From adfedb08bb13b1037314d59714f27ba252639da0 Mon Sep 17 00:00:00 2001 From: scottkurz Date: Wed, 30 Nov 2011 21:16:32 +0000 Subject: Use MESSAGE_ID instead of WS_MESSAGE_ID as Tuscany message header for handling callbacks' handling of WS-A headers. git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1208790 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/binding/ws/jaxws/JAXWSBindingInvoker.java | 5 +- .../sca/binding/ws/jaxws/JAXWSBindingProvider.java | 97 +++++++++++++--------- 2 files changed, 60 insertions(+), 42 deletions(-) (limited to 'sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws') 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 a68d7691ba..f251c97bb6 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 @@ -56,6 +56,7 @@ import javax.xml.ws.soap.SOAPFaultException; 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.core.invocation.Constants; import org.apache.tuscany.sca.interfacedef.Operation; import org.apache.tuscany.sca.interfacedef.util.FaultException; import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface; @@ -419,7 +420,6 @@ public class JAXWSBindingInvoker implements Invoker, DataExchangeSemantics { } // end method addWSAActionHeader - private static String WS_MESSAGE_ID = "WS_MESSAGE_ID"; protected static String SCA_CALLBACK_REL = "http://docs.oasis-open.org/opencsa/sca-bindings/ws/callback"; /** @@ -432,7 +432,8 @@ public class JAXWSBindingInvoker implements Invoker, DataExchangeSemantics { * @throws SOAPException */ private void addWSARelatesTo(SOAPHeader sh, Message msg) throws SOAPException { - String idValue = (String)msg.getHeaders().get(WS_MESSAGE_ID); + + String idValue = (String)msg.getHeaders().get(Constants.MESSAGE_ID); if (idValue != null) { SOAPHeaderElement relatesToH = sh.addHeaderElement(QNAME_WSA_RELATESTO); relatesToH.addAttribute(new QName(null, "RelationshipType"), SCA_CALLBACK_REL); diff --git a/sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingProvider.java b/sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingProvider.java index 9678cbf8c4..6afaf3c7c8 100644 --- a/sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingProvider.java +++ b/sca-java-2.x/trunk/modules/binding-ws-runtime-jaxws/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/JAXWSBindingProvider.java @@ -45,6 +45,7 @@ import org.apache.tuscany.sca.binding.ws.WebServiceBinding; import org.apache.tuscany.sca.binding.ws.WebServiceBindingFactory; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory; +import org.apache.tuscany.sca.core.invocation.Constants; import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint; import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.Operation; @@ -63,6 +64,7 @@ public class JAXWSBindingProvider implements Provider { public static final String WSA_FINAL_NAMESPACE = "http://www.w3.org/2005/08/addressing"; public static final QName QNAME_WSA_ADDRESS = new QName(WSA_FINAL_NAMESPACE, "Address"); public static final QName QNAME_WSA_FROM = new QName(WSA_FINAL_NAMESPACE, "From"); + public static final QName QNAME_WSA_RELATESTO = new QName(WSA_FINAL_NAMESPACE, "RelatesTo"); public static final QName QNAME_WSA_REPLYTO = new QName(WSA_FINAL_NAMESPACE, "ReplyTo"); public static final QName QNAME_WSA_REFERENCE_PARAMETERS = new QName(WSA_FINAL_NAMESPACE, "ReferenceParameters"); public static final QName QNAME_WSA_MESSAGEID = new QName(WSA_FINAL_NAMESPACE, "MessageID"); @@ -72,12 +74,12 @@ public class JAXWSBindingProvider implements Provider { private WebServiceBinding wsBinding; private javax.xml.soap.MessageFactory soapMessageFactory; private SOAPFactory soapFactory; - + @Resource private WebServiceContext context; private RuntimeAssemblyFactory assemblyFactory; private WebServiceBindingFactory webServiceBindingFactory; - + public JAXWSBindingProvider(){ // to keep Axis2 JAXWS implementation happy } @@ -107,7 +109,7 @@ public class JAXWSBindingProvider implements Provider { // Set to use the DOM data binding InterfaceContract contract = wsBinding.getBindingInterfaceContract(); contract.getInterface().resetDataBinding(Node.class.getName()); - + // Can we safely assume there is only one port because you configure // a binding in the following ways: // 1/ default - one port generated = host domain : host port / structural path @@ -124,7 +126,7 @@ public class JAXWSBindingProvider implements Provider { // specific processing by adding a root if it's not already present if (!wsBinding.getURI().startsWith("http://")) { String serviceURI = null; - + // look in the port for the location URL List wsdlPortExtensions = wsBinding.getPort().getExtensibilityElements(); for (final Object extension : wsdlPortExtensions) { @@ -132,12 +134,12 @@ public class JAXWSBindingProvider implements Provider { serviceURI = ((SOAPAddress) extension).getLocationURI(); } } - + if (serviceURI == null || !serviceURI.startsWith("http://")){ serviceURI = "http://localhost:" + defaultPort + wsBinding.getURI(); } - + wsBinding.setURI(serviceURI); } System.out.println("Binding.ws JAXWS provider - Service URI: " + wsBinding.getURI()); @@ -171,27 +173,28 @@ public class JAXWSBindingProvider implements Provider { Object[] body = new Object[]{root}; requestMsg.setBody(body); requestMsg.setOperation(operation); - + SOAPHeader header = request.getSOAPHeader(); String callbackAddress = null; if (header != null) { callbackAddress = handleCallbackAddress( header, requestMsg ); // Retrieve other callback-related headers handleMessageIDHeader( header, requestMsg ); + handleRelatesToHeader( header, requestMsg ); } // end if // Create a from EPR to hold the details of the callback endpoint EndpointReference from = null; if (callbackAddress != null ) { - // Check for special (& not allowed!) WS_Addressing values - checkCallbackAddress( callbackAddress, request ); - // + // Check for special (& not allowed!) WS_Addressing values + checkCallbackAddress( callbackAddress, request ); + // from = assemblyFactory.createEndpointReference(); Endpoint fromEndpoint = assemblyFactory.createEndpoint(); from.setTargetEndpoint(fromEndpoint); from.setStatus(EndpointReference.Status.WIRED_TARGET_FOUND_AND_MATCHED); requestMsg.setFrom(from); - Endpoint callbackEndpoint = assemblyFactory.createEndpoint(); + RuntimeEndpoint callbackEndpoint = (RuntimeEndpoint)assemblyFactory.createEndpoint(); // WebServiceBinding cbBinding = webServiceBindingFactory.createWebServiceBinding(); cbBinding.setURI(callbackAddress); @@ -203,11 +206,11 @@ public class JAXWSBindingProvider implements Provider { } Message responseMsg = endpoint.invoke(operation, requestMsg); - + SOAPMessage response = soapMessageFactory.createMessage(); if (responseMsg.isFault()) { -// ServiceRuntimeException e = responseMsg.getBody(); -// throw e; + // ServiceRuntimeException e = responseMsg.getBody(); + // throw e; FaultException fe = responseMsg.getBody(); SOAPFault fault = response.getSOAPBody().addFault(new QName(response.getSOAPBody().getNamespaceURI(), "Server"), fe.getMessage()); @@ -230,14 +233,14 @@ public class JAXWSBindingProvider implements Provider { private static String WS_REF_PARMS = "WS_REFERENCE_PARAMETERS"; private String handleCallbackAddress( SOAPHeader header, Message msg ) { String callbackAddress = null; - + Iterator it = header.getChildElements(QNAME_WSA_FROM); SOAPElement from = it.hasNext() ? it.next() : null; if( from == null ) { Iterator it2 = header.getChildElements(QNAME_WSA_REPLYTO); from = it2.hasNext() ? it2.next() : null; } - + if (from != null) { Iterator it2 = header.getChildElements(QNAME_WSA_ADDRESS); SOAPElement callbackAddrElement = it2.hasNext() ? it2.next() : null; @@ -245,17 +248,16 @@ public class JAXWSBindingProvider implements Provider { if (endpoint.getService().getInterfaceContract().getCallbackInterface() != null) { callbackAddress = callbackAddrElement.getTextContent(); } -// OMElement refParms = from.getFirstChildWithName(QNAME_WSA_REFERENCE_PARAMETERS); + // OMElement refParms = from.getFirstChildWithName(QNAME_WSA_REFERENCE_PARAMETERS); Iterator it3 = header.getChildElements(QNAME_WSA_REFERENCE_PARAMETERS); SOAPElement refParms = it3.hasNext() ? it3.next() : null; 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"; + /** * Handle a SOAP wsa:MessageID header - place the contents into the Tuscany message for use by any callback * @param header - the SOAP Headers @@ -266,11 +268,26 @@ public class JAXWSBindingProvider implements Provider { Iterator it = header.getChildElements(QNAME_WSA_MESSAGEID); SOAPElement messageID = it.hasNext() ? it.next() : null; if (messageID != null) { - String idValue = messageID.getTextContent(); - // Store the value of the message ID element into the message under "WS_MESSAGE_ID"... - msg.getHeaders().put(WS_MESSAGE_ID, idValue); + String idValue = messageID.getTextContent(); + msg.getHeaders().put(Constants.MESSAGE_ID, idValue); } // end if } // end method handleMessageID + + /** + * Handle a SOAP wsa:RelatesTo header - place the contents into the Tuscany message for use by any callback + * @param header - the SOAP Headers + * @param msg - the Tuscany Message + */ + private void handleRelatesToHeader( SOAPHeader header, Message msg ) { + if( header == null ) return; + Iterator it = header.getChildElements(QNAME_WSA_RELATESTO); + SOAPElement relatesTo = it.hasNext() ? it.next() : null; + if (relatesTo != null) { + String relatesToVal = relatesTo.getTextContent(); + msg.getHeaders().put(Constants.RELATES_TO, relatesToVal); + } // end if + } // end method handleRelatesToHeader + // Special WS_Addressing values private static String WS_ADDR_ANONYMOUS = "http://www.w3.org/2005/08/addressing/anonymous"; private static String WS_ADDR_NONE = "http://www.w3.org/2005/08/addressing/none"; @@ -285,28 +302,28 @@ public class JAXWSBindingProvider implements Provider { private void checkCallbackAddress( String callbackAddress, SOAPMessage request) { // If the address is anonymous or none, throw a SOAP fault... if( WS_ADDR_ANONYMOUS.equals(callbackAddress) || WS_ADDR_NONE.equals(callbackAddress) ) { - triggerOnlyNonAnonymousAddressSupportedFault(request, "wsa:From"); + triggerOnlyNonAnonymousAddressSupportedFault(request, "wsa:From"); } } // end method checkCallbackAddress // wsa:OnlyAnonymousAddressSupported // wsa:OnlyNonAnonymousAddressSupported public void triggerOnlyNonAnonymousAddressSupportedFault(SOAPMessage request, String incorrectHeaderName){ -// TODO -// String namespace = (String)messageContext.getProperty(AddressingConstants.WS_ADDRESSING_VERSION); -// if (Submission.WSA_NAMESPACE.equals(namespace)) { -// triggerAddressingFault(messageContext, Final.FAULT_HEADER_PROB_HEADER_QNAME, -// AddressingConstants.WSA_DEFAULT_PREFIX + ":" + -// incorrectHeaderName, Submission.FAULT_INVALID_HEADER, -// null, AddressingMessages.getMessage( -// "spec.submission.FAULT_INVALID_HEADER_REASON")); -// } else { -// triggerAddressingFault(messageContext, Final.FAULT_HEADER_PROB_HEADER_QNAME, -// AddressingConstants.WSA_DEFAULT_PREFIX + ":" + -// incorrectHeaderName, Final.FAULT_INVALID_HEADER, -// Final.FAULT_ONLY_NON_ANONYMOUS_ADDRESS_SUPPORTED, -// AddressingMessages.getMessage( -// "spec.final.FAULT_INVALID_HEADER_REASON")); -// } + // TODO + // String namespace = (String)messageContext.getProperty(AddressingConstants.WS_ADDRESSING_VERSION); + // if (Submission.WSA_NAMESPACE.equals(namespace)) { + // triggerAddressingFault(messageContext, Final.FAULT_HEADER_PROB_HEADER_QNAME, + // AddressingConstants.WSA_DEFAULT_PREFIX + ":" + + // incorrectHeaderName, Submission.FAULT_INVALID_HEADER, + // null, AddressingMessages.getMessage( + // "spec.submission.FAULT_INVALID_HEADER_REASON")); + // } else { + // triggerAddressingFault(messageContext, Final.FAULT_HEADER_PROB_HEADER_QNAME, + // AddressingConstants.WSA_DEFAULT_PREFIX + ":" + + // incorrectHeaderName, Final.FAULT_INVALID_HEADER, + // Final.FAULT_ONLY_NON_ANONYMOUS_ADDRESS_SUPPORTED, + // AddressingMessages.getMessage( + // "spec.final.FAULT_INVALID_HEADER_REASON")); + // } } } -- cgit v1.2.3