Author: veithen
Date: Sun Oct 31 14:40:21 2010
New Revision: 1029372

URL: http://svn.apache.org/viewvc?rev=1029372&view=rev
Log:
Modified SOAPConnectionImpl so that it creates a single ConfigurationContext 
instance that will not be shared with others.

Reasons:
* Starting with r921685, if no ConfigurationContext is supplied to the 
ServiceClient, it will create a new one (unless it can locate one using 
MessageContext.getCurrentMessageContext(), but this is not the most common use 
case for SOAPConnection). This means that SOAPConnection#call would create a 
new ConfigurationContext every time, and this is too expensive.
* We need to disable mustUnderstand processing. However, we can't do that on an 
AxisConfiguration that is shared with other components, because this would lead 
to unpredictable results.

Modified:
    
axis/axis2/java/core/trunk/modules/saaj/src/org/apache/axis2/saaj/SOAPConnectionImpl.java

Modified: 
axis/axis2/java/core/trunk/modules/saaj/src/org/apache/axis2/saaj/SOAPConnectionImpl.java
URL: 
http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/saaj/src/org/apache/axis2/saaj/SOAPConnectionImpl.java?rev=1029372&r1=1029371&r2=1029372&view=diff
==============================================================================
--- 
axis/axis2/java/core/trunk/modules/saaj/src/org/apache/axis2/saaj/SOAPConnectionImpl.java
 (original)
+++ 
axis/axis2/java/core/trunk/modules/saaj/src/org/apache/axis2/saaj/SOAPConnectionImpl.java
 Sun Oct 31 14:40:21 2010
@@ -32,6 +32,8 @@ import org.apache.axis2.addressing.Endpo
 import org.apache.axis2.client.OperationClient;
 import org.apache.axis2.client.Options;
 import org.apache.axis2.client.ServiceClient;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.ConfigurationContextFactory;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.engine.DispatchPhase;
@@ -76,8 +78,31 @@ public class SOAPConnectionImpl extends 
     /** Attribute which keeps track of whether this connection has been closed 
*/
     private boolean closed = false;
 
+    private final ConfigurationContext configurationContext;
     private ServiceClient serviceClient;
 
+    SOAPConnectionImpl() throws SOAPException {
+        // Create a new ConfigurationContext that will be used by all 
ServiceClient instances.
+        // There are two reasons why this is necessary:
+        //  * Starting with r921685, if no ConfigurationContext is supplied to 
the ServiceClient,
+        //    it will create a new one (unless it can locate one using 
MessageContext.getCurrentMessageContext(),
+        //    but this is not the most common use case for SOAPConnection). 
This means that
+        //    SOAPConnection#call would create a new ConfigurationContext 
every time, and this is
+        //    too expensive.
+        //  * We need to disable mustUnderstand processing. However, we can't 
do that on an AxisConfiguration
+        //    that is shared with other components, because this would lead to 
unpredictable results.
+        // Note that we could also use a single ServiceClient instance, but 
then the SOAPConnection
+        // implementation would no longer be thread safe. Although thread 
safety is not explicitly required
+        // by the SAAJ specs, it appears that the SOAPConnection in Sun's 
reference implementation is
+        // thread safe.
+        try {
+            configurationContext = 
ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, 
null);
+            
disableMustUnderstandProcessing(configurationContext.getAxisConfiguration());   
         
+        } catch (AxisFault ex) {
+            throw new SOAPException(ex);
+        }
+    }
+    
     /**
      * Sends the given message to the specified endpoint and blocks until it 
has returned the
      * response.
@@ -111,8 +136,7 @@ public class SOAPConnectionImpl extends 
         // initialize the Sender
         OperationClient opClient;
         try {
-            serviceClient = new ServiceClient();   
-            
disableMustUnderstandProcessing(serviceClient.getAxisConfiguration());          
  
+            serviceClient = new ServiceClient(configurationContext, null);
             opClient = 
serviceClient.createClient(ServiceClient.ANON_OUT_IN_OP);
         } catch (AxisFault e) {
             throw new SOAPException(e);
@@ -220,11 +244,11 @@ public class SOAPConnectionImpl extends 
      */
     private void disableMustUnderstandProcessing(AxisConfiguration config) {
         DispatchPhase phase;
-        phase = 
getDispatchPhase(serviceClient.getAxisConfiguration().getInFlowPhases());
+        phase = getDispatchPhase(config.getInFlowPhases());
         if (phase != null) {
             phase.addHandler(new UnderstandAllHeadersHandler());
         }
-        phase = 
getDispatchPhase(serviceClient.getAxisConfiguration().getInFaultFlowPhases());
+        phase = getDispatchPhase(config.getInFaultFlowPhases());
         if (phase != null) {
             phase.addHandler(new UnderstandAllHeadersHandler());
         }


Reply via email to