You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fx-dev@ws.apache.org by ch...@apache.org on 2006/04/06 12:50:26 UTC

svn commit: r391959 [1/2] - in /webservices/sandesha/trunk/src/org/apache/sandesha2: ./ client/ client/reports/ handlers/ msgprocessors/ msgreceivers/ util/ workers/ wsrm/

Author: chamikara
Date: Thu Apr  6 03:50:20 2006
New Revision: 391959

URL: http://svn.apache.org/viewcvs?rev=391959&view=rev
Log:
Devided the SandeshaClientAPI into two classes RMClientAPI and RMClientConstants.
Completed the RMFaultCallback feature.
Made Sender,Invoker, StorageManager properties of the conficContext rather than static.
Bug fixes.
Refactored code
 

Added:
    webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientAPI.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientConstants.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/client/SequenceReport.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/AcknowledgementManager.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/SOAPFaultEnvelopeCreator.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/SpecSpecificConstants.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/TerminateManager.java
Removed:
    webservices/sandesha/trunk/src/org/apache/sandesha2/AcknowledgementManager.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/SOAPFaultEnvelopeCreator.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/SpecSpecificConstants.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/TerminateManager.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/client/Sandesha2ClientAPI.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/client/reports/
Modified:
    webservices/sandesha/trunk/src/org/apache/sandesha2/RMMsgContext.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/Sandesha2Constants.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/SandeshaModule.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMReport.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CloseSequenceProcessor.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/msgreceivers/RMMessageReceiver.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/FaultManager.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/MsgInitializer.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/RMMsgCreator.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/SandeshaUtil.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/util/SequenceManager.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/workers/InOrderInvoker.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/workers/Sender.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/wsrm/RMElements.java
    webservices/sandesha/trunk/src/org/apache/sandesha2/wsrm/SequenceAcknowledgement.java

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/RMMsgContext.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/RMMsgContext.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/RMMsgContext.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/RMMsgContext.java Thu Apr  6 03:50:20 2006
@@ -19,16 +19,14 @@
 
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.jar.Attributes.Name;
 
+import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.addressing.AddressingConstants;
 import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.addressing.RelatesTo;
-import org.apache.axis2.context.AbstractContext;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.context.MessageContext;
-import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.sandesha2.util.SOAPAbstractFactory;
 import org.apache.sandesha2.wsrm.IOMRMElement;
 import org.apache.sandesha2.wsrm.IOMRMPart;

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/Sandesha2Constants.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/Sandesha2Constants.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/Sandesha2Constants.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/Sandesha2Constants.java Thu Apr  6 03:50:20 2006
@@ -17,7 +17,6 @@
 
 package org.apache.sandesha2;
 
