Author: norman
Date: Sun Apr 10 13:22:31 2011
New Revision: 1090796

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

Modified:
    
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java

Modified: 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java?rev=1090796&r1=1090795&r2=1090796&view=diff
==============================================================================
--- 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
 (original)
+++ 
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
 Sun Apr 10 13:22:31 2011
@@ -643,14 +643,24 @@ public abstract class ImapRequestLineRea
         int pos = range.indexOf(':');
         try {
             if (pos == -1) {
-                long value = parseUnsignedInteger(range);
-                return new IdRange(value);
+                
+                // Check if its a single "*" and so should return last message 
in mailbox. See IMAP-289
+                if (range.length() == 1 && range.charAt(0) == '*') {
+                    return new IdRange(Long.MAX_VALUE, Long.MAX_VALUE);
+                } else {
+                    long value = parseUnsignedInteger(range);
+                    return new IdRange(value);
+                }
             } else {
                 // Make sure we detect the low and high value
                 // See https://issues.apache.org/jira/browse/IMAP-212
                 long val1 = parseUnsignedInteger(range.substring(0, pos));
                 long val2 = parseUnsignedInteger(range.substring(pos + 1));
-                if (val1 <= val2) {
+                
+                // handle "*:*" ranges. See IMAP-289
+                if (val1 == Long.MAX_VALUE && val2 == Long.MAX_VALUE) {
+                    return new IdRange(Long.MAX_VALUE, Long.MAX_VALUE);
+                } else if (val1 <= val2) {
                     return new IdRange(val1, val2);
                 } else if(val1 == Long.MAX_VALUE) {
                     return new IdRange(Long.MIN_VALUE, val2);

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=1090796&r1=1090795&r2=1090796&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:22:31 2011
@@ -388,6 +388,12 @@ abstract public class AbstractMailboxPro
         long highVal = range.getHighVal();
       
         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;
+            }
+            
             if (lowVal != Long.MIN_VALUE) {
                 lowVal = selected.uid((int) lowVal);
                 if (lowVal == SelectedMailbox.NO_SUCH_MESSAGE)
@@ -398,6 +404,12 @@ abstract public class AbstractMailboxPro
                 if (highVal == SelectedMailbox.NO_SUCH_MESSAGE)
                     throw new MessageRangeException("No message found with msn 
" + highVal);
             }
+        } 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;
+            }
         }
         MessageRange mRange = MessageRange.range(lowVal, highVal);
         return mRange;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to