Author: norman
Date: Sun Apr 10 19:03:16 2011
New Revision: 1090868

URL: http://svn.apache.org/viewvc?rev=1090868&view=rev
Log:
Correctly handle sequence-sets when using SEARCH. See IMAP-292

Modified:
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java

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=1090868&r1=1090867&r2=1090868&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 19:03:16 2011
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.MessageM
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.MessageRangeException;
 import org.apache.james.mailbox.MessageResult;
+import org.apache.james.mailbox.MessageRange.Type;
 import org.apache.james.mailbox.util.FetchGroupImpl;
 
 abstract public class AbstractMailboxProcessor<M extends ImapRequest> extends 
AbstractChainedProcessor<M> {
@@ -407,10 +408,58 @@ abstract public class AbstractMailboxPro
             // 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) {
                 return MessageRange.one(selected.getLastUid());
+            } else if (highVal == Long.MAX_VALUE && selected.getLastUid() < 
lowVal) {
+                // Sequence uid ranges which use *:<uid-higher-then-last-uid> 
MUST return at least the highest uid in the mailbox
+                // See IMAP-291
+                return MessageRange.one(selected.getLastUid());
             }
         }
         MessageRange mRange = MessageRange.range(lowVal, highVal);
         return mRange;
     }
+    
+    
+    /**
+     * Format MessageRange to RANGE format applying selected folder min & max 
UIDs constraints
+     * 
+     * @param selected currently selected mailbox
+     * @param range input range
+     * @return normalized message range
+     * @throws MessageRangeException 
+     */
+    protected MessageRange normalizeMessageRange(SelectedMailbox selected, 
MessageRange range) throws MessageRangeException {
+        Type rangeType = range.getType();
+        long start;
+        long end;
+        
+        switch (rangeType) {
+        case ONE:
+            return range;
+        case ALL:
+            start = selected.getFirstUid();
+            end = selected.getLastUid();
+            return MessageRange.range(start, end);
+        case RANGE:
+            start = range.getUidFrom();
+            if (start < 1 || start == Long.MAX_VALUE || start < 
selected.getFirstUid()) {
+                start = selected.getFirstUid();
+            }
+            end = range.getUidTo();
+            if (end < 1 || end == Long.MAX_VALUE || end > 
selected.getLastUid()) {
+                end = selected.getLastUid();
+            }
+            return MessageRange.range(start, end);
+        case FROM:
+            start = range.getUidFrom();
+            if (start < 1 || start == Long.MAX_VALUE || start < 
selected.getFirstUid()) {
+                start = selected.getFirstUid();
+            }
+            
+            end = selected.getLastUid();
+            return MessageRange.range(start, end);
+        default:
+            throw new MessageRangeException("Unknown message range type: 
"+rangeType);
+        }
+    }
 
 }

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java?rev=1090868&r1=1090867&r2=1090868&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
 Sun Apr 10 19:03:16 2011
@@ -43,6 +43,7 @@ import org.apache.james.imap.message.res
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.MessageRangeException;
 import org.apache.james.mailbox.SearchQuery;
 import org.apache.james.mailbox.SearchQuery.Criterion;
@@ -230,45 +231,16 @@ public class SearchProcessor extends Abs
         final SearchQuery.NumericRange[] ranges = new 
