You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by ed...@apache.org on 2011/01/20 17:50:19 UTC

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

Author: edwardsmj
Date: Thu Jan 20 16:50:18 2011
New Revision: 1061384

URL: http://svn.apache.org/viewvc?rev=1061384&view=rev
Log:
Stage 1 of Axis2 binding-ws support of async callbacks, as described in TUSCANY-3821

Modified:
    tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/META-INF/MANIFEST.MF
    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/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/META-INF/MANIFEST.MF?rev=1061384&r1=1061383&r2=1061384&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/META-INF/MANIFEST.MF (original)
+++ tuscany/sca-java-2.x/trunk/modules/binding-ws-runtime-axis2/META-INF/MANIFEST.MF Thu Jan 20 16:50:18 2011
@@ -102,6 +102,7 @@ Import-Package: javax.servlet,
  org.apache.tuscany.sca.assembly.xml;version="2.0.0",
  org.apache.tuscany.sca.binding.ws;version="2.0.0",
  org.apache.tuscany.sca.common.xml;version="2.0.0",
+ org.apache.tuscany.sca.context;version="2.0.0",
  org.apache.tuscany.sca.contribution.processor;version="2.0.0",
  org.apache.tuscany.sca.contribution.resolver;version="2.0.0",
  org.apache.tuscany.sca.core;version="2.0.0",
@@ -132,3 +133,4 @@ Bundle-SymbolicName: org.apache.tuscany.
 Bundle-DocURL: http://www.apache.org/
 Bundle-RequiredExecutionEnvironment: J2SE-1.5,
  JavaSE-1.6
+Require-Bundle: org.apache.tuscany.sca.core

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=1061384&r1=1061383&r2=1061384&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 Thu Jan 20 16:50:18 2011
@@ -49,13 +49,23 @@ import org.apache.axis2.client.Operation
 import org.apache.axis2.client.Options;
 import org.apache.axis2.client.ServiceClient;
 import org.apache.axis2.context.MessageContext;
+import org.apache.tuscany.sca.assembly.AssemblyFactory;
 import org.apache.tuscany.sca.assembly.ComponentReference;
 import org.apache.tuscany.sca.assembly.Endpoint;
 import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
+import org.apache.tuscany.sca.binding.ws.WebServiceBindingFactory;
+import org.apache.tuscany.sca.context.CompositeContext;
+import org.apache.tuscany.sca.core.ExtensionPointRegistry;
+import org.apache.tuscany.sca.core.FactoryExtensionPoint;
+import org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory;
+import org.apache.tuscany.sca.core.invocation.AsyncResponseInvoker;
+import org.apache.tuscany.sca.core.invocation.Constants;
 import org.apache.tuscany.sca.interfacedef.util.FaultException;
 import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
 import org.apache.tuscany.sca.invocation.Invoker;
 import org.apache.tuscany.sca.invocation.Message;
+import org.apache.tuscany.sca.invocation.MessageFactory;
+import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
 import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
 import org.oasisopen.sca.ServiceRuntimeException;
 
@@ -209,9 +219,16 @@ public class Axis2ReferenceBindingInvoke
         // Axis2 operationClients can not be shared so create a new one for each request
         final OperationClient operationClient = serviceClient.createClient(wsdlOperationName);
         operationClient.setOptions(options);
-
-        Endpoint callbackEndpoint = msg.getFrom().getCallbackEndpoint();
-
+        
+        Endpoint callbackEndpoint;
+        AsyncResponseInvoker<String> respInvoker = (AsyncResponseInvoker<String>) msg.getHeaders().get(Constants.ASYNC_RESPONSE_INVOKER);
+        if( respInvoker != null ) {
+        	callbackEndpoint = createAsyncResponseEndpoint( msg, respInvoker );
+        	msg.setTo(callbackEndpoint);
+        } else {
+        	callbackEndpoint = msg.getFrom().getCallbackEndpoint();
+        } // end if 
+        
         SOAPEnvelope sev = requestMC.getEnvelope();
         SOAPHeader sh = sev.getHeader();
         
