WS-Addressing handler should not drop messages when the RelatesTo property is 
explicitly set by client code
-----------------------------------------------------------------------------------------------------------

                 Key: CXF-2167
                 URL: https://issues.apache.org/jira/browse/CXF-2167
             Project: CXF
          Issue Type: Improvement
    Affects Versions: 2.1.4
         Environment: Found in JBossWS/CXF 2.1.4.
            Reporter: Andrew Dinn


The WS Addressing (WSA) class MAPCodec checks the RelatesTo field of an 
incoming Message Addressing Properties to see if it equals a previously cached 
outgoing MessageId field. This allows it to re-establish the exchange 
associated with an outgoing message in a request-reply (RPC) style exchange. If 
a RelatesTo value is found which does nto correspond to a cached MessageId the 
message is dropped.

The problem with this is that it breaks use of the RelatesTo field by 
application code. Specifically, an application may wish to correlate sequences 
of 1-way messages by installing the MessageId from one message into the 
RelatesTo field of its successor. Since these messages employ different 
channels MPACodec will not find a cached MessageId for a successor message and 
so stop delivery of the messages.

A proposed fix is to change MAPCodec so that it only disables delivery if the 
RelatesTo field has a null value for its RelationshipType or if the 
RelationshipType is set to http://www.w3.org/2005/08/addressing/reply (this is 
the default value implied by a null setting). A patch for this fix which has 
been tested in JBossWS/CXF is given below

[ad...@toby cxf-2.1.4]$ svn diff 
rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
Index: rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java
===================================================================
--- rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java    
(revision 761707)
+++ rt/ws/addr/src/main/java/org/apache/cxf/ws/addressing/soap/MAPCodec.java    
(working copy)
@@ -53,6 +53,8 @@
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.Message;
 import org.apache.cxf.phase.Phase;
+import org.apache.cxf.ws.addressing.AddressingBuilder;
+import org.apache.cxf.ws.addressing.AddressingConstants;
 import org.apache.cxf.ws.addressing.AddressingProperties;
 import org.apache.cxf.ws.addressing.AddressingPropertiesImpl;
 import org.apache.cxf.ws.addressing.AttributedURIType;
@@ -73,6 +75,8 @@
 
     private static final Logger LOG = LogUtils.getL7dLogger(MAPCodec.class);
     private static final String IS_REFERENCE_PARAM_ATTR_NAME = 
"IsReferenceParameter";
+    private static final AddressingConstants ADDRESSING_CONSTANTS
+        = AddressingBuilder.getAddressingBuilder().newAddressingConstants();
 
     /**
      * REVISIT: map usage that the *same* interceptor instance 
@@ -83,7 +87,7 @@
 
     private VersionTransformer transformer;
     private HeaderFactory headerFactory;
-    
+
     /**
      * Constructor.
      */
@@ -463,6 +467,12 @@
                                                        AttributedURIType.class,
                                                        headerElement, 
                                                        unmarshaller));
+                            } else if (Names.WSA_FROM_NAME.equals(localName)) {
+                                maps.setFrom(decodeAsNative(
+                                                       headerURI,
+                                                       
EndpointReferenceType.class,
+                                                       headerElement,
+                                                       unmarshaller));
                             } else if (Names.WSA_TO_NAME.equals(localName)) {
                                 AttributedURIType addr = decodeAsNative(
                                                        headerURI,
@@ -721,7 +731,7 @@
      * @param maps the addressing properties
      */
     private void restoreExchange(SoapMessage message, AddressingProperties 
maps) {
-        if (maps != null && maps.getRelatesTo() != null) {
+        if (maps != null && maps.getRelatesTo() != null && 
isRelationshipReply(maps.getRelatesTo())) {
             Exchange correlatedExchange =
                 uncorrelatedExchanges.remove(maps.getRelatesTo().getValue());
             if (correlatedExchange != null) {
@@ -755,6 +765,11 @@
         
     }
 
+    private boolean isRelationshipReply(RelatesToType relatesTo) {
+        return relatesTo.getRelationshipType() == null
+                || 
relatesTo.getRelationshipType().equals(ADDRESSING_CONSTANTS.getRelationshipReply());
+    }
+
     /**
      * Marks a message as partial response
      * 


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to