-import org.apache.axis2.addressing.AddressingConstants;
 
 
 /**
@@ -477,5 +476,11 @@
 	String LIST_SEPERATOR = ",";
 	
 	String LIST_PART_SEPERATOR = "-";
+	
+	String STORAGE_MANAGER = "StorageManager";
+	
+	String SENDER = "Sender";
+	
+	String INVOKER = "Invoker";
 	
 }

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/SandeshaModule.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/SandeshaModule.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/SandeshaModule.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/SandeshaModule.java Thu Apr  6 03:50:20 2006
@@ -22,7 +22,6 @@
 import org.apache.axis2.description.AxisDescription;
 import org.apache.axis2.description.AxisModule;
 import org.apache.axis2.description.Parameter;
-import org.apache.axis2.description.PolicyInclude;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.axis2.modules.Module;
 import org.apache.axis2.modules.ModulePolicyExtension;
@@ -53,7 +52,8 @@
 		// PropertyManager.getInstance().loadPropertiesFromModuleDesc(module);
 
 		PropertyManager.getInstance().loadPropertiesFromModuleDescPolicy(module);
-		
+		
+		configContext.setProperty(Sandesha2Constants.STORAGE_MANAGER,null);   // this must be resetted by the module settings.
 		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configContext);
 		storageManager.initStorage(module);
 	}

Added: webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientAPI.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientAPI.java?rev=391959&view=auto
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientAPI.java (added)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientAPI.java Thu Apr  6 03:50:20 2006
@@ -0,0 +1,439 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.sandesha2.client;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.axiom.soap.SOAP12Constants;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axiom.soap.impl.llom.soap11.SOAP11Factory;
+import org.apache.axiom.soap.impl.llom.soap12.SOAP12Factory;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.client.ServiceClient;
+import org.apache.axis2.client.async.AsyncResult;
+import org.apache.axis2.client.async.Callback;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.sandesha2.Sandesha2Constants;
+import org.apache.sandesha2.SandeshaException;
+import org.apache.sandesha2.storage.StorageManager;
+import org.apache.sandesha2.storage.Transaction;
+import org.apache.sandesha2.storage.beanmanagers.CreateSeqBeanMgr;
+import org.apache.sandesha2.storage.beanmanagers.NextMsgBeanMgr;
+import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
+import org.apache.sandesha2.storage.beans.CreateSeqBean;
+import org.apache.sandesha2.storage.beans.NextMsgBean;
+import org.apache.sandesha2.storage.beans.SequencePropertyBean;
+import org.apache.sandesha2.util.AcknowledgementManager;
+import org.apache.sandesha2.util.SandeshaUtil;
+import org.apache.sandesha2.util.SpecSpecificConstants;
+import org.apache.sandesha2.wsrm.Identifier;
+import org.apache.sandesha2.wsrm.TerminateSequence;
+
+/**
+ * Contains all the Sandesha2Constants of Sandesha2.
+ * Please see sub-interfaces to see grouped data.
+ * 
+ * @author Chamikara Jayalath <ch...@gmail.com>
+ */
+
+public class RMClientAPI {
+
+	private static Log log = LogFactory.getLog(RMClientAPI.class);
+	
+	public static String VALUE_TRUE = "true";
+	public static String VALUE_FALSE = "false";
+	
+	public static SequenceReport getOutgoingSequenceReport (String internalSequenceID,ConfigurationContext configurationContext) throws SandeshaException {
+		
+		SequenceReport sequenceReport = new SequenceReport ();
+		sequenceReport.setSequenceDirection(SequenceReport.SEQUENCE_DIRECTION_OUT);
+		
+		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configurationContext);
+		SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropretyBeanMgr();
+		CreateSeqBeanMgr createSeqMgr = storageManager.getCreateSeqBeanMgr();
+		
+		Transaction reportTransaction = storageManager.getTransaction();
+		
+		CreateSeqBean createSeqFindBean = new CreateSeqBean ();
+		createSeqFindBean.setInternalSequenceID(internalSequenceID);
+		
+		CreateSeqBean createSeqBean = createSeqMgr.findUnique(createSeqFindBean);
+		
+		if (createSeqBean==null) {
+			//check weather this is an terminated sequence.
+			if (isTerminatedSequence(internalSequenceID,seqPropMgr)) {
+				fillTerminatedOutgoingSequenceInfo (sequenceReport,internalSequenceID,seqPropMgr);
+				
+				return sequenceReport;
+			}
+			
+			if (isTimedOutSequence(internalSequenceID,seqPropMgr)) {
+				fillTimedoutOutgoingSequenceInfo (sequenceReport,internalSequenceID,seqPropMgr);
+				
+				return sequenceReport;
+			}
+			
+			String message = "Unrecorder internalSequenceID";
+			log.debug(message);
+			return null;
+		}
+		
+		String outSequenceID = createSeqBean.getSequenceID();
+		if (outSequenceID==null) {
+			 sequenceReport.setInternalSequenceID(internalSequenceID);
+			 sequenceReport.setSequenceStatus(SequenceReport.SEQUENCE_STATUS_INITIAL);
+			 sequenceReport.setSequenceDirection(SequenceReport.SEQUENCE_DIRECTION_OUT);
+			 
+			 return sequenceReport;
+		}
+		
+		sequenceReport.setSequenceStatus(SequenceReport.SEQUENCE_STATUS_ESTABLISHED);
+		
+		fillOutgoingSequenceInfo(sequenceReport,outSequenceID,seqPropMgr);
+		
+		reportTransaction.commit();
+		
+		return sequenceReport;	
+	}
+	
+	private static boolean isTerminatedSequence (String internalSequenceID, SequencePropertyBeanMgr seqPropMgr) throws SandeshaException { 
+		SequencePropertyBean internalSequenceFindBean = new SequencePropertyBean ();
+		internalSequenceFindBean.setValue(internalSequenceID);
+		internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+		
+		SequencePropertyBean internalSequenceBean = seqPropMgr.findUnique(internalSequenceFindBean);
+		if (internalSequenceBean==null) {
+			String message = "Internal sequence Bean is not available for the given sequence";
+			log.debug (message);
+			
+			return false;
+		}
+		
+		String outSequenceID = internalSequenceBean.getSequenceID();
+	
+		SequencePropertyBean sequenceTerminatedBean = seqPropMgr.retrieve(outSequenceID,Sandesha2Constants.SequenceProperties.SEQUENCE_TERMINATED);
+		if (sequenceTerminatedBean!=null && Sandesha2Constants.VALUE_TRUE.equals(sequenceTerminatedBean.getValue())) {
+			return true;
+		}
+		
+		return false;
+		
+	}
+	
+	private static boolean isTimedOutSequence (String internalSequenceID, SequencePropertyBeanMgr seqPropMgr) throws SandeshaException { 
+		SequencePropertyBean internalSequenceFindBean = new SequencePropertyBean ();
+		internalSequenceFindBean.setValue(internalSequenceID);
+		internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+		
+		SequencePropertyBean internalSequenceBean = seqPropMgr.findUnique(internalSequenceFindBean);
+		if (internalSequenceBean==null) {
+			String message = "Internal sequence Bean is not available for the given sequence";
+			log.debug (message);
+			
+			return false;
+		}
+		
+		String outSequenceID = internalSequenceBean.getSequenceID();
+	
+		SequencePropertyBean sequenceTerminatedBean = seqPropMgr.retrieve(outSequenceID,Sandesha2Constants.SequenceProperties.SEQUENCE_TIMED_OUT);
+		if (sequenceTerminatedBean!=null && Sandesha2Constants.VALUE_TRUE.equals(sequenceTerminatedBean.getValue())) {
+			return true;
+		}
+		
+		return false;
+	}
+	
+	private static void fillTerminatedOutgoingSequenceInfo (SequenceReport report,String internalSequenceID,SequencePropertyBeanMgr seqPropMgr) throws SandeshaException  { 
+		SequencePropertyBean internalSequenceFindBean = new SequencePropertyBean ();
+		internalSequenceFindBean.setValue(internalSequenceID);
+		internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+		
+		SequencePropertyBean internalSequenceBean = seqPropMgr.findUnique(internalSequenceFindBean);
+		if (internalSequenceBean==null) {
+			String message = "Not a valid terminated sequence. Internal sequence Bean is not available for the given sequence";
+			log.debug (message);
+			
+			throw new SandeshaException (message);
+		}
+		
+		report.setSequenceStatus(SequenceReport.SEQUENCE_STATUS_TERMINATED);
+		
+		String outSequenceID = internalSequenceBean.getSequenceID();
+		fillOutgoingSequenceInfo(report,outSequenceID,seqPropMgr);
+	}
+	
+	private static void fillTimedoutOutgoingSequenceInfo (SequenceReport report,String internalSequenceID, SequencePropertyBeanMgr seqPropMgr) throws SandeshaException  { 
+		SequencePropertyBean internalSequenceFindBean = new SequencePropertyBean ();
+		internalSequenceFindBean.setValue(internalSequenceID);
+		internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+		
+		SequencePropertyBean internalSequenceBean = seqPropMgr.findUnique(internalSequenceFindBean);
+		if (internalSequenceBean==null) {
+			String message = "Not a valid timedOut sequence. Internal sequence Bean is not available for the given sequence";
+			log.debug (message);
+			
+			throw new SandeshaException (message);
+		}
+		
+		report.setSequenceStatus(SequenceReport.SEQUENCE_STATUS_TIMED_OUT);
+		String outSequenceID = internalSequenceBean.getSequenceID();
+		fillOutgoingSequenceInfo(report,outSequenceID,seqPropMgr);
+	}
+	
+	private static void fillOutgoingSequenceInfo (SequenceReport report,String outSequenceID, SequencePropertyBeanMgr seqPropMgr) throws SandeshaException  { 
+		report.setSequenceID(outSequenceID);
+		
+		ArrayList completedMessageList =  AcknowledgementManager.getClientCompletedMessagesList (outSequenceID,seqPropMgr);
+		
+		Iterator iter = completedMessageList.iterator();
+		while (iter.hasNext()) {
+			Long lng = new Long (Long.parseLong((String) iter.next()));
+			report.addCompletedMessage(lng);
+		}
+	}
+	
+	
+	public static SequenceReport getOutgoingSequenceReport (String to, String sequenceKey,ConfigurationContext configurationContext) throws SandeshaException {
+		
+		String internalSequenceID = SandeshaUtil.getInternalSequenceID (to,sequenceKey);
+		return getOutgoingSequenceReport(internalSequenceID,configurationContext);
+	
+	}
+	
+	public static SequenceReport getIncomingSequenceReport (String sequenceID,ConfigurationContext configCtx) throws SandeshaException {
+		
+		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configCtx);
+		SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropretyBeanMgr();
+		
+		SequenceReport sequenceReport = new SequenceReport ();
+
+		ArrayList completedMessageList =  AcknowledgementManager.getServerCompletedMessagesList (sequenceID,seqPropMgr);
+
+		Iterator iter = completedMessageList.iterator();
+		while (iter.hasNext()) {;
+			sequenceReport.addCompletedMessage((Long) iter.next());
+		}
+		
+		sequenceReport.setSequenceID(sequenceID);
+		sequenceReport.setInternalSequenceID(sequenceID);  //for the incoming side   internalSequenceID=sequenceID
+		sequenceReport.setSequenceDirection(SequenceReport.SEQUENCE_DIRECTION_IN);
+
+		sequenceReport.setSequenceStatus(getServerSequenceStatus (sequenceID,storageManager));
+	
+		return sequenceReport;
+	}
+	
+	
+	public static ArrayList getAllIncomingSequenceReports (ConfigurationContext configCtx) throws SandeshaException {
+		
+		RMReport report = getRMReport(configCtx);
+		ArrayList incomingSequenceIDs = report.getIncomingSequenceList();
+		Iterator incomingSequenceIDIter = incomingSequenceIDs.iterator();
+		
+		ArrayList incomingSequenceReports = new ArrayList ();
+
+		while (incomingSequenceIDIter.hasNext()) {
+			String sequnceID = (String) incomingSequenceIDIter.next();
+			SequenceReport incomingSequenceReport = getIncomingSequenceReport(sequnceID,configCtx);
+			if (incomingSequenceReport==null) {
+				throw new SandeshaException ("An incoming sequence report is not present for the given sequenceID");
+			}
+			
+			incomingSequenceReports.add(incomingSequenceReport);
+		}
+		
+		return incomingSequenceReports;
+	}
+	
+	private static byte getServerSequenceStatus (String sequenceID,StorageManager storageManager) throws SandeshaException {
+		
+		SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropretyBeanMgr();
+		
+		SequencePropertyBean terminatedBean = seqPropMgr.retrieve(sequenceID,Sandesha2Constants.SequenceProperties.SEQUENCE_TERMINATED);
+		if (terminatedBean!=null) {
+			return SequenceReport.SEQUENCE_STATUS_TERMINATED;
+		}
+		
+		SequencePropertyBean timedOutBean = seqPropMgr.retrieve(sequenceID,Sandesha2Constants.SequenceProperties.SEQUENCE_TIMED_OUT);
+		if (timedOutBean!=null) {
+			return SequenceReport.SEQUENCE_STATUS_TIMED_OUT;
+		}
+		
+		NextMsgBeanMgr nextMsgMgr = storageManager.getNextMsgBeanMgr();
+		NextMsgBean nextMsgBean = nextMsgMgr.retrieve(sequenceID);
+		
+		if (nextMsgBean!=null) {
+			return SequenceReport.SEQUENCE_STATUS_ESTABLISHED;
+		}
+		
+		throw new SandeshaException ("Unrecorded sequenceID");
+	}
+	
+	/**
+	 * RM Report gives the details of incoming and outgoing sequences.
+	 * The outgoing sequence have to pass the initial state (CS/CSR exchange) to be included in a RMReport
+	 * 
+	 * @param configurationContext
+	 * @return
+	 * @throws SandeshaException
+	 */
+	public static RMReport getRMReport (ConfigurationContext configurationContext) throws SandeshaException {
+		
+		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configurationContext);
+		SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropretyBeanMgr();
+		
+		RMReport rmReport = new RMReport ();
+
+		SequencePropertyBean internalSequenceFindBean = new SequencePropertyBean ();
+		internalSequenceFindBean.setName(Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+		
+		Collection collection = seqPropMgr.find(internalSequenceFindBean);
+		Iterator iterator = collection.iterator();
+		while (iterator.hasNext()) {
+			SequencePropertyBean bean = (SequencePropertyBean) iterator.next();
+			String sequenceID = bean.getSequenceID();
+			rmReport.addToOutgoingSequenceList (sequenceID);
+			rmReport.addToOutgoingInternalSequenceMap(sequenceID,bean.getValue());
+			
+			SequenceReport report = getOutgoingSequenceReport(bean.getValue(),configurationContext);
+			
+			rmReport.addToNoOfCompletedMessagesMap(sequenceID ,report.getCompletedMessages().size());
+			rmReport.addToSequenceStatusMap(sequenceID ,report.getSequenceStatus());
+		}
+		
+		
+		//incoming sequences
+		SequencePropertyBean serverCompletedMsgsFindBean = new SequencePropertyBean ();
+		serverCompletedMsgsFindBean.setName(Sandesha2Constants.SequenceProperties.SERVER_COMPLETED_MESSAGES);
+		
+		Collection serverCompletedMsgsBeans = seqPropMgr.find(serverCompletedMsgsFindBean);
+		Iterator iter = serverCompletedMsgsBeans.iterator();
+		while (iter.hasNext()) {
+			SequencePropertyBean serverCompletedMsgsBean = (SequencePropertyBean) iter.next();
+			String sequenceID = serverCompletedMsgsBean.getSequenceID();
+			rmReport.addToIncomingSequenceList(sequenceID);
+			
+			SequenceReport sequenceReport = getIncomingSequenceReport(sequenceID,configurationContext);
+			
+			rmReport.addToNoOfCompletedMessagesMap(sequenceID,sequenceReport.getCompletedMessages().size());
+			rmReport.addToSequenceStatusMap(sequenceID,sequenceReport.getSequenceStatus());
+		}
+		
+		return rmReport;
+	}
+	
+	public static String getInternalSequenceID (String to, String sequenceKey) {
+		return SandeshaUtil.getInternalSequenceID(to,sequenceKey);
+	}
+	
+
+	public static void terminateSequence (String toEPR, String sequenceKey, ServiceClient serviceClient,ConfigurationContext configurationContext) throws SandeshaException { 
+
+		String internalSequenceID = SandeshaUtil.getInternalSequenceID(toEPR,sequenceKey);
+				
+		SequenceReport sequenceReport = RMClientAPI.getOutgoingSequenceReport(internalSequenceID,configurationContext);
+		if (sequenceReport==null)
+			throw new SandeshaException ("Cannot generate the sequence report for the given internalSequenceID");
+		if (sequenceReport.getSequenceStatus()!=SequenceReport.SEQUENCE_STATUS_ESTABLISHED)
+			throw new SandeshaException ("Canot terminate the sequence since it is not active");
+		
+		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configurationContext);
+		SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropretyBeanMgr();
+		SequencePropertyBean sequenceIDBean = seqPropMgr.retrieve(internalSequenceID,Sandesha2Constants.SequenceProperties.OUT_SEQUENCE_ID);
+		if (sequenceIDBean==null)
+			throw new SandeshaException ("SequenceIdBean is not set");
+		
+		String sequenceID = sequenceIDBean.getValue();
+
+		if (sequenceID==null)
+			throw new SandeshaException ("Cannot find the sequenceID");
+		
+		Options options = serviceClient.getOptions();
+		
+		String rmSpecVersion = (String) options.getProperty(RMClientConstants.RM_SPEC_VERSION);
+
+		if (rmSpecVersion==null) 
+			rmSpecVersion = SpecSpecificConstants.getDefaultSpecVersion ();
+		
+		String oldAction = options.getAction();
+		
+		options.setAction(SpecSpecificConstants.getTerminateSequenceAction(rmSpecVersion));		
+		
+		SOAPEnvelope dummyEnvelope = null;
+		SOAPFactory factory = null;
+		String soapNamespaceURI = options.getSoapVersionURI();
+		if (SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI.equals(soapNamespaceURI)) {
+			factory = new SOAP12Factory ();
+			dummyEnvelope = factory.getDefaultEnvelope();
+		}else  {
+			factory = new SOAP11Factory ();
+			dummyEnvelope = factory.getDefaultEnvelope();
+		}
+		
+		String rmNamespaceValue = SpecSpecificConstants.getRMNamespaceValue(rmSpecVersion);
+		
+		TerminateSequence terminateSequence = new TerminateSequence (factory,rmNamespaceValue);
+		Identifier identifier = new Identifier (factory,rmNamespaceValue);
+		identifier.setIndentifer(sequenceID);
+		terminateSequence.setIdentifier(identifier);
+		
+		terminateSequence.toSOAPEnvelope(dummyEnvelope);
+		
+	    String oldSequenceKey = (String) options.getProperty(RMClientConstants.SEQUENCE_KEY);
+	    options.setProperty(RMClientConstants.SEQUENCE_KEY,sequenceKey);
+		try {
+			DummyCallback callback = new RMClientAPI().new DummyCallback();
+			serviceClient.fireAndForget(dummyEnvelope.getBody().getFirstChildWithName(new QName (rmNamespaceValue,Sandesha2Constants.WSRM_COMMON.TERMINATE_SEQUENCE))); 
+		} catch (AxisFault e) {
+			throw new SandeshaException ("Could not invoke the service client", e);
+		}
+
+		if (oldSequenceKey!=null)
+			options.setProperty(RMClientConstants.SEQUENCE_KEY,oldSequenceKey);
+		
+//		options.setAction(oldAction);
+	}
+	
+	private class DummyCallback extends Callback {
+
+		public void onComplete(AsyncResult result) {
+			// TODO Auto-generated method stub
+			System.out.println("Error: dummy callback was called");
+		}
+
+		public void onError(Exception e) {
+			// TODO Auto-generated method stub
+			System.out.println("Error: dummy callback received an error");
+			
+		}
+		
+	}
+	
+	//This blocks the system until the messages u have sent hv been completed.
+	public void blockForCompletion () {
+		
+	}
+	
+}

