Author: rdonkin
Date: Sun Nov 18 04:20:51 2007
New Revision: 596082

URL: http://svn.apache.org/viewvc?rev=596082&view=rev
Log:
Ported FetchResponse to new design pattern.

Added:
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/LegacyFetchResponse.java
      - copied, changed from r595917, 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/FetchResponse.java
    
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoderTest.java
Modified:
    
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/imap/message/response/imap4rev1/FetchResponse.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/base/ImapResponseComposerImpl.java
    
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoder.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/ImapResponseTest.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-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/SelectedMailboxSessionImpl.java
    
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java

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=596082&r1=596081&r2=596082&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
 Sun Nov 18 04:20:51 2007
@@ -31,6 +31,7 @@
     String SP = " ";
     
     public static final String NIL = "NIL";
+    public static final String UID = "UID";
     public static final char OPENING_PARENTHESIS = '(';
     public static final char CLOSING_PARENTHESIS = ')';
     public static final char SP_CHAR = ' ';

Modified: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/FetchResponse.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/FetchResponse.java?rev=596082&r1=596081&r2=596082&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/FetchResponse.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/FetchResponse.java
 Sun Nov 18 04:20:51 2007
@@ -18,26 +18,47 @@
  ****************************************************************/
 package org.apache.james.imap.message.response.imap4rev1;
 
+import javax.mail.Flags;
+
 import org.apache.james.api.imap.message.response.ImapResponseMessage;
 
