operationcontext.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,097 行 · 第 1/3 页
JAVA
1,097 行
// reseed the operation context map
ServiceContext serv = getServiceContext();
ConfigurationContext activeCC;
if (serv != null) {
activeCC = serv.getConfigurationContext();
} else {
activeCC = cc;
}
if (key != null) {
// make sure this OperationContext object is registered in the
// list maintained by the ConfigurationContext object
boolean registrationSuceeded = activeCC.registerOperationContext(key, this);
if (!registrationSuceeded) {
// trace point
log.trace(logCorrelationIDString + ":activate(): OperationContext key [" + key +
"] already exists in ConfigurationContext map. This OperationContext [" +
this.toString() + "] was not added to the table.");
}
}
//-------------------------------------------------------
// update the modified entries in the messageContexts table
//-------------------------------------------------------
// NOTE: an entry in the metaMessageContextMap must wait
// for its corresponding active message context object
// to call this operation context object so we don't
// need to handle the metaMessagecontextMap table here
if ((workingSet != null) && (!workingSet.isEmpty())) {
Set keySet = workingSet.keySet();
Iterator itKeys = keySet.iterator();
while (itKeys.hasNext()) {
// expect the key to be a string
String keyObj = (String) itKeys.next();
// get the message context associated with that label
MessageContext value = (MessageContext) workingSet.get((Object) keyObj);
// activate that object
if (value != null) {
// trace point
log.trace(logCorrelationIDString + ":activate(): key [" + keyObj +
"] message id [" + value.getMessageID() + "]");
suppressWarnings = true;
value.activateWithOperationContext(this);
suppressWarnings = false;
if (messageContexts == null) {
messageContexts = new HashMap();
}
}
// put the entry in the "real" table
// note that the key or the value could be null
messageContexts.put(keyObj, value);
}
}
//-------------------------------------------------------
// done, reset the flag
//-------------------------------------------------------
needsToBeReconciled = false;
}
/**
* Isolate the specified message context object
* to prepare for serialization. Instead of
* saving the entire message context object,
* just setup some metadata about the message
* context.
* <p/>
* Note: this will remove the specified
* message context object from the message context
* table.
*
* @param mc The message context object
*/
public void isolateMessageContext(MessageContext mc) {
if (mc == null) {
return;
}
if ((messageContexts == null) || (messageContexts.isEmpty())) {
return;
}
// get the message ID from the message context
String messageID = mc.getMessageID();
if (messageID == null) {
// can't locate it without identification
return;
}
Iterator it = messageContexts.keySet().iterator();
while (it.hasNext()) {
// get the key
Object keyObj = it.next();
// get the value associated with that key
MessageContext value = (MessageContext) messageContexts.get(keyObj);
if (value != null) {
String valueID = value.getMessageID();
if ((valueID != null) && valueID.equals(messageID)) {
// found the input message context in our table
if (metaMessageContextMap == null) {
metaMessageContextMap = new HashMap();
}
// build a meta data entry
// MessageContext class name
// MessageContext messageID
// key used in the original hashmap that is associated with this MessageContext
// note: this is typically something like "In", "Out", "Fault"
//
MetaDataEntry metaData = new MetaDataEntry(value.getClass().getName(),
value.getMessageID(),
keyObj.toString());
// put the meta data entry in the list
// note that if the entry was already in the list,
// this will replace that entry
metaMessageContextMap.put(keyObj, metaData);
// don't change the original table - there's potentially lots of areas that
// grab the table
// // now remove the original entry from the messageContexts table
// messageContexts.remove(keyObj);
// put the original entry in the temporary list
if (isolatedMessageContexts == null) {
isolatedMessageContexts = new HashMap();
}
// note that if the entry was already in the list,
// this will replace that entry
isolatedMessageContexts.put(keyObj, value);
// trace point
log.trace(logCorrelationIDString +
":isolateMessageContext(): set up message context id[" + valueID +
"] with key [" + keyObj.toString() +
"] from messageContexts table to prepare for serialization.");
break;
}
}
}
}
/**
* Restore the specified MessageContext object in the
* table used to hold the message contexts associated
* with this operation.
*
* @param msg The message context object
*/
public void restoreMessageContext(MessageContext msg) {
// see if the activation has been done
if (needsToBeReconciled) {
// nope, need to do the activation first
log.trace(logCorrelationIDString +
":restoreMessageContext(): *** WARNING : need to invoke activate() prior to restoring the MessageContext to the list.");
return;
}
if (msg == null) {
return;
}
String msgID = msg.getMessageID();
if (msgID == null) {
// can't identify message context
log.trace(logCorrelationIDString +
":restoreMessageContext(): *** WARNING : MessageContext does not have a message ID.");
return;
}
// first check the metaMessageContextMap to see if
// the specified message context object matches any
// of the metadata entries.
if ((metaMessageContextMap != null) && (!metaMessageContextMap.isEmpty())) {
Iterator itMeta = metaMessageContextMap.keySet().iterator();
while (itMeta.hasNext()) {
String keyM = (String) itMeta.next();
MetaDataEntry valueM = (MetaDataEntry) metaMessageContextMap.get(keyM);
String valueM_ID;
if (valueM != null) {
valueM_ID = valueM.getQNameAsString();
if (msgID.equals(valueM_ID)) {
String label = valueM.getExtraName();
if (messageContexts == null) {
messageContexts = new HashMap();
}
// put the message context into the messageContexts table
messageContexts.put(label, msg);
// remove the metadata from the metadata table
metaMessageContextMap.remove(keyM);
log.trace(logCorrelationIDString +
":restoreMessageContext(): restored label [" + label +
"] message ID [" + msg.getMessageID() + "]");
break;
}
}
}
} else
// see if we can put the msg directly in the messageContexts table
if ((messageContexts != null) && (!messageContexts.isEmpty())) {
Iterator itList = messageContexts.keySet().iterator();
while (itList.hasNext()) {
String key = (String) itList.next();
MessageContext value = (MessageContext) messageContexts.get(key);
String valueID;
if (value != null) {
valueID = value.getMessageID();
if (msgID.equals(valueID)) {
// update the entry
messageContexts.put(key, msg);
}
}
}
}
}
/**
* Get the name associated with the operation.
*
* @return The name String
*/
public String getOperationName() {
String opName = null;
if (axisOperation != null) {
QName qname = axisOperation.getName();
if (qname != null) {
opName = qname.getLocalPart();
}
}
return opName;
}
/**
* Get the name associated with the service.
*
* @return The name String
*/
public String getServiceName() {
String srvName = null;
ServiceContext sc = (ServiceContext) getParent();
if (sc == null) {
sc = metaParent;
}
if (sc != null) {
srvName = sc.getName();
}
return srvName;
}
/**
* Get the name associated with the service group.
*
* @return The name String
*/
public String getServiceGroupName() {
String srvGroupName = null;
ServiceContext sc = (ServiceContext) getParent();
if (sc == null) {
sc = metaParent;
}
if (sc != null) {
srvGroupName = sc.getGroupName();
}
return srvGroupName;
}
/**
* Compares key parts of the state from the current instance of
* this class with the specified instance to see if they are
* equivalent.
* <p/>
* This differs from the java.lang.Object.equals() method in
* that the equals() method generally looks at both the
* object identity (location in memory) and the object state
* (data).
* <p/>
*
* @param ctx The object to compare with
* @return TRUE if this object is equivalent with the specified object
* that is, key fields match
* FALSE, otherwise
*/
public boolean isEquivalent(OperationContext ctx) {
// NOTE: the input object is expected to exist (ie, be non-null)
if (this.isComplete != ctx.isComplete()) {
return false;
}
if (!this.axisOperation.equals(ctx.getAxisOperation())) {
return false;
}
// TODO: consider checking the parent objects for equivalency
// TODO: consider checking fields from the super class for equivalency
return true;
}
/**
* Get the ID associated with this object instance.
*
* @return A string that can be output to a log file as an identifier
* for this object instance. It is suitable for matching related log
* entries.
*/
public String getLogCorrelationIDString() {
return logCorrelationIDString;
}
public ConfigurationContext getRootContext() {
return this.getConfigurationContext();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?