messagecontext.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 2,012 行 · 第 1/5 页
JAVA
2,012 行
* content ID. Returns "NULL" if a attachment cannot be found by the given content ID.
*
* @param contentID :
* Content ID of the MIME attachment
* @return Data handler of the attachment
*/
public DataHandler getAttachment(String contentID) {
if (attachments == null) {
attachments = new Attachments();
}
return attachments.getDataHandler(contentID);
}
/**
* Removes the attachment with the given content ID from the Attachments Map
* Do nothing if a attachment cannot be found by the given content ID.
*
* @param contentID of the attachment
*/
public void removeAttachment(String contentID) {
if (attachments != null) {
attachments.removeDataHandler(contentID);
}
}
/*
* ===============================================================
* SelfManagedData Section
* ===============================================================
*/
/*
* character to delimit strings
*/
private String selfManagedDataDelimiter = "*";
/**
* Set up a unique key in the form of
* <OL>
* <LI>the class name for the class that owns the key
* <LI>delimitor
* <LI>the key as a string
* <LI>delimitor
* <LI>the key's hash code as a string
* </OL>
*
* @param clazz The class that owns the supplied key
* @param key The key
* @return A string key
*/
private String generateSelfManagedDataKey(Class clazz, Object key) {
return clazz.getName() + selfManagedDataDelimiter + key.toString() +
selfManagedDataDelimiter + Integer.toString(key.hashCode());
}
/**
* Add a key-value pair of self managed data to the set associated with
* this message context.
* <p/>
* This is primarily intended to allow handlers to manage their own
* message-specific data when the message context is saved/restored.
*
* @param clazz The class of the caller that owns the key-value pair
* @param key The key for this data object
* @param value The data object
*/
public void setSelfManagedData(Class clazz, Object key, Object value) {
if (selfManagedDataMap == null) {
selfManagedDataMap = new LinkedHashMap();
}
// make sure we have a unique key and a delimiter so we can
// get the classname and hashcode for serialization/deserialization
selfManagedDataMap.put(generateSelfManagedDataKey(clazz, key), value);
}
/**
* Retrieve a value of self managed data previously saved with the specified key.
*
* @param clazz The class of the caller that owns the key-value pair
* @param key The key for the data
* @return The data object associated with the key, or NULL if not found
*/
public Object getSelfManagedData(Class clazz, Object key) {
if (selfManagedDataMap != null) {
return selfManagedDataMap.get(generateSelfManagedDataKey(clazz, key));
}
return null;
}
/**
* Check to see if the key for the self managed data is available
*
* @param clazz The class of the caller that owns the key-value pair
* @param key The key to look for
* @return TRUE if the key exists, FALSE otherwise
*/
public boolean containsSelfManagedDataKey(Class clazz, Object key) {
if (selfManagedDataMap == null) {
return false;
}
return selfManagedDataMap.containsKey(generateSelfManagedDataKey(clazz, key));
}
/**
* Removes the mapping of the specified key if the specified key
* has been set for self managed data
*
* @param clazz The class of the caller that owns the key-value pair
* @param key The key of the object to be removed
*/
public void removeSelfManagedData(Class clazz, Object key) {
if (selfManagedDataMap != null) {
selfManagedDataMap.remove(generateSelfManagedDataKey(clazz, key));
}
}
/**
* Flatten the phase list into a list of just unique handler instances
*
* @param list the list of handlers
* @param map users should pass null as this is just a holder for the recursion
* @return a list of unigue object instances
*/
private ArrayList flattenPhaseListToHandlers(ArrayList list, LinkedHashMap map) {
if (map == null) {
map = new LinkedHashMap();
}
Iterator it = list.iterator();
while (it.hasNext()) {
Handler handler = (Handler) it.next();
String key = null;
if (handler != null) {
key = handler.getClass().getName() + "@" + handler.hashCode();
}
if (handler instanceof Phase) {
// add its handlers to the list
flattenHandlerList(((Phase) handler).getHandlers(), map);
} else {
// if the same object is already in the list,
// then it won't be in the list multiple times
map.put(key, handler);
}
}
if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
Iterator it2 = map.keySet().iterator();
while (it2.hasNext()) {
Object key = it2.next();
Handler value = (Handler) map.get(key);
String name = value.getName();
log.trace(getLogIDString() + ":flattenPhaseListToHandlers(): key [" + key +
"] handler name [" + name + "]");
}
}
return new ArrayList(map.values());
}
/**
* Flatten the handler list into just unique handler instances
* including phase instances.
*
* @param list the list of handlers/phases
* @param map users should pass null as this is just a holder for the recursion
* @return a list of unigue object instances
*/
private ArrayList flattenHandlerList(ArrayList list, LinkedHashMap map) {
if (map == null) {
map = new LinkedHashMap();
}
Iterator it = list.iterator();
while (it.hasNext()) {
Handler handler = (Handler) it.next();
String key = null;
if (handler != null) {
key = handler.getClass().getName() + "@" + handler.hashCode();
}
if (handler instanceof Phase) {
// put the phase in the list
map.put(key, handler);
// add its handlers to the list
flattenHandlerList(((Phase) handler).getHandlers(), map);
} else {
// if the same object is already in the list,
// then it won't be in the list multiple times
map.put(key, handler);
}
}
return new ArrayList(map.values());
}
/**
* Calls the serializeSelfManagedData() method of each handler that
* implements the <bold>SelfManagedDataManager</bold> interface.
* Handlers for this message context are identified via the
* executionChain list.
*
* @param out The output stream
*/
private void serializeSelfManagedData(ObjectOutput out) {
selfManagedDataHandlerCount = 0;
try {
if ((selfManagedDataMap == null)
|| (executionChain == null)
|| (selfManagedDataMap.size() == 0)
|| (executionChain.size() == 0)) {
out.writeBoolean(ObjectStateUtils.EMPTY_OBJECT);
if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
log.trace(getLogIDString() + ":serializeSelfManagedData(): No data : END");
}
return;
}
// let's create a temporary list with the handlers
ArrayList flatExecChain = flattenPhaseListToHandlers(executionChain, null);
//ArrayList selfManagedDataHolderList = serializeSelfManagedDataHelper(flatExecChain.iterator(), new ArrayList());
ArrayList selfManagedDataHolderList = serializeSelfManagedDataHelper(flatExecChain);
if (selfManagedDataHolderList.size() == 0) {
out.writeBoolean(ObjectStateUtils.EMPTY_OBJECT);
if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
log.trace(getLogIDString() + ":serializeSelfManagedData(): No data : END");
}
return;
}
out.writeBoolean(ObjectStateUtils.ACTIVE_OBJECT);
// SelfManagedData can be binary so won't be able to treat it as a
// string - need to treat it as a byte []
// how many handlers actually
// returned serialized SelfManagedData
out.writeInt(selfManagedDataHolderList.size());
for (int i = 0; i < selfManagedDataHolderList.size(); i++) {
out.writeObject(selfManagedDataHolderList.get(i));
}
}
catch (IOException e) {
if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
log.trace("MessageContext:serializeSelfManagedData(): Exception [" +
e.getClass().getName() + "] description [" + e.getMessage() + "]", e);
}
}
}
/**
* This is the helper method to do the recursion for serializeSelfManagedData()
*
* @param handlers
* @return ArrayList
*/
private ArrayList serializeSelfManagedDataHelper(ArrayList handlers) {
ArrayList selfManagedDataHolderList = new ArrayList();
Iterator it = handlers.iterator();
try {
while (it.hasNext()) {
Handler handler = (Handler) it.next();
//if (handler instanceof Phase)
//{
// selfManagedDataHolderList = serializeSelfManagedDataHelper(((Phase)handler).getHandlers().iterator(), selfManagedDataHolderList);
//}
//else if (SelfManagedDataManager.class.isAssignableFrom(handler.getClass()))
if (SelfManagedDataManager.class.isAssignableFrom(handler.getClass())) {
// only call the handler's serializeSelfManagedData if it implements SelfManagedDataManager
if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
log.trace(
"MessageContext:serializeSelfManagedDataHelper(): calling handler [" +
handler.getClass().getName() + "] name [" +
handler.getName() + "] serializeSelfManagedData method");
}
ByteArrayOutputStream baos_fromHandler =
((SelfManagedDataManager) handler).serializeSelfManagedData(this);
if (baos_fromHandler != null) {
baos_fromHandler.close();
try {
SelfManagedDataHolder selfManagedDataHolder = new SelfManagedDataHolder(
handler.getClass().getName(), handler.getName(),
baos_fromHandler.toByteArray());
selfManagedDataHolderList.add(selfManagedDataHolder);
selfManagedDataHandlerCount++;
}
catch (Exception exc) {
if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
log.trace("MessageContext:serializeSelfManagedData(): exception [" +
exc.getClass().getName() + "][" + exc.getMessage() +
"] in setting up SelfManagedDataHolder object for [" +
handler.getClass().getName() + " / " + handler.getName() + "] ",
exc);
}
}
}
}
}
return selfManagedDataHolderList;
}
catch (Exception ex) {
if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
log.trace("MessageContext:serializeSelfManagedData(): exception [" +
ex.getClass().getName() + "][" + ex.getMessage() + "]", ex);
}
return null;
}
}
/**
* During deserialization, the executionChain will be
* re-constituted before the SelfManagedData is restored.
* This means the handler instances are already available.
* This method lets us find the handler instance from the
* executionChain so we can call each one's
* deserializeSelfManagedData method.
*
* @param it The iterator from the executionChain object
* @param classname The class name
* @param qNameAsString The QName in string form
* @return SelfManagedDataManager handler
*/
private SelfManagedDataManager deserialize_getHandlerFromExecutionChain(Iterator it,
String classname,
String qNameAsString) {
SelfManagedDataManager handler_toreturn = null;
try {
while ((it.hasNext()) && (handler_toreturn == null)) {
Handler handler = (Handler) it.next();
if (handler instanceof Phase) {
handler_toreturn = deserialize_getHandlerFromExecutionChain(
((Phase) handler).getHandlers().iterator(), classname, qNameAsString);
} else if ((handler.getClass().getName().equals(classname))
&& (handler.getName().equals(qNameAsString))) {
handler_toreturn = (SelfManagedDataManager) handler;
}
}
return handler_toreturn;
}
catch (ClassCastException e) {
// Doesn't seem likely to happen, but just in case...
// A handler classname in the executionChain matched up with our parameter
// classname, but the existing class in the executionChain is a different
// implementation than the one we saved during serializeSelfManagedData.
// NOTE: the exception gets absorbed!
if (LoggingControl.debugLoggingAllowed && log.isTraceEnabled()) {
log.trace(
"MessageContext:deserialize_getHandlerFromExecutionChain(): ClassCastException thrown: " +
e.getMessage(), e);
}
return null;
}
}
/*
* We don't need to create new instances of the handlers
* since the executionChain is rebuilt after readExternal().
* We just have to find them in the executionChain and
* call each handler's deserializeSelfManagedData method.
*/
private void deserializeSelfManagedData() throws IOException {
try {
for (int i = 0;
(selfManagedDataListHolder != null) && (i < selfManagedDataListHolder.size()); i++)
{
SelfManagedDataHolder selfManagedDataHolder =
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?