Author: davidillsley Date: Tue Jan 15 01:58:14 2008 New Revision: 612065 URL: http://svn.apache.org/viewvc?rev=612065&view=rev Log: AXIS2-3283
Add accessor to determine if any operation contexts are currently registered and remove synchronization blocks in favour of a ConcurrentHashMap. Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/ConfigurationContext.java Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/ConfigurationContext.java URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/ConfigurationContext.java?rev=612065&r1=612064&r2=612065&view=diff ============================================================================== --- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/ConfigurationContext.java (original) +++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/ConfigurationContext.java Tue Jan 15 01:58:14 2008 @@ -40,6 +40,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap; + import java.io.File; import java.net.URL; import java.util.ArrayList; @@ -48,7 +50,6 @@ import java.util.Hashtable; import java.util.Iterator; import java.util.List; -import java.util.Map; /** * <p>Axis2 states are held in two information models, called description hierarchy @@ -70,7 +71,7 @@ * Map containing <code>MessageID</code> to * <code>OperationContext</code> mapping. */ - private final Map operationContextMap = new HashMap(); + private final ConcurrentHashMap operationContextMap = new ConcurrentHashMap(); private Hashtable serviceGroupContextMap = new Hashtable(); private Hashtable applicationSessionServiceGroupContexts = new Hashtable(); private AxisConfiguration axisConfiguration; @@ -309,26 +310,34 @@ public boolean registerOperationContext(String messageID, OperationContext mepContext, boolean override) { - boolean alreadyInMap; + + if(messageID == null){ + if(log.isDebugEnabled()){ + log.debug("messageID is null. Returning false"); + } + return false; + } + + boolean alreadyInMap = false; mepContext.setKey(messageID); - synchronized (operationContextMap) { - alreadyInMap = operationContextMap.containsKey(messageID); - if (!alreadyInMap || override) { - this.operationContextMap.put(messageID, mepContext); - } - if (log.isDebugEnabled()) - { - log.debug("registerOperationContext ("+override+"): "+ - mepContext+" with key: "+messageID); - HashMap msgContextMap = mepContext.getMessageContexts(); - Iterator msgContextIterator = msgContextMap.values().iterator(); - while (msgContextIterator.hasNext()) - { - MessageContext msgContext = (MessageContext)msgContextIterator.next(); - log.debug("msgContext: "+msgContext+" action: "+msgContext.getWSAAction()); - } - } + if(override){ + operationContextMap.put(messageID, mepContext); + }else{ + Object previous = operationContextMap.putIfAbsent(messageID, mepContext); + alreadyInMap = (previous!=null); + } + if (log.isDebugEnabled()) + { + log.debug("registerOperationContext ("+override+"): "+ + mepContext+" with key: "+messageID); + HashMap msgContextMap = mepContext.getMessageContexts(); + Iterator msgContextIterator = msgContextMap.values().iterator(); + while (msgContextIterator.hasNext()) + { + MessageContext msgContext = (MessageContext)msgContextIterator.next(); + log.debug("msgContext: "+msgContext+" action: "+msgContext.getWSAAction()); + } } return (!alreadyInMap || override); } @@ -338,13 +347,20 @@ * @param key */ public void unregisterOperationContext(String key) { - synchronized (operationContextMap) { - OperationContext opCtx = (OperationContext) operationContextMap.get(key); - operationContextMap.remove(key); - contextRemoved(opCtx); - } + if(key == null){ + if(log.isDebugEnabled()){ + log.debug("key is null."); + } + }else{ + OperationContext opCtx = (OperationContext) operationContextMap.remove(key); + contextRemoved(opCtx); + } } + public boolean isAnyOperationContextRegistered(){ + return !operationContextMap.isEmpty(); + } + /** * Adds the given ServiceGroupContext into the SOAP session table * @@ -402,14 +418,7 @@ * @param id */ public OperationContext getOperationContext(String id) { - OperationContext opCtx; - synchronized (operationContextMap) { - if (operationContextMap == null) { - return null; - } - opCtx = (OperationContext) this.operationContextMap.get(id); - } - + OperationContext opCtx = (OperationContext) this.operationContextMap.get(id); return opCtx; } @@ -434,39 +443,36 @@ // group name is not necessarily a prereq // but if the group name is non-null, then it has to match - synchronized (operationContextMap) { - Iterator it = operationContextMap.keySet().iterator(); + Iterator it = operationContextMap.values().iterator(); - while (it.hasNext()) { - Object key = it.next(); - OperationContext value = (OperationContext) operationContextMap.get(key); - - String valueOperationName; - String valueServiceName; - String valueServiceGroupName; - - if (value != null) { - valueOperationName = value.getOperationName(); - valueServiceName = value.getServiceName(); - valueServiceGroupName = value.getServiceGroupName(); - - if ((valueOperationName != null) && (valueOperationName.equals(operationName))) { - if ((valueServiceName != null) && (valueServiceName.equals(serviceName))) { - if ((valueServiceGroupName != null) && (serviceGroupName != null) - && (valueServiceGroupName.equals(serviceGroupName))) { - // match - return value; - } - - // or, both need to be null - if ((valueServiceGroupName == null) && (serviceGroupName == null)) { - // match - return value; - } - } - } - } - } + while (it.hasNext()) { + OperationContext value = (OperationContext) it.next(); + + String valueOperationName; + String valueServiceName; + String valueServiceGroupName; + + if (value != null) { + valueOperationName = value.getOperationName(); + valueServiceName = value.getServiceName(); + valueServiceGroupName = value.getServiceGroupName(); + + if ((valueOperationName != null) && (valueOperationName.equals(operationName))) { + if ((valueServiceName != null) && (valueServiceName.equals(serviceName))) { + if ((valueServiceGroupName != null) && (serviceGroupName != null) + && (valueServiceGroupName.equals(serviceGroupName))) { + // match + return value; + } + + // or, both need to be null + if ((valueServiceGroupName == null) && (serviceGroupName == null)) { + // match + return value; + } + } + } + } } // if we got here, we did not find an operation context --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]