Added: webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientConstants.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientConstants.java?rev=391959&view=auto
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientConstants.java (added)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMClientConstants.java Thu Apr  6 03:50:20 2006
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.sandesha2.client;
+
+public class RMClientConstants {
+	public static String AcksTo = "Sandesha2AcksTo";
+	public static String LAST_MESSAGE = "Sandesha2LastMessage";
+	public static String OFFERED_SEQUENCE_ID = "Sandesha2OfferedSequenceId";
+	public static String SANDESHA_DEBUG_MODE = "Sandesha2DebugMode";
+	public static String SEQUENCE_KEY = "Sandesha2SequenceKey";
+	public static String MESSAGE_NUMBER = "Sandesha2MessageNumber";
+	public static String RM_SPEC_VERSION = "Sandesha2RMSpecVersion";
+	public static String DUMMY_MESSAGE = "Sandesha2DummyMessage"; //If this property is set, even though this message will invoke the RM handlers, this will not be sent as an actual application message
+	public static String RM_FAULT_CALLBACK = "Sandesha2RMFaultCallback";
+}

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMReport.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMReport.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMReport.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/client/RMReport.java Thu Apr  6 03:50:20 2006
@@ -17,6 +17,8 @@
 package org.apache.sandesha2.client;
 
 import java.util.ArrayList;
+import java.util.HashMap;
+
 
 
 /**
@@ -26,25 +28,64 @@
 	
 	private ArrayList incomingSequenceList = null;
 	private ArrayList outgoingSequenceList = null;
+	private HashMap sequenceStatusMap = null;
+	private HashMap noOfCompletedMessagesMap = null;
+	private HashMap outgoingInternalSequenceIDMap = null;
 	
 	public RMReport () {
 		incomingSequenceList = new ArrayList ();
 		outgoingSequenceList = new ArrayList ();
+		sequenceStatusMap = new HashMap ();
+		noOfCompletedMessagesMap = new HashMap ();
+		outgoingInternalSequenceIDMap = new HashMap ();
+	}
+
+	public long getCompletedMessagesCount(String sequenceID) {
+		Long lng = (Long) noOfCompletedMessagesMap.get(sequenceID);
+		if (lng==null)
+			return -1;
+		
+		return lng.longValue();
+	}
+
+	public ArrayList getIncomingSequenceList() {
+		return incomingSequenceList;
+	}
+
+	public ArrayList getOutgoingSequenceList() {
+		return outgoingSequenceList;
+	}
+
+	public byte getSequenceStatusMap(String sequenceID) {
+		Byte status = (Byte) sequenceStatusMap.get(sequenceID);
+		if (status==null)
+			return SequenceReport.SEQUENCE_STATUS_UNKNOWN;
+		
+		return status.byteValue();
+	}
+
+	public void addToIncomingSequenceList (String incomingSequenceID) {
+		incomingSequenceList.add(incomingSequenceID);
 	}
 	
-	public void addIncomingSequenceID (String sequenceID) {
-		incomingSequenceList.add(sequenceID);
+	public void addToOutgoingSequenceList (String outSequenceID) {
+		outgoingSequenceList.add(outSequenceID);
 	}
 	
-	public void addOutgoingSequenceID (String sequenceID) {
-		outgoingSequenceList.add(sequenceID);
+	public void addToNoOfCompletedMessagesMap (String id, long noOfMsgs) {
+		noOfCompletedMessagesMap.put(id, new Long (noOfMsgs));
 	}
 	
-	public ArrayList getIncomingSequenceList () {
-		return incomingSequenceList;
+	public void addToSequenceStatusMap (String id, byte status) {
+		sequenceStatusMap.put(id, new Byte (status));
 	}
 	
-	public ArrayList getOutgoingSequenceList () {
-		return outgoingSequenceList;
+	public String getInternalSequenceIdOfOutSequence (String outSequenceID) {
+		return (String) outgoingInternalSequenceIDMap.get(outSequenceID);
+	}
+	
+	public void addToOutgoingInternalSequenceMap (String outSequenceID, String internalSequenceID) {
+		outgoingInternalSequenceIDMap.put(outSequenceID,internalSequenceID);
 	}
+	
 }

Added: webservices/sandesha/trunk/src/org/apache/sandesha2/client/SequenceReport.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/client/SequenceReport.java?rev=391959&view=auto
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/client/SequenceReport.java (added)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/client/SequenceReport.java Thu Apr  6 03:50:20 2006
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ * 
+ * Licensed 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.sandesha2.client;
+
+import java.util.ArrayList;
+
+/**
+ * @author Chamikara Jayalath <ch...@gmail.com>
+ */
+
+public class SequenceReport {
+
+	public static final byte SEQUENCE_STATUS_UNKNOWN = 0;
+	public static final byte SEQUENCE_STATUS_INITIAL = 1;
+	public static final byte SEQUENCE_STATUS_ESTABLISHED = 2;
+	public static final byte SEQUENCE_STATUS_TERMINATED = 3;
+	public static final byte SEQUENCE_STATUS_TIMED_OUT = 4;
+	private static final byte MAX_SEQUENCE_STATUS = 4;
+	
+	public static final byte SEQUENCE_DIRECTION_UNKNOWN=0;
+	public static final byte SEQUENCE_DIRECTION_IN=1;
+	public static final byte SEQUENCE_DIRECTION_OUT=2;
+	private static final byte MAX_SEQUENCE_DIRECTION = 2;
+	
+	private byte sequenceStatus = SEQUENCE_STATUS_UNKNOWN;
+	private byte sequenceDirection = SEQUENCE_DIRECTION_UNKNOWN;
+	private String sequenceID = null;
+	private String internalSequenceID = null;   //only for outgoing sequences
+	private ArrayList completedMessages = null; //no of messages acked (both for incoming and outgoing)
+	
+	public SequenceReport () {
+		completedMessages = new ArrayList ();
+	}
+	
+	public void setSequenceStatus (byte sequenceStatus) {
+		if (sequenceStatus>=SEQUENCE_STATUS_UNKNOWN && sequenceStatus<=MAX_SEQUENCE_STATUS) {
+			this.sequenceStatus = sequenceStatus;
+		}
+	}
+	
+	public void setSequenceDirection (byte sequenceDirection) {
+		if (sequenceDirection>=SEQUENCE_DIRECTION_UNKNOWN && sequenceDirection<=MAX_SEQUENCE_DIRECTION) {
+			this.sequenceDirection = sequenceDirection;
+		}
+	}
+	
+	public byte getSequenceStatus () {
+		return sequenceStatus;
+	}
+	
+	public byte getSequenceDirection () {
+		return sequenceDirection;
+	}
+
+	public String getSequenceID() {
+		return sequenceID;
+	}
+
+	public void setSequenceID(String sequenceID) {
+		this.sequenceID = sequenceID;
+	}
+	
+	public ArrayList getCompletedMessages () {
+		return completedMessages;
+	}
+
+	public void addCompletedMessage (Long messageNo) {
+		completedMessages.add(messageNo);
+	}
+	
+	public void setCompletedMessages (ArrayList completedMessages) {
+		this.completedMessages = completedMessages;
+	}
+
+	public String getInternalSequenceID() {
+		return internalSequenceID;
+	}
+
+	public void setInternalSequenceID(String internalSequenceID) {
+		this.internalSequenceID = internalSequenceID;
+	}
+	
+	
+}

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java Thu Apr  6 03:50:20 2006
@@ -39,8 +39,9 @@
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
+import org.apache.sandesha2.client.RMClientConstants;
 import org.apache.sandesha2.client.RMFaultCallback;
