[
https://issues.apache.org/jira/browse/CXF-2167?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Daniel Kulp resolved CXF-2167.
------------------------------
Resolution: Fixed
Fix Version/s: 2.2.1
2.1.5
> 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
> Fix For: 2.1.5, 2.2.1
>
>
> 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.