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
/**