-import org.apache.sandesha2.client.Sandesha2ClientAPI;
+import org.apache.sandesha2.client.RMClientAPI;
 import org.apache.sandesha2.msgprocessors.ApplicationMsgProcessor;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
@@ -89,7 +90,7 @@
 					if (requestMessage!=null) {
 						if(SandeshaUtil.isRetriableOnFaults(requestMessage)){
 							
-							RMFaultCallback faultCallback = (RMFaultCallback) operationContext.getProperty(Sandesha2ClientAPI.RM_FAULT_CALLBACK);
+							RMFaultCallback faultCallback = (RMFaultCallback) operationContext.getProperty(RMClientConstants.RM_FAULT_CALLBACK);
 							if (faultCallback!=null) {
 								
 								

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/handlers/SandeshaOutHandler.java Thu Apr  6 03:50:20 2006
@@ -39,8 +39,8 @@
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
-import org.apache.sandesha2.client.Sandesha2ClientAPI;
+import org.apache.sandesha2.client.RMClientAPI;
+import org.apache.sandesha2.client.RMClientConstants;
 import org.apache.sandesha2.msgprocessors.ApplicationMsgProcessor;
 import org.apache.sandesha2.msgprocessors.MsgProcessor;
 import org.apache.sandesha2.msgprocessors.MsgProcessorFactory;
@@ -60,6 +60,7 @@
 import org.apache.sandesha2.util.SandeshaPropertyBean;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.util.SequenceManager;
+import org.apache.sandesha2.util.SpecSpecificConstants;
 import org.apache.sandesha2.wsrm.AckRequested;
 import org.apache.sandesha2.wsrm.CreateSequence;
 import org.apache.sandesha2.wsrm.Identifier;
@@ -109,9 +110,9 @@
 		msgCtx.setProperty(Sandesha2Constants.APPLICATION_PROCESSING_DONE,
 				"true");
 		
-		String dummyMessageString = (String) msgCtx.getOptions().getProperty(Sandesha2ClientAPI.DUMMY_MESSAGE);
+		String dummyMessageString = (String) msgCtx.getOptions().getProperty(RMClientConstants.DUMMY_MESSAGE);
 		boolean dummyMessage = false;
-		if (dummyMessageString!=null && Sandesha2ClientAPI.VALUE_TRUE.equals(dummyMessageString))
+		if (dummyMessageString!=null && RMClientAPI.VALUE_TRUE.equals(dummyMessageString))
 			dummyMessage = true;
 		
 		StorageManager storageManager = SandeshaUtil

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AckRequestedProcessor.java Thu Apr  6 03:50:20 2006
@@ -37,7 +37,6 @@
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.SenderBeanMgr;
@@ -51,6 +50,7 @@
 import org.apache.sandesha2.util.SOAPAbstractFactory;
 import org.apache.sandesha2.util.SandeshaPropertyBean;
 import org.apache.sandesha2.util.SandeshaUtil;
+import org.apache.sandesha2.util.SpecSpecificConstants;
 import org.apache.sandesha2.wsrm.AckRequested;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axiom.soap.SOAPFactory;

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java Thu Apr  6 03:50:20 2006
@@ -32,12 +32,9 @@
 import org.apache.axis2.transport.TransportSender;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.sandesha2.AcknowledgementManager;
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
-import org.apache.sandesha2.TerminateManager;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.SenderBeanMgr;
@@ -46,10 +43,13 @@
 import org.apache.sandesha2.storage.beans.SequencePropertyBean;
 import org.apache.sandesha2.transport.Sandesha2TransportOutDesc;
 import org.apache.sandesha2.transport.Sandesha2TransportSender;
+import org.apache.sandesha2.util.AcknowledgementManager;
 import org.apache.sandesha2.util.FaultManager;
 import org.apache.sandesha2.util.RMMsgCreator;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.util.SequenceManager;
+import org.apache.sandesha2.util.SpecSpecificConstants;
+import org.apache.sandesha2.util.TerminateManager;
 import org.apache.sandesha2.wsrm.AcknowledgementRange;
 import org.apache.sandesha2.wsrm.Nack;
 import org.apache.sandesha2.wsrm.SequenceAcknowledgement;

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/ApplicationMsgProcessor.java Thu Apr  6 03:50:20 2006
@@ -38,13 +38,12 @@
 import org.apache.axis2.transport.TransportSender;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.sandesha2.AcknowledgementManager;
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
+import org.apache.sandesha2.client.RMClientConstants;
 import org.apache.sandesha2.client.RMFaultCallback;
-import org.apache.sandesha2.client.Sandesha2ClientAPI;
+import org.apache.sandesha2.client.RMClientAPI;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.CreateSeqBeanMgr;
@@ -58,6 +57,7 @@
 import org.apache.sandesha2.storage.beans.SenderBean;
 import org.apache.sandesha2.storage.beans.SequencePropertyBean;
 import org.apache.sandesha2.transport.Sandesha2TransportOutDesc;
+import org.apache.sandesha2.util.AcknowledgementManager;
 import org.apache.sandesha2.util.FaultManager;
 import org.apache.sandesha2.util.MsgInitializer;
 import org.apache.sandesha2.util.PropertyManager;
@@ -66,6 +66,7 @@
 import org.apache.sandesha2.util.SandeshaPropertyBean;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.util.SequenceManager;
+import org.apache.sandesha2.util.SpecSpecificConstants;
 import org.apache.sandesha2.wsrm.AckRequested;
 import org.apache.sandesha2.wsrm.CreateSequence;
 import org.apache.sandesha2.wsrm.Identifier;
@@ -438,11 +439,11 @@
 		ConfigurationContext configContext = msgContext .getConfigurationContext();
 		
 		//setting the Fault callback		
-		RMFaultCallback faultCallback = (RMFaultCallback) msgContext.getOptions().getProperty(Sandesha2ClientAPI.RM_FAULT_CALLBACK);
+		RMFaultCallback faultCallback = (RMFaultCallback) msgContext.getOptions().getProperty(RMClientConstants.RM_FAULT_CALLBACK);
 		if (faultCallback!=null) {
 			OperationContext operationContext = msgContext.getOperationContext();
 			if (operationContext!=null) {
-				operationContext.setProperty(Sandesha2ClientAPI.RM_FAULT_CALLBACK,faultCallback);
+				operationContext.setProperty(RMClientConstants.RM_FAULT_CALLBACK,faultCallback);
 			}
 		}
 		
@@ -513,7 +514,7 @@
 
 			long requestMsgNo = reqSequence.getMessageNumber().getMessageNumber();
 			
-			internalSequenceId = SandeshaUtil.getInternalSequenceID(incomingSeqId);
+			internalSequenceId = SandeshaUtil.getOutgoingSideInternalSequenceID(incomingSeqId);
 			
 			//deciding weather the last message.
 			String requestLastMsgNoStr = SandeshaUtil.getSequenceProperty(incomingSeqId,Sandesha2Constants.SequenceProperties.LAST_IN_MESSAGE_NO,configContext);
@@ -533,10 +534,10 @@
 			}
 
 			String to = toEPR.getAddress();
-			String sequenceKey = (String) msgContext.getProperty(Sandesha2ClientAPI.SEQUENCE_KEY);
+			String sequenceKey = (String) msgContext.getProperty(RMClientConstants.SEQUENCE_KEY);
 			internalSequenceId = SandeshaUtil.getInternalSequenceID(to,sequenceKey);
 			
-			String lastAppMessage = (String) msgContext.getProperty(Sandesha2ClientAPI.LAST_MESSAGE);
+			String lastAppMessage = (String) msgContext.getProperty(RMClientConstants.LAST_MESSAGE);
 			if (lastAppMessage!=null && "true".equals(lastAppMessage))
 				lastMessage = true;
 		}
@@ -545,7 +546,7 @@
 		   the system will generate the message numbers */
 
 		//User should set it as a long object.
-		Long messageNumberLng = (Long) msgContext.getProperty(Sandesha2ClientAPI.MESSAGE_NUMBER);
+		Long messageNumberLng = (Long) msgContext.getProperty(RMClientConstants.MESSAGE_NUMBER);
 		
 		long givenMessageNumber = -1;
 		if (messageNumberLng!=null) {
@@ -576,9 +577,9 @@
 		
 		//A dummy message is a one which will not be processed as a actual application message.
 		//The RM handlers will simply let these go.
-		String dummyMessageString = (String) msgContext.getOptions().getProperty(Sandesha2ClientAPI.DUMMY_MESSAGE);
+		String dummyMessageString = (String) msgContext.getOptions().getProperty(RMClientConstants.DUMMY_MESSAGE);
 		boolean dummyMessage = false;
-		if (dummyMessageString!=null && Sandesha2ClientAPI.VALUE_TRUE.equals(dummyMessageString))
+		if (dummyMessageString!=null && RMClientAPI.VALUE_TRUE.equals(dummyMessageString))
 			dummyMessage = true;
 		
 		//saving the used message number
@@ -627,7 +628,7 @@
 					Sandesha2Constants.SequenceProperties.TO_EPR);
 			if (incomingToBean != null) {
 				String incomingTo = incomingToBean.getValue();
-				msgContext.setProperty(Sandesha2ClientAPI.AcksTo, incomingTo);
+				msgContext.setProperty(RMClientConstants.AcksTo, incomingTo);
 			}
 		}
 
