Author: asankha
Date: Thu Jan  4 04:13:35 2007
New Revision: 492540

URL: http://svn.apache.org/viewvc?view=rev&rev=492540
Log:
committing fix for http://issues.apache.org/jira/browse/SYNAPSE-49 from Tijs 
with a minor update to RMSequenceMediator

Added:
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorFactory.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorSerializer.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/RMSequenceMediator.java
Modified:
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/Constants.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java
    
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2FlexibleMEPClient.java

Modified: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java?view=diff&rev=492540&r1=492539&r2=492540
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java
 (original)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/Constants.java
 Thu Jan  4 04:13:35 2007
@@ -128,4 +128,17 @@
     int TRACING_UNSET=2;
     /** Tracing logger */
     String TRACE_LOGGER ="TRACE_LOGGER";
+    
+    //  -- Synapse property values for WS-RM sequence handling --
+    /** WS-RM version 1.0*/
+    String SEQUENCE_VERSION_1_0 = "1.0";
+    /** WS-RM version 1.1*/
+    String SEQUENCE_VERSION_1_1 = "1.1";
+    
+    /** Sandesha last message property name */
+    String SANDESHA_LAST_MESSAGE = "Sandesha2LastMessage";
+    /** Sandesha last sequence key property name */
+    String SANDESHA_SEQUENCE_KEY = "Sandesha2SequenceKey";
+    /** Sandesha WS-RM specification version property name */
+    String SANDESHA_SPEC_VERSION = "Sandesha2RMSpecVersion";
 }

Modified: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/Constants.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/Constants.java?view=diff&rev=492540&r1=492539&r2=492540
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/Constants.java
 (original)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/Constants.java
 Thu Jan  4 04:13:35 2007
@@ -51,4 +51,10 @@
     public static final String SCOPE_CORRELATE = 
org.apache.synapse.Constants.SCOPE_CORRELATE;
     /** The String value for an Axis2 messagecontext property */
     public static final String SCOPE_AXIS2 = 
org.apache.synapse.Constants.SCOPE_AXIS2;
+    
+    //  -- Synapse property values for WS-RM sequence handling --
+    /** The String value for a WS-RM version 1.0*/
+    public static final String SEQUENCE_VERSION_1_0 = 
org.apache.synapse.Constants.SEQUENCE_VERSION_1_0;
+    /** The String value for a WS-RM version 1.1*/
+    public static final String SEQUENCE_VERSION_1_1 = 
org.apache.synapse.Constants.SEQUENCE_VERSION_1_1;
 }

Modified: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java?view=diff&rev=492540&r1=492539&r2=492540
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java
 (original)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/MediatorFactoryFinder.java
 Thu Jan  4 04:13:35 2007
@@ -62,6 +62,7 @@
         InMediatorFactory.class,
         OutMediatorFactory.class,
         RMMediatorFactory.class,
+        RMSequenceMediatorFactory.class,
         TryMediatorFactory.class,
         ClassMediatorFactory.class    
       };

Added: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorFactory.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorFactory.java?view=auto&rev=492540
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorFactory.java
 (added)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorFactory.java
 Thu Jan  4 04:13:35 2007
