You are viewing a plain text version of this content. The canonical link for it is here.
Posted to sandesha-dev@ws.apache.org by mc...@apache.org on 2007/01/18 17:44:24 UTC

svn commit: r497494 - in /webservices/sandesha/trunk/java: src/org/apache/sandesha2/client/ src/org/apache/sandesha2/handlers/ src/org/apache/sandesha2/msgprocessors/ src/org/apache/sandesha2/storage/beans/ src/org/apache/sandesha2/util/ src/org/apache...

Author: mckierna
Date: Thu Jan 18 08:44:23 2007
New Revision: 497494

URL: http://svn.apache.org/viewvc?view=rev&rev=497494
Log:
http://issues.apache.org/jira/browse/SANDESHA2-65

Added:
    webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/utils/
    webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/utils/RangeStringTest.java
Modified:
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMDBean.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMSBean.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/AcknowledgementManager.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/Range.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RangeString.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java
    webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/Invoker.java
    webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaUtilTest.java
    webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/client/SandeshaClient.java Thu Jan 18 08:44:23 2007
@@ -188,9 +188,10 @@
 			StorageManager storageManager) throws SandeshaException {
 		report.setSequenceID(rmsBean.getSequenceID());
 
-		List completedMessageList = 
-			AcknowledgementManager.getClientCompletedMessagesList(rmsBean.getInternalSequenceID(), rmsBean.getSequenceID(),
-				storageManager);
+		List completedMessageList = AcknowledgementManager.
+		getClientCompletedMessageRanges(rmsBean.getInternalSequenceID(), 
+				rmsBean.getSequenceID(),
+				storageManager).getContainedElementsAsNumbersList();
 
 		Iterator iter = completedMessageList.iterator();
 		while (iter.hasNext()) {
@@ -985,8 +986,10 @@
 
 			SequenceReport sequenceReport = new SequenceReport();
 
-			ArrayList completedMessageList = AcknowledgementManager.getServerCompletedMessagesList(sequenceID,
-					storageManager);
+			List completedMessageList = AcknowledgementManager.
+			getServerCompletedMessageRanges(
+				sequenceID,
+				storageManager).getContainedElementsAsNumbersList();
 			
 			Iterator iter = completedMessageList.iterator();
 			while (iter.hasNext()) {

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/handlers/SandeshaGlobalInHandler.java Thu Jan 18 08:44:23 2007
@@ -17,8 +17,6 @@
 
 package org.apache.sandesha2.handlers;
 
-import java.util.List;
-
 import org.apache.axiom.soap.SOAPBody;
 import org.apache.axiom.soap.SOAPEnvelope;
 import org.apache.axis2.AxisFault;
@@ -39,6 +37,8 @@
 import org.apache.sandesha2.storage.Transaction;
 import org.apache.sandesha2.storage.beans.RMDBean;
 import org.apache.sandesha2.util.MsgInitializer;
+import org.apache.sandesha2.util.Range;
+import org.apache.sandesha2.util.RangeString;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.wsrm.Sequence;
 
@@ -180,7 +180,8 @@
 				RMDBean rmdBean = SandeshaUtil.getRMDBeanFromSequenceId(storageManager, propertyKey);
 				if (rmdBean != null) {
 					if (rmdBean.getServerCompletedMessages() != null) {
-						if (rmdBean.getServerCompletedMessages().contains(new Long(msgNo)))
+						if (rmdBean.getServerCompletedMessages().isMessageNumberInRanges(msgNo))
+							//this msg is in a completed range
 							drop = true;
 					}
 	
@@ -197,11 +198,11 @@
 								log.debug(SandeshaMessageHelper.getMessage(SandeshaMessageKeys.emptyLastMsg));
 								drop = true;
 	
-								List serverCompletedMsgs = rmdBean.getServerCompletedMessages();
-								
-								// Add this message to the completed range
-								serverCompletedMsgs.add(new Long(msgNo));
+								RangeString serverCompletedMsgs = rmdBean.getServerCompletedMessages();
 								
+								// Add this message to the completed ranges
+								serverCompletedMsgs.addRange(new Range(msgNo));
+								// Update with the new ranges
 								rmdBean.setServerCompletedMessages(serverCompletedMsgs);
 	
 								// TODO correct the syntac into '[received msgs]'

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/AcknowledgementProcessor.java Thu Jan 18 08:44:23 2007
@@ -17,7 +17,6 @@
 
 package org.apache.sandesha2.msgprocessors;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 
@@ -46,6 +45,8 @@
 import org.apache.sandesha2.storage.beans.SenderBean;
 import org.apache.sandesha2.util.AcknowledgementManager;
 import org.apache.sandesha2.util.FaultManager;
+import org.apache.sandesha2.util.Range;
+import org.apache.sandesha2.util.RangeString;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.util.TerminateManager;
 import org.apache.sandesha2.wsrm.AcknowledgementRange;
@@ -140,26 +141,31 @@
 		input.setInternalSequenceID(sequencePropertyKey);
 		Collection retransmitterEntriesOfSequence = retransmitterMgr.find(input);
 
-		ArrayList ackedMessagesList = new ArrayList();
-		boolean removedSenderBean = false;
+		RangeString ackedMessagesRanges = new RangeString(); //keep track of the ranges in the ack msgs
+		long numberOfNewMessagesAcked = 0;
+
 		while (ackRangeIterator.hasNext()) {
 			AcknowledgementRange ackRange = (AcknowledgementRange) ackRangeIterator.next();
 			long lower = ackRange.getLowerValue();
 			long upper = ackRange.getUpperValue();
-			if(log.isDebugEnabled()) log.debug("Ack Range: " + lower + " - " + upper);
+			
+			if(log.isDebugEnabled()) 
+				log.debug("Ack Range: " + lower + " - " + upper);
 
+			//add this new range to the ongoing string
+			ackedMessagesRanges.addRange(new Range(lower, upper)); 
+			
 			for (long messageNo = lower; messageNo <= upper; messageNo++) {
 				SenderBean retransmitterBean = getRetransmitterEntry(retransmitterEntriesOfSequence, messageNo);
 				if (retransmitterBean != null) {
+					//this is a new ack range, not just the repeat of a previous one
 					retransmitterMgr.delete(retransmitterBean.getMessageID());
 
 					// removing the application message from the storage.
 					String storageKey = retransmitterBean.getMessageContextRefKey();
 					storageManager.removeMessageContext(storageKey);
-					removedSenderBean = true;
+					numberOfNewMessagesAcked++;
 				}
-
-				ackedMessagesList.add(new Long(messageNo));
 			}
 		}
 
@@ -187,11 +193,14 @@
 		// setting acked message date.
 		// TODO add details specific to each message.
 		
-		// Set the completed message list, but only if we have actually removed a SenderBean
-		// It is possible for the ACK messages arrive out of sequence
-		if (removedSenderBean) {
-		  rmsBean.setClientCompletedMessages(ackedMessagesList);
-			long noOfMsgsAcked = ackedMessagesList.size();
+		// We overwrite the previous client completed message ranges with the
+		// latest view, but only if it is an update i.e. contained a new
+		// ack range (which is because we do not previous acks arriving late 
+		// to break us)
+		if (numberOfNewMessagesAcked>0) {
+		  rmsBean.setClientCompletedMessages(ackedMessagesRanges);
+			long noOfMsgsAcked = 
+				rmsBean.getNumberOfMessagesAcked() + numberOfNewMessagesAcked;
 			rmsBean.setNumberOfMessagesAcked(noOfMsgsAcked);
 		}
 		

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/CreateSeqResponseMsgProcessor.java Thu Jan 18 08:44:23 2007
@@ -45,6 +45,7 @@
 import org.apache.sandesha2.storage.beans.RMDBean;
 import org.apache.sandesha2.storage.beans.SenderBean;
 import org.apache.sandesha2.util.MsgInitializer;
+import org.apache.sandesha2.util.RangeString;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.util.SpecSpecificConstants;
 import org.apache.sandesha2.wsrm.Accept;
@@ -199,7 +200,7 @@
 			String rmSpecVersion = createSeqResponseRMMsgCtx.getRMSpecVersion();
 			rMDBean.setRMVersion(rmSpecVersion);
 			
-			rMDBean.setServerCompletedMessages(new ArrayList());
+			rMDBean.setServerCompletedMessages(new RangeString());
 
 			RMDBeanMgr rmdBeanMgr = storageManager.getRMDBeanMgr();
 

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/msgprocessors/SequenceProcessor.java Thu Jan 18 08:44:23 2007
@@ -19,7 +19,6 @@
 
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.List;
 
 import javax.xml.namespace.QName;
 
@@ -52,6 +51,8 @@
 import org.apache.sandesha2.util.AcknowledgementManager;
 import org.apache.sandesha2.util.FaultManager;
 import org.apache.sandesha2.util.MsgInitializer;
+import org.apache.sandesha2.util.Range;
+import org.apache.sandesha2.util.RangeString;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.wsrm.Sequence;
 
@@ -171,11 +172,11 @@
 			bean.setHighestInMessageNumber(msgNo);
 		}
 
-		// Get the server completed messages list
-		List serverCompletedMessages = bean.getServerCompletedMessages();
-		
-		// If the message in the list of completed
-		boolean msgNoPresentInList = serverCompletedMessages.contains(new Long(msgNo));
+		// Get the server completed message ranges list
+		RangeString serverCompletedMessageRanges = bean.getServerCompletedMessages();
+		// See if the message is in the list of completed ranges
+		boolean msgNoPresentInList = 
+			serverCompletedMessageRanges.isMessageNumberInRanges(msgNo);
 		
 		if (msgNoPresentInList
 				&& (Sandesha2Constants.QOS.InvocationType.DEFAULT_INVOCATION_TYPE == Sandesha2Constants.QOS.InvocationType.EXACTLY_ONCE)) {
@@ -187,7 +188,7 @@
 
 		if (!msgNoPresentInList)
 		{
-			serverCompletedMessages.add(new Long(msgNo));
+			serverCompletedMessageRanges.addRange(new Range(msgNo));
 		}
 		
 		// Update the RMD bean

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMDBean.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMDBean.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMDBean.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMDBean.java Thu Jan 18 08:44:23 2007
@@ -17,7 +17,7 @@
 
 package org.apache.sandesha2.storage.beans;
 
-import java.util.List;
+import org.apache.sandesha2.util.RangeString;
 
 /**
  * This bean is used at the receiving side (of both server and client)
@@ -43,17 +43,16 @@
 	private String lastInMessageId;
 
 	/** 
-	 * For incoming sequences this gives the msg no's of the messages that were
-	 * received (may be an ack was sent - depending on the policy)
+	 * For incoming sequences this gives the msg ranges of the messages that
+	 * have been received (and also possibly an ack was sent, depending on the policy)
 	 */
-	private List serverCompletedMessages = null;
+	private RangeString serverCompletedMessages = null;
 	
 	/**
 	 * For IN_ORDER sequences, we can have finite ranges of messages that can be
-	 * delivered out of order. These are maintained as a String that is consistent
-	 * with the form described in  org.apache.sandesha2.util.RangeString
+	 * delivered out of order. These are maintained as a RangeString
 	 */
-	private String outOfOrderRanges = null;
+	private RangeString outOfOrderRanges = null;
 
 	/**
 	 * Comment for <code>nextMsgNoToProcess</code>
@@ -122,11 +121,11 @@
   	this.highestInMessageNumber = highestInMessageNumber;
   }
 
-	public List getServerCompletedMessages() {
+	public RangeString getServerCompletedMessages() {
   	return serverCompletedMessages;
   }
 
-	public void setServerCompletedMessages(List serverCompletedMessages) {
+	public void setServerCompletedMessages(RangeString serverCompletedMessages) {
   	this.serverCompletedMessages = serverCompletedMessages;
   }
 
@@ -138,11 +137,11 @@
   	this.lastInMessageId = lastInMessageId;
   }
 
-	public String getOutOfOrderRanges() {
+	public RangeString getOutOfOrderRanges() {
   	return outOfOrderRanges;
   }
 
-	public void setOutOfOrderRanges(String outOfOrderRanges) {
+	public void setOutOfOrderRanges(RangeString outOfOrderRanges) {
   	this.outOfOrderRanges = outOfOrderRanges;
   }
 	

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMSBean.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMSBean.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMSBean.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/storage/beans/RMSBean.java Thu Jan 18 08:44:23 2007
@@ -17,7 +17,7 @@
 
 package org.apache.sandesha2.storage.beans;
 
-import java.util.List;
+import org.apache.sandesha2.util.RangeString;
 
 /**
  * This bean is used at the sending side (of both server and client)
@@ -69,10 +69,10 @@
 	private String highestOutRelatesTo = null;
   
 	/** 
-	 * For out going sequences this gives the messages that were sent and that were successfully
+	 * For out going sequences this gives the message ranges that were sent and that were successfully
 	 * acked by the other end point.
 	 */
-	private List clientCompletedMessages = null;
+	private RangeString clientCompletedMessages = null;
   
 	private String transportTo;
 
@@ -224,11 +224,11 @@
   	rmsFlags |= NEXT_MSG_NUM_FLAG;
   }
 
-	public List getClientCompletedMessages() {
+	public RangeString getClientCompletedMessages() {
   	return clientCompletedMessages;
   }
 
-	public void setClientCompletedMessages(List clientCompletedMessages) {
+	public void setClientCompletedMessages(RangeString clientCompletedMessages) {
   	this.clientCompletedMessages = clientCompletedMessages;
   }
 

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/AcknowledgementManager.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/AcknowledgementManager.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/AcknowledgementManager.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/AcknowledgementManager.java Thu Jan 18 08:44:23 2007
@@ -17,11 +17,9 @@
 
 package org.apache.sandesha2.util;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 
 import javax.xml.namespace.QName;
 
@@ -159,10 +157,10 @@
 	 * @param outGoingMessage
 	 * @return
 	 */
-	public static List getClientCompletedMessagesList(String internalSequenceID, String sequenceID, StorageManager storageManager)
+	public static RangeString getClientCompletedMessageRanges(String internalSequenceID, String sequenceID, StorageManager storageManager)
 			throws SandeshaException {
 		if (log.isDebugEnabled())
-			log.debug("Enter: AcknowledgementManager::getClientCompletedMessagesList " + internalSequenceID + ", " + sequenceID);
+			log.debug("Enter: AcknowledgementManager::getClientCompletedMessageRanges " + internalSequenceID + ", " + sequenceID);
     
 		RMSBean rmsBean = SandeshaUtil.getRMSBeanFromSequenceId(storageManager, sequenceID);
 
@@ -173,17 +171,17 @@
 			throw e;
 		}
 		
-		List completedMsgList = rmsBean.getClientCompletedMessages();
+		RangeString completedMsgRanges = rmsBean.getClientCompletedMessages();
 
 		if (log.isDebugEnabled())
-			log.debug("Exit: AcknowledgementManager::getClientCompletedMessagesList");
-		return completedMsgList;
+			log.debug("Exit: AcknowledgementManager::getClientCompletedMessageRanges");
+		return completedMsgRanges;
 	}
 
-	public static ArrayList getServerCompletedMessagesList(String sequenceID, StorageManager storageManager)
+	public static RangeString getServerCompletedMessageRanges(String sequenceID, StorageManager storageManager)
 			throws SandeshaException {
 		if (log.isDebugEnabled())
-			log.debug("Enter: AcknowledgementManager::getServerCompletedMessagesList " + sequenceID);
+			log.debug("Enter: AcknowledgementManager::getServerCompletedMessageRanges " + sequenceID);
 
 		RMDBean rmdBean = SandeshaUtil.getRMDBeanFromSequenceId(storageManager, sequenceID);
 		
@@ -195,8 +193,8 @@
 		}
 
 		if (log.isDebugEnabled())
-			log.debug("Exit: AcknowledgementManager::getServerCompletedMessagesList");
-		return (ArrayList)rmdBean.getServerCompletedMessages();
+			log.debug("Exit: AcknowledgementManager::getServerCompletedMessageRanges");
+		return rmdBean.getServerCompletedMessages();
 	}
 
 	public static RMMsgContext generateAckMessage(RMMsgContext referenceRMMessage, String sequencePropertyKey ,String sequenceId,

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/Range.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/Range.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/Range.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/Range.java Thu Jan 18 08:44:23 2007
@@ -17,6 +17,8 @@
 
 package org.apache.sandesha2.util;
 
+import java.io.Serializable;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.sandesha2.i18n.SandeshaMessageHelper;
@@ -25,12 +27,22 @@
 /**
  * Data structure to represent a range of values from lowerValue->upperValue inclusive.
  */
-public class Range {
+public class Range implements Serializable{
+
+	private static final long serialVersionUID = 1701339894096240940L;
 
 	private static final Log log = LogFactory.getLog(Range.class);
 	
 	long lowerValue;
 	long upperValue;
+	
+	/**
+	 * Create a range for a single number
+	 * @param value
+	 */
+	public Range(long value){
+		this(value, value);
+	}
 	
 	/**
 	 * 

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RangeString.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RangeString.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RangeString.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/RangeString.java Thu Jan 18 08:44:23 2007
@@ -17,6 +17,7 @@
 
 package org.apache.sandesha2.util;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -34,13 +35,21 @@
  * Also performs task such as aggregation of ranges
  *
  */
-public class RangeString {
+public class RangeString implements Serializable{
 
+	private static final long serialVersionUID = -3487094584241136861L;
 	/**
 	 * Each entry in this map is a range
 	 * The key to each range entry is range.lowerValue
 	 */
-	private Map rangeMap;
+	private final Map rangeMap;
+	
+	/**
+	 * Creates an empty range string
+	 */
+	public RangeString(){
+		this(null);
+	}
 	
 	/**
 	 * Expects a String of the form
@@ -80,24 +89,77 @@
 		return null; 
 	}
 	
-	private Range getRangeImmediatelyAbove(long msgNumber){
-		//see if there is a range that starts imemdiately
-		//above the specified number
-		long targetRange = msgNumber + 1;
-		return (Range)rangeMap.get(new Long(targetRange));
+	/**
+	 * If the passed in evelopeRange encompasses several ranges, these are 
+	 * removed from the map 
+	 * @param currentRange
+	 * @return
+	 */
+	private void cleanUpRangesEnveloped(Range envelopeRange){
+		//see if there are any ranges that start at some point between 
+		//immediately above the start of the envelope range up to 
+		//its end 
+		long startOfRangeLookup = envelopeRange.lowerValue + 1;
+		long endOfRangeLookup = envelopeRange.upperValue;
+		for(long i=startOfRangeLookup; i<=endOfRangeLookup; i++){
+			Range removedRange = (Range)rangeMap.remove(new Long(i)); //remove if there is anything present
+			if(removedRange!=null && removedRange.upperValue>envelopeRange.upperValue){
+				//this range started in our envelope but stretched out beyond it so we
+				//can absorb its upper value
+				envelopeRange.upperValue = removedRange.upperValue;
+			}
+		}
+	}
+	
+	/**
+	 * Looks to see if there is a range that starts immediately above
+	 * this one. If so, that range is returned 
+	 * @param targetRange
+	 * @return
+	 */
+	private Range getRangeImmediatelyAbove(Range targetRange){
+		return (Range)rangeMap.get(new Long(targetRange.upperValue + 1));		
 	}
 	
 	
 	public boolean isMessageNumberInRanges(long messageNumber){
+		if(getRangeForMessageNumber(messageNumber)!=null){
+			return true;
+		}
+		else{
+			return false;
+		}
+	}
+	
+	public Range getRangeForMessageNumber(long messageNumber){
 		Range below = getNextRangeBelow(messageNumber);
 		if(below!=null){
 			if(below.rangeContainsValue(messageNumber)){
 				//this range contains our value
-				return true;
+				return below;
 			}
 		}
 		
 		//if we made it here then we are not in any ranges
+		return null;		
+	}
+	
+	/**
+	 * Returns true if the numbers are contained in a single range
+	 * @param interestedRange
+	 * @return
+	 */
+	public boolean isRangeCompleted(Range interestedRange){
+		Range containingRange = getNextRangeBelow(interestedRange.lowerValue);
+		if(containingRange!=null){
+			//so we know there is a range below us, check to see if it
+			//stretches to us or over above us
+			if(containingRange.upperValue>=interestedRange.upperValue){
+				//it does, so this range is contained
+				return true;
+			}
+		}
+		//either their was no range at all or it did not reach high enough 
 		return false;
 	}
 	
@@ -106,11 +168,7 @@
 	 * @return a String of the form [x1,y1][x2,y2]...[xn,yn]
 	 */
 	public String toString(){
-		//iterate the rangeList creating an on-going string
-		Set keySet = rangeMap.keySet();
-		//sort the set
-		List sortedList = new LinkedList(keySet);
-		Collections.sort(sortedList);
+		List sortedList = getSortedKeyList();
 		String returnString = "";
 		for(int i=0; i<sortedList.size(); i++){
 			returnString = returnString + (rangeMap.get(sortedList.get(i))).toString();
@@ -120,34 +178,48 @@
 	}
 	
 	/**
-	 * Returns a list string of the form
-	 * [x1,x2,x3....xn] listing each discrete number contained in all of the ranges
-	 * in order
+	 * @return ordered array of each range object in the string 
 	 */
-	public String getContainedElementsAsListString(){
-		//iterate the rangeList creating an on-going string
+	public Range[] getRanges(){
+		List sortedKeyList = getSortedKeyList();
+		Range[] ranges = new Range[sortedKeyList.size()];
+		for(int i=0; i<ranges.length; i++){
+			ranges[i] = (Range)rangeMap.get(sortedKeyList.get(i));
+		}
+		return ranges;
+	}
+	
+	
+	private List getSortedKeyList(){
 		Set keySet = rangeMap.keySet();
 		//sort the set
 		List sortedList = new LinkedList(keySet);
 		Collections.sort(sortedList);
-		String returnString = "[";
-		for(int i=0; i<sortedList.size(); i++){
-			Range r = (Range)rangeMap.get(sortedList.get(i));
-			for(long l=r.lowerValue; l<=r.upperValue;l++){
-				if(i==0 && l==r.lowerValue){
-					//first time does not need leading ','
-					returnString += l;						
-				}
-				else{
-					returnString += "," + l;						
-				}
+		return sortedList;
+	}
+	
+	/**
+	 * Returns a List of the form
+	 * [x1,x2,x3....xn] listing each discrete number contained in all of the ranges
+	 * in order
+	 * NOTE: inefficient, should be avoided
+	 */
+	public List getContainedElementsAsNumbersList(){
+		List returnList = new LinkedList();
+		Range[] ranges = getRanges();
+		for(int i=0; i<ranges.length; i++){
+			for(long current = ranges[i].lowerValue; current<=ranges[i].upperValue; current++){
+				returnList.add(new Long(current));
 			}
 		}
-		
-		return returnString + "]";		
+		return returnList;
 	}
 	
 	public void addRange(Range r){
+		
+		Range finalRange = r; //we use this to keep track of the final range
+		//as we might aggregate this new range with existing ranges
+		
 		//first we try to aggregate existing ranges
 		boolean rangeAdded = false;
 		long indexKey = r.lowerValue;
@@ -160,11 +232,17 @@
 				//we do not quit yet, as maybe this has plugged a gap between
 				//an upper range. But we should mark the range as added.
 				rangeAdded = true;
+				finalRange = below; //as below now encompasses both ranges agrregated together 
+			}
+			else if(below.upperValue > r.lowerValue){
+				//the range below extends over this one - this range
+				//is already complete, so we do not need to add it at all.
+				return;
 			}
 		}
 		
 		//see if we can extend another range down
-		Range above = getRangeImmediatelyAbove(r.upperValue);
+		Range above = getRangeImmediatelyAbove(r);
 		if(above!=null){
 			//we can extend this down
 			//first remove it. Then we will either add it under its new key or 
@@ -174,13 +252,16 @@
 			if(rangeAdded){
 				//we extend down and up - join two ranges together
 				//Sicne we have removed the upper, we simply do not add it again and set the
-				//lower range to encompass both of them
+				//below range to encompass both of them
 				below.upperValue = above.upperValue;
+				//NOTE: finalRange has already been set when extending up
 			}
 			else{
-				//we did extend up but we did not extend down. Add the upper range back under its new key
+				//we did not extend up but we can extend down. 
+				//Add the upper range back under its new key
 				rangeAdded = true;				
 				rangeMap.put(new Long(above.lowerValue), above);
+				finalRange = above;
 			}
 
 		}
@@ -188,11 +269,16 @@
 		if(!rangeAdded){
 			//if we got here and did not add a range then we need to 
 			//genuinely add a new range object
-			rangeMap.put(new Long(r.lowerValue), r);			
+			rangeMap.put(new Long(r.lowerValue), r);
 		}
-
+		
+		//finally, we go through the new range we have added to make sure it
+		//does not now encompass any smaller ranges that were there before (but
+		//that could not be extended up or down)
+		cleanUpRangesEnveloped(finalRange);
 		
 	}
+	
 	
 
 }

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SandeshaUtil.java Thu Jan 18 08:44:23 2007
@@ -22,9 +22,7 @@
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
-import java.util.StringTokenizer;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.FactoryConfigurationError;
@@ -118,86 +116,29 @@
 	}
 
 	/**
-	 * Used to convert a message number list (a comma seperated list of message
-	 * numbers) into a set of AcknowledgementRanges. This breaks the list, sort
-	 * the items and group them to create the AcknowledgementRange objects.
+	 * Used to convert a RangeString into a set of AcknowledgementRanges.
 	 * 
 	 * @param msgNoStr
 	 * @param factory
 	 * @return
 	 * @throws SandeshaException
 	 */
-	public static ArrayList getAckRangeArrayList(List completedMessages, String rmNamespaceValue)
+	public static ArrayList getAckRangeArrayList(RangeString completedMessageRanges, String rmNamespaceValue)
 			throws SandeshaException {
 
-		ArrayList ackRanges = new ArrayList();
+		ArrayList ackRanges = new ArrayList(); //the final ack ranges that we will build up
 
-		ArrayList sortedMsgNoArrayList = getSortedMsgNoArrayList(completedMessages);
-
-		Iterator iterator = sortedMsgNoArrayList.iterator();
-		long lower = 0;
-		long upper = 0;
-		boolean completed = true;
-
-		while (iterator.hasNext()) {
-			Long tempLng = (Long) iterator.next();
-			long temp = tempLng.longValue();
-			if (lower == 0) {
-				lower = temp;
-				upper = temp;
-				completed = false;
-			} else if (temp == (upper + 1)) {
-				upper = temp;
-				completed = false;
-			} else {
-				// add ackRange (lower,upper)
-				AcknowledgementRange ackRange = new AcknowledgementRange(rmNamespaceValue);
-				ackRange.setLowerValue(lower);
-				ackRange.setUpperValue(upper);
-				ackRanges.add(ackRange);
-
-				lower = temp;
-				upper = temp;
-				completed = false;
-			}
-		}
-
-		if (!completed) {
+		Range[] ranges = completedMessageRanges.getRanges();
+		for(int i=0; i<ranges.length; i++){
 			AcknowledgementRange ackRange = new AcknowledgementRange(rmNamespaceValue);
-			ackRange.setLowerValue(lower);
-			ackRange.setUpperValue(upper);
-			ackRanges.add(ackRange);
-			completed = true;
+			ackRange.setLowerValue(ranges[i].lowerValue);
+			ackRange.setUpperValue(ranges[i].upperValue);
+			ackRanges.add(ackRange);			
 		}
-
+		
 		return ackRanges;
 	}
 
-	public static ArrayList getSortedMsgNoArrayList(List list) {
-
-		ArrayList sortedList = new ArrayList();
-
-		long max = 0;
-		Iterator it1 = list.iterator();
-		while (it1.hasNext()) {
-			Long tempLng = (Long) it1.next();
-			long temp = tempLng.longValue();
-			if (temp > max)
-				max = temp;
-		}
-
-		int item = 0;
-		for (long i = 1; i <= max; i++) {
-			Long temp = new Long(i);
-			if (list.contains(temp)) {
-				sortedList.add(item, temp);
-				item++;
-			}
-		}
-
-		return sortedList;
-	}
-
 	public static void startSenderForTheSequence(ConfigurationContext context, String sequenceID) throws SandeshaException {
 		if (log.isDebugEnabled())
 			log.debug("Enter: SandeshaUtil::startSenderForTheSequence , context " + context + ", sequenceID " + sequenceID);
@@ -295,19 +236,6 @@
 		return false;
 	}
 
-	public static ArrayList getSplittedMsgNoArraylist(String str) {
-
-		StringTokenizer tokenizer = new StringTokenizer(str, ",");
-
-		ArrayList results = new ArrayList();
-
-		while (tokenizer.hasMoreTokens()) {
-			results.add(tokenizer.nextToken());
-		}
-
-		return results;
-	}
-
 	public static String getServerSideIncomingSeqIdFromInternalSeqId(String internalSequenceId)
 			throws SandeshaException {
 
@@ -689,26 +617,6 @@
 		return retArr;
 	}
 
-	public static ArrayList getArrayListFromMsgsString(String str) {
-
-		if (str == null || "".equals(str))
-			return new ArrayList();
-
-		ArrayList retArr = new ArrayList();
-
-		StringTokenizer tokenizer = new StringTokenizer(str, ",");
-
-		while (tokenizer.hasMoreElements()) {
-			String nextToken = tokenizer.nextToken();
-			if (nextToken != null && !"".equals(nextToken)) {
-				Long lng = new Long(nextToken);
-				retArr.add(lng);
-			}
-		}
-
-		return retArr;
-	}
-
 	public static String getInternalSequenceID(String to, String sequenceKey) {
 		if (to == null && sequenceKey == null)
 			return null;
@@ -864,15 +772,16 @@
 			StorageManager storageManager) throws SandeshaException {
 
 		RMSBean rmsBean = SandeshaUtil.getRMSBeanFromInternalSequenceId(storageManager, sequencePropertyKey);
-		List ackedMsgsList = rmsBean.getClientCompletedMessages();
-
+		
+		RangeString ackedMsgRanges = rmsBean.getClientCompletedMessages();
 		long smallestMsgNo = 1;
-		for (long tempMsgNo = smallestMsgNo; tempMsgNo <= highestInMsgNo; tempMsgNo++) {
-			if (!ackedMsgsList.contains(new Long(tempMsgNo)))
-				return false;
+		Range interestedRange = new Range(smallestMsgNo, highestInMsgNo);
+		boolean allComplete = false;
+		if(ackedMsgRanges.isRangeCompleted(interestedRange)){
+			allComplete = true;
 		}
-
-		return true; // all message upto the highest have been acked.
+		return allComplete;
+	
 	}
 	
 	public static SandeshaPolicyBean getPropertyBean (AxisDescription axisDescription) throws SandeshaException {

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/util/SequenceManager.java Thu Jan 18 08:44:23 2007
@@ -8,7 +8,6 @@
 
 import java.net.URI;
 import java.net.URISyntaxException;
-import java.util.ArrayList;
 
 import javax.xml.namespace.QName;
 
@@ -89,7 +88,7 @@
 		MessageContext createSeqContext = createSequenceMsg.getMessageContext();
 		ConfigurationContext configurationContext = createSeqContext.getConfigurationContext();
 
-		rmdBean.setServerCompletedMessages(new ArrayList());
+		rmdBean.setServerCompletedMessages(new RangeString());
 		
 		rmdBean.setReplyToEPR(to.getAddress());
 		rmdBean.setAcksToEPR(acksTo.getAddress());
@@ -243,8 +242,8 @@
 
 		}
 
-		// New up the client completed messages list
-		rmsBean.setClientCompletedMessages(new ArrayList());
+		// New up the client completed message ranges list
+		rmsBean.setClientCompletedMessages(new RangeString());
 
 		// saving transportTo value;
 		String transportTo = (String) firstAplicationMsgCtx.getProperty(Constants.Configuration.TRANSPORT_URL);

Modified: webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/Invoker.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/Invoker.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/Invoker.java (original)
+++ webservices/sandesha/trunk/java/src/org/apache/sandesha2/workers/Invoker.java Thu Jan 18 08:44:23 2007
@@ -134,14 +134,14 @@
 								RangeString rangeString = null;
 								if(rMDBean.getOutOfOrderRanges()==null){
 									//insert a new blank one one
-									rangeString = new RangeString("");
+									rangeString = new RangeString();
 								}
 								else{
-									rangeString = new RangeString(rMDBean.getOutOfOrderRanges());
+									rangeString = rMDBean.getOutOfOrderRanges();
 								}
 								//update the range String with the new value
 								rangeString.addRange(r);
-								rMDBean.setOutOfOrderRanges(rangeString.toString());
+								rMDBean.setOutOfOrderRanges(rangeString);
 							}
 							
 							rmdBeanMgr.update(rMDBean);
@@ -177,8 +177,7 @@
 		RMDBean rmdBean = SandeshaUtil.getRMDBeanFromSequenceId(storageManager, sequenceID);
 		
 		if(rmdBean != null && rmdBean.getOutOfOrderRanges() != null){
-			String sequenceRanges = rmdBean.getOutOfOrderRanges();
-			RangeString rangeString = new RangeString(sequenceRanges);
+			RangeString rangeString = rmdBean.getOutOfOrderRanges();
 			//we now have the set of ranges that can be delivered out of order.
 			//Look for any invokable message that lies in one of those ranges
 			InvokerBean selector = new InvokerBean();

Modified: webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaUtilTest.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaUtilTest.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaUtilTest.java (original)
+++ webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/SandeshaUtilTest.java Thu Jan 18 08:44:23 2007
@@ -20,6 +20,8 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 
+import org.apache.sandesha2.util.Range;
+import org.apache.sandesha2.util.RangeString;
 import org.apache.sandesha2.util.SandeshaUtil;
 import org.apache.sandesha2.wsrm.AcknowledgementRange;
 
@@ -59,16 +61,17 @@
 		
 	}
 	
-	public void testGetAckRangeArrayList () throws SandeshaException {
-		ArrayList msgNumberArr = new ArrayList();
-		msgNumberArr.add(new Long(3));
-		msgNumberArr.add(new Long(6));
-		msgNumberArr.add(new Long(1));
-		msgNumberArr.add(new Long(5));
-		msgNumberArr.add(new Long(8));
-		msgNumberArr.add(new Long(2));	
+	public void testGetAckRangesFromRangeStringOutOfOrder()throws SandeshaException{
 		
-		ArrayList list = SandeshaUtil.getAckRangeArrayList(msgNumberArr,Sandesha2Constants.SPEC_2005_02.NS_URI);
+		RangeString rangeString = new RangeString();
+		rangeString.addRange(new Range(3));
+		rangeString.addRange(new Range(6));
+		rangeString.addRange(new Range(1));
+		rangeString.addRange(new Range(5));
+		rangeString.addRange(new Range(8));
+		rangeString.addRange(new Range(2));
+		
+		ArrayList list = SandeshaUtil.getAckRangeArrayList(rangeString,Sandesha2Constants.SPEC_2005_02.NS_URI);
 		assertNotNull(list);
 		assertEquals(list.size(),3);
 		
@@ -91,6 +94,81 @@
 		assertNotNull(ackRange);
 		assertEquals(ackRange.getLowerValue(),8);
 		assertEquals(ackRange.getUpperValue(),8);
+		
+		assertFalse(it.hasNext());
+	}
+	
+	public void testGetAckRangesFromRangeStringGapFilling () throws SandeshaException {
+		//build a range string to represent the completed messages
+		RangeString rangeString = new RangeString();
+		rangeString.addRange(new Range(1,3));
+		rangeString.addRange(new Range(4));
+		//insert a gap - number 5 is missing
+		rangeString.addRange(new Range(6));
+		//insert a gap - 7 and 8 are missing
+		rangeString.addRange(new Range(9, 10));
+		
+		ArrayList list = SandeshaUtil.getAckRangeArrayList(rangeString,Sandesha2Constants.SPEC_2005_02.NS_URI);
+		assertNotNull(list);
+		//we expect 3 ranges: [1-4] [6] [9-10]
+		assertEquals(list.size(),3);
+		
+		Iterator it = list.iterator();
+		AcknowledgementRange ackRange = null;
+		
+		ackRange = (AcknowledgementRange) it.next();
+		assertNotNull(ackRange);
+		assertEquals(ackRange.getLowerValue(),1);
+		assertEquals(ackRange.getUpperValue(),4);
+		
+		ackRange = null;
+		ackRange = (AcknowledgementRange) it.next();
+		assertNotNull(ackRange);
+		assertEquals(ackRange.getLowerValue(),6);
+		assertEquals(ackRange.getUpperValue(),6);
+		
+		ackRange = null;
+		ackRange = (AcknowledgementRange) it.next();
+		assertNotNull(ackRange);
+		assertEquals(ackRange.getLowerValue(),9);
+		assertEquals(ackRange.getUpperValue(),10);
+		
+		assertFalse(it.hasNext());
+		
+		//ok, now plug a gap at msg 5
+		rangeString.addRange(new Range(5));
+		list = SandeshaUtil.getAckRangeArrayList(rangeString,Sandesha2Constants.SPEC_2005_02.NS_URI);
+		assertNotNull(list);
+		//we expect 2 ranges: [1-6] [9-10]
+		it = list.iterator();
+		ackRange = null;
+		
+		ackRange = (AcknowledgementRange) it.next();
+		assertNotNull(ackRange);
+		assertEquals(ackRange.getLowerValue(),1);
+		assertEquals(ackRange.getUpperValue(),6);
+		
+		ackRange = null;
+		ackRange = (AcknowledgementRange) it.next();
+		assertNotNull(ackRange);
+		assertEquals(ackRange.getLowerValue(),9);
+		assertEquals(ackRange.getUpperValue(),10);
+		
+		assertFalse(it.hasNext());
+		
+		//plug all of the gaps - 7 and 8
+		rangeString.addRange(new Range(8));
+		rangeString.addRange(new Range(7,8)); 
+		list = SandeshaUtil.getAckRangeArrayList(rangeString,Sandesha2Constants.SPEC_2005_02.NS_URI);
+		assertNotNull(list);
+		//we expect 1 ranges: [1-10]
+		it = list.iterator();
+		ackRange = null;
+		
+		ackRange = (AcknowledgementRange) it.next();
+		assertNotNull(ackRange);
+		assertEquals(ackRange.getLowerValue(),1);
+		assertEquals(ackRange.getUpperValue(),10);
 		
 		assertFalse(it.hasNext());
 	}

Added: webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/utils/RangeStringTest.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/utils/RangeStringTest.java?view=auto&rev=497494
==============================================================================
--- webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/utils/RangeStringTest.java (added)
+++ webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/utils/RangeStringTest.java Thu Jan 18 08:44:23 2007
@@ -0,0 +1,103 @@
+/*
+ * 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.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.sandesha2.SandeshaTestCase;
+
+import com.ibm.jvm.util.ByteArrayOutputStream;
+
+public class RangeStringTest extends SandeshaTestCase{
+
+	
+	public RangeStringTest(String s){
+		super(s);
+	}
+	
+	public void testStringToRangeAndBack(){
+	  
+		//our expected range is missing 6, 9, 10 and 11 and ends at 12
+		String finalRangeString = "[0,5][7,8][12,12]";
+		
+		RangeString rString = new RangeString(finalRangeString);
+		assertTrue(rString.isMessageNumberInRanges(0));
+		assertTrue(rString.isMessageNumberInRanges(1));
+		assertTrue(rString.isMessageNumberInRanges(2));
+		assertTrue(rString.isMessageNumberInRanges(3));
+		assertTrue(rString.isMessageNumberInRanges(4));
+		assertTrue(rString.isMessageNumberInRanges(5));
+		
+		assertFalse(rString.isMessageNumberInRanges(6));
+		
+		assertTrue(rString.isMessageNumberInRanges(7));
+		assertTrue(rString.isMessageNumberInRanges(8));
+		
+		assertFalse(rString.isMessageNumberInRanges(9));
+		assertFalse(rString.isMessageNumberInRanges(10));
+		assertFalse(rString.isMessageNumberInRanges(11));
+		
+		assertTrue(rString.isMessageNumberInRanges(12));
+		
+		//now just check some boundary conditions
+		assertFalse(rString.isMessageNumberInRanges(13));
+		assertFalse(rString.isMessageNumberInRanges(-1));
+		
+		//now we get the string representation back
+		assertEquals(finalRangeString, rString.toString());
+		
+	}
+	
+	
+	public void testGrowingRange(){
+		//start of missing msgs 2-9
+		String msgs = "[1,1][10,10]";
+		
+		RangeString rString = new RangeString(msgs);
+		rString.addRange(new Range(2,2)); //msg 2 arrives
+		rString.addRange(new Range(8,9)); //msgs 8 and 9 arrive
+		rString.addRange(new Range(6,6)); // msg 6 arrives
+		rString.addRange(new Range(3,5)); //msgs 3,4 and 5 arrive
+		rString.addRange(new Range(3,4)); //msgs 3,4 are duplicated
+		rString.addRange(new Range(7,7)); //finally msg 7
+		
+		//all msgs have now arrived
+		assertEquals("[1,10]", rString.toString());
+		
+		//all messages are duplicated
+		rString.addRange(new Range(1,10)); 
+		//cehck we handle duplicates
+		assertEquals("[1,10]", rString.toString());
+	}
+	
+	public void testSerialize()throws Exception{
+		String msgRange = "[1,100]";
+		RangeString r = new RangeString(msgRange);
+		//serialize
+		ByteArrayOutputStream memoryBuffer = new ByteArrayOutputStream();
+		ObjectOutputStream serializer = new ObjectOutputStream(memoryBuffer);
+		serializer.writeObject(r);
+		serializer.flush();
+		//deserialize
+		ObjectInputStream inStrm = new ObjectInputStream(new ByteArrayInputStream(memoryBuffer.toByteArray()));
+		RangeString newRangeString = (RangeString)inStrm.readObject();
+		assertEquals(msgRange, newRangeString.toString());
+	}
+	
+	
+}
\ No newline at end of file

Modified: webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java
URL: http://svn.apache.org/viewvc/webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java?view=diff&rev=497494&r1=497493&r2=497494
==============================================================================
--- webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java (original)
+++ webservices/sandesha/trunk/java/test/src/org/apache/sandesha2/workers/ForceInboundDispatchTest.java Thu Jan 18 08:44:23 2007
@@ -84,7 +84,7 @@
 			
 			//also check that the sequence has an out of order gap that contains msg 2			
 			assertNotNull(rMDBean.getOutOfOrderRanges());
-			RangeString rangeString = new RangeString(rMDBean.getOutOfOrderRanges());
+			RangeString rangeString = rMDBean.getOutOfOrderRanges();
 			assertTrue(rangeString.isMessageNumberInRanges(2));
 			t.commit();
 			



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