@@ -657,7 +658,7 @@
 			specVersion = specVersionBean.getValue();
 		} else {
 			//in the client side, user will set the RM version.
-			specVersion = (String) msgContext.getProperty(Sandesha2ClientAPI.RM_SPEC_VERSION);
+			specVersion = (String) msgContext.getProperty(RMClientConstants.RM_SPEC_VERSION);
 		}
 		
 		if (specVersion==null) 
@@ -690,7 +691,7 @@
 
 				String acksTo = null;
 				if (serviceContext != null)
-					acksTo = (String) msgContext.getProperty(Sandesha2ClientAPI.AcksTo);
+					acksTo = (String) msgContext.getProperty(RMClientConstants.AcksTo);
 
 				if (msgContext.isServerSide()) {
 					// we do not set acksTo value to anonymous when the create
@@ -875,7 +876,6 @@
 		// sending the message once through Sandesha2TransportSender.
 		AxisEngine engine = new AxisEngine(createSeqMsg.getConfigurationContext());
 		 try {
-			 log.info ("Sending create seq msg...");
 			 engine.send(createSeqMsg);
 		 } catch (AxisFault e) {
 			 throw new SandeshaException (e.getMessage());
@@ -990,7 +990,7 @@
 
 			OperationContext operationContext = msg.getOperationContext();
 			if (operationContext != null) {
-				Object obj = msg.getProperty(Sandesha2ClientAPI.LAST_MESSAGE);
+				Object obj = msg.getProperty(RMClientConstants.LAST_MESSAGE);
 				if (obj != null && "true".equals(obj)) {
 					lastMessage = true;
 					

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CloseSequenceProcessor.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CloseSequenceProcessor.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CloseSequenceProcessor.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CloseSequenceProcessor.java Thu Apr  6 03:50:20 2006
@@ -5,7 +5,6 @@
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.engine.AxisEngine;
 import org.apache.axis2.util.Utils;
-import org.apache.sandesha2.AcknowledgementManager;
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
@@ -13,6 +12,7 @@
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
 import org.apache.sandesha2.storage.beans.SequencePropertyBean;
+import org.apache.sandesha2.util.AcknowledgementManager;
 import org.apache.sandesha2.util.FaultManager;
 import org.apache.sandesha2.util.RMMsgCreator;
 import org.apache.sandesha2.util.SOAPAbstractFactory;

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqMsgProcessor.java Thu Apr  6 03:50:20 2006
@@ -31,9 +31,9 @@
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
+import org.apache.sandesha2.client.RMClientConstants;
 import org.apache.sandesha2.client.RMFaultCallback;
-import org.apache.sandesha2.client.Sandesha2ClientAPI;
+import org.apache.sandesha2.client.RMClientAPI;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.CreateSeqBeanMgr;
@@ -44,6 +44,7 @@
 import org.apache.sandesha2.util.RMMsgCreator;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.util.SequenceManager;
+import org.apache.sandesha2.util.SpecSpecificConstants;
 import org.apache.sandesha2.wsrm.Accept;
 import org.apache.sandesha2.wsrm.CreateSequence;
 import org.apache.sandesha2.wsrm.CreateSequenceResponse;
@@ -125,7 +126,7 @@
 					//Setting the CreateSequence table entry for the outgoing side.
 					CreateSeqBean createSeqBean = new CreateSeqBean();
 					createSeqBean.setSequenceID(offeredSequenceID);
-					String outgoingSideInternalSequenceID = SandeshaUtil.getInternalSequenceID(newSequenceId);
+					String outgoingSideInternalSequenceID = SandeshaUtil.getOutgoingSideInternalSequenceID(newSequenceId);
 					createSeqBean.setInternalSequenceID(outgoingSideInternalSequenceID);
 					createSeqBean.setCreateSeqMsgID(SandeshaUtil.getUUID()); //this is a dummy value.
 				
@@ -230,11 +231,11 @@
 		MessageContext msgCtx = rmMsgCtx.getMessageContext();
 		
 		//adding the RM_FAULT_CALLBACK
-		RMFaultCallback faultCallback = (RMFaultCallback) msgCtx.getOptions().getProperty(Sandesha2ClientAPI.RM_FAULT_CALLBACK);
+		RMFaultCallback faultCallback = (RMFaultCallback) msgCtx.getOptions().getProperty(RMClientConstants.RM_FAULT_CALLBACK);
 		if (faultCallback!=null) {
 			OperationContext operationContext = msgCtx.getOperationContext();
 			if (operationContext!=null) {
-				operationContext.setProperty(Sandesha2ClientAPI.RM_FAULT_CALLBACK,faultCallback);
+				operationContext.setProperty(RMClientConstants.RM_FAULT_CALLBACK,faultCallback);
 			}
 		}
 	}

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java Thu Apr  6 03:50:20 2006
@@ -30,7 +30,6 @@
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beanmanagers.CreateSeqBeanMgr;
@@ -45,6 +44,7 @@
 import org.apache.sandesha2.util.SOAPAbstractFactory;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.util.SequenceManager;
+import org.apache.sandesha2.util.SpecSpecificConstants;
 import org.apache.sandesha2.wsrm.Accept;
 import org.apache.sandesha2.wsrm.AckRequested;
 import org.apache.sandesha2.wsrm.CreateSequenceResponse;

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/msgprocessors/TerminateSeqMsgProcessor.java Thu Apr  6 03:50:20 2006
@@ -34,13 +34,11 @@
 import org.apache.axis2.util.Utils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.sandesha2.AcknowledgementManager;
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
-import org.apache.sandesha2.TerminateManager;
-import org.apache.sandesha2.client.Sandesha2ClientAPI;
+import org.apache.sandesha2.client.RMClientAPI;
+import org.apache.sandesha2.client.RMClientConstants;
 import org.apache.sandesha2.storage.SandeshaStorageException;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.Transaction;
@@ -49,11 +47,14 @@
 import org.apache.sandesha2.storage.beans.SenderBean;
 import org.apache.sandesha2.storage.beans.SequencePropertyBean;
 import org.apache.sandesha2.transport.Sandesha2TransportOutDesc;
+import org.apache.sandesha2.util.AcknowledgementManager;
 import org.apache.sandesha2.util.FaultManager;
 import org.apache.sandesha2.util.MsgInitializer;
 import org.apache.sandesha2.util.RMMsgCreator;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.util.SequenceManager;
+import org.apache.sandesha2.util.SpecSpecificConstants;
+import org.apache.sandesha2.util.TerminateManager;
 import org.apache.sandesha2.wsrm.CreateSequenceResponse;
 import org.apache.sandesha2.wsrm.Sequence;
 import org.apache.sandesha2.wsrm.SequenceAcknowledgement;
@@ -183,7 +184,7 @@
 		}
 		
 		//following will be valid only for the server side, since the obtained int. seq ID is only valid there.
-		String responseSideInternalSequenceID = SandeshaUtil.getInternalSequenceID(sequenceID);
+		String responseSideInternalSequenceID = SandeshaUtil.getOutgoingSideInternalSequenceID(sequenceID);
 		
 		long highestOutMsgNo = 0;
 		try {
@@ -290,7 +291,7 @@
 		SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropretyBeanMgr();
 		
 		String toAddress = rmMsgCtx.getTo().getAddress();
-		String sequenceKey = (String) options.getProperty(Sandesha2ClientAPI.SEQUENCE_KEY);
+		String sequenceKey = (String) options.getProperty(RMClientConstants.SEQUENCE_KEY);
         String internalSeqenceID = SandeshaUtil.getInternalSequenceID(toAddress,sequenceKey);
         
         String outSequenceID = SandeshaUtil.getSequenceProperty(internalSeqenceID,Sandesha2Constants.SequenceProperties.OUT_SEQUENCE_ID,configurationContext);

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/msgreceivers/RMMessageReceiver.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/msgreceivers/RMMessageReceiver.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/msgreceivers/RMMessageReceiver.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/msgreceivers/RMMessageReceiver.java Thu Apr  6 03:50:20 2006
@@ -36,13 +36,11 @@
 
 public class RMMessageReceiver extends AbstractMessageReceiver {
 
-
 	public final void receive(MessageContext messgeCtx) throws AxisFault {
 		System.out.println("RM MESSSAGE RECEIVER WAS CALLED");
 		
 		RMMsgContext rmMsgCtx = MsgInitializer.initializeMessage(messgeCtx);
-		System.out.println("MsgReceiver got type:" + SandeshaUtil.getMessageTypeString(rmMsgCtx.getMessageType()));
-		
+		System.out.println("MsgReceiver got type:" + SandeshaUtil.getMessageTypeString(rmMsgCtx.getMessageType()));	
 	}
 	
 }

Added: webservices/sandesha/trunk/src/org/apache/sandesha2/util/AcknowledgementManager.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/util/AcknowledgementManager.java?rev=391959&view=auto
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/util/AcknowledgementManager.java (added)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/util/AcknowledgementManager.java Thu Apr  6 03:50:20 2006
@@ -0,0 +1,385 @@
+/*
+ * Copyright  1999-2004 The Apache Software Foundation.
+ *
+ *  Licensed 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.sandesha2.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.Constants;
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.OperationContext;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisOperationFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.sandesha2.RMMsgContext;
+import org.apache.sandesha2.Sandesha2Constants;
+import org.apache.sandesha2.SandeshaException;
+import org.apache.sandesha2.Sandesha2Constants.MessageParts;
+import org.apache.sandesha2.Sandesha2Constants.MessageTypes;
+import org.apache.sandesha2.Sandesha2Constants.SequenceProperties;
+import org.apache.sandesha2.storage.StorageManager;
+import org.apache.sandesha2.storage.Transaction;
+import org.apache.sandesha2.storage.beanmanagers.SenderBeanMgr;
+import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
+import org.apache.sandesha2.storage.beans.SenderBean;
+import org.apache.sandesha2.storage.beans.SequencePropertyBean;
+import org.apache.sandesha2.transport.Sandesha2TransportOutDesc;
+import org.apache.sandesha2.wsrm.AcknowledgementRange;
+import org.apache.sandesha2.wsrm.SequenceAcknowledgement;
+
+/**
+ * Contains logic for managing acknowledgements.
+ * 
+ * @author Chamikara Jayalath <ch...@gmail.com>
+ */
+
+public class AcknowledgementManager {
+
+	private static Log log = LogFactory.getLog(AcknowledgementManager.class);
+	
+	/**
+	 * Piggybacks any available acks of the same sequence to the given
+	 * application message.
+	 * 
+	 * @param applicationRMMsgContext
+	 * @throws SandeshaException
+	 */
+	public static void piggybackAcksIfPresent(
+			RMMsgContext rmMessageContext) throws SandeshaException {
+		
+		ConfigurationContext configurationContext = rmMessageContext.getConfigurationContext();
+		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configurationContext);
+
+		SenderBeanMgr retransmitterBeanMgr = storageManager.getRetransmitterBeanMgr();
+		SequencePropertyBeanMgr sequencePropertyBeanMgr = storageManager.getSequencePropretyBeanMgr();
+
+		SenderBean findBean = new SenderBean();
+
+		String sequnceID = SandeshaUtil.getSequenceIDFromRMMessage (rmMessageContext);
+		
+		findBean.setMessageType(Sandesha2Constants.MessageTypes.ACK);
+		findBean.setSend(true);
+		findBean.setReSend(false);
+		
+		String carrietTo = rmMessageContext.getTo().getAddress();
+		
+		Collection collection = retransmitterBeanMgr.find(findBean);
+		
+		Iterator it = collection.iterator();
+
+		
+		piggybackLoop:
+		while (it.hasNext()) {
+			SenderBean ackBean = (SenderBean) it.next();
+
+			long timeNow = System.currentTimeMillis();
+			if (ackBean.getTimeToSend() > timeNow) { 
+				//Piggybacking will happen only if the end of ack interval (timeToSend) is not reached.
+
+				MessageContext ackMsgContext = storageManager
+				.retrieveMessageContext(ackBean.getMessageContextRefKey(),configurationContext);
+				
+				//wsa:To has to match for piggybacking.
+				String to = ackMsgContext.getTo().getAddress();
+				if (!carrietTo.equals(to)) {
+					continue piggybackLoop;
+				}
+				
+				String ackSequenceID = ackBean.getSequenceID();
+				
+				//sequenceID has to match for piggybacking
+				if (!ackSequenceID.equals(sequnceID)) {
+					continue piggybackLoop;
+				}
+				
+				//deleting the ack entry.
+				retransmitterBeanMgr.delete(ackBean.getMessageID());
+
+				//Adding the ack to the application message
+				RMMsgContext ackRMMsgContext = MsgInitializer.initializeMessage(ackMsgContext);
+				if (ackRMMsgContext.getMessageType() != Sandesha2Constants.MessageTypes.ACK) {
+					String message = "Invalid ack message entry";
+					log.debug(message);
+					throw new SandeshaException(message);
+				}
+
+				SequenceAcknowledgement sequenceAcknowledgement = (SequenceAcknowledgement) ackRMMsgContext
+						.getMessagePart(Sandesha2Constants.MessageParts.SEQ_ACKNOWLEDGEMENT);
+				rmMessageContext.setMessagePart(
+						Sandesha2Constants.MessageParts.SEQ_ACKNOWLEDGEMENT,
+						sequenceAcknowledgement);
+
+				rmMessageContext.addSOAPEnvelope();
+				break piggybackLoop;
+			}
+		}
+	}
+	
+	/**this is used to get the acked messages of a sequence. If this is an outgoing message the sequenceIdentifier should
+	 * be the internal sequenceID.
+	 * 
+	 * @param sequenceIdentifier
+	 * @param outGoingMessage
+	 * @return
+	 */
+	public static ArrayList getClientCompletedMessagesList (String sequenceID,SequencePropertyBeanMgr seqPropMgr) throws SandeshaException {
+	
+		//first trying to get it from the internal sequence id.
+		SequencePropertyBean internalSequenceBean = seqPropMgr.retrieve(sequenceID,Sandesha2Constants.SequenceProperties.INTERNAL_SEQUENCE_ID);
+		String internalSequenceID = null;
+		if (internalSequenceBean!=null)
+			internalSequenceID = internalSequenceBean.getValue();
+		
+		SequencePropertyBean completedMessagesBean = null;
+		if (internalSequenceID!=null)
+			completedMessagesBean = seqPropMgr.retrieve(internalSequenceID,Sandesha2Constants.SequenceProperties.CLIENT_COMPLETED_MESSAGES);
+		
+		if (completedMessagesBean==null)
+			completedMessagesBean = seqPropMgr.retrieve(sequenceID,Sandesha2Constants.SequenceProperties.CLIENT_COMPLETED_MESSAGES);
+		
+		ArrayList completedMsgList = null;
+		if (completedMessagesBean!=null) {
+			completedMsgList = SandeshaUtil.getArrayListFromString(completedMessagesBean.getValue());
+		} else {
+			String message = "Completed messages bean is null, for the sequence " + sequenceID;
+			throw new SandeshaException (message);
+		}
+		
+		return completedMsgList;
+	}
+	
+	public static ArrayList getServerCompletedMessagesList (String sequenceID,SequencePropertyBeanMgr seqPropMgr) throws SandeshaException {
+				
+		SequencePropertyBean completedMessagesBean = null;
+
+		completedMessagesBean = seqPropMgr.retrieve(sequenceID,Sandesha2Constants.SequenceProperties.SERVER_COMPLETED_MESSAGES);
+		
+		ArrayList completedMsgList = null;
+		if (completedMessagesBean!=null) {
+			completedMsgList = SandeshaUtil.getArrayListFromMsgsString (completedMessagesBean.getValue());
+		} else {
+			String message = "Completed messages bean is null, for the sequence " + sequenceID;
+			throw new SandeshaException (message);
+		}
+		
+		return completedMsgList;
+	}
+	
+	public static RMMsgContext generateAckMessage (RMMsgContext referenceRMMessage, String sequenceID)throws SandeshaException {
+		
+		MessageContext referenceMsg = referenceRMMessage.getMessageContext();
+		
+		ConfigurationContext configurationContext = referenceRMMessage.getMessageContext().getConfigurationContext();
+		StorageManager storageManager = SandeshaUtil.getSandeshaStorageManager(configurationContext);
+		SequencePropertyBeanMgr seqPropMgr = storageManager.getSequencePropretyBeanMgr();
+		
+		//Setting the ack depending on AcksTo.
+		SequencePropertyBean acksToBean = seqPropMgr.retrieve(sequenceID,
+				Sandesha2Constants.SequenceProperties.ACKS_TO_EPR);
+
+		EndpointReference acksTo = new EndpointReference(acksToBean.getValue());
+		String acksToStr = acksTo.getAddress();
+
+		if (acksToStr == null)
+			throw new SandeshaException(
+					"acksToStr Seqeunce property is not set correctly");
+		
+		AxisOperation ackOperation = null;
+
+		try {
+			ackOperation = AxisOperationFactory.getOperationDescription(AxisOperationFactory.MEP_URI_IN_ONLY);
+		} catch (AxisFault e) {
+			throw new SandeshaException("Could not create the Operation");
+		}
+
+		AxisOperation rmMsgOperation = referenceRMMessage.getMessageContext()
+				.getAxisOperation();
+		if (rmMsgOperation != null) {
+			ArrayList outFlow = rmMsgOperation.getPhasesOutFlow();
+			if (outFlow != null) {
+				ackOperation.setPhasesOutFlow(outFlow);
+				ackOperation.setPhasesOutFaultFlow(outFlow);
+			}
+		}
+
+		MessageContext ackMsgCtx = SandeshaUtil.createNewRelatedMessageContext(
+				referenceRMMessage, ackOperation);
+		ackMsgCtx.setProperty(AddressingConstants.WS_ADDRESSING_VERSION,
+				referenceMsg.getProperty(AddressingConstants.WS_ADDRESSING_VERSION));  //TODO do this in the RMMsgCreator
+		
+		
+		ackMsgCtx.setProperty(Sandesha2Constants.APPLICATION_PROCESSING_DONE,"true");
+		
+		RMMsgContext ackRMMsgCtx = MsgInitializer.initializeMessage(ackMsgCtx);
+		ackRMMsgCtx.setRMNamespaceValue(referenceRMMessage.getRMNamespaceValue());
+		
+		ackMsgCtx.setMessageID(SandeshaUtil.getUUID());
+
+		SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil
+				.getSOAPVersion(referenceMsg.getEnvelope()));
+		
+		//Setting new envelope
+		SOAPEnvelope envelope = factory.getDefaultEnvelope();
+		try {
+			ackMsgCtx.setEnvelope(envelope);
+		} catch (AxisFault e3) {
+			throw new SandeshaException(e3.getMessage());
+		}
+
+		ackMsgCtx.setTo(acksTo);
+		
+		//adding the SequenceAcknowledgement part.
+		RMMsgCreator.addAckMessage(ackRMMsgCtx, sequenceID);
+		
+		ackMsgCtx.setProperty(MessageContext.TRANSPORT_IN,null);
+
+		String addressingNamespaceURI = SandeshaUtil.getSequenceProperty(sequenceID,Sandesha2Constants.SequenceProperties.ADDRESSING_NAMESPACE_VALUE,configurationContext);
+		String anonymousURI = SpecSpecificConstants.getAddressingAnonymousURI(addressingNamespaceURI);
+		
+		if (anonymousURI.equals(acksTo.getAddress())) {
+
+//			AxisEngine engine = new AxisEngine(ackRMMsgCtx.getMessageContext()
+//					.getConfigurationContext());
+
+			//setting CONTEXT_WRITTEN since acksto is anonymous
+			if (referenceRMMessage.getMessageContext().getOperationContext() == null) {
+				//operation context will be null when doing in a GLOBAL
+				// handler.
+				try {
+					AxisOperation op = AxisOperationFactory
+							.getAxisOperation(AxisOperationFactory.MEP_CONSTANT_IN_OUT);
+					OperationContext opCtx = new OperationContext(op);
+					referenceRMMessage.getMessageContext().setAxisOperation(op);
+					referenceRMMessage.getMessageContext().setOperationContext(opCtx);
+				} catch (AxisFault e2) {
+					throw new SandeshaException(e2.getMessage());
+				}
+			}
+
+			referenceRMMessage.getMessageContext().getOperationContext().setProperty(
+					org.apache.axis2.Constants.RESPONSE_WRITTEN,
+					Constants.VALUE_TRUE);
+
+			referenceRMMessage.getMessageContext().setProperty(
+					Sandesha2Constants.ACK_WRITTEN, "true");
+			
+			ackRMMsgCtx.getMessageContext().setServerSide(true);
+			return ackRMMsgCtx;
+			
+		} else {
+
+			Transaction asyncAckTransaction = storageManager.getTransaction();
+
+			SenderBeanMgr retransmitterBeanMgr = storageManager
+					.getRetransmitterBeanMgr();
+
+			String key = SandeshaUtil.getUUID();
+			
+			SenderBean ackBean = new SenderBean();
+			ackBean.setMessageContextRefKey(key);
+			ackBean.setMessageID(ackMsgCtx.getMessageID());
+			ackBean.setReSend(false);
+			ackBean.setSequenceID(sequenceID);
+			
+			//this will be set to true in the sender.
+			ackBean.setSend(true);
+			
+			ackMsgCtx.setProperty(Sandesha2Constants.QUALIFIED_FOR_SENDING,
+					Sandesha2Constants.VALUE_FALSE);
+			
+			ackBean.setMessageType(Sandesha2Constants.MessageTypes.ACK);
+			long ackInterval = SandeshaUtil.getPropretyBean(referenceMsg).getAcknowledgementInaterval();
+			
+			//Ack will be sent as stand alone, only after the retransmitter
+			// interval.
+			long timeToSend = System.currentTimeMillis() + ackInterval;
+
+			//removing old acks.
+			SenderBean findBean = new SenderBean();
+			findBean.setMessageType(Sandesha2Constants.MessageTypes.ACK);
+			
+			//this will be set to true in the sandesha2TransportSender.
+			findBean.setSend(true);
+			findBean.setReSend(false);
+			Collection coll = retransmitterBeanMgr.find(findBean);
+			Iterator it = coll.iterator();
+
+			if (it.hasNext()) {
+				SenderBean oldAckBean = (SenderBean) it.next();
+				timeToSend = oldAckBean.getTimeToSend();		//If there is an old ack. This ack will be sent in the old timeToSend.
+				retransmitterBeanMgr.delete(oldAckBean.getMessageID());
+			}
+			
+			ackBean.setTimeToSend(timeToSend);
+			storageManager.storeMessageContext(key,ackMsgCtx);
+			
+			//inserting the new ack.
+			retransmitterBeanMgr.insert(ackBean);
+			asyncAckTransaction.commit();
+
+			//passing the message through sandesha2sender
+			ackMsgCtx.setProperty(Sandesha2Constants.ORIGINAL_TRANSPORT_OUT_DESC,ackMsgCtx.getTransportOut());
+			ackMsgCtx.setProperty(Sandesha2Constants.SET_SEND_TO_TRUE,Sandesha2Constants.VALUE_TRUE);
+			ackMsgCtx.setProperty(Sandesha2Constants.MESSAGE_STORE_KEY,key);
+			ackMsgCtx.setTransportOut(new Sandesha2TransportOutDesc ());
+			RMMsgContext ackRMMessageCtx = MsgInitializer.initializeMessage(ackMsgCtx);
+			
+			SandeshaUtil.startSenderForTheSequence(configurationContext,sequenceID);	
+			referenceMsg.pause(); 
+			return ackRMMessageCtx;
+		}	
+	}
+	
+	public static boolean verifySequenceCompletion(Iterator ackRangesIterator,
+			long lastMessageNo) {
+		HashMap startMap = new HashMap();
+
+		while (ackRangesIterator.hasNext()) {
+			AcknowledgementRange temp = (AcknowledgementRange) ackRangesIterator
+					.next();
+			startMap.put(new Long(temp.getLowerValue()), temp);
+		}
+
+		long start = 1;
+		boolean loop = true;
+		while (loop) {
+			AcknowledgementRange temp = (AcknowledgementRange) startMap
+					.get(new Long(start));
+			if (temp == null) {
+				loop = false;
+				continue;
+			}
+
+			if (temp.getUpperValue() >= lastMessageNo)
+				return true;
+
+			start = temp.getUpperValue() + 1;
+		}
+
+		return false;
+	}
+}
\ No newline at end of file

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/util/FaultManager.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/util/FaultManager.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/util/FaultManager.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/util/FaultManager.java Thu Apr  6 03:50:20 2006
@@ -40,9 +40,7 @@
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.FaultData;
 import org.apache.sandesha2.RMMsgContext;
-import org.apache.sandesha2.SOAPFaultEnvelopeCreator;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.beanmanagers.CreateSeqBeanMgr;
 import org.apache.sandesha2.storage.beanmanagers.NextMsgBeanMgr;
@@ -69,7 +67,6 @@
 
 	public FaultManager() {
 	}
-
 
 	/**
 	 * Check weather the CreateSequence should be refused and generate the fault if it should.

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/util/MsgInitializer.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/util/MsgInitializer.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/util/MsgInitializer.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/util/MsgInitializer.java Thu Apr  6 03:50:20 2006
@@ -23,7 +23,6 @@
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
 import org.apache.sandesha2.storage.beans.SequencePropertyBean;

Modified: webservices/sandesha/trunk/src/org/apache/sandesha2/util/RMMsgCreator.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/util/RMMsgCreator.java?rev=391959&r1=391958&r2=391959&view=diff
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/util/RMMsgCreator.java (original)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/util/RMMsgCreator.java Thu Apr  6 03:50:20 2006
@@ -23,8 +23,9 @@
 
 import javax.xml.namespace.QName;
 
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axis2.AxisFault;
-import org.apache.axis2.addressing.AddressingConstants;
 import org.apache.axis2.addressing.EndpointReference;
 import org.apache.axis2.client.Options;
 import org.apache.axis2.context.ConfigurationContext;
@@ -38,9 +39,7 @@
 import org.apache.sandesha2.RMMsgContext;
 import org.apache.sandesha2.Sandesha2Constants;
 import org.apache.sandesha2.SandeshaException;
-import org.apache.sandesha2.SpecSpecificConstants;
-import org.apache.sandesha2.client.Sandesha2ClientAPI;
-import org.apache.sandesha2.msgprocessors.TerminateSeqResponseMsgProcessor;
+import org.apache.sandesha2.client.RMClientConstants;
 import org.apache.sandesha2.storage.StorageManager;
 import org.apache.sandesha2.storage.beanmanagers.SequencePropertyBeanMgr;
 import org.apache.sandesha2.storage.beans.SequencePropertyBean;
@@ -55,13 +54,10 @@
 import org.apache.sandesha2.wsrm.CreateSequenceResponse;
 import org.apache.sandesha2.wsrm.IOMRMElement;
 import org.apache.sandesha2.wsrm.Identifier;
-import org.apache.sandesha2.wsrm.Sequence;
 import org.apache.sandesha2.wsrm.SequenceAcknowledgement;
 import org.apache.sandesha2.wsrm.SequenceOffer;
 import org.apache.sandesha2.wsrm.TerminateSequence;
 import org.apache.sandesha2.wsrm.TerminateSequenceResponse;
-import org.apache.axiom.soap.SOAPEnvelope;
-import org.apache.axiom.soap.SOAPFactory;
 
 /**
  * Used to create new RM messages.
@@ -282,7 +278,7 @@
 				.getOperationContext();
 		if (operationcontext != null) {
 			String offeredSequence = (String) applicationMsgContext
-					.getProperty(Sandesha2ClientAPI.OFFERED_SEQUENCE_ID);
+					.getProperty(RMClientConstants.OFFERED_SEQUENCE_ID);
 			if (offeredSequence != null && !"".equals(offeredSequence)) {
 				SequenceOffer offerPart = new SequenceOffer(factory,rmNamespaceValue);
 				Identifier identifier = new Identifier(factory,rmNamespaceValue);

Added: webservices/sandesha/trunk/src/org/apache/sandesha2/util/SOAPFaultEnvelopeCreator.java
URL: http://svn.apache.org/viewcvs/webservices/sandesha/trunk/src/org/apache/sandesha2/util/SOAPFaultEnvelopeCreator.java?rev=391959&view=auto
==============================================================================
--- webservices/sandesha/trunk/src/org/apache/sandesha2/util/SOAPFaultEnvelopeCreator.java (added)
+++ webservices/sandesha/trunk/src/org/apache/sandesha2/util/SOAPFaultEnvelopeCreator.java Thu Apr  6 03:50:20 2006
@@ -0,0 +1,214 @@
+/*
+ * Copyright  1999-2004 The Apache Software Foundation.
+ *
+ *  Licensed 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.sandesha2.util;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.addressing.AddressingConstants;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axiom.om.OMConstants;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMNamespace;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axiom.soap.SOAPFault;
+import org.apache.axiom.soap.SOAPFaultCode;
+import org.apache.axiom.soap.SOAPFaultDetail;
+import org.apache.axiom.soap.SOAPFaultReason;
+import org.apache.axiom.soap.SOAPFaultSubCode;
+import org.apache.axiom.soap.SOAPFaultText;
+import org.apache.axiom.soap.SOAPFaultValue;
+import org.apache.sandesha2.FaultData;
+import org.apache.sandesha2.Sandesha2Constants;
+import org.apache.sandesha2.SandeshaException;
+import org.apache.sandesha2.Sandesha2Constants.SOAPFaults;
+import org.apache.sandesha2.Sandesha2Constants.SOAPVersion;
+import org.apache.sandesha2.Sandesha2Constants.SOAPFaults.FaultType;
+import org.apache.sandesha2.wsrm.FaultCode;
+import org.apache.sandesha2.wsrm.SequenceFault;
+
+/**
+ * Used to create an SOAP Envelope for a RM Related Fault.
+ * Support both SOAP 1.1 and SOAP 1.2 encoding.
+ * 
+ * @author Sanka Samaranayaka <ss...@gmail.com>
+ * @author Chamikara Jayalath <ch...@gmail.com>
+ */
+
+public class SOAPFaultEnvelopeCreator {
+
+	/**
+	 * Adding the SOAP Fault Envelope. 
+	 * 
+	 * @param faultMsgContext
+	 * @param SOAPVersion
+	 * @param faultData
+	 * @throws SandeshaException
+	 */
+	public static void addSOAPFaultEnvelope(MessageContext faultMsgContext,
+			int SOAPVersion, FaultData faultData, String rmNamespaceValue) throws SandeshaException {
+
+		SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SOAPVersion);
+		SOAPEnvelope env = factory.getDefaultFaultEnvelope();
+
+		try {
+			faultMsgContext.setEnvelope(env);
+		} catch (AxisFault e) {
+			throw new SandeshaException(e.getMessage());
+		}
+
+		if (SOAPVersion == Sandesha2Constants.SOAPVersion.v1_1)
+			doSOAP11Encoding(faultMsgContext, faultData, rmNamespaceValue);
+		else
+			doSOAP12Encoding(faultMsgContext, faultData, rmNamespaceValue);
+
+	}
+
+	/**
+	 * To find out weather this is a sequence fault. These faults are handeled differently 
+	 * accodting to the RM spec.
+	 * 
+	 * @param faultData
+	 * @return
+	 */
+	private static boolean isSequenceFault(FaultData faultData) {
+
+		boolean sequenceFault = false;
+
+		int faultType = faultData.getType();
+
+		if (faultType <= 0)
+			return false;
+
+		if (faultType == Sandesha2Constants.SOAPFaults.FaultType.CREATE_SEQUENCE_REFUSED)
+			sequenceFault = true;
+
+		if (faultType == Sandesha2Constants.SOAPFaults.FaultType.UNKNOWN_SEQUENCE)
+			sequenceFault = true;
+
+		return sequenceFault;
+
+	}
+
+	/**
+	 * Adding the SequenceFault header. Only for Sequence faults.
+	 * 
+	 * @param faultMessageContext
+	 * @param faultData
+	 * @param factory
+	 */
+	private static void addSequenceFaultHeader(
+			MessageContext faultMessageContext, FaultData faultData,
+			SOAPFactory factory, String rmNamespaceValue) throws SandeshaException {
+
+		SequenceFault sequenceFault = new SequenceFault(factory, rmNamespaceValue);
+
+		FaultCode faultCode = new FaultCode(factory, rmNamespaceValue);
+		faultCode.setFaultCode(faultData.getSubcode());
+		sequenceFault.setFaultCode(faultCode);
+	}
+
+	/**
+	 * Building the envelope with SOAP 1.1
+	 * 
+	 * @param faultMsgContext
+	 * @param data
+	 * @throws SandeshaException
+	 */
+	private static void doSOAP11Encoding(MessageContext faultMsgContext,
+			FaultData data, String rmNamespaceValue) throws SandeshaException {
+
+		SOAPEnvelope faultMsgEnvelope = faultMsgContext.getEnvelope();
+		if (faultMsgEnvelope == null)
+			throw new SandeshaException("SOAP Envelope is null");
+
+		SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil
+				.getSOAPVersion(faultMsgEnvelope));
+
+		SOAPFault fault = faultMsgEnvelope.getBody().getFault();
+		SOAPFaultCode faultCode = fault.getCode();
+
+		if (isSequenceFault(data)) {
+			faultCode.setText(data.getCode());
+		} else {
+			faultCode.setText(data.getSubcode());
+		}
+
+		SOAPFaultReason faultReason = fault.getReason();
+
+		OMNamespace namespace = factory.createOMNamespace(
+				OMConstants.XMLNS_URI, OMConstants.XMLNS_PREFIX);
+		faultReason.getSOAPFaultText("en").addAttribute("lang", "en", namespace);
+
+		faultReason.setText(data.getReason());
+		faultCode.getValue().setText(data.getSubcode());
+		faultReason.getSOAPFaultText("en").setText(data.getReason());
+
+		//SequenceFault header is added only for SOAP 1.1
+		if (isSequenceFault(data))
+			addSequenceFaultHeader(faultMsgContext, data, factory, rmNamespaceValue);
+
+	}
+
+	
+	/**
+	 * Building the envelope with SOAP 1.2
+	 * 
+	 * @param faultMsgContext
+	 * @param data
+	 * @throws SandeshaException
+	 */
+	private static void doSOAP12Encoding(MessageContext faultMsgContext,
+			FaultData data, String rmNamespaceValue) throws SandeshaException {
+
+		SOAPEnvelope faultEnvelope = faultMsgContext.getEnvelope();
+		if (faultEnvelope == null)
+			throw new SandeshaException("SOAP Envelope is null");
+
+		SOAPFactory factory = SOAPAbstractFactory.getSOAPFactory(SandeshaUtil
+				.getSOAPVersion(faultEnvelope));
+
+		SOAPFault fault = faultEnvelope.getBody().getFault();
+		if (fault == null)
+			throw new SandeshaException("Fault part is null");
+
+		SOAPFaultCode faultCode = fault.getCode();
+		SOAPFaultValue codeValue = faultCode.getValue();
+		codeValue.setText(data.getCode());
+
+		SOAPFaultSubCode faultSubCode = factory
+				.createSOAPFaultSubCode(faultCode);
+		SOAPFaultValue subCodeValue = factory
+				.createSOAPFaultValue(faultSubCode);
+		subCodeValue.setText(data.getSubcode());
+
+		SOAPFaultReason faultReason = fault.getReason();
+		SOAPFaultText faultText = faultReason.getSOAPFaultText("en");
+		faultText.setText(data.getReason());
+
+		SOAPFaultDetail faultDetail = fault.getDetail();
+
+		OMElement detailElement = data.getDetail();
+
+		if (detailElement != null)
+			faultDetail.addChild(detailElement);
+
+		
+		faultMsgContext.setWSAAction(AddressingConstants.Final.WSA_FAULT_ACTION);
+	}
+
+}
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: sandesha-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: sandesha-dev-help@ws.apache.org