You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by sl...@apache.org on 2011/07/14 15:47:21 UTC

svn commit: r1146712 - /tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/

Author: slaws
Date: Thu Jul 14 13:47:21 2011
New Revision: 1146712

URL: http://svn.apache.org/viewvc?rev=1146712&view=rev
Log:
TUSCANY-3852 - Move the SOAP envelope construction to the start of the response binding chain so that response chain behaves in a similar way to the reference request chain. 

Added:
    tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingResponseInterceptor.java
Modified:
    tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingProvider.java
    tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceInOutSyncMessageReceiver.java
    tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/TuscanyServiceProvider.java

Modified: tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingProvider.java?rev=1146712&r1=1146711&r2=1146712&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingProvider.java Thu Jul 14 13:47:21 2011
@@ -36,8 +36,11 @@ import org.apache.tuscany.sca.core.Exten
 import org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory;
 import org.apache.tuscany.sca.host.http.ServletHost;
 import org.apache.tuscany.sca.interfacedef.InterfaceContract;
+import org.apache.tuscany.sca.invocation.InvocationChain;
+import org.apache.tuscany.sca.invocation.Phase;
 import org.apache.tuscany.sca.policy.PolicySubject;
 import org.apache.tuscany.sca.policy.util.PolicyHelper;
+import org.apache.tuscany.sca.provider.EndpointProvider;
 import org.apache.tuscany.sca.provider.PolicyProvider;
 import org.apache.tuscany.sca.provider.ServiceBindingProvider;
 import org.apache.tuscany.sca.runtime.RuntimeComponent;
@@ -45,7 +48,7 @@ import org.apache.tuscany.sca.runtime.Ru
 import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
 import org.oasisopen.sca.ServiceRuntimeException;
 