-public class FetchResponse implements ImapResponseMessage {
+public final class FetchResponse implements ImapResponseMessage {
 
-        // TODO: this is not an efficient solution
-        // TODO: would be better to lazy load and stream on output
-        // TODO: this is just a transitional solution
-        private final int number;
-        private final String data;
-        public FetchResponse(final int number, final String data) {
+        private final int messageNumber;
+        private final Flags flags;
+        private final Long uid;
+        
+        public FetchResponse(final int messageNumber, final Flags flags, final 
Long uid) {
             super();
-            this.number = number;
-            this.data = data;
+            this.messageNumber = messageNumber;
+            this.flags = flags;
+            this.uid = uid;
         }
         
-        public final String getData() {
-            return data;
+        /**
+         * Gets the number of the message whose details 
+         * have been fetched.
+         * @return message number
+         */
+        public final int getMessageNumber() {
+            return messageNumber;
         }
         
-        public final int getNumber() {
-            return number;
-        }        
+        /**
+         * Gets the fetched flags.
+         * @return [EMAIL PROTECTED] Flags} fetched,
+         * or null if the <code>FETCH</code> did not include <code>FLAGS</code>
+         */
+        public Flags getFlags() {
+            return flags;
+        }
+        
+        /**
+         * Gets the unique id for the fetched message.
+         * @return message uid, 
+         * or null if the <code>FETCH</code> did not include <code>UID</code>
+         */
+        public Long getUid() {
+            return uid;
+        }
 }

Copied: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/LegacyFetchResponse.java
 (from r595917, 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/FetchResponse.java)
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/LegacyFetchResponse.java?p2=james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/LegacyFetchResponse.java&p1=james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/FetchResponse.java&r1=595917&r2=596082&rev=596082&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/FetchResponse.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imap/message/response/imap4rev1/LegacyFetchResponse.java
 Sun Nov 18 04:20:51 2007
@@ -20,14 +20,17 @@
 
 import org.apache.james.api.imap.message.response.ImapResponseMessage;
 
-public class FetchResponse implements ImapResponseMessage {
+/**
+ * @deprecated data should be not be encoded in the processor
+ */
+public class LegacyFetchResponse implements ImapResponseMessage {
 
         // TODO: this is not an efficient solution
         // TODO: would be better to lazy load and stream on output
         // TODO: this is just a transitional solution
         private final int number;
         private final String data;
-        public FetchResponse(final int number, final String data) {
+        public LegacyFetchResponse(final int number, final String data) {
             super();
             this.number = number;
             this.data = data;

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=596082&r1=596081&r2=596082&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
 Sun Nov 18 04:20:51 2007
@@ -139,8 +139,18 @@
     public abstract void untaggedNoResponse(String displayMessage,
             String responseCode);
 
+    /**
+     * Writes flags to output using standard format.
+     * @param flags <code>Flags</code>, not null
+     */
+    public abstract void flags(Flags flags);
+    
+    /**
+     * Writes a complete FLAGS response.
+     * @param flags <code>Flags</code>, not null
+     */
     public abstract void flagsResponse(Flags flags);
-
+    
     public abstract void existsResponse(int count);
 
     public abstract void recentResponse(int count);
@@ -149,7 +159,25 @@
     
     public abstract void searchResponse(long[] ids);
 
-    public abstract void fetchResponse(int msn, String msgData);
+    /**
+     * Starts a FETCH response by writing the opening
+     * star-FETCH-number-paren sequence.
+     * @param msn message number
+     * @see #closeFetchResponse()
+     */
+    public abstract void openFetchResponse(long msn);
+    
+    /**
+     * Ends a FETCH response by writing the closing
+     * paren-crlf sequence.
+     */
+    public abstract void closeFetchResponse();
+    
+    /**
+     * @deprecated
+     * @see #openFetchResponse(long)
+     */
+    public abstract void legacyFetchResponse(int msn, String msgData);
 
     public abstract void commandResponse(ImapCommand command, String message);
 

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=596082&r1=596081&r2=596082&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
 Sun Nov 18 04:20:51 2007
@@ -172,8 +172,7 @@
      */
     public void flagsResponse(Flags flags) {
         untagged();
-        message(FLAGS);
-        message(MessageFlags.format(flags));
+        flags(flags);
         end();
     }
 
@@ -208,9 +207,9 @@
     }
 
     /**
-     * @see 
org.apache.james.imapserver.codec.encode.ImapResponseComposer#fetchResponse(int,
 java.lang.String)
+     * @see 
org.apache.james.imapserver.codec.encode.ImapResponseComposer#legacyFetchResponse(int,
 java.lang.String)
      */
-    public void fetchResponse(int msn, String msgData) {
+    public void legacyFetchResponse(int msn, String msgData) {
         untagged();
         message(msn);
         message(FETCH);
@@ -397,5 +396,41 @@
                 message(id);
             }
         }
+    }
+
+    public void flags(Flags flags) {
+        message(FLAGS);
+        openParen();
+        if ( flags.contains(Flags.Flag.ANSWERED) ) {
+            message( "\\Answered" );
+        }
+        if ( flags.contains(Flags.Flag.DELETED) ) {
+            message( "\\Deleted" );
+        }
+        if ( flags.contains(Flags.Flag.DRAFT) ) {
+            message( "\\Draft" );
+        }
+        if ( flags.contains(Flags.Flag.FLAGGED) ) {
+            message( "\\Flagged" );
+        }
+        if ( flags.contains(Flags.Flag.RECENT) ) {
+            message( "\\Recent" );
+        }
+        if ( flags.contains(Flags.Flag.SEEN) ) {
+            message( "\\Seen" );
+        }
+        closeParen();
+    }
+
+    public void closeFetchResponse() {
+        closeParen();
+        end();
+    }
+
+    public void openFetchResponse(long msn) {
+        untagged();
+        message(msn);
+        message(FETCH);
+        openParen();
     }
 }

Modified: 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoder.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoder.java?rev=596082&r1=596081&r2=596082&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoder.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/main/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoder.java
 Sun Nov 18 04:20:51 2007
@@ -19,8 +19,12 @@
 
 package org.apache.james.imapserver.codec.encode.imap4rev1;
 
+import javax.mail.Flags;
+
+import org.apache.james.api.imap.ImapConstants;
 import org.apache.james.api.imap.ImapMessage;
 import org.apache.james.imap.message.response.imap4rev1.FetchResponse;
+import org.apache.james.imap.message.response.imap4rev1.LegacyFetchResponse;
 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;
@@ -32,15 +36,36 @@
     }
 
     public boolean isAcceptable(final ImapMessage message) {
-        return (message instanceof FetchResponse);
+        return (message instanceof LegacyFetchResponse) 
+            || (message instanceof FetchResponse);
     }
 
     protected void doEncode(ImapMessage acceptableMessage, 
ImapResponseComposer composer) {
-        final FetchResponse fetchResponse = (FetchResponse) acceptableMessage;
+        if (acceptableMessage instanceof FetchResponse) {
+            final FetchResponse fetchResponse = (FetchResponse) 
acceptableMessage;
+            final long messageNumber = fetchResponse.getMessageNumber();
+            composer.openFetchResponse(messageNumber);
+            final Flags flags = fetchResponse.getFlags();
+            if (flags != null) {
+                composer.flags(flags);
+            }
+            final Long uid = fetchResponse.getUid();
+            if (uid != null) {
+                composer.message(ImapConstants.UID);
+                composer.message(uid.longValue());
+            }
+            composer.closeFetchResponse();
+        } else {
+            final LegacyFetchResponse fetchResponse = (LegacyFetchResponse) 
acceptableMessage;
+            encodeLegacy(composer, fetchResponse);
+        }
+    }
+
+    private void encodeLegacy(ImapResponseComposer composer, final 
LegacyFetchResponse fetchResponse) {
         // TODO: this is inefficient
         final String data = fetchResponse.getData();
         final int number = fetchResponse.getNumber();
-        composer.fetchResponse(number, data);
+        composer.legacyFetchResponse(number, data);
     }
 
 }

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=596082&r1=596081&r2=596082&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
 Sun Nov 18 04:20:51 2007
@@ -22,6 +22,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.mail.Flags;
+
 import junit.framework.TestCase;
 
 public abstract class AbstractTestImapResponseComposer extends TestCase {
@@ -81,6 +83,35 @@
         checkListResponseEncode("* LSUB (\\one \\two \\three \\four) \".\" 
\"#news\"\r\n", "LSUB", attributes, ".", "#news");
         checkListResponseEncode("* LIST (\\one \\two \\three \\four) \".\" 
\"#INBOX\"\r\n", "LIST", attributes, ".", "#INBOX");
     }
+    
+    public void testShouldEncodeFlagsCorrectly() throws Exception {
+        checkFlagsEncode(" FLAGS (\\Seen)", new Flags(Flags.Flag.SEEN));
+        checkFlagsEncode(" FLAGS (\\Recent)", new Flags(Flags.Flag.RECENT));
+        checkFlagsEncode(" FLAGS (\\Draft)", new Flags(Flags.Flag.DRAFT));
+        checkFlagsEncode(" FLAGS (\\Answered)", new 
Flags(Flags.Flag.ANSWERED));
+        checkFlagsEncode(" FLAGS (\\Flagged)", new Flags(Flags.Flag.FLAGGED));
+        checkFlagsEncode(" FLAGS (\\Deleted)", new Flags(Flags.Flag.DELETED));
+        Flags flags = new Flags();
+        flags.add(Flags.Flag.SEEN);
+        flags.add(Flags.Flag.ANSWERED);
+        flags.add(Flags.Flag.FLAGGED);
+        flags.add(Flags.Flag.DELETED);
+        flags.add(Flags.Flag.SEEN);
+        flags.add(Flags.Flag.DRAFT);
+        checkFlagsEncode(" FLAGS (\\Answered \\Deleted \\Draft \\Flagged 
\\Seen)", flags);
+    }
+    
+    private void checkFlagsEncode(String expected, Flags flags) throws 
Exception {
+        StringBuffer buffer = new StringBuffer();
+        byte[] output = encodeFlagsResponse(flags);
+        for (int i=0;i<output.length;i++) {
+            buffer.append((char) output[i]);
+        }
+        assertEquals(expected, buffer.toString());
+        clear(); 
+    }
+    
+    protected abstract byte[] encodeFlagsResponse(Flags flags) throws 
Exception;
     
     private void checkSearchResponseEncode(String expected, long[] ids) throws 
Exception {
         StringBuffer buffer = new StringBuffer();

Modified: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/ImapResponseTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/ImapResponseTest.java?rev=596082&r1=596081&r2=596082&view=diff
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/ImapResponseTest.java
 (original)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/ImapResponseTest.java
 Sun Nov 18 04:20:51 2007
@@ -37,7 +37,7 @@
     protected void setUp() throws Exception {
         super.setUp();
         writer = new MockImapResponseWriter();
-        response = new ImapResponseComposerImpl(writer);;
+        response = new ImapResponseComposerImpl(writer);
     }
 
     protected void tearDown() throws Exception {
@@ -90,14 +90,16 @@
     public void testFlagsResponse() {
         Flags flags = new Flags();
         response.flagsResponse(flags);
-        assertEquals(4, writer.operations.size());
+        assertEquals(5, writer.operations.size());
         assertEquals(new MockImapResponseWriter.UntaggedOperation(), 
writer.operations.get(0));
         assertEquals(new 
MockImapResponseWriter.TextMessageOperation(ImapResponseComposerImpl.FLAGS), 
                 writer.operations.get(1));
-        assertEquals(new 
MockImapResponseWriter.TextMessageOperation(MessageFlags.format(flags)),
+        assertEquals(new MockImapResponseWriter.ParenOperation(true),
                 writer.operations.get(2));
-        assertEquals(new MockImapResponseWriter.EndOperation(), 
+        assertEquals(new MockImapResponseWriter.ParenOperation(false),
                 writer.operations.get(3));
+        assertEquals(new MockImapResponseWriter.EndOperation(), 
+                writer.operations.get(4));
     }
 
     public void testExistsResponse() {
@@ -142,7 +144,7 @@
     public void testFetchResponse() {
         int count = 7;
         String data = "Some data";
-        response.fetchResponse(count, data);
+        response.legacyFetchResponse(count, data);
         assertEquals(5, writer.operations.size());
         assertEquals(new MockImapResponseWriter.UntaggedOperation(), 
writer.operations.get(0));
         assertEquals(new 
MockImapResponseWriter.NumericMessageOperation(count), 

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=596082&r1=596081&r2=596082&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
 Sun Nov 18 04:20:51 2007
@@ -41,7 +41,9 @@
         clear();
     }
     
-    public byte[] getBytes() {
+    public byte[] getBytes() throws Exception {
+        writer.flush();
+        out.flush();
         return out.toByteArray();
     }
 

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=596082&r1=596081&r2=596082&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
 Sun Nov 18 04:20:51 2007
@@ -21,6 +21,8 @@
 
 import java.util.List;
 
+import javax.mail.Flags;
+
 import 
org.apache.james.imapserver.codec.encode.AbstractTestImapResponseComposer;
 
 public class ImapResponseComposerImplTest extends
@@ -50,6 +52,11 @@
 
     protected byte[] encodeSearchResponse(long[] ids) throws Exception {
         composer.searchResponse(ids);
+        return writer.getBytes();
+    }
+
+    protected byte[] encodeFlagsResponse(Flags flags) throws Exception {
+        composer.flags(flags);
         return writer.getBytes();
     }
 

Added: 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoderTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoderTest.java?rev=596082&view=auto
==============================================================================
--- 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoderTest.java
 (added)
+++ 
james/server/trunk/imap-codec-library/src/test/java/org/apache/james/imapserver/codec/encode/imap4rev1/FetchResponseEncoderTest.java
 Sun Nov 18 04:20:51 2007
@@ -0,0 +1,89 @@
+/****************************************************************
+ * 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;
+
+import javax.mail.Flags;
+
+import org.apache.james.api.imap.ImapCommand;
+import org.apache.james.api.imap.ImapMessage;
+import org.apache.james.imap.message.response.imap4rev1.FetchResponse;
+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 FetchResponseEncoderTest extends MockObjectTestCase {
+
+    Flags flags;
+    ImapResponseComposer composer;
+    Mock mockComposer;
+    Mock mockNextEncoder;
+    FetchResponseEncoder encoder;
+    Mock mockCommand;
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+        mockComposer = mock(ImapResponseComposer.class);
+        composer = (ImapResponseComposer) mockComposer.proxy();
+        mockNextEncoder = mock(ImapEncoder.class);
+        encoder = new FetchResponseEncoder((ImapEncoder) 
mockNextEncoder.proxy());
+        mockCommand = mock(ImapCommand.class);
+        flags = new Flags(Flags.Flag.DELETED);
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testShouldNotAcceptUnknownResponse() throws Exception {
+        
assertFalse(encoder.isAcceptable((ImapMessage)mock(ImapMessage.class).proxy()));
+    }
+    
+    public void testShouldAcceptFetchResponse() throws Exception {
+        assertTrue(encoder.isAcceptable(new FetchResponse(11, null, null)));
+    }
+    
+    public void testShouldEncodeFlagsResponse() throws Exception {
+        FetchResponse message = new FetchResponse(100, flags, null);
+        
mockComposer.expects(once()).method("openFetchResponse").with(eq(100L));
+        mockComposer.expects(once()).method("flags").with(eq(flags));
+        mockComposer.expects(once()).method("closeFetchResponse");
+        encoder.doEncode(message, composer);
+    }
+    
+    public void testShouldEncodeUidResponse() throws Exception {
+        FetchResponse message = new FetchResponse(100, null, new Long(72));
+        
mockComposer.expects(once()).method("openFetchResponse").with(eq(100L));
+        mockComposer.expects(once()).method("message").with(eq("UID"));
+        mockComposer.expects(once()).method("message").with(eq(72L));
+        mockComposer.expects(once()).method("closeFetchResponse");
+        encoder.doEncode(message, composer);
+    }
+    
+    public void testShouldEncodeAllResponse() throws Exception {
+        FetchResponse message = new FetchResponse(100, flags, new Long(72));
+        
mockComposer.expects(once()).method("openFetchResponse").with(eq(100L));
+        mockComposer.expects(once()).method("flags").with(eq(flags));
+        mockComposer.expects(once()).method("message").with(eq("UID"));
+        mockComposer.expects(once()).method("message").with(eq(72L));
+        mockComposer.expects(once()).method("closeFetchResponse");
+        encoder.doEncode(message, composer);
+    }
+}

Modified: 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/SelectedMailboxSessionImpl.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/SelectedMailboxSessionImpl.java?rev=596082&r1=596081&r2=596082&view=diff
==============================================================================
--- 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/SelectedMailboxSessionImpl.java
 (original)
+++ 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/SelectedMailboxSessionImpl.java
 Sun Nov 18 04:20:51 2007
@@ -32,6 +32,7 @@
 import org.apache.james.imap.message.response.imap4rev1.ExistsResponse;
 import org.apache.james.imap.message.response.imap4rev1.ExpungeResponse;
 import org.apache.james.imap.message.response.imap4rev1.FetchResponse;
+import org.apache.james.imap.message.response.imap4rev1.LegacyFetchResponse;
 import org.apache.james.imap.message.response.imap4rev1.RecentResponse;
 import 
org.apache.james.imap.message.response.imap4rev1.status.UntaggedNoResponse;
 import org.apache.james.mailboxmanager.MailboxListener;
@@ -165,15 +166,14 @@
                 for (int i = 0; i < flagUpdates.length; i++) {
                 MessageResult mr = flagUpdates[i];
                 int msn = mr.getMsn();
-                Flags updatedFlags = mr.getFlags();
-                StringBuffer out = new StringBuffer("FLAGS ");
-                out.append(MessageFlags.format(updatedFlags));
+                final Flags flags = mr.getFlags();
+                final Long uid;
                 if (useUid) {
-                    out.append(" UID ");
-                    out.append(mr.getUid());
+                    uid = new Long(mr.getUid());
+                } else {
+                    uid = null;
                 }
-                // TODO: use CharSequence instead (avoid unnecessary string 
creation)
-                FetchResponse response = new FetchResponse(msn, 
out.toString());
+                FetchResponse response = new FetchResponse(msn, flags, uid);
                 responses.add(response);
             }
         } catch (MailboxManagerException e) {

Modified: 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java?rev=596082&r1=596081&r2=596082&view=diff
==============================================================================
--- 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java
 (original)
+++ 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java
 Sun Nov 18 04:20:51 2007
@@ -41,7 +41,7 @@
 import org.apache.james.api.imap.process.ImapProcessor;
 import org.apache.james.api.imap.process.ImapSession;
 import org.apache.james.imap.message.request.imap4rev1.FetchRequest;
-import org.apache.james.imap.message.response.imap4rev1.FetchResponse;
+import org.apache.james.imap.message.response.imap4rev1.LegacyFetchResponse;
 import org.apache.james.imapserver.codec.encode.EncoderUtils;
 import org.apache.james.imapserver.processor.base.AbstractImapRequestProcessor;
 import org.apache.james.imapserver.processor.base.AuthorizationException;
@@ -95,7 +95,7 @@
                             useUids);
                     // TODO: this is inefficient
                     // TODO: stream output upon response
-                    FetchResponse response = new 
FetchResponse(fetchResults[j].getMsn(), msgData);
+                    LegacyFetchResponse response = new 
LegacyFetchResponse(fetchResults[j].getMsn(), msgData);
                     responder.respond(response);
                 }
             }



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

Reply via email to