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 2010/09/14 07:39:32 UTC

svn commit: r996760 - in /james/imap/trunk: api/src/main/java/org/apache/james/imap/api/process/ processor/src/main/java/org/apache/james/imap/processor/ processor/src/main/java/org/apache/james/imap/processor/base/

Author: norman
Date: Tue Sep 14 05:39:31 2010
New Revision: 996760

URL: http://svn.apache.org/viewvc?rev=996760&view=rev
Log:
Handle unknown uid or msn ranges in Copy,Search,Store and Fetch commands, now it really acts like dovecot and respect MSN and UID (IMAP-209)

Modified:
    james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/SelectedMailbox.java
    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/base/SelectedMailboxImpl.java
    james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java

Modified: james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/SelectedMailbox.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/SelectedMailbox.java?rev=996760&r1=996759&r2=996760&view=diff
==============================================================================
--- james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/SelectedMailbox.java (original)
+++ james/imap/trunk/api/src/main/java/org/apache/james/imap/api/process/SelectedMailbox.java Tue Sep 14 05:39:31 2010
@@ -151,4 +151,18 @@ public interface SelectedMailbox {
      * @return flagsUids
      */
     public Collection<Long> flagUpdateUids();
+    
+    /**
+     * Return the uid of the first message in the mailbox or -1 if the mailbox is empty
+     * 
+     * @return firstUid
+     */
+    public long getFirstUid();
+    
+    /**
+     * Return the uid of the last message in the mailbox or -1 if the mailbox is empty
+     * 
+     * @return lastUid
+     */
+    public long getLastUid();
 }
\ No newline at end of file

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=996760&r1=996759&r2=996760&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 Tue Sep 14 05:39:31 2010
@@ -373,6 +373,7 @@ abstract public class AbstractMailboxPro
     protected MessageRange messageRange(SelectedMailbox selected, IdRange range, boolean useUids) throws MessageRangeException {
         long lowVal = range.getLowVal();
         long highVal = range.getHighVal();
+      
         if (useUids == false) {
             if (lowVal != Long.MAX_VALUE) {
                 lowVal = selected.uid((int) lowVal);
@@ -384,6 +385,15 @@ abstract public class AbstractMailboxPro
                 if (highVal == SelectedMailbox.NO_SUCH_MESSAGE)
                     throw new MessageRangeException("No message found with msn " + highVal);
             }
+        } else {
+            
+        	if (lowVal != Long.MAX_VALUE && lowVal < selected.getFirstUid()) {
+                throw new MessageRangeException("No message found with uid " + lowVal);
+        	} 
+        	
+        	if (highVal != Long.MAX_VALUE && highVal > selected.getLastUid()) {
+                throw new MessageRangeException("No message found with uid " + highVal);
+        	} 
         }
         MessageRange mRange = MessageRange.range(lowVal, highVal);
         return mRange;

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=996760&r1=996759&r2=996760&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 Tue Sep 14 05:39:31 2010
@@ -98,6 +98,7 @@ public class SearchProcessor extends Abs
     private Collection<Long> findIds(final boolean useUids,
             final ImapSession session, MessageManager mailbox, final SearchQuery query)
             throws MailboxException, MessageRangeException {
+    	
         final Iterator<Long> it = mailbox.search(query, ImapSessionUtils
                 .getMailboxSession(session));
 
@@ -237,8 +238,9 @@ public class SearchProcessor extends Abs
             final long lowVal = range.getLowVal();
             final long lowUid;
             final long highUid;
+            final SelectedMailbox selected = session.getSelected();
+
             if (msn) {
-                final SelectedMailbox selected = session.getSelected();
                 if (highVal == Long.MAX_VALUE) {
                     highUid = Long.MAX_VALUE;
                 } else {
@@ -257,6 +259,15 @@ public class SearchProcessor extends Abs
             } else {
                 lowUid = lowVal;
                 highUid = highVal;
+                
+                
+            	if (lowVal != Long.MAX_VALUE && lowVal < selected.getFirstUid()) {
+                    throw new MessageRangeException("No message found with uid " + lowVal);
+            	} 
+            	
+            	if (highVal != Long.MAX_VALUE && highVal > selected.getLastUid()) {
+                    throw new MessageRangeException("No message found with uid " + highVal);
+            	} 
             }
             ranges[i] = new SearchQuery.NumericRange(lowUid, highUid);
         }

Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java?rev=996760&r1=996759&r2=996760&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java Tue Sep 14 05:39:31 2010
@@ -208,4 +208,20 @@ public class SelectedMailboxImpl impleme
     public Collection<Long> flagUpdateUids() {
         return events.flagUpdateUids();
     }
+
+    /*
+     * (non-Javadoc)
+     * @see org.apache.james.imap.api.process.SelectedMailbox#getFirstUid()
+     */
+	public long getFirstUid() {
+		return converter.getFirstUid();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.apache.james.imap.api.process.SelectedMailbox#getLastUid()
+	 */
+	public long getLastUid() {
+		return converter.getLastUid();
+	}
 }

Modified: james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java
URL: http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java?rev=996760&r1=996759&r2=996760&view=diff
==============================================================================
--- james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java (original)
+++ james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/UidToMsnConverter.java Tue Sep 14 05:39:31 2010
@@ -78,11 +78,7 @@ public class UidToMsnConverter implement
         if (uid != null) {
             return uid.longValue();
         } else {
-            if (msn > 0) {
-                return highestUid;
-            } else {
-                return 0;
-            }
+            return SelectedMailbox.NO_SUCH_MESSAGE;
         }
     }
 
@@ -156,6 +152,29 @@ public class UidToMsnConverter implement
         }
     }
 
+    
+    /**
+     * @see SelectedMailbox#getFirstUid()
+     */
+    public synchronized long getFirstUid() {
+    	if (uidToMsn.isEmpty()) {
+    		return -1;
+    	} else {
+    		return uidToMsn.firstKey();
+    	}
+    }
+    
+    
+    /**
+     * @see SelectedMailbox#getLastUid()
+     */
+    public synchronized long getLastUid() {
+    	if (uidToMsn.isEmpty()) {
+    		return -1;
+    	} else {
+    		return uidToMsn.lastKey();
+    	}
+    }
     /**
      * Close this {@link MailboxListener}
      */



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