You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by sc...@apache.org on 2010/06/14 17:04:42 UTC

svn commit: r954504 - /axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/utility/SAAJFactory.java

Author: scheu
Date: Mon Jun 14 15:04:42 2010
New Revision: 954504

URL: http://svn.apache.org/viewvc?rev=954504&view=rev
Log:
AXIS2-4738
Contributor:Rich Scheuerle
Add caching to MessageFactory and SOAPFactory access.

Modified:
    axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/utility/SAAJFactory.java

Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/utility/SAAJFactory.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/utility/SAAJFactory.java?rev=954504&r1=954503&r2=954504&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/utility/SAAJFactory.java (original)
+++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/utility/SAAJFactory.java Mon Jun 14 15:04:42 2010
@@ -27,6 +27,9 @@ import javax.xml.soap.SOAPException;
 import javax.xml.soap.SOAPFactory;
 import javax.xml.ws.WebServiceException;
 import java.lang.reflect.Method;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * Provides convenience methods to construct a SOAP 1.1 or SOAP 1.2 SAAJ MessageFactory or
@@ -42,6 +45,10 @@ public class SAAJFactory {
     public static final String SOAP_1_1_PROTOCOL = "SOAP 1.1 Protocol";
     public static final String SOAP_1_2_PROTOCOL = "SOAP 1.2 Protocol";
     public static final String DYNAMIC_PROTOCOL = "Dynamic Protocol";
+    
+    // Cache the MessgeFactory and SOAPFactory instances.  There will be only a few at most
+    private static Map<String, MessageFactory> _mmap = new ConcurrentHashMap<String, MessageFactory>();
+    private static Map<String, SOAPFactory> _smap = new ConcurrentHashMap<String, SOAPFactory>();
 
     /**
      * Create SOAPFactory using information from the envelope namespace
@@ -49,10 +56,18 @@ public class SAAJFactory {
      * @param namespace
      * @return
      */
+    
+    // Since there are only a few protocols, this map will only contain 3 or less MessageFactories
     public static SOAPFactory createSOAPFactory(String namespace)
             throws WebServiceException, SOAPException {
-        Method m = getSOAPFactoryNewInstanceProtocolMethod();
         SOAPFactory sf = null;
+        // Try quick cache
+        sf = _smap.get(namespace);
+        if (sf != null){
+            return sf;
+        }
+        
+        Method m = getSOAPFactoryNewInstanceProtocolMethod();
         if (m == null) {
             if (namespace.equals(SOAP11_ENV_NS)) {
                 sf = SOAPFactory.newInstance();
@@ -73,6 +88,10 @@ public class SAAJFactory {
                 throw ExceptionFactory.makeWebServiceException(e);
             }
         }
+        
+        if (sf != null) {
+            _smap.put(namespace, sf);
+        }
         return sf;
     }
 
@@ -82,10 +101,18 @@ public class SAAJFactory {
      * @param namespace
      * @return
      */
+    
     public static MessageFactory createMessageFactory(String namespace)
             throws WebServiceException, SOAPException {
-        Method m = getMessageFactoryNewInstanceProtocolMethod();
+        
+        // Try quick cache
         MessageFactory mf = null;
+        mf = _mmap.get(namespace);
+        if (mf != null){
+            return mf;
+        }
+        
+        Method m = getMessageFactoryNewInstanceProtocolMethod();
         if (m == null) {
             if (namespace.equals(SOAP11_ENV_NS)) {
                 mf = MessageFactory.newInstance();
@@ -106,6 +133,9 @@ public class SAAJFactory {
                 throw ExceptionFactory.makeWebServiceException(e);
             }
         }
+        if (mf != null) {
+            _mmap.put(namespace, mf);
+        }
         return mf;
     }