Author: rdonkin
Date: Fri Nov  9 13:09:10 2007
New Revision: 593652

URL: http://svn.apache.org/viewvc?rev=593652&view=rev
Log:
Return messages are they are produced.

Modified:
    
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/AbstractImapRequestProcessor.java
    
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/imap4rev1/FetchProcessor.java

Modified: 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/AbstractImapRequestProcessor.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/AbstractImapRequestProcessor.java?rev=593652&r1=593651&r2=593652&view=diff
==============================================================================
--- 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/AbstractImapRequestProcessor.java
 (original)
+++ 
james/server/trunk/imap-mailbox-processor-function/src/main/java/org/apache/james/imapserver/processor/base/AbstractImapRequestProcessor.java
 Fri Nov  9 13:09:10 2007
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.james.imapserver.processor.base;
 
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.avalon.framework.logger.Logger;
 import org.apache.james.api.imap.ImapCommand;
 import org.apache.james.api.imap.ImapConstants;
@@ -94,6 +97,15 @@
             
         } else {
             doProcess(message, session, tag, command, responder);
+        }
+    }
+    
+    protected void unsolicitedResponses(final ImapSession session, 
+            final ImapProcessor.Responder responder, boolean useUids) {
+        final List responses = session.unsolicitedResponses(useUids);
+        for (final Iterator it=responses.iterator(); it.hasNext();) {
+            ImapResponseMessage message = (ImapResponseMessage) it.next();
+            responder.respond(message);
         }
     }
 

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=593652&r1=593651&r2=593652&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
 Fri Nov  9 13:09:10 2007
@@ -36,12 +36,11 @@
 import org.apache.james.api.imap.message.IdRange;
 import org.apache.james.api.imap.message.MessageFlags;
 import org.apache.james.api.imap.message.request.ImapRequest;
-import org.apache.james.api.imap.message.response.ImapResponseMessage;
 import 
org.apache.james.api.imap.message.response.imap4rev1.StatusResponseFactory;
 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.legacy.FetchResponse;
+import org.apache.james.imap.message.response.imap4rev1.FetchResponse;
 import org.apache.james.imapserver.codec.encode.EncoderUtils;
 import org.apache.james.imapserver.processor.base.AbstractImapRequestProcessor;
 import org.apache.james.imapserver.processor.base.AuthorizationException;
@@ -57,7 +56,8 @@
 
 public class FetchProcessor extends AbstractImapRequestProcessor {
 
-    public FetchProcessor(final ImapProcessor next, final 
StatusResponseFactory factory) {
+    public FetchProcessor(final ImapProcessor next,
+            final StatusResponseFactory factory) {
         super(next, factory);
     }
 
@@ -65,35 +65,21 @@
         return (message instanceof FetchRequest);
     }
 
-    protected void doProcess(ImapRequest message,
-            ImapSession session, String tag, ImapCommand command, Responder 
responder)
+    protected void doProcess(ImapRequest message, ImapSession session,
+            String tag, ImapCommand command, Responder responder)
             throws MailboxException, AuthorizationException, ProtocolException 
{
         final FetchRequest request = (FetchRequest) message;
-        final ImapResponseMessage result = doProcess(request, session, tag,
-                command);
-        responder.respond(result);
-    }
-
-    private ImapResponseMessage doProcess(FetchRequest request,
-            ImapSession session, String tag, ImapCommand command)
-            throws MailboxException, AuthorizationException, ProtocolException 
{
         final boolean useUids = request.isUseUids();
         final IdRange[] idSet = request.getIdSet();
         final FetchData fetch = request.getFetch();
-        final ImapResponseMessage result = doProcess(useUids, idSet, fetch,
-                session, tag, command);
-        return result;
+        doProcess(useUids, idSet, fetch, session, tag, command, responder);
     }
 
-    private ImapResponseMessage doProcess(final boolean useUids,
+    private void doProcess(final boolean useUids,
             final IdRange[] idSet, final FetchData fetch, ImapSession session,
-            String tag, ImapCommand command) throws MailboxException,
+            String tag, ImapCommand command, Responder responder) throws 
MailboxException,
             AuthorizationException, ProtocolException {
-
-        FetchResponse result = new FetchResponse(command, tag);
-        boolean omitExpunged = (!useUids);
-
-        // TODO only fetch needed results
+        
         int resultToFetch = getNeededMessageResult(fetch);
         ImapMailboxSession mailbox = ImapSessionUtils.getMailbox(session);
         for (int i = 0; i < idSet.length; i++) {
@@ -110,12 +96,13 @@
                         useUids);
                 // TODO: this is inefficient
                 // TODO: stream output upon response
-                result.addMessageData(fetchResults[j].getMsn(), msgData);
+                FetchResponse response = new 
FetchResponse(fetchResults[j].getMsn(), msgData);
+                responder.respond(response);
             }
         }
