You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/04/10 15:50:44 UTC

svn commit: r1090799 - in /james/imap/trunk: api/src/main/java/org/apache/james/imap/api/message/IdRange.java processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java

Author: norman
Date: Sun Apr 10 13:50:43 2011
New Revision: 1090799

URL: http://svn.apache.org/viewvc?rev=1090799&view=rev
Log:
Correctly parse and handle "*" and "*:*" message ranges. See IMAP-289

Modified:
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java
    james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java?rev=1090799&r1=1090798&r2=1090799&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/message/IdRange.java Sun Apr 10 13:50:43 2011
@@ -131,18 +131,33 @@ public class IdRange {
     public static List<IdRange> mergeRanges(final List<IdRange> ranges) {
         List<IdRange> copy = new ArrayList<IdRange>(ranges);
         Collections.sort(copy, IdRangeComperator.INSTANCE);
-       
+        
+        boolean lastUid = false;
+        
         for (int i = 0; i < copy.size() -1; i++) {
             IdRange current = copy.get(i);
             IdRange next = copy.get(i +1);
-            if (current.getHighVal() >= next.getLowVal() -1) {
-                if (next.getHighVal() > current.getHighVal()) {
-                    current.setHighVal(next.getHighVal());
+            if (next.getLowVal() == Long.MAX_VALUE && next.getHighVal() == Long.MAX_VALUE) {
+                if (lastUid) {
+                    copy.remove(next);
+                    i--;
+                } else {
+                    lastUid = true;
                 }
-                // remove the merged id range and decrease the count
-                copy.remove(next);
-                i--;
+            }  else {
+                // Make sure we handle the "*" and "*:*" correctly and don't remove ranges by error. See IMAP-289
+                if ((current.getLowVal() != Long.MAX_VALUE && current.getHighVal() != Long.MAX_VALUE) && (current.getHighVal() >= next.getLowVal() -1)) {
+                    if (next.getHighVal() > current.getHighVal()) {
+                        current.setHighVal(next.getHighVal());
+                    }
+                    // remove the merged id range and decrease the count
+                    copy.remove(next);
+                    i--;
+                } 
             }
+            
+            
+            
         }
         return copy;
 
@@ -153,7 +168,18 @@ public class IdRange {
         private static IdRangeComperator INSTANCE = new IdRangeComperator();
 
         public int compare(IdRange range1, IdRange range2) {
-            return (int) (range1.getLowVal() - range2.getLowVal());
+            
+            // Correctly sort and respect "*" and "*:*" ranges. See IMAP-289
+            if (range1.getLowVal() == Long.MAX_VALUE && range1.getHighVal() == Long.MAX_VALUE && range2.getLowVal() == Long.MAX_VALUE && range2.getHighVal() == Long.MAX_VALUE) {
+                return 0;
+            }
+            if (range1.getLowVal() == Long.MAX_VALUE && range1.getHighVal() == Long.MAX_VALUE) {
+                return 1;
+            } else if (range2.getLowVal() == Long.MAX_VALUE && range2.getHighVal() == Long.MAX_VALUE) {
+                return -1;
+            } else {
+                return (int) (range1.getLowVal() - range2.getLowVal());
+            }
         }
 
     }

Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java?rev=1090799&r1=1090798&r2=1090799&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java Sun Apr 10 13:50:43 2011
@@ -390,8 +390,7 @@ abstract public class AbstractMailboxPro
         if (useUids == false) {
             // Take care of "*" and "*:*" values by return the last message in the mailbox. See IMAP-289
             if (lowVal == Long.MAX_VALUE && highVal == Long.MAX_VALUE) {
-                lowVal = selected.getLastUid();
-                highVal = lowVal;
+                return MessageRange.one(selected.getLastUid());
             }
             
             if (lowVal != Long.MIN_VALUE) {
@@ -407,8 +406,7 @@ abstract public class AbstractMailboxPro
         } else {
             // Take care of "*" and "*:*" values by return the last message in the mailbox. See IMAP-289
             if (lowVal == Long.MAX_VALUE && highVal == Long.MAX_VALUE) {
-                lowVal = selected.getLastUid();
-                highVal = lowVal;
+                return MessageRange.one(selected.getLastUid());
             }
         }
         MessageRange mRange = MessageRange.range(lowVal, highVal);



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