Author: rdonkin
Date: Fri Nov  9 22:28:44 2007
New Revision: 593739

URL: http://svn.apache.org/viewvc?rev=593739&view=rev
Log:
Ported search encoding to new architecture.

Added:
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/SearchResponse.java
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoder.java
      - copied, changed from r593640, 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/SearchResponseEncoder.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java
Removed:
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/SearchResponseEncoder.java
Modified:
    
james/server/trunk/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/encode/writer/OutputStreamImapResponseWriter.java
    
james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/ImapConstants.java
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseComposer.java
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseWriter.java
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImpl.java
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/main/DefaultImapEncoderFactory.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/AbstractTestImapResponseComposer.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ByteImapResponseWriter.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImplTest.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/MockImapResponseWriter.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/ListResponseEncoderTest.java
    
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/SearchProcessor.java

Modified: 
james/server/trunk/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/encode/writer/OutputStreamImapResponseWriter.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/encode/writer/OutputStreamImapResponseWriter.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/encode/writer/OutputStreamImapResponseWriter.java
 (original)
+++ 
james/server/trunk/experimental-seda-imap-function/src/main/java/org/apache/james/experimental/imapserver/encode/writer/OutputStreamImapResponseWriter.java
 Fri Nov  9 22:28:44 2007
@@ -77,7 +77,7 @@
         }
     }
 