@@ -0,0 +1,151 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.synapse.config.xml;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMAttribute;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.xpath.AXIOMXPath;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.Mediator;
+import org.apache.synapse.SynapseException;
+import org.apache.synapse.mediators.builtin.RMSequenceMediator;
+import org.jaxen.JaxenException;
+
+/**
+ * Creates a RMSequence mediator through the supplied XML configuration
+ * <p/>
+ * <pre>
+ * &lt;RMSequence (correlation="xpath" [last-message="xpath"]) | single="true" 
[version="1.0|1.1"]/&gt;
+ * </pre>
+ */
+public class RMSequenceMediatorFactory extends AbstractMediatorFactory {
+
+    private static final Log log = LogFactory.getLog(LogMediatorFactory.class);
+
+    private static final QName SEQUENCE_Q = new 
QName(Constants.SYNAPSE_NAMESPACE, "RMSequence");
+
+    public Mediator createMediator(OMElement elem) {
+
+        RMSequenceMediator sequenceMediator = new RMSequenceMediator();
+        OMAttribute correlation =
+            elem.getAttribute(new QName(Constants.NULL_NAMESPACE, 
"correlation"));
+        OMAttribute lastMessage =
+            elem.getAttribute(new QName(Constants.NULL_NAMESPACE, 
"last-message"));
+        OMAttribute single = elem.getAttribute(new 
QName(Constants.NULL_NAMESPACE, "single"));
+        OMAttribute version = elem.getAttribute(new 
QName(Constants.NULL_NAMESPACE, "version"));
+
+        if (single == null && correlation == null) {
+            String msg = "The 'single' attribute value of true or a 
'correlation' attribute is " +
+                "required for the configuration of a RMSequence mediator";
+            log.error(msg);
+            throw new SynapseException(msg);
+        }
+
+        if (correlation != null) {
+            if (correlation.getAttributeValue() != null &&
+                correlation.getAttributeValue().trim().length() == 0) {
+                String msg = "Invalid attribute value specified for 
correlation";
+                log.error(msg);
+                throw new SynapseException(msg);
+
+            } else {
+                try {
+                    sequenceMediator.setCorrelation(new 
AXIOMXPath(correlation.getAttributeValue()));
+                } catch (JaxenException e) {
+                    String msg = "Invalid XPath expression for attribute 
correlation : "
+                        + correlation.getAttributeValue();
+                    log.error(msg);
+                    throw new SynapseException(msg);
+                }
+            }
+            OMElementUtils.addNameSpaces(sequenceMediator.getCorrelation(), 
elem, log);
+        }
+
+        if (single != null) {
+            
sequenceMediator.setSingle(Boolean.valueOf(single.getAttributeValue()));
+        }
+
+        if (sequenceMediator.isSingle() && sequenceMediator.getCorrelation() 
!= null) {
+            String msg = "Invalid RMSequence mediator. A RMSequence can't have 
both a "
+                + "single attribute value of true and a correlation attribute 
specified.";
+            log.error(msg);
+            throw new SynapseException(msg);
+
+        } else if (!sequenceMediator.isSingle() && 
sequenceMediator.getCorrelation() == null) {
+            String msg = "Invalid RMSequence mediator. A RMSequence must have 
a "
+                + "single attribute value of true or a correlation attribute 
specified.";
+            log.error(msg);
+            throw new SynapseException(msg);
+        }
+
+        if (lastMessage != null) {
+            if (lastMessage.getAttributeValue() != null &&
+                lastMessage.getAttributeValue().trim().length() == 0) {
+                String msg = "Invalid attribute value specified for 
last-message";
+                log.error(msg);
+                throw new SynapseException(msg);
+
+            } else {
+                try {
+                    sequenceMediator.setLastMessage(new 
AXIOMXPath(lastMessage.getAttributeValue()));
+                } catch (JaxenException e) {
+                    String msg = "Invalid XPath expression for attribute 
last-message : "
+                        + lastMessage.getAttributeValue();
+                    log.error(msg);
+                    throw new SynapseException(msg);
+                }
+            }
+            OMElementUtils.addNameSpaces(sequenceMediator.getLastMessage(), 
elem, log);
+        }
+
+        if (sequenceMediator.isSingle() && sequenceMediator.getLastMessage() 
!= null) {
+            String msg = "Invalid RMSequence mediator. A RMSequence can't have 
both a "
+                + "single attribute value of true and a last-message attribute 
specified.";
+            log.error(msg);
+            throw new SynapseException(msg);
+        }
+
+        if (version != null) {
+            if 
(!Constants.SEQUENCE_VERSION_1_0.equals(version.getAttributeValue()) &&
+                
!Constants.SEQUENCE_VERSION_1_1.equals(version.getAttributeValue())) {
+                String msg = "Only '" + Constants.SEQUENCE_VERSION_1_0 + "' or 
'" +
+                    Constants.SEQUENCE_VERSION_1_1
+                    + "' values are allowed for attribute version for a 
RMSequence mediator"
+                    + ", Unsupported version " + version.getAttributeValue();
+                log.error(msg);
+                throw new SynapseException(msg);
+            }
+            sequenceMediator.setVersion(version.getAttributeValue());
+        }
+
+        // after successfully creating the mediator
+        // set its common attributes such as tracing etc
+        initMediator(sequenceMediator, elem);
+
+        return sequenceMediator;
+    }
+
+    public QName getTagQName() {
+        return SEQUENCE_Q;
+    }
+}

Added: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorSerializer.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorSerializer.java?view=auto&rev=492540
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorSerializer.java
 (added)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/RMSequenceMediatorSerializer.java
 Thu Jan  4 04:13:35 2007