SearchQuery.NumericRange[length];
         for (int i = 0; i < length; i++) {
             final IdRange range = sequenceNumbers[i];
-            long highVal = range.getHighVal();
-            long lowVal = range.getLowVal();
-            long lowUid;
-            long highUid;
-            final SelectedMailbox selected = session.getSelected();
-
-            if (msn) {
-                if (highVal == Long.MAX_VALUE) {
-                    highUid = Long.MAX_VALUE;
-                } else {
-                    final int highMsn = (int) highVal;
-                    highUid = selected.uid(highMsn);
-                    
-                    if (highUid == SelectedMailbox.NO_SUCH_MESSAGE) highUid = 
selected.getLastUid();
-                }
-                if (lowVal == Long.MIN_VALUE) {
-                    lowUid = Long.MAX_VALUE;
-                } else {
-                    final int lowMsn = (int) lowVal;
-                    lowUid = selected.uid(lowMsn);
-                    if (lowUid == SelectedMailbox.NO_SUCH_MESSAGE) lowUid = 
selected.getFirstUid();
 
-                }
-            } else {
-                lowUid = lowVal;
-                highUid = highVal;
-                
-                
-               if (lowVal != Long.MIN_VALUE && lowVal < 
selected.getFirstUid()) {
-                       lowUid = selected.getFirstUid();
-               } 
-               
-               if (highVal != Long.MAX_VALUE && highVal > 
selected.getLastUid()) {
-                       highUid = selected.getLastUid();
-               } 
-            }
-            ranges[i] = new SearchQuery.NumericRange(lowUid, highUid);
+            // correctly calculate the ranges. See IMAP-292
+            final SelectedMailbox selected = session.getSelected();
+            MessageRange mRange = messageRange(selected, range, !msn);
+            mRange = normalizeMessageRange(selected, mRange);
+            ranges[i] = new SearchQuery.NumericRange(mRange.getUidFrom(), 
mRange.getUidTo());
+            
         }
-        return SearchQuery.uid(ranges);
+        Criterion crit =  SearchQuery.uid(ranges);
+        return crit;
     }
 
     private Criterion or(List<SearchKey> keys, final ImapSession session) 
throws MessageRangeException {

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java?rev=1090868&r1=1090867&r2=1090868&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
 Sun Apr 10 19:03:16 2011
@@ -33,7 +33,6 @@ import org.apache.james.imap.api.message
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.imap.message.request.FetchRequest;
 import org.apache.james.imap.message.response.FetchResponse;
 import org.apache.james.imap.processor.AbstractMailboxProcessor;
@@ -41,14 +40,13 @@ import org.apache.james.mailbox.MailboxE
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageManager.MessageCallback;
 import org.apache.james.mailbox.MessageRange;
 import org.apache.james.mailbox.MessageRangeException;
 import org.apache.james.mailbox.MessageResult;
-import org.apache.james.mailbox.UnsupportedCriteriaException;
-import org.apache.james.mailbox.MessageManager.MessageCallback;
-import org.apache.james.mailbox.MessageRange.Type;
 import org.apache.james.mailbox.MessageResult.FetchGroup;
 import org.apache.james.mailbox.MessageResult.MimePath;
+import org.apache.james.mailbox.UnsupportedCriteriaException;
 import org.apache.james.mailbox.util.FetchGroupImpl;
 import org.apache.james.mime4j.field.address.parser.ParseException;
 
@@ -145,49 +143,7 @@ public class FetchProcessor extends Abst
         }
         
     }
-    
-    /**
-     * Format MessageRange to RANGE format applying selected folder min & max 
UIDs constraints
-     * 
-     * @param selected currently selected mailbox
-     * @param range input range
-     * @return normalized message range
-     * @throws MessageRangeException 
-     */
-    private MessageRange normalizeMessageRange(SelectedMailbox selected, 
MessageRange range) throws MessageRangeException {
-        Type rangeType = range.getType();
-        long start;
-        long end;
-        
-        switch (rangeType) {
-        case ONE:
-            return range;
-        case ALL:
-            start = selected.getFirstUid();
-            end = selected.getLastUid();
-            return MessageRange.range(start, end);
-        case RANGE:
-            start = range.getUidFrom();
-            if (start < 1 || start == Long.MAX_VALUE || start < 
selected.getFirstUid()) {
-                start = selected.getFirstUid();
-            }
-            end = range.getUidTo();
-            if (end < 1 || end == Long.MAX_VALUE || end > 
selected.getLastUid()) {
-                end = selected.getLastUid();
-            }
-            return MessageRange.range(start, end);
-        case FROM:
-            start = range.getUidFrom();
-            if (start < 1 || start == Long.MAX_VALUE || start < 
selected.getFirstUid()) {
-                start = selected.getFirstUid();
-            }
-            
-            end = selected.getLastUid();
-            return MessageRange.range(start, end);
-        default:
-            throw new MessageRangeException("Unknown message range type: 
"+rangeType);
-        }
-    }
+
     
     protected FetchGroup getFetchGroup(FetchData fetch) {
         FetchGroupImpl result = new FetchGroupImpl();



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

Reply via email to