Author: edwardsmj
Date: Sat Jun 19 06:41:04 2010
New Revision: 956193

URL: http://svn.apache.org/viewvc?rev=956193&view=rev
Log:
Handle the wsa:ReferenceParameters SOAP header if present on the invocation of 
a bidirectional service offered as a Web service - pass the parameters back in 
the SOAP headers of any callback operation invocation from the service to the 
client, as required by TUSCANY-3592

Modified:
    
tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ReferenceBindingInvoker.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/Axis2ReferenceBindingInvoker.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/Axis2ReferenceBindingInvoker.java?rev=956193&r1=956192&r2=956193&view=diff
==============================================================================
--- 
tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ReferenceBindingInvoker.java
 (original)
+++ 
tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/axis2/provider/Axis2ReferenceBindingInvoker.java
 Sat Jun 19 06:41:04 2010
@@ -21,6 +21,7 @@ package org.apache.tuscany.sca.binding.w
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
+import java.util.Iterator;
 
 import javax.wsdl.Operation;
 import javax.wsdl.PortType;
@@ -28,6 +29,7 @@ import javax.xml.namespace.QName;
 
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMNode;
 import org.apache.axiom.soap.SOAPBody;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFactory;
@@ -156,7 +158,7 @@ public class Axis2ReferenceBindingInvoke
         requestMC.setTo( new EndpointReference(toAddress) ); 
         
         if( isInvocationForCallback( msg ) ) {
-               addWSAToHeader( sh, toAddress );
+               addWSAToHeader( sh, toAddress, msg );
                addWSAActionHeader( sh );
                addWSARelatesTo( sh, msg );
         } // end if 
@@ -204,13 +206,23 @@ public class Axis2ReferenceBindingInvoke
 
     } // end method addWSAFromHeader
     
-    private void addWSAToHeader( SOAPHeader sh, String address ) {
+    private static String WS_REF_PARMS = "WS_REFERENCE_PARAMETERS";
+    private void addWSAToHeader( SOAPHeader sh, String address, Message msg ) {
         // Create wsa:To header which is required by ws-addressing spec
-
         OMElement wsaToOM = sh.getOMFactory().createOMElement(QNAME_WSA_TO);
         wsaToOM.setText( address );
         sh.addChild(wsaToOM);
         
+        // Deal with Reference Parameters, if present - copy to the header 
without the wsa:ReferenceParameters wrapper
+        OMElement refParms = (OMElement) msg.getHeaders().get(WS_REF_PARMS);
+        if( refParms != null ) {
+               Iterator<?> children = refParms.getChildren();
+               while( children.hasNext() ) {
+                       OMNode node = (OMNode) children.next();
+                       sh.addChild(node);
+               }
+        } // end if 
+        
     } // end method addWSAActionHeader
         
     

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=956193&r1=956192&r2=956193&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
 Sat Jun 19 06:41:04 2010
@@ -50,6 +50,8 @@ public class TuscanyServiceProvider {
         new QName(AddressingConstants.Final.WSA_NAMESPACE, 
AddressingConstants.EPR_ADDRESS);
     public static final QName QNAME_WSA_FROM =
         new QName(AddressingConstants.Final.WSA_NAMESPACE, 
AddressingConstants.WSA_FROM);
+    public static final QName QNAME_WSA_REPLYTO =
+        new QName(AddressingConstants.Final.WSA_NAMESPACE, 
AddressingConstants.WSA_REPLY_TO);
     public static final QName QNAME_WSA_REFERENCE_PARAMETERS =
         new QName(AddressingConstants.Final.WSA_NAMESPACE, 
AddressingConstants.EPR_REFERENCE_PARAMETERS);
     public static final QName QNAME_WSA_MESSAGEID =
@@ -107,15 +109,7 @@ public class TuscanyServiceProvider {
         //FIXME: can we use the Axis2 addressing support for this?
         SOAPHeader header = inMC.getEnvelope().getHeader();
         if (header != null) {
-            OMElement from = header.getFirstChildWithName(QNAME_WSA_FROM);
-            if (from != null) {
-                OMElement callbackAddrElement = 
from.getFirstChildWithName(QNAME_WSA_ADDRESS);
-                if (callbackAddrElement != null) {
-                    if 
(endpoint.getService().getInterfaceContract().getCallbackInterface() != null) {
-                        callbackAddress = callbackAddrElement.getText();
-                    }
-                }
-            } // end if
+            callbackAddress = handleCallbackAddress( header, msg );
             // Retrieve other callback-related headers
             handleMessageIDHeader( header, msg );
         } // end if
@@ -149,6 +143,27 @@ public class TuscanyServiceProvider {
         }
         return response.getBody();
     } // end method 
+
+    private static String WS_REF_PARMS = "WS_REFERENCE_PARAMETERS";
+    private String handleCallbackAddress( SOAPHeader header, Message msg ) {
+       String callbackAddress = null;
+        
+       OMElement from = header.getFirstChildWithName(QNAME_WSA_FROM);
+       if( from == null ) from = 
header.getFirstChildWithName(QNAME_WSA_REPLYTO);
+       
+        if (from != null) {
+            OMElement callbackAddrElement = 
from.getFirstChildWithName(QNAME_WSA_ADDRESS);
+            if (callbackAddrElement != null) {
+                if 
(endpoint.getService().getInterfaceContract().getCallbackInterface() != null) {
+                    callbackAddress = callbackAddrElement.getText();
+                }
+                OMElement refParms = 
from.getFirstChildWithName(QNAME_WSA_REFERENCE_PARAMETERS);
+                if( refParms != null ) msg.getHeaders().put(WS_REF_PARMS, 
refParms);
+            }
+        } // end if
+       
+       return callbackAddress;
+    } // end method handleCallbackAddress
     
     private static String WS_MESSAGE_ID = "WS_MESSAGE_ID";
     /**


Reply via email to