-    public void message( int number )
+    public void message( long number )
     {
         space();
         writer.print( number );

Modified: 
james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/ImapConstants.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/ImapConstants.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/ImapConstants.java
 (original)
+++ 
james/server/trunk/imap-api/src/main/java/org/apache/james/api/imap/ImapConstants.java
 Fri Nov  9 22:28:44 2007
@@ -81,6 +81,7 @@
     
     public static final String LIST_RESPONSE_NAME = "LIST";
     public static final String LSUB_RESPONSE_NAME = "LSUB";
+    public static final String SEARCH_RESPONSE_NAME = "SEARCH";
     
     public static final String NAME_ATTRIBUTE_NOINFERIORS = "\\Noinferiors";
     public static final String NAME_ATTRIBUTE_NOSELECT = "\\Noselect";

Added: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/SearchResponse.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/SearchResponse.java?rev=593739&view=auto
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/SearchResponse.java
 (added)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/server/SearchResponse.java
 Fri Nov  9 22:28:44 2007
@@ -0,0 +1,47 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imap.message.response.imap4rev1.server;
+
+import org.apache.james.api.imap.message.response.ImapResponseMessage;
+
+/**
+ * A <code>SEARCH</code> response.
+ */
+public class SearchResponse implements ImapResponseMessage {
+    private final long ids[];
+
+    /**
+     * Constructs a <code>SEARCH</code> response.
+     * @param ids ids, not null
+     */
+    public SearchResponse(final long[] ids) {
+        super();
+        this.ids = ids;
+    }
+
+    /**
+     * Gets the ids returned by this search.
+     * @return the ids, not null
+     */
+    public final long[] getIds() {
+        return ids;
+    }
+    
+}

Modified: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseComposer.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseComposer.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseComposer.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseComposer.java
 Fri Nov  9 22:28:44 2007
@@ -146,6 +146,8 @@
     public abstract void recentResponse(int count);
 
     public abstract void expungeResponse(int msn);
+    
+    public abstract void searchResponse(long[] ids);
 
     public abstract void fetchResponse(int msn, String msgData);
 
@@ -188,7 +190,7 @@
 
     public abstract void message(final String message);
 
-    public abstract void message(final int number);
+    public abstract void message(final long number);
 
     public abstract void responseCode(final String responseCode);
 

Modified: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseWriter.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseWriter.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseWriter.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/ImapResponseWriter.java
 Fri Nov  9 22:28:44 2007
@@ -50,7 +50,7 @@
      */
     void message( String message );
 
-    void message( int number );
+    void message( long number );
  
     /**
      * Writes a response code.

Modified: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImpl.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImpl.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImpl.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImpl.java
 Fri Nov  9 22:28:44 2007
@@ -285,9 +285,9 @@
     }
 
     /**
-     * @see 
org.apache.james.imapserver.codec.encode.ImapResponseComposer#message(int)
+     * @see 
org.apache.james.imapserver.codec.encode.ImapResponseComposer#message(long)
      */
-    public void message(final int number) {
+    public void message(final long number) {
         writer.message(number);
     }
 
@@ -380,5 +380,22 @@
 
     public void openParen() {
         writer.openParen();
+    }
+
+    public void searchResponse(long[] ids) {
+        untagged();
+        message(ImapConstants.SEARCH_RESPONSE_NAME);
+        message(ids);
+        end();
+    }
+
+    private void message(long[] ids) {
+        if (ids != null) {
+            final int length = ids.length;
+            for (int i=0;i<length; i++) {
+                final long id = ids[i];
+                message(id);
+            }
+        }
     }
 }

Copied: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoder.java
 (from r593640, 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/SearchResponseEncoder.java)
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoder.java?p2=james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoder.java&p1=james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/SearchResponseEncoder.java&r1=593640&r2=593739&rev=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/SearchResponseEncoder.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoder.java
 Fri Nov  9 22:28:44 2007
@@ -16,19 +16,19 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.imapserver.codec.encode.imap4rev1.legacy;
+package org.apache.james.imapserver.codec.encode.imap4rev1.server;
 
 import java.util.List;
 
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapMessage;
-import org.apache.james.imap.message.response.imap4rev1.legacy.SearchResponse;
+import org.apache.james.imap.message.response.imap4rev1.server.SearchResponse;
 import org.apache.james.imapserver.codec.encode.ImapEncoder;
 import org.apache.james.imapserver.codec.encode.ImapResponseComposer;
 import 
org.apache.james.imapserver.codec.encode.base.AbstractChainedImapEncoder;
 
 /**
- * @deprecated responses should correspond directly to the specification
+ * Encoders IMAP4rev1 <code>SEARCH</code> responses.
  */
 public class SearchResponseEncoder extends AbstractChainedImapEncoder {
     
@@ -38,20 +38,11 @@
 
     protected void doEncode(ImapMessage acceptableMessage, 
ImapResponseComposer composer) {
         SearchResponse response = (SearchResponse) acceptableMessage;
-        final ImapCommand command = response.getCommand();
-        final String idList = response.getIdList();
-        composer.commandResponse( command, idList );
-
-        List unsolicitedResponses = response.getUnsolicatedResponses();
-        chainEncodeAll(unsolicitedResponses, composer);
-        
-        final String tag = response.getTag();
-        composer.commandComplete( command, tag );  
-        
+        final long[] ids = response.getIds();
+        composer.searchResponse(ids);
     }
 
     protected boolean isAcceptable(ImapMessage message) {
         return (message instanceof SearchResponse);
-    }
-    
+    } 
 }

Modified: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/main/DefaultImapEncoderFactory.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/main/DefaultImapEncoderFactory.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/main/DefaultImapEncoderFactory.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/main/DefaultImapEncoderFactory.java
 Fri Nov  9 22:28:44 2007
@@ -34,10 +34,10 @@
 import 
org.apache.james.imapserver.codec.encode.imap4rev1.legacy.ErrorResponseEncoder;
 import 
org.apache.james.imapserver.codec.encode.imap4rev1.legacy.ExamineAndSelectResponseEncoder;
 import 
org.apache.james.imapserver.codec.encode.imap4rev1.legacy.LogoutResponseEncoder;
-import 
org.apache.james.imapserver.codec.encode.imap4rev1.legacy.SearchResponseEncoder;
 import 
org.apache.james.imapserver.codec.encode.imap4rev1.legacy.StatusCommandResponseEncoder;
 import 
org.apache.james.imapserver.codec.encode.imap4rev1.server.LSubResponseEncoder;
 import 
org.apache.james.imapserver.codec.encode.imap4rev1.server.ListResponseEncoder;
+import 
org.apache.james.imapserver.codec.encode.imap4rev1.server.SearchResponseEncoder;
 import 