@@ -251,7 +268,36 @@ public class Axis2ReferenceBindingInvoke
         return operationClient;
     } // end method createOperationClient
     
-    private String getToAddress( Message msg ) throws ServiceRuntimeException {
+    /**
+     * Create an Async Response Endpoint
+     * @param msg - the Tuscany message
+     * @param respInvoker - the AsyncResponseInvoker for the async response
+     * @return - an Endpoint which embodies the callback address
+     */
+    private Endpoint createAsyncResponseEndpoint(Message msg,
+			AsyncResponseInvoker<String> respInvoker) {
+		String callbackAddress = respInvoker.getResponseTargetAddress();
+		if( callbackAddress == null ) return null;
+		
+		// Get the necessary factories
+		ExtensionPointRegistry registry = endpointReference.getCompositeContext().getExtensionPointRegistry();
+        FactoryExtensionPoint modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class);
+        RuntimeAssemblyFactory assemblyFactory = (RuntimeAssemblyFactory)modelFactories.getFactory(AssemblyFactory.class);
+        WebServiceBindingFactory webServiceBindingFactory = (WebServiceBindingFactory)modelFactories.getFactory(WebServiceBindingFactory.class);
+		
+        // Create the endpoint
+        RuntimeEndpoint callbackEndpoint = (RuntimeEndpoint)assemblyFactory.createEndpoint();
+        // Add a binding
+        WebServiceBinding cbBinding = webServiceBindingFactory.createWebServiceBinding();
+        cbBinding.setURI(callbackAddress);
+        callbackEndpoint.setBinding(cbBinding);
+        // Embed the response Address URI
+        callbackEndpoint.setURI(callbackAddress);
+        callbackEndpoint.setUnresolved(true);
+		return callbackEndpoint;
+	} // end method createAsyncResponseEndpoint
+
+	private String getToAddress( Message msg ) throws ServiceRuntimeException {
     	String address = null;
     	
         // if target endpoint was not specified when this invoker was created, 
@@ -292,11 +338,11 @@ public class Axis2ReferenceBindingInvoke
      * @throws AxisFault - if an error occurs setting the wsa:From into the header
      */
     private void addWSAMessageIDHeader( SOAPHeader sh, String msgID ) throws AxisFault {
+    	if( msgID == null ) return;
         OMElement idHeader = sh.getOMFactory().createOMElement(QNAME_WSA_MESSAGEID);
         idHeader.setText( msgID );
         
         sh.addChild(idHeader);
-
     } // end method addWSAMessageIDHeader
     
     private static String WS_REF_PARMS = "WS_REFERENCE_PARAMETERS";
@@ -353,7 +399,7 @@ public class Axis2ReferenceBindingInvoke
      * @param msg - the message
      */
     private void addWSARelatesTo( SOAPHeader sh, Message msg ) {
-    	String idValue = (String) msg.getHeaders().get(WS_MESSAGE_ID);
+    	String idValue = (String) msg.getHeaders().get("RELATES_TO");
     	if( idValue != null ){
             OMElement relatesToOM = sh.getOMFactory().createOMElement( QNAME_WSA_RELATESTO );
             OMAttribute relType = sh.getOMFactory().createOMAttribute("RelationshipType", null, SCA_CALLBACK_REL);

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=1061384&r1=1061383&r2=1061384&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 Jan 20 16:50:18 2011
@@ -46,10 +46,14 @@ import org.apache.tuscany.sca.binding.ws
 import org.apache.tuscany.sca.core.ExtensionPointRegistry;
 import org.apache.tuscany.sca.core.FactoryExtensionPoint;
 import org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory;
+import org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl;
+import org.apache.tuscany.sca.core.invocation.AsyncResponseInvoker;
+import org.apache.tuscany.sca.core.invocation.Constants;
 import org.apache.tuscany.sca.interfacedef.Operation;
 import org.apache.tuscany.sca.invocation.Message;
 import org.apache.tuscany.sca.invocation.MessageFactory;
 import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
+import org.apache.tuscany.sca.runtime.RuntimeEndpointReference;
 import org.oasisopen.sca.ServiceRuntimeException;
 
 public class TuscanyServiceProvider {
@@ -151,6 +155,9 @@ public class TuscanyServiceProvider {
 
         // Create a from EPR to hold the details of the callback endpoint, if any
         createCallbackEPR( callbackAddress, inMC, msg );
+        
+        // Set up any async response EPR
+        setupAsyncResponse( msg, callbackAddress );
 
         Message response = endpoint.invoke(msg);
         
@@ -199,6 +206,26 @@ public class TuscanyServiceProvider {
     } // end method 
     
     /**
+     * Setup the necessary infrastructure for the Async response handling
+     * @param msg
+     * @param callbackAddress 
+     */
+    private void setupAsyncResponse(Message msg, String callbackAddress) {
+    	if( !endpoint.isAsyncInvocation() ) return;
+
+    	endpoint.createAsyncServerCallback();
+    	RuntimeEndpointReference asyncCallback = endpoint.getAsyncServerCallback();
+    	
+    	// Create a response invoker, containing the callback address and add it to the message headers
+        AsyncResponseInvoker<String> respInvoker = 
+        	new AsyncResponseInvoker<String>(endpoint, asyncCallback,
+        			callbackAddress, 
+        			(String)msg.getHeaders().get(Constants.MESSAGE_ID),
+        			msg.getOperation().getName(), messageFactory);
+        msg.getHeaders().put(Constants.ASYNC_RESPONSE_INVOKER, respInvoker);
+	} // end method setupAsyncResponse
+
+	/**
      * If there is a callback address, create an EPR for the callback with a referenced endpoint that contains
      * the binding and the target callback address
      * @param callbackAddress - the callback address - may be null
@@ -216,7 +243,7 @@ public class TuscanyServiceProvider {
             from.setTargetEndpoint(fromEndpoint);
             from.setStatus(EndpointReference.Status.WIRED_TARGET_FOUND_AND_MATCHED);
             msg.setFrom(from);
-            Endpoint callbackEndpoint = assemblyFactory.createEndpoint();
+            RuntimeEndpoint callbackEndpoint = (RuntimeEndpoint)assemblyFactory.createEndpoint();
             //
             WebServiceBinding cbBinding = webServiceBindingFactory.createWebServiceBinding();
             cbBinding.setURI(callbackAddress);
@@ -262,7 +289,6 @@ public class TuscanyServiceProvider {
     	return callbackAddress;
     } // end method handleCallbackAddress
     
-    private static String WS_MESSAGE_ID = "WS_MESSAGE_ID";
     /**
      * Handle a SOAP wsa:MessageID header - place the contents into the Tuscany message for use by any callback
      * @param header - the SOAP Headers
@@ -274,11 +300,10 @@ public class TuscanyServiceProvider {
         if (messageID != null) {
         	String idValue = messageID.getText();
         	// Store the value of the message ID element into the message under "WS_MESSAGE_ID"...
-        	msg.getHeaders().put(WS_MESSAGE_ID, idValue);
+        	msg.getHeaders().put(Constants.MESSAGE_ID, idValue);
         } // end if
     } // end method handleMessageID
     
-    private static String WS_RELATES_TO = "WS_RELATES_TO";
     /**
      * Handle a SOAP wsa:RelatesTo header - place the contents into the Tuscany message for use by any callback
      * @param header - the SOAP Headers
@@ -289,8 +314,8 @@ public class TuscanyServiceProvider {
         OMElement messageID = header.getFirstChildWithName(QNAME_WSA_RELATESTO);
         if (messageID != null) {
         	String idValue = messageID.getText();
-        	// Store the value of the message ID element into the message under "WS_MESSAGE_ID"...
-        	msg.getHeaders().put(WS_MESSAGE_ID, idValue);
+        	// Store the value of the message ID element into the message under "RELATES_TO"...
+        	msg.getHeaders().put(Constants.RELATES_TO, idValue);
         } // end if
     } // end method handleMessageID
 } // end class AsyncResponseHandler