summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/trunk
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/trunk')
-rw-r--r--sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingInvoker.java81
1 files changed, 61 insertions, 20 deletions
diff --git a/sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingInvoker.java b/sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingInvoker.java
index 3c89c53b96..25c6e358bb 100644
--- a/sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingInvoker.java
+++ b/sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingInvoker.java
@@ -94,7 +94,8 @@ public class JAXWSBindingInvoker implements Invoker, DataExchangeSemantics {
public static final QName CONVERSATION_ID_REFPARM_QN =
new QName(SCA11_TUSCANY_NS, "ConversationID", TUSCANY_PREFIX);
- protected Dispatch<SOAPMessage> dispatch;
+ private boolean dynamicDispatchForCallback = false;
+ protected Dispatch<SOAPMessage> staticDispatch;
private MessageFactory messageFactory;
private Operation operation;
private WebServiceBinding wsBinding;
@@ -109,10 +110,24 @@ public class JAXWSBindingInvoker implements Invoker, DataExchangeSemantics {
this.operation = operation;
this.wsBinding = wsBinding;
this.endpointReference = endpointReference;
- this.dispatch = createDispatch(wsBinding);
+
+ if (endpointReference.getReference().isForCallback()) {
+ this.dynamicDispatchForCallback = true;
+ } else {
+ this.staticDispatch = createStaticDispatch(wsBinding);
+ }
+ }
+
+ protected Dispatch<SOAPMessage> createDynamicDispatch(WebServiceBinding wsBinding) {
+ QName serviceName = wsBinding.getService().getQName();
+ QName portName = new QName(serviceName.getNamespaceURI(), wsBinding.getPort().getName());
+ Service service = Service.create(serviceName);
+ service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, wsBinding.getURI());
+
+ return service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
}
- protected Dispatch<SOAPMessage> createDispatch(WebServiceBinding wsBinding) {
+ protected Dispatch<SOAPMessage> createStaticDispatch(WebServiceBinding wsBinding) {
URL wsdlLocation = null;
try {
if (wsBinding.getGeneratedWSDLDocument() != null && wsBinding.getGeneratedWSDLDocument().getDocumentBaseURI() != null) {
@@ -130,21 +145,31 @@ public class JAXWSBindingInvoker implements Invoker, DataExchangeSemantics {
e1.printStackTrace();
}
- QName serviceName = null;
- QName portName = null;
- Service service = null;
-
if (wsdlLocation != null) {
- serviceName = wsBinding.getServiceName();
- portName = new QName(serviceName.getNamespaceURI(), wsBinding.getPortName());
- service = Service.create(wsdlLocation, serviceName);
+ return createDispatchFromWSDL(wsBinding, wsdlLocation);
} else {
- serviceName = wsBinding.getService().getQName();
- portName = new QName(serviceName.getNamespaceURI(), wsBinding.getPort().getName());
- service = Service.create(serviceName);
- service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, wsBinding.getURI());
- }
-
+ return createDispatchFromURI(wsBinding, wsBinding.getURI());
+ }
+ }
+
+ protected Dispatch<SOAPMessage> createDynamicDispatch(WebServiceBinding wsBinding, String uri) {
+ return createDispatchFromURI(wsBinding, uri);
+ }
+
+ private Dispatch<SOAPMessage> createDispatchFromWSDL(WebServiceBinding wsBinding, URL wsdlLocation) {
+ QName serviceName = wsBinding.getServiceName();
+ QName portName = new QName(serviceName.getNamespaceURI(), wsBinding.getPortName());
+ Service service = Service.create(wsdlLocation, serviceName);
+
+ return service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
+ }
+
+ protected Dispatch<SOAPMessage> createDispatchFromURI(WebServiceBinding wsBinding, String uri) {
+ QName serviceName = wsBinding.getService().getQName();
+ QName portName = new QName(serviceName.getNamespaceURI(), wsBinding.getPort().getName());
+ Service service = Service.create(serviceName);
+ service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, uri);
+
return service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
}
@@ -227,16 +252,32 @@ public class JAXWSBindingInvoker implements Invoker, DataExchangeSemantics {
Node msgNode = body.getOwnerDocument().importNode((Node)args[0], true);
body.appendChild(msgNode);
soapMessage.saveChanges();
+
+ Dispatch<SOAPMessage> invocationDispatch = null;
+
+ //TODO - captured static case as well???
+ if (dynamicDispatchForCallback) {
+ Endpoint ep = msg.getTo();
+ if (ep != null && ep.getBinding() != null) {
+ String address = ep.getBinding().getURI();
+ invocationDispatch = createDynamicDispatch(wsBinding, address);
+ } else {
+ throw new ServiceRuntimeException("[BWS20025] Unable to determine destination endpoint for endpoint reference " + endpointReference);
+ }
+ } else {
+ invocationDispatch = staticDispatch;
+ }
+
if (operation.isNonBlocking()) {
- dispatch.invokeOneWay(soapMessage);
+ invocationDispatch.invokeOneWay(soapMessage);
return null;
}
if (action != null) {
- dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, true);
- dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, action);
+ invocationDispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, true);
+ invocationDispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, action);
}
- SOAPMessage response = dispatch.invoke(soapMessage);
+ SOAPMessage response = invocationDispatch.invoke(soapMessage);
return response;
}