org.apache.james.imapserver.codec.encode.imap4rev1.status.UntaggedNoResponseEncoder;
 
 /**

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/AbstractTestImapResponseComposer.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/AbstractTestImapResponseComposer.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/AbstractTestImapResponseComposer.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/AbstractTestImapResponseComposer.java
 Fri Nov  9 22:28:44 2007
@@ -26,6 +26,10 @@
 
 public abstract class AbstractTestImapResponseComposer extends TestCase {
 
+    private static final long[] ONE_TWO_THREE = {1, 2, 3};
+    private static final long[] FIBS = {1, 1, 2, 3, 5, 8, 13, 21, 34, 65, 99};
+    private static final long[] EMPTY = {};
+    
     protected void setUp() throws Exception {
         super.setUp();
     }
@@ -34,6 +38,12 @@
         super.tearDown();
     }
 
+    public void testSearch() throws Exception {
+        checkSearchResponseEncode("* SEARCH 1 2 3\r\n", ONE_TWO_THREE);
+        checkSearchResponseEncode("* SEARCH 1 1 2 3 5 8 13 21 34 65 99\r\n", 
FIBS);
+        checkSearchResponseEncode("* SEARCH\r\n", EMPTY);     
+    }
+    
     public void testQuotedDelimiter() throws Exception {
         checkListResponseEncode("* LSUB () \"\\\"\" \"#news\"\r\n", "LSUB", 
null, "\"", "#news");
         checkListResponseEncode("* LIST () \"\\\"\" \"#INBOX\"\r\n", "LIST", 
null, "\"", "#INBOX");
@@ -71,6 +81,19 @@
         checkListResponseEncode("* LSUB (\\one \\two \\three \\four) \".\" 
\"#news\"\r\n", "LSUB", attributes, ".", "#news");
         checkListResponseEncode("* LIST (\\one \\two \\three \\four) \".\" 
\"#INBOX\"\r\n", "LIST", attributes, ".", "#INBOX");
     }
+    
+    private void checkSearchResponseEncode(String expected, long[] ids) throws 
Exception {
+        StringBuffer buffer = new StringBuffer();
+        byte[] output = encodeSearchResponse(ids);
+        for (int i=0;i<output.length;i++) {
+            buffer.append((char) output[i]);
+        }
+        assertEquals(expected, buffer.toString());
+        clear();
+    }
+    
+    protected abstract byte[] encodeSearchResponse(long[] ids) throws 
Exception;
+    
     
     private void checkListResponseEncode(String expected, String typeName, 
List attributes, 
             String hierarchyDelimiter, String name) throws Exception {

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ByteImapResponseWriter.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ByteImapResponseWriter.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ByteImapResponseWriter.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ByteImapResponseWriter.java
 Fri Nov  9 22:28:44 2007
@@ -80,7 +80,7 @@
         }
     }
 
-    public void message( int number )
+    public void message( long number )
     {
         space();
         writer.print( number );

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImplTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImplTest.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImplTest.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/base/ImapResponseComposerImplTest.java
 Fri Nov  9 22:28:44 2007
@@ -48,4 +48,9 @@
         writer.clear();
     }
 
+    protected byte[] encodeSearchResponse(long[] ids) throws Exception {
+        composer.searchResponse(ids);
+        return writer.getBytes();
+    }
+
 }

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/MockImapResponseWriter.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/MockImapResponseWriter.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/MockImapResponseWriter.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/legacy/MockImapResponseWriter.java
 Fri Nov  9 22:28:44 2007
@@ -41,7 +41,7 @@
         operations.add(new TextMessageOperation(message));
     }
 
-    public void message(int number) {
+    public void message(long number) {
         operations.add(new NumericMessageOperation(number));
     }
 
@@ -132,14 +132,14 @@
     }
     
     public static class NumericMessageOperation {
-        public final int number;
-        public NumericMessageOperation(int number) {
+        public final long number;
+        public NumericMessageOperation(long number) {
             this.number = number;
         }
         public int hashCode() {
             final int PRIME = 31;
             int result = 1;
-            result = PRIME * result + number;
+            result = (int) (PRIME * result + number);
             return result;
         }
         public boolean equals(Object obj) {

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/ListResponseEncoderTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/ListResponseEncoderTest.java?rev=593739&r1=593738&r2=593739&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/ListResponseEncoderTest.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/ListResponseEncoderTest.java
 Fri Nov  9 22:28:44 2007
@@ -19,12 +19,8 @@
 
 package org.apache.james.imapserver.codec.encode.imap4rev1.server;
 
-import java.util.Arrays;
-
-import org.apache.james.api.imap.ImapConstants;
 import org.apache.james.api.imap.ImapMessage;
-import org.apache.james.imap.message.response.imap4rev1.server.LSubResponse;
-import org.apache.james.imap.message.response.imap4rev1.server.ListResponse;
+import org.apache.james.imap.message.response.imap4rev1.server.SearchResponse;
 import org.apache.james.imapserver.codec.encode.ImapEncoder;
 import org.apache.james.imapserver.codec.encode.ImapResponseComposer;
 import org.jmock.Mock;
@@ -32,7 +28,10 @@
 
 public class ListResponseEncoderTest extends MockObjectTestCase {
 
-    ListResponseEncoder encoder;
+    private static final long[] IDS = {1, 4, 9, 16};
+    
+    SearchResponse response;
+    SearchResponseEncoder encoder;
     Mock mockNextEncoder;
     Mock composer;
     
@@ -40,7 +39,8 @@
         super.setUp();
         mockNextEncoder = mock(ImapEncoder.class);
         composer = mock(ImapResponseComposer.class);    
-        encoder = new ListResponseEncoder((ImapEncoder) 
mockNextEncoder.proxy());
+        response = new SearchResponse(IDS);
+        encoder = new SearchResponseEncoder((ImapEncoder) 
mockNextEncoder.proxy());
     }
 
     protected void tearDown() throws Exception {
@@ -48,55 +48,13 @@
     }
 
     public void testIsAcceptable() {
-        assertTrue(encoder.isAcceptable(new ListResponse(true, true, true, 
true, ".", "name")));
-        assertFalse(encoder.isAcceptable(new LSubResponse(true, true, true, 
true, ".", "name")));
+        assertTrue(encoder.isAcceptable(response));
         assertFalse(encoder.isAcceptable((ImapMessage) 
mock(ImapMessage.class).proxy()));
         assertFalse(encoder.isAcceptable(null));
     }
     
-    public void testName() throws Exception {
-        composer.expects(once()).method("listResponse").with(same("LIST"), 
NULL, same("."), same("INBOX.name"));      
-        encoder.encode(new ListResponse(false, false, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testDelimiter() throws Exception {
-        composer.expects(once()).method("listResponse").with(same("LIST"), 
NULL, same("@"), same("INBOX.name"));      
-        encoder.encode(new ListResponse(false, false, false, false, "@", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testNoDelimiter() throws Exception {
-        composer.expects(once()).method("listResponse").with(same("LIST"), 
NULL, NULL, same("INBOX.name"));      
-        encoder.encode(new ListResponse(false, false, false, false, null, 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testAllAttributes() throws Exception {
-        String[] all = {ImapConstants.NAME_ATTRIBUTE_NOINFERIORS, 
ImapConstants.NAME_ATTRIBUTE_NOSELECT, 
-                ImapConstants.NAME_ATTRIBUTE_MARKED, 
ImapConstants.NAME_ATTRIBUTE_UNMARKED};
-        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(all)), same("."), same("INBOX.name"));      
-        encoder.encode(new ListResponse(true, true, true, true, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testNoInferiors() throws Exception {
-        String[] values = {ImapConstants.NAME_ATTRIBUTE_NOINFERIORS};
-        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
-        encoder.encode(new ListResponse(true, false, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testNoSelect() throws Exception {
-        String[] values = {ImapConstants.NAME_ATTRIBUTE_NOSELECT};
-        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
-        encoder.encode(new ListResponse(false, true, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testMarked() throws Exception {
-        String[] values = {ImapConstants.NAME_ATTRIBUTE_MARKED};
-        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
-        encoder.encode(new ListResponse(false, false, true, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
-    }
-    
-    public void testUnmarked() throws Exception {
-        String[] values = {ImapConstants.NAME_ATTRIBUTE_UNMARKED};
-        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
-        encoder.encode(new ListResponse(false, false, false, true, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    public void testEncode() throws Exception {
+        composer.expects(once()).method("searchResponse").with(same(IDS));     
 
+        encoder.encode(response, (ImapResponseComposer) composer.proxy());
     }
 }

Added: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java?rev=593739&view=auto
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java
 (added)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/server/SearchResponseEncoderTest.java
 Fri Nov  9 22:28:44 2007
@@ -0,0 +1,102 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.imapserver.codec.encode.imap4rev1.server;
+
+import java.util.Arrays;
+
+import org.apache.james.api.imap.ImapConstants;
+import org.apache.james.api.imap.ImapMessage;
+import org.apache.james.imap.message.response.imap4rev1.server.LSubResponse;
+import org.apache.james.imap.message.response.imap4rev1.server.ListResponse;
+import org.apache.james.imapserver.codec.encode.ImapEncoder;
+import org.apache.james.imapserver.codec.encode.ImapResponseComposer;
+import org.jmock.Mock;
+import org.jmock.MockObjectTestCase;
+
+public class SearchResponseEncoderTest extends MockObjectTestCase {
+
+    ListResponseEncoder encoder;
+    Mock mockNextEncoder;
+    Mock composer;
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+        mockNextEncoder = mock(ImapEncoder.class);
+        composer = mock(ImapResponseComposer.class);    
+        encoder = new ListResponseEncoder((ImapEncoder) 
mockNextEncoder.proxy());
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testIsAcceptable() {
+        assertTrue(encoder.isAcceptable(new ListResponse(true, true, true, 
true, ".", "name")));
+        assertFalse(encoder.isAcceptable(new LSubResponse(true, true, true, 
true, ".", "name")));
+        assertFalse(encoder.isAcceptable((ImapMessage) 
mock(ImapMessage.class).proxy()));
+        assertFalse(encoder.isAcceptable(null));
+    }
+    
+    public void testName() throws Exception {
+        composer.expects(once()).method("listResponse").with(same("LIST"), 
NULL, same("."), same("INBOX.name"));      
+        encoder.encode(new ListResponse(false, false, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    }
+    
+    public void testDelimiter() throws Exception {
+        composer.expects(once()).method("listResponse").with(same("LIST"), 
NULL, same("@"), same("INBOX.name"));      
+        encoder.encode(new ListResponse(false, false, false, false, "@", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    }
+    
+    public void testNoDelimiter() throws Exception {
+        composer.expects(once()).method("listResponse").with(same("LIST"), 
NULL, NULL, same("INBOX.name"));      
+        encoder.encode(new ListResponse(false, false, false, false, null, 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    }
+    
+    public void testAllAttributes() throws Exception {
+        String[] all = {ImapConstants.NAME_ATTRIBUTE_NOINFERIORS, 
ImapConstants.NAME_ATTRIBUTE_NOSELECT, 
+                ImapConstants.NAME_ATTRIBUTE_MARKED, 
ImapConstants.NAME_ATTRIBUTE_UNMARKED};
+        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(all)), same("."), same("INBOX.name"));      
+        encoder.encode(new ListResponse(true, true, true, true, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    }
+    
+    public void testNoInferiors() throws Exception {
+        String[] values = {ImapConstants.NAME_ATTRIBUTE_NOINFERIORS};
+        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
+        encoder.encode(new ListResponse(true, false, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    }
+    
+    public void testNoSelect() throws Exception {
+        String[] values = {ImapConstants.NAME_ATTRIBUTE_NOSELECT};
+        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
+        encoder.encode(new ListResponse(false, true, false, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    }
+    
+    public void testMarked() throws Exception {
+        String[] values = {ImapConstants.NAME_ATTRIBUTE_MARKED};
+        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
+        encoder.encode(new ListResponse(false, false, true, false, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    }
+    
+    public void testUnmarked() throws Exception {
+        String[] values = {ImapConstants.NAME_ATTRIBUTE_UNMARKED};
+        composer.expects(once()).method("listResponse").with(same("LIST"), 
eq(Arrays.asList(values)), same("."), same("INBOX.name"));      
+        encoder.encode(new ListResponse(false, false, false, true, ".", 
"INBOX.name"), (ImapResponseComposer) composer.proxy());
+    }
+}

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=593739&r1=593738&r2=593739&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
 Fri Nov  9 22:28:44 2007
@@ -34,7 +34,7 @@
 import org.apache.james.api.imap.process.ImapSession;
 import org.apache.james.api.imap.process.ImapProcessor.Responder;
 import org.apache.james.imap.message.request.imap4rev1.SearchRequest;
-import org.apache.james.imap.message.response.imap4rev1.legacy.SearchResponse;
+import org.apache.james.imap.message.response.imap4rev1.server.SearchResponse;
 import org.apache.james.imapserver.processor.base.AbstractImapRequestProcessor;
 import org.apache.james.imapserver.processor.base.AuthorizationException;
 import org.apache.james.imapserver.processor.base.ImapSessionUtils;
@@ -59,24 +59,14 @@
             ImapSession session, String tag, ImapCommand command, Responder 
responder)
             throws MailboxException, AuthorizationException, ProtocolException 
{
         final SearchRequest request = (SearchRequest) message;
-        final ImapResponseMessage result = doProcess(request, session, tag,
-                command);
-        responder.respond(result);
-    }
-
-    private ImapResponseMessage doProcess(SearchRequest request,
-            ImapSession session, String tag, ImapCommand command)
-            throws MailboxException, AuthorizationException, ProtocolException 
{
         final SearchTerm searchTerm = request.getSearchTerm();
         final boolean useUids = request.isUseUids();
-        final ImapResponseMessage result = doProcess(searchTerm, useUids,
-                session, tag, command);
-        return result;
+        doProcess(searchTerm, useUids, session, tag, command, responder);
     }
 
-    private ImapResponseMessage doProcess(final SearchTerm searchTerm,
-            final boolean useUids, ImapSession session, String tag,
-            ImapCommand command) throws MailboxException,
+    private void doProcess(final SearchTerm searchTerm,
+            final boolean useUids, final ImapSession session, final String tag,
+            final ImapCommand command, final Responder responder) throws 
MailboxException,
             AuthorizationException, ProtocolException {
         ImapMailboxSession mailbox = ImapSessionUtils.getMailbox(session);
         final int resultCode;
@@ -85,6 +75,7 @@
         } else {
             resultCode = MessageResult.MSN;
         }
+        
         MessageResult[] messageResults;
         try {
             // TODO: implementation
@@ -93,25 +84,20 @@
         } catch (MailboxManagerException e) {
             throw new MailboxException(e);
         }
-        // TODO: probably more efficient to stream data
-        // TODO: directly to response
-        StringBuffer idList = new StringBuffer();
-        for (int i = 0; i < messageResults.length; i++) {
-            if (i > 0) {
-                idList.append(ImapConstants.SP);
-            }
+
+        final int length = messageResults.length;
+        long[] ids = new long[length];
+        for (int i = 0; i < length; i++) {
             if (useUids) {
-                idList.append(messageResults[i].getUid());
+                ids[i] = messageResults[i].getUid();
             } else {
-                idList.append(messageResults[i].getMsn());
+                ids[i] = messageResults[i].getMsn();
             }
         }
-        final SearchResponse result = new SearchResponse(command, idList
-                .toString(), tag);
+        final SearchResponse response = new SearchResponse(ids);
+        responder.respond(response);
         boolean omitExpunged = (!useUids);
-        List unsolicitedResponses = session.unsolicitedResponses(omitExpunged,
-                useUids);
-        result.addUnsolicitedResponses(unsolicitedResponses);
-        return result;
+        unsolicitedResponses(session, responder, omitExpunged, useUids);
+        okComplete(command, tag, responder);
     }
 }



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

Reply via email to