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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to