operationcontext.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,097 行 · 第 1/3 页
JAVA
1,097 行
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.context;
import org.apache.axiom.om.util.UUIDGenerator;
import org.apache.axis2.AxisFault;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.util.MetaDataEntry;
import org.apache.axis2.util.ObjectStateUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.xml.namespace.QName;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* An OperationContext represents a running "instance" of an operation, which is
* represented by an AxisOperation object. This concept is needed to allow
* messages to be grouped into operations as in WSDL 2.0-speak operations are
* essentially arbitrary message exchange patterns. So as messages are being
* exchanged the OperationContext remembers the state of where in the message
* exchange pattern it is in.
* <p/>
* The base implementation of OperationContext
* supports MEPs which have one input message and/or one output message. That
* is, it supports the all the MEPs that are in the WSDL 2.0 specification. In
* order to support another MEP one must extend this class and register its
* creation in the OperationContexFactory.
*/
public class OperationContext extends AbstractContext implements Externalizable {
/*
* setup for logging
*/
private static final Log log = LogFactory.getLog(OperationContext.class);
private static final String myClassName = "OperationContext";
/**
* An ID which can be used to correlate operations on an instance of
* this object in the log files
*/
private String logCorrelationIDString = myClassName + "@" + UUIDGenerator.getUUID();
/**
* @serial The serialization version ID tracks the version of the class.
* If a class definition changes, then the serialization/externalization
* of the class is affected. If a change to the class is made which is
* not compatible with the serialization/externalization of the class,
* then the serialization version ID should be updated.
* Refer to the "serialVer" utility to compute a serialization
* version ID.
*/
private static final long serialVersionUID = -7264782778333554350L;
/**
* @serial Tracks the revision level of a class to identify changes to the
* class definition that are compatible to serialization/externalization.
* If a class definition changes, then the serialization/externalization
* of the class is affected.
* Refer to the writeExternal() and readExternal() methods.
*/
// supported revision levels, add a new level to manage compatible changes
private static final int REVISION_1 = 1;
// current revision level of this object
private static final int revisionID = REVISION_1;
/**
* @serial isComplete flag
*/
private boolean isComplete;
/**
* @serial key string
*/
//The key value of the operationContextMap;
private String key;
// the AxisOperation of which this is a running instance. The MEP of this
// AxisOperation must be one of the 8 predefined ones in WSDL 2.0.
private transient AxisOperation axisOperation;
/**
* the set of message contexts associated with this operation
*/
private transient HashMap messageContexts;
//----------------------------------------------------------------
// MetaData for data to be restored in activate after readExternal
//----------------------------------------------------------------
/**
* Indicates whether the message context has been reconstituted
* and needs to have its object references reconciled
*/
private transient boolean needsToBeReconciled = false;
/**
* Suppresses warning messages for activation
* when doing internal reconciliation
*/
private transient boolean suppressWarnings = false;
/**
* The AxisOperation metadata will be used during
* activate to match up with an existing object
*/
private transient MetaDataEntry metaAxisOperation = null;
/**
* The AxisService metadata will be used during
* activate to match up with an existing object
*/
private transient MetaDataEntry metaAxisService = null;
/**
* The ServiceContext metadata will be used during
* activate to match up with an existing object
*/
private transient ServiceContext metaParent = null;
/**
* This is used to hold information about message context objects
* that are in the messageContexts map. This allows message context
* objects to be isolated from the object graph so that duplicate
* copies of objects are not saved/restored.
*/
private HashMap metaMessageContextMap = null;
/**
* This is used to hold temporarily any message context objects
* that were isolated from the messageContexts map.
*/
private transient HashMap isolatedMessageContexts = null;
/**
* This is used to hold temporarily any message context objects
* from the messageContexts map for save/restore activities.
*/
private transient HashMap workingSet = null;
//----------------------------------------------------------------
// end MetaData section
//----------------------------------------------------------------
/**
* Simple constructor (needed for deserialization, shouldn't be used otherwise!)
*/
public OperationContext() {
super(null);
this.messageContexts = new HashMap();
}
/**
* Constructs a new OperationContext.
*
* @param axisOperation the AxisOperation whose running instances' state this
* OperationContext represents.
* @param serviceContext the parent ServiceContext representing any state related to
* the set of all operations of the service.
*/
public OperationContext(AxisOperation axisOperation,
ServiceContext serviceContext) {
super(serviceContext);
this.messageContexts = new HashMap();
this.axisOperation = axisOperation;
this.setParent(serviceContext);
}
/**
* When a new message is added to the <code>MEPContext</code> the logic
* should be included remove the MEPContext from the table in the
* <code>EngineContext</code>. Example: IN_IN_OUT At the second IN
* message the MEPContext should be removed from the AxisOperation.
*
* @param msgContext
*/
public void addMessageContext(MessageContext msgContext) throws AxisFault {
if (axisOperation != null) {
axisOperation.addMessageContext(msgContext, this);
touch();
}
}
/**
* Removes the pointers to this <code>OperationContext</code> in the
* <code>ConfigurationContext</code>'s OperationContextMap so that this
* <code>OperationContext</code> will eventually get garbage collected
* along with the <code>MessageContext</code>'s it contains. Note that if
* the caller wants to make sure its safe to clean up this OperationContext
* he should call isComplete() first. However, in cases like IN_OPTIONAL_OUT
* and OUT_OPTIONAL_IN, it is possibe this will get called without the MEP
* being complete due to the optional nature of the MEP.
*/
public void cleanup() {
ServiceContext serv = getServiceContext();
if (serv != null) {
serv.getConfigurationContext().unregisterOperationContext(key);
}
}
/**
* @return Returns the axisOperation.
*/
public AxisOperation getAxisOperation() {
if (needsToBeReconciled && !suppressWarnings) {
log.warn(logCorrelationIDString +
":getAxisOperation(): ****WARNING**** OperationContext.activate(configurationContext) needs to be invoked.");
}
return axisOperation;
}
/**
* Returns the EngineContext in which the parent ServiceContext lives.
*
* @return Returns parent ServiceContext's parent EngineContext.
*/
public ConfigurationContext getConfigurationContext() {
if (parent != null) {
return ((ServiceContext) parent).getConfigurationContext();
} else {
return null;
}
}
/**
* @param messageLabel
* @return Returns MessageContext.
* @throws AxisFault
*/
public MessageContext getMessageContext(String messageLabel)
throws AxisFault {
if (messageContexts == null) {
return null;
}
return (MessageContext) messageContexts.get(messageLabel);
}
public HashMap getMessageContexts() {
return messageContexts;
}
/**
* Returns the ServiceContext in which this OperationContext lives.
*
* @return Returns parent ServiceContext.
*/
public ServiceContext getServiceContext() {
return (ServiceContext) parent;
}
/**
* Checks to see if the MEP is complete. i.e. whether all the messages that
* are associated with the MEP has arrived and MEP is complete.
*/
public boolean isComplete() {
return isComplete;
}
public void setComplete(boolean complete) {
isComplete = complete;
}
public void setKey(String key) {
this.key = key;
}
/* ===============================================================
* Externalizable support
* ===============================================================
*/
/**
* Save the contents of this object.
* <p/>
* NOTE: Transient fields and static fields are not saved.
* Also, objects that represent "static" data are
* not saved, except for enough information to be
* able to find matching objects when the message
* context is re-constituted.
*
* @param out The stream to write the object contents to
* @throws IOException
*/
public void writeExternal(ObjectOutput out) throws IOException {
//---------------------------------------------------------
// in order to handle future changes to the message
// context definition, be sure to maintain the
// object level identifiers
//---------------------------------------------------------
// serialization version ID
out.writeLong(serialVersionUID);
// revision ID
out.writeInt(revisionID);
//---------------------------------------------------------
// various simple fields
//---------------------------------------------------------
out.writeLong(getLastTouchedTime());
out.writeBoolean(isComplete);
ObjectStateUtils.writeString(out, key, logCorrelationIDString + ".key");
ObjectStateUtils.writeString(out, logCorrelationIDString,
logCorrelationIDString + ".logCorrelationIDString");
//---------------------------------------------------------
// properties
//---------------------------------------------------------
Map tmpMap = getProperties();
HashMap tmpHashMap = null;
if ((tmpMap != null) && (!tmpMap.isEmpty())) {
tmpHashMap = new HashMap(tmpMap);
}
ObjectStateUtils.writeHashMap(out, tmpHashMap, logCorrelationIDString + ".properties");
//---------------------------------------------------------
// AxisOperation axisOperation
//---------------------------------------------------------
String axisOpMarker = logCorrelationIDString + ".axisOperation";
ObjectStateUtils.writeString(out, axisOpMarker, axisOpMarker);
if (axisOperation == null) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?