-        List unsolicitedResponses = session.unsolicitedResponses(useUids);
-        result.addUnsolicitedResponses(unsolicitedResponses);
-        return result;
+        
+        unsolicitedResponses(session, responder, useUids);
+        okComplete(command, tag, responder);
     }
 
     private int getNeededMessageResult(FetchData fetch) {
@@ -134,7 +121,7 @@
         }
         if (fetch.isEnvelope() || fetch.isBody() || fetch.isBodyStructure()) {
             // TODO: structure
-            //result |= MessageResult.ENVELOPE;
+            // result |= MessageResult.ENVELOPE;
             result |= MessageResult.MIME_MESSAGE;
         }
 
@@ -146,19 +133,20 @@
     private int fetchForBodyElements(final Collection bodyElements) {
         int result = 0;
         if (bodyElements != null) {
-            for (final Iterator it=bodyElements.iterator();it.hasNext();) {
+            for (final Iterator it = bodyElements.iterator(); it.hasNext();) {
                 final BodyFetchElement element = (BodyFetchElement) it.next();
                 final String section = element.getParameters();
                 if ("HEADER".equalsIgnoreCase(section)) {
-                    result |=  MessageResult.HEADERS;
-                } else if ( section.startsWith( "HEADER.FIELDS.NOT " ) ) {
-                    result |=  MessageResult.HEADERS;
-                } else if ( section.startsWith( "HEADER.FIELDS " ) ) {
-                    result |=  MessageResult.HEADERS;
-                } else if (section.equalsIgnoreCase("TEXT")) {;
-                    result |=  MessageResult.BODY_CONTENT;
+                    result |= MessageResult.HEADERS;
+                } else if (section.startsWith("HEADER.FIELDS.NOT ")) {
+                    result |= MessageResult.HEADERS;
+                } else if (section.startsWith("HEADER.FIELDS ")) {
+                    result |= MessageResult.HEADERS;
+                } else if (section.equalsIgnoreCase("TEXT")) {
+                    ;
+                    result |= MessageResult.BODY_CONTENT;
                 } else if (section.length() == 0) {
-                    result |=  MessageResult.FULL_CONTENT;
+                    result |= MessageResult.FULL_CONTENT;
                 }
             }
         }
@@ -201,7 +189,7 @@
             }
 
             // TODO: RFC822.HEADER
-            
+
             // RFC822.SIZE response
             if (fetch.isSize()) {
                 response.append(" RFC822.SIZE ");
@@ -211,21 +199,21 @@
             // Only create when needed
             if (fetch.isEnvelope() || fetch.isBody() || 
fetch.isBodyStructure()) {
                 // TODO: replace SimpleMessageAttributes
-                final SimpleMessageAttributes attrs = new 
SimpleMessageAttributes(result
-                        .getMimeMessage(), getLogger());
-    
+                final SimpleMessageAttributes attrs = new 
SimpleMessageAttributes(
+                        result.getMimeMessage(), getLogger());
+
                 // ENVELOPE response
                 if (fetch.isEnvelope()) {
                     response.append(" ENVELOPE ");
                     response.append(attrs.getEnvelope());
                 }
-    
+
                 // BODY response
                 if (fetch.isBody()) {
                     response.append(" BODY ");
                     response.append(attrs.getBodyStructure(false));
                 }
-    
+
                 // BODYSTRUCTURE response
                 if (fetch.isBodyStructure()) {
                     response.append(" BODYSTRUCTURE ");
@@ -277,31 +265,30 @@
         if (sectionSpecifier.length() == 0) {
             final MessageResult.Content fullMessage = result.getFullMessage();
             addLiteralContent(fullMessage, response);
-        }
-        else if ( sectionSpecifier.equalsIgnoreCase( "HEADER" ) ) {
+        } else if (sectionSpecifier.equalsIgnoreCase("HEADER")) {
             final Iterator headers = result.iterateHeaders();
             List lines = MessageResultUtils.getAll(headers);
-            addHeaders( lines, response );
-        }
-        else if ( sectionSpecifier.startsWith( "HEADER.FIELDS.NOT " ) ) {
-            String[] excludeNames = extractHeaderList( sectionSpecifier, 
"HEADER.FIELDS.NOT ".length() );
+            addHeaders(lines, response);
+        } else if (sectionSpecifier.startsWith("HEADER.FIELDS.NOT ")) {
+            String[] excludeNames = extractHeaderList(sectionSpecifier,
+                    "HEADER.FIELDS.NOT ".length());
             final Iterator headers = result.iterateHeaders();
             List lines = MessageResultUtils.getMatching(excludeNames, headers);
-            addHeaders( lines, response );
-        }
-        else if ( sectionSpecifier.startsWith( "HEADER.FIELDS " ) ) {
-            String[] includeNames = extractHeaderList( sectionSpecifier, 
"HEADER.FIELDS ".length() );
+            addHeaders(lines, response);
+        } else if (sectionSpecifier.startsWith("HEADER.FIELDS ")) {
+            String[] includeNames = extractHeaderList(sectionSpecifier,
+                    "HEADER.FIELDS ".length());
             final Iterator headers = result.iterateHeaders();
             List lines = MessageResultUtils.getMatching(includeNames, headers);
-            addHeaders( lines, response );
+            addHeaders(lines, response);
         } else if (sectionSpecifier.equalsIgnoreCase("MIME")) {
             // TODO implement
             throw new ProtocolException("MIME not yet implemented.");
-            
+
         } else if (sectionSpecifier.equalsIgnoreCase("TEXT")) {
             final MessageResult.Content messageBody = result.getMessageBody();
             addLiteralContent(messageBody, response);
-            
+
         } else {
             // Should be a part specifier followed by a section specifier.
             // See if there's a leading part specifier.
@@ -325,17 +312,18 @@
         }
 
     }
-    
-    private void addLiteralContent(final MessageResult.Content content, final 
StringBuffer response) throws MessagingException {
-        response.append('{' );
+
+    private void addLiteralContent(final MessageResult.Content content,
+            final StringBuffer response) throws MessagingException {
+        response.append('{');
         final long length = content.size();
-        response.append( length ); // TODO JD addLiteral: why was it  
bytes.length +1 here?
-        response.append( '}' );
-        response.append( "\r\n" );
+        response.append(length); // TODO JD addLiteral: why was it
+                                    // bytes.length +1 here?
+        response.append('}');
+        response.append("\r\n");
         content.writeTo(response);
     }
 
-    
     // TODO should do this at parse time.
     private String[] extractHeaderList(String headerList, int prefixLen) {
         // Remove the trailing and leading ')('
@@ -360,19 +348,19 @@
         return (String[]) strings.toArray(new String[0]);
     }
 
-    private void addHeaders( List headerLines, StringBuffer response ) throws 
MessagingException
-    {
+    private void addHeaders(List headerLines, StringBuffer response)
+            throws MessagingException {
         int count = 0;
-        for (final Iterator it=headerLines.iterator();it.hasNext();) {
+        for (final Iterator it = headerLines.iterator(); it.hasNext();) {
             MessageResult.Header header = (MessageResult.Header) it.next();
             count += header.size() + 2;
         }
-        response.append( '{' );
-        response.append( count + 2 );
-        response.append( '}' );
+        response.append('{');
+        response.append(count + 2);
+        response.append('}');
         response.append("\r\n");
 
-        for (final Iterator it=headerLines.iterator();it.hasNext();) {
+        for (final Iterator it = headerLines.iterator(); it.hasNext();) {
             MessageResult.Header header = (MessageResult.Header) it.next();
             header.writeTo(response);
             response.append("\r\n");



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

Reply via email to