@@ -0,0 +1,93 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.synapse.config.xml;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.Mediator;
+import org.apache.synapse.SynapseException;
+import org.apache.synapse.mediators.builtin.RMSequenceMediator;
+
+/**
+ * <pre>
+ * &lt;RMSequence (correlation="xpath" [last-message="xpath"]) | single="true" 
[version="1.0|1.1"]/&gt;
+ * </pre>
+ */
+public class RMSequenceMediatorSerializer extends AbstractMediatorSerializer {
+
+    private static final Log log = 
LogFactory.getLog(RMSequenceMediatorSerializer.class);
+
+    public OMElement serializeMediator(OMElement parent, Mediator m) {
+
+        if (!(m instanceof RMSequenceMediator)) {
+            handleException("Unsupported mediator passed in for serialization 
: " + m.getType());
+        }
+
+        RMSequenceMediator mediator = (RMSequenceMediator) m;
+        OMElement sequence = fac.createOMElement("RMSequence", synNS);
+        finalizeSerialization(sequence, mediator);
+        
+        if(mediator.isSingle() && mediator.getCorrelation() != null) {
+            handleException("Invalid RMSequence mediator. A RMSequence can't 
have both a " 
+                    + "single attribute value of true and a correlation 
attribute specified.");
+        }
+        if(mediator.isSingle() && mediator.getLastMessage() != null) {
+            handleException("Invalid RMSequence mediator. A RMSequence can't 
have both a " 
+                    + "single attribute value of true and a last-message 
attribute specified.");
+        }
+        
+        if (mediator.isSingle()) {
+            sequence.addAttribute(fac.createOMAttribute("single", nullNS, 
String.valueOf(mediator.isSingle())));
+        } else if (mediator.getCorrelation() != null) {
+            sequence.addAttribute(fac.createOMAttribute("correlation", nullNS, 
+                    mediator.getCorrelation().toString()));
+            super.serializeNamespaces(sequence, mediator.getCorrelation());
+        } else {
+            handleException("Invalid RMSequence mediator. Specify a single 
message sequence " 
+                    + "or a correlation attribute.");
+        }
+        
+        if (mediator.getLastMessage() != null) {
+            sequence.addAttribute(fac.createOMAttribute(
+                "last-message", nullNS, mediator.getLastMessage().toString()));
+            super.serializeNamespaces(sequence, mediator.getLastMessage());
+        }
+        
+        if (mediator.getVersion() != null) {
+            sequence.addAttribute(fac.createOMAttribute("version", nullNS, 
mediator.getVersion()));
+        }
+
+        if (parent != null) {
+            parent.addChild(sequence);
+        }
+        return sequence;
+    }
+
+    public String getMediatorClassName() {
+        return RMSequenceMediator.class.getName();
+    }
+
+    private void handleException(String msg) {
+        log.error(msg);
+        throw new SynapseException(msg);
+    }
+
+}

Modified: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2FlexibleMEPClient.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2FlexibleMEPClient.java?view=diff&rev=492540&r1=492539&r2=492540
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2FlexibleMEPClient.java
 (original)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/core/axis2/Axis2FlexibleMEPClient.java
 Thu Jan  4 04:13:35 2007
@@ -19,31 +19,37 @@
 
 package org.apache.synapse.core.axis2;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPHeader;
 import org.apache.axiom.soap.SOAPHeaderBlock;
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMNamespace;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.addressing.AddressingConstants;
 import org.apache.axis2.client.OperationClient;
 import org.apache.axis2.client.Options;
-import org.apache.axis2.context.*;
-import org.apache.axis2.description.*;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.ServiceContext;
+import org.apache.axis2.context.ServiceGroupContext;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.AxisServiceGroup;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.util.UUIDGenerator;
 import org.apache.axis2.util.Utils;
 import org.apache.axis2.wsdl.WSDLConstants;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.synapse.Constants;
-import org.apache.synapse.SynapseException;
 import org.apache.neethi.Policy;
 import org.apache.neethi.PolicyEngine;
-
-import javax.xml.namespace.QName;
-import java.util.ArrayList;
-import java.util.Iterator;
+import org.apache.synapse.Constants;
+import org.apache.synapse.SynapseException;
 
 /**
  * This is a simple client that handles both in only and in out
@@ -114,7 +120,7 @@
                     org.apache.synapse.config.xml.Constants.SANDESHA_POLICY,
                     getPolicy(synapseOutMessageContext, wsRMPolicyKey));
             }
-
+            copyRMOptions(originalInMsgCtx, clientOptions);
 
             // always send each and every message in a new sequence and 
terminate sequence
             //clientOptions.setProperty("Sandesha2LastMessage", "true");
@@ -179,6 +185,22 @@
         // set SOAP envelope on the message context, removing WS-A headers
         newMC.setEnvelope(removeAddressingHeaders(ori));
         return newMC;
+    }
+    
+    private static void copyRMOptions(MessageContext oriContext, Options 
targetOptions) {
+        Options oriOptions = oriContext.getOptions();
+        if(oriOptions.getProperty(Constants.SANDESHA_LAST_MESSAGE) != null) {
+            targetOptions.setProperty(Constants.SANDESHA_LAST_MESSAGE, 
+                    oriOptions.getProperty(Constants.SANDESHA_LAST_MESSAGE));
+        }
+        if(oriOptions.getProperty(Constants.SANDESHA_SPEC_VERSION) != null) {
+            targetOptions.setProperty(Constants.SANDESHA_SPEC_VERSION, 
+                    oriOptions.getProperty(Constants.SANDESHA_SPEC_VERSION));
+        }
+        if(oriOptions.getProperty(Constants.SANDESHA_SEQUENCE_KEY) != null) {
+            targetOptions.setProperty(Constants.SANDESHA_SEQUENCE_KEY, 
+                    oriOptions.getProperty(Constants.SANDESHA_SEQUENCE_KEY));
+        }
     }
     
     /**

Added: 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/RMSequenceMediator.java
URL: 
http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/RMSequenceMediator.java?view=auto&rev=492540
==============================================================================
--- 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/RMSequenceMediator.java
 (added)
+++ 
webservices/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/mediators/builtin/RMSequenceMediator.java
 Thu Jan  4 04:13:35 2007
@@ -0,0 +1,208 @@
+package org.apache.synapse.mediators.builtin;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Collections;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.xpath.AXIOMXPath;
+import org.apache.axis2.util.UUIDGenerator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.Constants;
+import org.apache.synapse.MessageContext;
+import org.apache.synapse.SynapseException;
+import org.apache.synapse.config.Property;
+import org.apache.synapse.core.axis2.Axis2MessageContext;
+import org.apache.synapse.mediators.AbstractMediator;
+import org.jaxen.JaxenException;
+
+public class RMSequenceMediator extends AbstractMediator {
+
+    private static Log log = LogFactory.getLog(RMSequenceMediator.class);
+    private static final Log trace = LogFactory.getLog(Constants.TRACE_LOGGER);
+
+    private AXIOMXPath correlation = null;
+    private AXIOMXPath lastMessage = null;
+    private Boolean single;
+    private String version = null;
+
+    private static final String WSRM_SpecVersion_1_0 = "Spec_2005_02";
+    private static final String WSRM_SpecVersion_1_1 = "Spec_2006_08";
+    // set sequence expiry time to 5 minutes
+    private static final long SEQUENCE_EXPIRY_TIME = 300000;
+    private static Map sequenceMap = Collections.synchronizedMap(new 
HashMap());
+
+    public boolean mediate(MessageContext smc) {
+        if (log.isDebugEnabled()) {
+            log.debug("RMSequence Mediator  ::  mediate() ");
+        }
+        boolean shouldTrace = shouldTrace(smc.getTracingState());
+        if (shouldTrace) {
+            trace.trace("Start : RMSequence mediator");
+        }
+        if (!(smc instanceof Axis2MessageContext)) {
+            if (log.isDebugEnabled()) {
+                log.debug("RMSequence Mediator  ::  only axis2 message context 
is supported ");
+            }
+            return true;
+        }
+        Axis2MessageContext axis2MessageCtx = (Axis2MessageContext) smc;
+        org.apache.axis2.context.MessageContext orgMessageCtx =
+            axis2MessageCtx.getAxis2MessageContext();
+
+        cleanupSequenceMap();
+
+        String version = getVersionValue();
+        orgMessageCtx.getOptions().setProperty(
+            Constants.SANDESHA_SPEC_VERSION, version);
+        if (log.isDebugEnabled()) {
+            log.debug("using WS-RM version " + version);
+        }
+
+        if (isSingle()) {
+            String sequenceID = UUIDGenerator.getUUID();
+            orgMessageCtx.getOptions().setProperty(
+                Constants.SANDESHA_SEQUENCE_KEY, sequenceID);
+            orgMessageCtx.getOptions().setProperty(
+                Constants.SANDESHA_LAST_MESSAGE, "true");
+            return true;
+        }
+
+        String correlationValue = getCorrelationValue(smc);
+        if (log.isDebugEnabled()) {
+            log.debug("correlation value is " + correlationValue);
+        }
+
+        boolean lastMessage = isLastMessage(smc);
+        if (log.isDebugEnabled()) {
+            log.debug("Is this message the last message in sequence: " + 
lastMessage);
+        }
+
+        String sequenceID = retrieveSequenceID(correlationValue);
+        orgMessageCtx.getOptions().setProperty(
+            Constants.SANDESHA_SEQUENCE_KEY, sequenceID);
+        if (log.isDebugEnabled()) {
+            log.debug("RMSequence Mediator  ::  using sequence " + sequenceID);
+        }
+
+        if (lastMessage) {
+            orgMessageCtx.getOptions().setProperty(
+                Constants.SANDESHA_LAST_MESSAGE, "true");
+            sequenceMap.remove(correlationValue);
+        }
+
+        if (shouldTrace) {
+            trace.trace("End : RMSequence mediator");
+        }
+        return true;
+    }
+
+    private String retrieveSequenceID(String correlationValue) {
+        String sequenceID = null;
+        if (!sequenceMap.containsKey(correlationValue)) {
+            sequenceID = UUIDGenerator.getUUID();
+            if (log.isDebugEnabled()) {
+                log.debug("setting sequenceID " + sequenceID + " for 
correlation " + correlationValue);
+            }
+            Property sequenceProperty = new Property();
+            sequenceProperty.setValue(sequenceID);
+            sequenceProperty.setExpiryTime(System.currentTimeMillis() + 
SEQUENCE_EXPIRY_TIME);
+            sequenceMap.put(correlationValue, sequenceProperty);
+        } else {
+            sequenceID = (String) ((Property) 
sequenceMap.get(correlationValue)).getValue();
+            if (log.isDebugEnabled()) {
+                log.debug("got sequenceID " + sequenceID + " for correlation " 
+ correlationValue);
+            }
+        }
+        return sequenceID;
+    }
+
+    private String getCorrelationValue(MessageContext smc) {
+        OMElement node = null;
+        try {
+            node = (OMElement) 
getCorrelation().selectSingleNode(smc.getEnvelope());
+        } catch (JaxenException e) {
+            log.error("XPath error : " + e.getMessage());
+            throw new SynapseException("XPath error : " + e.getMessage());
+        }
+        if (node == null) {
+            log.debug("XPath expression did not return any node");
+            throw new SynapseException("XPath expression did not return any 
node");
+        }
+        return node.getText();
+    }
+
+    private String getVersionValue() {
+        if (Constants.SEQUENCE_VERSION_1_1.equals(getVersion())) {
+            return WSRM_SpecVersion_1_1;
+        } else {
+            return WSRM_SpecVersion_1_0;
+        }
+    }
+
+    private boolean isLastMessage(MessageContext smc) {
+        if (getLastMessage() == null) {
+            return false;
+        }
+        try {
+            return getLastMessage().booleanValueOf(smc.getEnvelope());
+        } catch (JaxenException e) {
+            log.error("XPath error : " + e.getMessage());
+            throw new SynapseException("XPath error : " + e.getMessage());
+        }
+    }
+
+    private synchronized void cleanupSequenceMap() {
+        Iterator itKey = sequenceMap.keySet().iterator();
+        while (itKey.hasNext()) {
+            Object key = itKey.next();
+            Property sequenceProperty = (Property) sequenceMap.get(key);
+            if (sequenceProperty.isExpired()) {
+                sequenceMap.remove(key);
+            }
+        }
+    }
+
+    public boolean isSingle() {
+        if (getSingle() != null && getSingle().booleanValue()) {
+            return true;
+
+        } else {
+            return false;
+        }
+    }
+
+    public AXIOMXPath getCorrelation() {
+        return correlation;
+    }
+
+    public void setCorrelation(AXIOMXPath correlation) {
+        this.correlation = correlation;
+    }
+
+    public AXIOMXPath getLastMessage() {
+        return lastMessage;
+    }
+
+    public void setLastMessage(AXIOMXPath lastMessage) {
+        this.lastMessage = lastMessage;
+    }
+
+    public Boolean getSingle() {
+        return single;
+    }
+
+    public void setSingle(Boolean single) {
+        this.single = single;
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to