Author: rdonkin
Date: Wed Mar 19 12:12:06 2008
New Revision: 638976

URL: http://svn.apache.org/viewvc?rev=638976&view=rev
Log:
Ensure that results are sorted and each ID only returned once.

Modified:
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/imap4rev1/SearchCommandParserAndParenthesesTest.java
    
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/imap4rev1/SearchCommandParserAndParenthesesTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/imap4rev1/SearchCommandParserAndParenthesesTest.java?rev=638976&r1=638975&r2=638976&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/imap4rev1/SearchCommandParserAndParenthesesTest.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/decode/imap4rev1/SearchCommandParserAndParenthesesTest.java
 Wed Mar 19 12:12:06 2008
@@ -34,7 +34,6 @@
 import org.apache.james.api.imap.message.request.DayMonthYear;
 import org.apache.james.api.imap.message.request.SearchKey;
 import org.apache.james.imapserver.codec.decode.ImapRequestLineReader;
-import 
org.apache.james.imapserver.codec.decode.imap4rev1.SearchCommandParserTopLevelAndTest.Input;
 import org.jmock.Mock;
 import org.jmock.MockObjectTestCase;
 

Modified: 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java?rev=638976&r1=638975&r2=638976&view=diff
==============================================================================
--- 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java
 (original)
+++ 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java
 Wed Mar 19 12:12:06 2008
@@ -20,8 +20,10 @@
 package org.apache.james.imapserver.processor.imap4rev1;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
+import java.util.TreeSet;
 
 import javax.mail.Flags.Flag;
 
@@ -79,6 +81,27 @@
 
         final SearchQuery query = toQuery(searchKey, session);
         
+        final Collection results = findIds(useUids, session, mailbox, 
fetchGroup, query);
+        final long[] ids = toArray(results);
+        
+        final SearchResponse response = new SearchResponse(ids);
+        responder.respond(response);
+        boolean omitExpunged = (!useUids);
+        unsolicitedResponses(session, responder, omitExpunged, useUids);
+        okComplete(command, tag, responder);
+    }
+
+    private long[] toArray(final Collection results) {
+        final Iterator it = results.iterator();
+        final int length = results.size();
+        long[] ids = new long[length];
+        for (int i = 0; i < length; i++) {
+            ids[i] = ((Long) it.next()).longValue();
+        }
+        return ids;
+    }
+
+    private Collection findIds(final boolean useUids, final ImapSession 
session, ImapMailbox mailbox, final FetchGroup fetchGroup, final SearchQuery 
query) throws MailboxException {
         final Iterator it;
         try {
             
@@ -87,7 +110,7 @@
             throw new MailboxException(e);
         }
 
-        final List results = new ArrayList();
+        final Collection results = new TreeSet();
         while (it.hasNext()) {
             final MessageResult result = (MessageResult) it.next();
             final Long number;
@@ -99,18 +122,7 @@
             }
             results.add(number);
         }
-        
-        final int length = results.size();
-        long[] ids = new long[length];
-        for (int i = 0; i < length; i++) {
-            ids[i] = ((Long) results.get(i)).longValue();
-        }
-        
-        final SearchResponse response = new SearchResponse(ids);
-        responder.respond(response);
-        boolean omitExpunged = (!useUids);
-        unsolicitedResponses(session, responder, omitExpunged, useUids);
-        okComplete(command, tag, responder);
+        return results;
     }
 
     private SearchQuery toQuery(final SearchKey key, final ImapSession 
session) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to