-public class Axis2ServiceBindingProvider extends Axis2BaseBindingProvider implements ServiceBindingProvider {
+public class Axis2ServiceBindingProvider extends Axis2BaseBindingProvider implements EndpointProvider {
     private static final Logger logger = Logger.getLogger(Axis2ServiceBindingProvider.class.getName());
 
     // Tuscany extensions
@@ -225,6 +228,18 @@ public class Axis2ServiceBindingProvider
         return true;
     }
     
+    @Override
+    public void configure() {
+        // add in the response interceptor that turns the response message back into a SOAP
+        // envelope before the response returns through the binding chain
+        InvocationChain bindingChain = endpoint.getBindingInvocationChain();
+        
+        // add transport interceptor
+        bindingChain.addInterceptor(Phase.SERVICE_BINDING_POLICY, 
+                                    new Axis2ServiceBindingResponseInterceptor(endpoint) );
+        
+    }
+    
     // Service specific utility operations
     
     private void createAxisService(String endpointURL, Port port) throws AxisFault {

Added: tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingResponseInterceptor.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingResponseInterceptor.java?rev=1146712&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingResponseInterceptor.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceBindingResponseInterceptor.java Thu Jul 14 13:47:21 2011
@@ -0,0 +1,124 @@
+/*
+ * 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.tuscany.sca.binding.ws.axis2.provider;
+
+
+import java.util.Iterator;
+
+import javax.wsdl.BindingOperation;
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMAbstractFactory;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMFactory;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.client.OperationClient;
+import org.apache.axis2.context.MessageContext;
+import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
+import org.apache.tuscany.sca.binding.ws.axis2.context.WSAxis2BindingContext;
+import org.apache.tuscany.sca.invocation.Invoker;
+import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.invocation.Phase;
+import org.apache.tuscany.sca.invocation.PhasedInterceptor;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+
+/**
+ * Create the SOAP envelope from the response message before the reponse
+ * passes back through the binding chain
+ */
+public class Axis2ServiceBindingResponseInterceptor implements PhasedInterceptor {
+
+    private Invoker next; 
+    
+    private RuntimeEndpoint endpoint;
+    private WebServiceBinding wsBinding;
+
+    public Axis2ServiceBindingResponseInterceptor(RuntimeEndpoint endpoint) {
+        this.endpoint = endpoint;
+        this.wsBinding = (WebServiceBinding)endpoint.getBinding();
+    }
+
+    public Message invoke(Message msg) {
+        
+        Message response =  getNext().invoke(msg);
+          
+        // set up the response envelope here before we return back through the binding chain
+        // so that this is symetrical with how the outgoing reference binding chain behaves 
+        WSAxis2BindingContext bindingContext = msg.getBindingContext();
+        MessageContext responseMC = bindingContext.getAxisOutMessageContext();
+        
+        if(!response.isFault()) {
+            OMElement responseOM = response.getBody();
+            
+            if (wsBinding.isRpcLiteral()){               
+                // add the response wrapping element
+                OMFactory factory = OMAbstractFactory.getOMFactory();
+                String wrapperNamespace = null;
+                
+                // the rpc style creates a wrapper with a namespace where the namespace is
+                // defined on the wsdl binding operation. If no binding is provided by the 
+                // user then default to the namespace of the WSDL itself. 
+                if (wsBinding.getBinding() != null){
+                    Iterator iter = wsBinding.getBinding().getBindingOperations().iterator();
+                    loopend:
+                    while(iter.hasNext()){
+                        BindingOperation bOp = (BindingOperation)iter.next();
+                        if (bOp.getName().equals(msg.getOperation().getName())){
+                            for (Object ext : bOp.getBindingOutput().getExtensibilityElements()){
+                                if (ext instanceof javax.wsdl.extensions.soap.SOAPBody){
+                                    wrapperNamespace = ((javax.wsdl.extensions.soap.SOAPBody)ext).getNamespaceURI();
+                                    break loopend;
+                                }
+                            }
+                        }
+                    }
+                }
+                
+                if (wrapperNamespace == null){
+                    wrapperNamespace =  wsBinding.getUserSpecifiedWSDLDefinition().getNamespace();
+                }
+                          
+                QName operationResponseQName = new QName(wrapperNamespace,
+                                                 msg.getOperation().getName() + "Response");
+                OMElement operationResponseElement = factory.createOMElement(operationResponseQName);
+                operationResponseElement.addChild(responseOM);
+                responseOM = operationResponseElement;
+            }  
+            
+            if (null != responseOM ) {
+                responseMC.getEnvelope().getBody().addChild(responseOM);
+            }
+        }       
+        
+        return response;
+    }
+
+    public Invoker getNext() {
+        return next;
+    }
+
+    public void setNext(Invoker next) {
+        this.next = next;
+    }
+
+    public String getPhase() {
+        return Phase.SERVICE_BINDING_POLICY;
+    }
+    
+}

Modified: tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceInOutSyncMessageReceiver.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceInOutSyncMessageReceiver.java?rev=1146712&r1=1146711&r2=1146712&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceInOutSyncMessageReceiver.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ServiceInOutSyncMessageReceiver.java Thu Jul 14 13:47:21 2011
@@ -48,13 +48,13 @@ public class Axis2ServiceInOutSyncMessag
         try {
             OMElement requestOM = inMC.getEnvelope().getBody().getFirstElement();
             
-            OMElement responseOM = (OMElement)provider.invoke(requestOM, inMC, outMC);
-
+            // create the out soap message before the invoke so it's available to the message chain
+            // during response processing
             SOAPEnvelope soapEnvelope = getSOAPFactory(inMC).getDefaultEnvelope();
-            if (null != responseOM ) {
-                soapEnvelope.getBody().addChild(responseOM);
-            }
             outMC.setEnvelope(soapEnvelope);
+            
+            provider.invoke(requestOM, inMC, outMC);
+            
             outMC.getOperationContext().setProperty(Constants.RESPONSE_WRITTEN, Constants.VALUE_TRUE);
 
         } catch (InvocationTargetException e) {

Modified: tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/TuscanyServiceProvider.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/TuscanyServiceProvider.java?rev=1146712&r1=1146711&r2=1146712&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/TuscanyServiceProvider.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/TuscanyServiceProvider.java Thu Jul 14 13:47:21 2011
@@ -170,44 +170,9 @@ public class TuscanyServiceProvider {
             throw new InvocationTargetException((Throwable) response.getBody());
         }
         
-        OMElement responseOM = response.getBody();
-        
-        if (wsBinding.isRpcLiteral()){               
-            // add the response wrapping element
-            OMFactory factory = OMAbstractFactory.getOMFactory();
-            String wrapperNamespace = null;
-            
-            // the rpc style creates a wrapper with a namespace where the namespace is
-            // defined on the wsdl binding operation. If no binding is provided by the 
-            // user then default to the namespace of the WSDL itself. 
-            if (wsBinding.getBinding() != null){
-                Iterator iter = wsBinding.getBinding().getBindingOperations().iterator();
-                loopend:
-                while(iter.hasNext()){
-                    BindingOperation bOp = (BindingOperation)iter.next();
-                    if (bOp.getName().equals(msg.getOperation().getName())){
-                        for (Object ext : bOp.getBindingOutput().getExtensibilityElements()){
-                            if (ext instanceof javax.wsdl.extensions.soap.SOAPBody){
-                                wrapperNamespace = ((javax.wsdl.extensions.soap.SOAPBody)ext).getNamespaceURI();
-                                break loopend;
-                            }
-                        }
-                    }
-                }
-            }
-            
-            if (wrapperNamespace == null){
-                wrapperNamespace =  wsBinding.getUserSpecifiedWSDLDefinition().getNamespace();
-            }
-                      
-            QName operationResponseQName = new QName(wrapperNamespace,
-                                             msg.getOperation().getName() + "Response");
-            OMElement operationResponseElement = factory.createOMElement(operationResponseQName);
-            operationResponseElement.addChild(responseOM);
-            responseOM = operationResponseElement;
-        }
-        
-        return responseOM;
+        // The envelope has already been set up in Axis2ServiceBindingResponseInvoker
+        // so no need to return anything here
+        return null;         
     } // end method 
     
     /**