You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mr...@apache.org on 2007/08/17 23:37:16 UTC
svn commit: r567153 - in /ode/trunk:
axis2/src/main/java/org/apache/ode/axis2/
axis2/src/main/java/org/apache/ode/axis2/hooks/
axis2/src/main/java/org/apache/ode/axis2/util/
utils/src/main/java/org/apache/ode/utils/
Author: mriou
Date: Fri Aug 17 14:37:15 2007
New Revision: 567153
URL: http://svn.apache.org/viewvc?view=rev&rev=567153
Log:
ODE-154 Fix for WS-Addressing headers contributed by Richard Taylor.
Modified:
ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java
ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/SessionOutHandler.java
ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java
ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java
Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java
URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java?view=diff&rev=567153&r1=567152&r2=567153
==============================================================================
--- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java (original)
+++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/ExternalService.java Fri Aug 17 14:37:15 2007
@@ -43,6 +43,7 @@
import org.apache.ode.bpel.iapi.PartnerRoleMessageExchange;
import org.apache.ode.bpel.iapi.Scheduler;
import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.Namespaces;
import org.apache.ode.utils.uuid.UUID;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -108,9 +109,8 @@
}
Options options = new Options();
+ options.setAction(mctx.getSoapAction());
options.setTo(axisEPR);
- String soapAction = _converter.getSoapAction(odeMex.getOperationName());
- options.setAction(soapAction);
options.setTimeOutInMilliSeconds(60000);
CachedServiceClient cached = _cachedClients.get();
@@ -187,6 +187,23 @@
}
/**
+ * Extracts the action to be used for the given operation. It first checks to see
+ * if a value is specified using WS-Addressing in the portType, it then falls back onto
+ * getting it from the SOAP Binding.
+ * @param operation the name of the operation to get the Action for
+ * @return The action value for the specified operation
+ */
+ private String getAction(String operation)
+ {
+ String action = _converter.getWSAInputAction(operation);
+ if (action == null || "".equals(action))
+ {
+ action = _converter.getSoapAction(operation);
+ }
+ return action;
+ }
+
+ /**
* Extracts endpoint information from ODE message exchange to stuff them into Axis MessageContext.
*/
private void writeHeader(MessageContext ctxt, PartnerRoleMessageExchange odeMex) {
@@ -204,9 +221,7 @@
targetEPR.setSessionId(partnerSessionId);
}
options.setProperty("targetSessionEndpoint", targetEPR);
- String soapAction = _converter.getSoapAction(odeMex.getOperationName());
- options.setProperty("soapAction", soapAction);
-
+
if (myRoleEPR != null) {
if (myRoleSessionId != null) {
if (__log.isDebugEnabled()) {
@@ -220,12 +235,15 @@
__log.debug("My-Role EPR not specified, SEP will not be used.");
}
- if (MessageExchange.MessageExchangePattern.REQUEST_RESPONSE == odeMex.getMessageExchangePattern()) {
- EndpointReference annonEpr =
- new EndpointReference("http://www.w3.org/2005/08/addressing/anonymous");
- ctxt.setReplyTo(annonEpr);
- ctxt.setMessageID("uuid:"+new UUID().toString());
- }
+ String action = getAction(odeMex.getOperationName());
+ ctxt.setSoapAction(action);
+
+ if (MessageExchange.MessageExchangePattern.REQUEST_RESPONSE == odeMex.getMessageExchangePattern()) {
+ EndpointReference annonEpr =
+ new EndpointReference(Namespaces.WS_ADDRESSING_ANON_URI);
+ ctxt.setReplyTo(annonEpr);
+ ctxt.setMessageID("uuid:" + new UUID().toString());
+ }
}
public org.apache.ode.bpel.iapi.EndpointReference getInitialEndpointReference() {
Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/SessionOutHandler.java
URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/SessionOutHandler.java?view=diff&rev=567153&r1=567152&r2=567153
==============================================================================
--- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/SessionOutHandler.java (original)
+++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/hooks/SessionOutHandler.java Fri Aug 17 14:37:15 2007
@@ -60,19 +60,35 @@
if (header == null) {
header = factory.createSOAPHeader(messageContext.getEnvelope());
}
+
if (otargetSession != null && otargetSession instanceof MutableEndpoint) {
- WSAEndpoint targetEpr = EndpointFactory.convertToWSA((MutableEndpoint) otargetSession);
-
- OMElement to = factory.createOMElement("To", wsAddrNS);
+ WSAEndpoint targetEpr = EndpointFactory.convertToWSA((MutableEndpoint) otargetSession);
+
+ OMElement to = factory.createOMElement("To", wsAddrNS);
header.addChild(to);
to.setText(targetEpr.getUrl());
- String soapAction = (String) messageContext.getProperty("soapAction");
+ String action = messageContext.getSoapAction();
OMElement wsaAction = factory.createOMElement("Action", wsAddrNS);
header.addChild(wsaAction);
- wsaAction.setText(soapAction);
+ wsaAction.setText(action);
+ // we only set the ReplyTo and MessageID headers if doing Request-Response
+ org.apache.axis2.addressing.EndpointReference replyToEpr = messageContext.getReplyTo();
+ if (replyToEpr != null) {
+ OMElement replyTo = factory.createOMElement("ReplyTo", wsAddrNS);
+ OMElement address = factory.createOMElement("Address", wsAddrNS);
+ replyTo.addChild(address);
+ header.addChild(replyTo);
+ address.setText(replyToEpr.getAddress());
+
+ String messageId = messageContext.getMessageID();
+ OMElement messageIdElem = factory.createOMElement("MessageID", wsAddrNS);
+ header.addChild(messageIdElem);
+ messageIdElem.setText(messageId);
+ }
+
if (targetEpr.getSessionId() != null) {
OMElement session = factory.createOMElement("session", intalioSessNS);
header.addChild(session);
Modified: ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java
URL: http://svn.apache.org/viewvc/ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java?view=diff&rev=567153&r1=567152&r2=567153
==============================================================================
--- ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java (original)
+++ ode/trunk/axis2/src/main/java/org/apache/ode/axis2/util/SoapMessageConverter.java Fri Aug 17 14:37:15 2007
@@ -34,6 +34,7 @@
import org.apache.ode.axis2.Messages;
import org.apache.ode.axis2.OdeFault;
import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.Namespaces;
import org.apache.ode.utils.stl.CollectionsX;
import org.w3c.dom.Element;
@@ -43,12 +44,14 @@
import javax.wsdl.BindingOutput;
import javax.wsdl.Definition;
import javax.wsdl.Fault;
+import javax.wsdl.Input;
import javax.wsdl.Message;
import javax.wsdl.Operation;
import javax.wsdl.Part;
import javax.wsdl.Port;
import javax.wsdl.Service;
import javax.wsdl.extensions.ElementExtensible;
+import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.soap.SOAPBinding;
import javax.wsdl.extensions.soap.SOAPBody;
import javax.wsdl.extensions.soap.SOAPHeader;
@@ -64,7 +67,6 @@
* representation and vice versa.
*
* @author Maciej Szefler ( m s z e f l e r (at) g m a i l . c o m )
- *
*/
public class SoapMessageConverter {
@@ -458,15 +460,33 @@
return ee.isEmpty() ? null : ee.iterator().next();
}
+
+ /**
+ * Attempts to extract the WS-Addressing "Action" attribute value from the operation definition.
+ * When WS-Addressing is being used by a service provider, the "Action" is specified in the
+ * portType->operation instead of the SOAP binding->operation.
+ *
+ * @param operation The name of the operation to extract the SOAP Action from
+ * @return the SOAPAction value if one is specified, otherwise empty string
+ */
+ public String getWSAInputAction(String operation) {
+ BindingOperation bop = _binding.getBindingOperation(operation, null, null);
+ if (bop == null) return "";
+
+ Input input = bop.getOperation().getInput();
+ if (input != null) {
+ Object actionQName = input.getExtensionAttribute(new QName(Namespaces.WS_ADDRESSING_NS, "Action"));
+ if (actionQName != null && actionQName instanceof QName)
+ return ((QName)actionQName).getLocalPart();
+ }
+ return "";
+ }
/**
* Attempts to extract the SOAP Action is defined in the WSDL document.
*
- * @param def
- * @param service
- * @param port
- * @param operation
- * @return
+ * @param operation The name of the operation to extract the SOAP Action from
+ * @return the SOAPAction value if one is specified, otherwise empty string
*/
public String getSoapAction(String operation) {
BindingOperation bop = _binding.getBindingOperation(operation, null, null);
@@ -478,7 +498,7 @@
return "";
}
-
+
public QName parseSoapFault(Element odeMsgEl, SOAPEnvelope envelope, Operation operation) throws AxisFault {
SOAPFault flt = envelope.getBody().getFault();
SOAPFaultDetail detail = flt.getDetail();
Modified: ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java
URL: http://svn.apache.org/viewvc/ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java?view=diff&rev=567153&r1=567152&r2=567153
==============================================================================
--- ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java (original)
+++ ode/trunk/utils/src/main/java/org/apache/ode/utils/Namespaces.java Fri Aug 17 14:37:15 2007
@@ -42,14 +42,16 @@
/** Diverse WS-* stuff */
public static final String WS_ADDRESSING_NS = "http://www.w3.org/2005/08/addressing";
public static final String WS_ADDRESSING_WSDL_NS = "http://www.w3.org/2006/05/addressing/wsdl";
+ public static final String WS_ADDRESSING_ANON_URI = "http://www.w3.org/2005/08/addressing/anonymous";
public static final String SOAP_NS = "http://schemas.xmlsoap.org/wsdl/soap/";
public static final String WSDL_11 = "http://schemas.xmlsoap.org/wsdl/";
public static final String WSDL_20 = "http://www.w3.org/2006/01/wsdl";
public static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
public static final String JBI_END_POINT_REFERENCE = "http://java.sun.com/jbi/end-point-reference";
public static final QName WS_ADDRESSING_ENDPOINT = new QName(WS_ADDRESSING_NS, "EndpointReference");
+ public static final QName WS_ADDRESSING_USINGADDRESSING = new QName(WS_ADDRESSING_WSDL_NS, "UsingAddressing");
-/** ODE stuff */
+ /** ODE stuff */
public static final String ODE_PMAPI = "http://www.apache.org/ode/pmapi/types/2006/08/02/";
public static final String ODE_EXTENSION_NS = "http://www.apache.org/ode/type/extension";
public static final String INTALIO_SESSION_NS = "http://www.intalio.com/type/session";