Hi Bill;

Do you think its a good idea to have synchronized block (specially in
hot place like ConfigurationContext) , doesn't that slow down Axis2 ?

Thanks
Deepal

>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?view=diff&rev=495106&r1=495105&r2=495106
>==============================================================================
>--- 
>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
> Wed Jan 10 20:04:31 2007
>@@ -56,8 +56,8 @@
>     private final Map operationContextMap = new HashMap();
>     private Hashtable serviceGroupContextMap = new Hashtable();
>     private Hashtable applicationSessionServiceGroupContextTable = new 
> Hashtable();
>-    private transient AxisConfiguration axisConfiguration;
>-    private transient ThreadFactory threadPool;
>+    private AxisConfiguration axisConfiguration;
>+    private ThreadFactory threadPool;
>     //To keep TransportManager instance
>     private ListenerManager listenerManager;
> 
>@@ -124,16 +124,30 @@
>         if (serviceContext == null) {
>             if (Constants.SCOPE_APPLICATION.equals(axisService.getScope())) {
>                 String serviceGroupName = ((AxisServiceGroup) 
> axisService.getParent()).getServiceGroupName();
>-                serviceGroupContext = (ServiceGroupContext) 
>applicationSessionServiceGroupContextTable.get(
>-                        serviceGroupName);
>+                serviceGroupContext = null;
>+
>+                synchronized (applicationSessionServiceGroupContextTable) {
>+                    if (applicationSessionServiceGroupContextTable != null) {
>+                        serviceGroupContext = (ServiceGroupContext) 
>applicationSessionServiceGroupContextTable.get(
>+                                serviceGroupName);
>+                    }
>+                }
>+
>                 if (serviceGroupContext == null) {
>                     AxisServiceGroup axisServiceGroup = 
> messageContext.getAxisServiceGroup();
>                     if (axisServiceGroup == null) {
>                         axisServiceGroup = (AxisServiceGroup) 
> axisService.getParent();
>                     }
>                     serviceGroupContext = new 
> ServiceGroupContext(messageContext.getConfigurationContext(),
>-                            axisServiceGroup);
>-                    
>applicationSessionServiceGroupContextTable.put(serviceGroupName, 
>serviceGroupContext);
>+                                                                  
>axisServiceGroup);
>+
>+                    synchronized (applicationSessionServiceGroupContextTable) 
>{
>+                        if (applicationSessionServiceGroupContextTable == 
>null) {
>+                            applicationSessionServiceGroupContextTable = new 
>Hashtable();
>+                        }
>+                        
>applicationSessionServiceGroupContextTable.put(serviceGroupName, 
>serviceGroupContext);
>+                    }
>+
>                 }
>                 serviceContext = 
> serviceGroupContext.getServiceContext(axisService);
> 
>@@ -209,28 +223,41 @@
>      * @param mepContext
>      */
>     public void registerOperationContext(String messageID,
>-                                                      OperationContext 
>mepContext) {
>+                                         OperationContext mepContext) {
>         mepContext.setKey(messageID);
>-        this.operationContextMap.put(messageID, mepContext);
>+        synchronized (operationContextMap) {
>+            this.operationContextMap.put(messageID, mepContext);
>+        }
>     }
> 
>     public void registerServiceGroupContext(ServiceGroupContext 
> serviceGroupContext) {
>         String id = serviceGroupContext.getId();
> 
>-        if (serviceGroupContextMap.get(id) == null) {
>-            serviceGroupContextMap.put(id, serviceGroupContext);
>-            serviceGroupContext.touch();
>-            serviceGroupContext.setParent(this);
>+        synchronized (serviceGroupContextMap) {
>+            if (serviceGroupContextMap == null) {
>+                serviceGroupContextMap = new Hashtable();
>+            }
>+
>+            if ((serviceGroupContextMap.isEmpty()) || 
>(serviceGroupContextMap.get(id) == null)) {
>+                serviceGroupContextMap.put(id, serviceGroupContext);
>+                serviceGroupContext.touch();
>+                serviceGroupContext.setParent(this);
>+            }
>         }
> 
>         // this is the best time to clean up the SGCtxts since are not being 
> used anymore
>         cleanupServiceGroupContexts();
>     }
> 
>-    public void addServiceGroupContextintoApplicatoionScopeTable(
>-            ServiceGroupContext serviceGroupContext) {
>-        applicationSessionServiceGroupContextTable.put(
>-                serviceGroupContext.getDescription().getServiceGroupName(), 
>serviceGroupContext);
>+    public void 
>addServiceGroupContextintoApplicatoionScopeTable(ServiceGroupContext 
>serviceGroupContext) { 
>+
>+        synchronized (applicationSessionServiceGroupContextTable) {
>+            if (applicationSessionServiceGroupContextTable == null) {
>+                applicationSessionServiceGroupContextTable = new Hashtable();
>+            }
>+            applicationSessionServiceGroupContextTable.put(
>+                    
>serviceGroupContext.getDescription().getServiceGroupName(), 
>serviceGroupContext);
>+        }
>     }
> 
>     public AxisConfiguration getAxisConfiguration() {
>@@ -243,13 +270,84 @@
>      * @return Returns OperationContext <code>OperationContext<code>
>      */
>     public OperationContext getOperationContext(String id) {
>-        return (OperationContext) this.operationContextMap.get(id);
>+        OperationContext opCtx = null;
>+        
>+        synchronized (operationContextMap) {
>+            if (operationContextMap == null) {
>+                return null;
>+            }
>+            opCtx = (OperationContext) this.operationContextMap.get(id); 
>+        }
>+
>+        return opCtx;
>     }
> 
>     public Map getOperationContextMap() {
>         return this.operationContextMap;
>     }
> 
>+    public OperationContext findOperationContext(String operationName, String 
>serviceName, String serviceGroupName)
>+    {
>+        if (operationName == null)
>+        {
>+            return null;
>+        }
>+        
>+        if (serviceName == null)
>+        {
>+            return null;
>+        }
>+
>+        // 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();
>+
>+            while (it.hasNext())
>+            {
>+                Object key = it.next();
>+                OperationContext value = (OperationContext) 
>operationContextMap.get(key);
>+
>+                String valueOperationName = null;
>+                String valueServiceName = null;
>+                String valueServiceGroupName = null;
>+
>+                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 
>+        // that fits the criteria
>+        return null;
>+    }
>+
>     /**
>      * Allows users to resolve the path relative to the root diretory.
>      *
>@@ -265,27 +363,72 @@
>     }
> 
>     public ServiceGroupContext getServiceGroupContext(String 
> serviceGroupContextId,
>-                                                                   
>MessageContext msgContext) {
>-        ServiceGroupContext serviceGroupContext;
>-            serviceGroupContext = (ServiceGroupContext) 
>serviceGroupContextMap.get(serviceGroupContextId);
>-            if (serviceGroupContext != null) {
>-                serviceGroupContext.touch();
>+                                                      MessageContext 
>msgContext) {
>+
>+        ServiceGroupContext serviceGroupContext = null;
>+        
>+        synchronized (serviceGroupContextMap) {
>+            if (serviceGroupContextMap != null) {
>+                serviceGroupContext = (ServiceGroupContext) 
>serviceGroupContextMap.get(serviceGroupContextId);
>+
>+                if (serviceGroupContext != null) {
>+                    serviceGroupContext.touch();
>+                }
>             }
>+        }
>+
>         if (serviceGroupContext == null
>-                && msgContext.getSessionContext() != null) {
>+            && msgContext != null
>+            && msgContext.getSessionContext() != null) {
>             serviceGroupContext = 
> msgContext.getSessionContext().getServiceGroupContext(
>                     serviceGroupContextId);
>         }
>-        if (serviceGroupContext == null) {
>+
>+        if (serviceGroupContext == null && msgContext != null) {
>             AxisService axisService = msgContext.getAxisService();
>             if (axisService != null) {
>                 AxisServiceGroup asg = (AxisServiceGroup) 
> axisService.getParent();
>                 if (asg != null) {
>-                    serviceGroupContext = (ServiceGroupContext)
>-                            
>applicationSessionServiceGroupContextTable.get(asg.getServiceGroupName());
>+
>+                    synchronized (applicationSessionServiceGroupContextTable) 
>{
>+                        if (applicationSessionServiceGroupContextTable != 
>null) {
>+                            serviceGroupContext = (ServiceGroupContext)
>+                                    
>applicationSessionServiceGroupContextTable.get(asg.getServiceGroupName());
>+                        }
>+                    }
>                 }
>             }
>+        }
>+
>+        return serviceGroupContext;
>+    }
>+
> 
>+    /**
>+     * Returns a ServiceGroupContext object associated
>+     * with the specified ID from the internal table. 
>+     * 
>+     * @param Id     The ID string associated with the ServiceGroupContext 
>object
>+     * @return The ServiceGroupContext object, or null if not found
>+     */
>+    public ServiceGroupContext getServiceGroupContext(String Id) {
>+
>+        if (Id == null)
>+        {
>+            // Hashtables require non-null key-value pairs
>+            return null;
>+        }
>+
>+        ServiceGroupContext serviceGroupContext = null;
>+
>+        synchronized (serviceGroupContextMap)
>+        {
>+            if (serviceGroupContextMap != null) {
>+                serviceGroupContext = (ServiceGroupContext) 
>serviceGroupContextMap.get(Id);
>+                if (serviceGroupContext != null) {
>+                    serviceGroupContext.touch();
>+                }
>+            }
>         }
> 
>         return serviceGroupContext;
>@@ -338,6 +481,10 @@
>     }
> 
>     private void cleanupServiceGroupContexts() {
>+        synchronized (serviceGroupContextMap) {
>+            if (serviceGroupContextMap == null) {
>+                return;
>+            }
>             long currentTime = new Date().getTime();
>             Iterator sgCtxtMapKeyIter = 
> serviceGroupContextMap.keySet().iterator();
>             while (sgCtxtMapKeyIter.hasNext()) {
>@@ -351,6 +498,7 @@
>                 }
>             }
>         }
>+    }
> 
>     public ListenerManager getListenerManager() {
>         return listenerManager;
>@@ -361,7 +509,13 @@
>     }
> 
>     private void cleanupServiceContexts(ServiceGroupContext 
> serviceGroupContext) {
>+        if (serviceGroupContext == null) {
>+            return;
>+        }
>         Iterator serviceContecxtes = serviceGroupContext.getServiceContexts();
>+        if (serviceContecxtes == null) {
>+            return;
>+        }
>         while (serviceContecxtes.hasNext()) {
>             ServiceContext serviceContext = (ServiceContext) 
> serviceContecxtes.next();
>             try {
>@@ -373,20 +527,19 @@
>     }
> 
>     private void cleanupContexts() {
>-        if (applicationSessionServiceGroupContextTable.size() > 0) {
>-            Iterator applicationScopeSgs =
>-                    
>applicationSessionServiceGroupContextTable.values().iterator();
>+        if ((applicationSessionServiceGroupContextTable != null) &&
>+            (applicationSessionServiceGroupContextTable.size() > 0)) {
>+            Iterator applicationScopeSgs = 
>applicationSessionServiceGroupContextTable.values().iterator();
>             while (applicationScopeSgs.hasNext()) {
>                 ServiceGroupContext serviceGroupContext =
>                         (ServiceGroupContext) applicationScopeSgs.next();
>                 cleanupServiceContexts(serviceGroupContext);
>             }
>         }
>-        if (serviceGroupContextMap.size() > 0) {
>+        if ((serviceGroupContextMap != null) && 
>(serviceGroupContextMap.size() > 0)) {
>             Iterator sopaSessionSgs = 
> serviceGroupContextMap.values().iterator();
>             while (sopaSessionSgs.hasNext()) {
>-                ServiceGroupContext serviceGroupContext =
>-                        (ServiceGroupContext) sopaSessionSgs.next();
>+                ServiceGroupContext serviceGroupContext = 
>(ServiceGroupContext) sopaSessionSgs.next();
>                 cleanupServiceContexts(serviceGroupContext);
>             }
>         }
>
>
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
>  
>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to