Author: wstrzalka
Date: Wed Feb 23 20:04:50 2011
New Revision: 1073919

URL: http://svn.apache.org/viewvc?rev=1073919&view=rev
Log:
Fetch optimisation by moving batch responsibility to mailbox. See IMAP-258

Removed:
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/base/MessageRangeException.java
Modified:
    
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/CopyProcessor.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.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/StoreProcessor.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
    
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java

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=1073919&r1=1073918&r2=1073919&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
 Wed Feb 23 20:04:50 2011
@@ -40,7 +40,6 @@ import org.apache.james.imap.message.res
 import org.apache.james.imap.message.response.FetchResponse;
 import org.apache.james.imap.message.response.RecentResponse;
 import org.apache.james.imap.processor.base.AbstractChainedProcessor;
-import org.apache.james.imap.processor.base.MessageRangeException;
 import org.apache.james.mailbox.MailboxConstants;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
@@ -48,6 +47,7 @@ import org.apache.james.mailbox.MailboxP
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageRangeException;
 import org.apache.james.mailbox.MessageResult;
 import org.apache.james.mailbox.util.FetchGroupImpl;
 

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
 Wed Feb 23 20:04:50 2011
@@ -32,11 +32,11 @@ import org.apache.james.imap.api.process
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.imap.message.request.CopyRequest;
-import org.apache.james.imap.processor.base.MessageRangeException;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPath;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageRangeException;
 import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
 import org.apache.james.mailbox.MessageRange;
 

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
 Wed Feb 23 20:04:50 2011
@@ -32,12 +32,12 @@ import org.apache.james.imap.api.process
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.imap.message.request.ExpungeRequest;
-import org.apache.james.imap.processor.base.MessageRangeException;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageRangeException;
 
 public class ExpungeProcessor extends AbstractMailboxProcessor<ExpungeRequest> 
implements CapabilityImplementingProcessor{
 

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=1073919&r1=1073918&r2=1073919&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
 Wed Feb 23 20:04:50 2011
@@ -40,10 +40,10 @@ import org.apache.james.imap.api.process
 import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.imap.message.request.SearchRequest;
 import org.apache.james.imap.message.response.SearchResponse;
-import org.apache.james.imap.processor.base.MessageRangeException;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageRangeException;
 import org.apache.james.mailbox.SearchQuery;
 import org.apache.james.mailbox.SearchQuery.Criterion;
 

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
 Wed Feb 23 20:04:50 2011
@@ -33,12 +33,12 @@ import org.apache.james.imap.api.process
 import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.imap.message.request.StoreRequest;
 import org.apache.james.imap.message.response.FetchResponse;
-import org.apache.james.imap.processor.base.MessageRangeException;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageRangeException;
 
 public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
     

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
 Wed Feb 23 20:04:50 2011
@@ -19,11 +19,8 @@
 
 package org.apache.james.imap.processor.fetch;
 
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
@@ -38,17 +35,18 @@ import org.apache.james.imap.api.process
 import org.apache.james.imap.message.request.FetchRequest;
 import org.apache.james.imap.message.response.FetchResponse;
 import org.apache.james.imap.processor.AbstractMailboxProcessor;
-import org.apache.james.imap.processor.base.MessageRangeException;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageRange;
-import org.apache.james.mailbox.MessageRange.Type;
+import org.apache.james.mailbox.MessageRangeException;
 import org.apache.james.mailbox.MessageResult;
+import org.apache.james.mailbox.UnsupportedCriteriaException;
+import org.apache.james.mailbox.MessageManager.MessageCallback;
+import org.apache.james.mailbox.MessageRange.Type;
 import org.apache.james.mailbox.MessageResult.FetchGroup;
 import org.apache.james.mailbox.MessageResult.MimePath;
-import org.apache.james.mailbox.UnsupportedCriteriaException;
 import org.apache.james.mailbox.util.FetchGroupImpl;
 import org.apache.james.mime4j.field.address.parser.ParseException;
 
@@ -67,8 +65,8 @@ public class FetchProcessor extends Abst
      * (non-Javadoc)
      * @see 
org.apache.james.imap.processor.AbstractMailboxProcessor#doProcess(org.apache.james.imap.api.message.request.ImapRequest,
 org.apache.james.imap.api.process.ImapSession, java.lang.String, 
org.apache.james.imap.api.ImapCommand, 
org.apache.james.imap.api.process.ImapProcessor.Responder)
      */
-    protected void doProcess(FetchRequest request, ImapSession session,
-            String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(FetchRequest request, final ImapSession session,
+            String tag, ImapCommand command, final Responder responder) {
         final boolean useUids = request.isUseUids();
         final IdRange[] idSet = request.getIdSet();
         final FetchData fetch = request.getFetch();
@@ -80,36 +78,33 @@ public class FetchProcessor extends Abst
                 throw new MailboxException("Session not in SELECTED state");
             }
             
+            final MailboxSession mailboxSession = 
ImapSessionUtils.getMailboxSession(session);
+            final FetchResponseBuilder builder = new FetchResponseBuilder(new 
EnvelopeBuilder(session.getLog()));
+            
             for (int i = 0; i < idSet.length; i++) {
-                final FetchResponseBuilder builder = new FetchResponseBuilder(
-                        new EnvelopeBuilder(session.getLog()));
                 MessageRange messageSet = messageRange(session.getSelected(), 
idSet[i], useUids);
-                
-                // TODO: Maybe this should better be handled by the mailbox..
-                //
-                // split the MessageRange to not risk an OOM on big ranges
-                List<MessageRange> batchSet;
-                if (batchSize > 0) {
-                    batchSet = splitMessageRange(session.getSelected(), 
messageSet);
-                } else {
-                    batchSet = Arrays.asList(messageSet);
-                }
-                for (int a = 0; a < batchSet.size(); a++) {
-                    final MailboxSession mailboxSession = ImapSessionUtils
-                            .getMailboxSession(session);
-                    final Iterator<MessageResult> it = 
mailbox.getMessages(batchSet.get(a), resultToFetch, mailboxSession);
-                    while (it.hasNext()) {
-                        final MessageResult result = (MessageResult) it.next();
-                        try {
-                            final FetchResponse response = 
builder.build(fetch, result, mailbox, session, useUids);
-                            responder.respond(response);
-                        } catch (ParseException e) {
-                            // we can't for whatever reason parse the message 
so just skip it and log it to debug
-                            session.getLog().debug("Unable to parse message 
with uid " + result.getUid(), e);
-                        }
-                    }
-                }
+                MessageRange normalizedMessageSet = 
normalizeMessageRange(session.getSelected(), messageSet);
+                MessageRange batchedMessageSet = 
MessageRange.range(normalizedMessageSet.getUidFrom(), 
normalizedMessageSet.getUidTo(), batchSize);
+                mailbox.getMessages(batchedMessageSet, resultToFetch, 
mailboxSession, new MessageCallback() {
+                                       
+                                       public void 
onMessages(Iterator<MessageResult> it) throws MailboxException {
+                                               while (it.hasNext()) {
+                                           final MessageResult result = 
it.next();
+                                           try {
+                                               final FetchResponse response = 
builder.build(fetch, result, mailbox, session, useUids);
+                                               responder.respond(response);
+                                           } catch (ParseException e) {
+                                               // we can't for whatever reason 
parse the message so just skip it and log it to debug
+                                               session.getLog().debug("Unable 
to parse message with uid " + result.getUid(), e);
+                                           } catch (MessageRangeException e) {
+                                               // we can't for whatever reason 
find the message so just skip it and log it to debug
+                                               session.getLog().debug("Unable 
to find message with uid " + result.getUid(), e);
+                                                       }
+                                       }
+                                       }
+                               });
             }
+            
             unsolicitedResponses(session, responder, useUids);
             okComplete(command, tag, responder);
         } catch (UnsupportedCriteriaException e) {
@@ -119,68 +114,50 @@ public class FetchProcessor extends Abst
             taggedBad(command, tag, responder, 
HumanReadableText.INVALID_MESSAGESET);
         } catch (MailboxException e) {
             no(command, tag, responder, HumanReadableText.SEARCH_FAILED);
-        }
+        } 
     }
-
+    
     /**
-     * Split the given MessageRange in pieces
+     * Format MessageRange to RANGE format applying selected folder min & max 
UIDs constraints
      * 
-     * @param selected
-     * @param range
-     * @return splitted
+     * @param selected currently selected mailbox
+     * @param range input range
+     * @return normalized message range
+     * @throws MessageRangeException 
      */
-    private List<MessageRange> splitMessageRange(SelectedMailbox selected, 
MessageRange range) {
+    private MessageRange normalizeMessageRange(SelectedMailbox selected, 
MessageRange range) throws MessageRangeException {
         Type rangeType = range.getType();
         long start;
         long end;
+        
         switch (rangeType) {
         case ONE:
-            Arrays.asList(range);
-            break;
+            return range;
         case ALL:
             start = selected.getFirstUid();
             end = selected.getLastUid();
-            return createRanges(start, end);
-
+            return MessageRange.range(start, end);
         case RANGE:
             start = range.getUidFrom();
-            if (start < 1 || start == Long.MAX_VALUE) {
+            if (start < 1 || start == Long.MAX_VALUE || start < 
selected.getFirstUid()) {
                 start = selected.getFirstUid();
             }
             end = range.getUidTo();
-            if (end < 1 || end == Long.MAX_VALUE) {
+            if (end < 1 || end == Long.MAX_VALUE || end > 
selected.getLastUid()) {
                 end = selected.getLastUid();
             }
-            return createRanges(start, end);
+            return MessageRange.range(start, end);
         case FROM:
             start = range.getUidFrom();
-            end = range.getUidTo();
-            if (end < 1 || end == Long.MAX_VALUE) {
-                end = selected.getLastUid();
+            if (start < 1 || start == Long.MAX_VALUE || start < 
selected.getFirstUid()) {
+                start = selected.getFirstUid();
             }
-            return createRanges(start, end);
+            
+            end = selected.getLastUid();
+            return MessageRange.range(start, end);
         default:
-            break;
-        }
-        return Arrays.asList(range);
-    }
-
-    private List<MessageRange> createRanges(long start, long end) {
-        List<MessageRange> ranges = new ArrayList<MessageRange>();
-        if (start == end) {
-            ranges.add(MessageRange.one(start));
-        } else {
-            while (start < end) {
-                long to = start + batchSize;
-                if (to > end) {
-                    to = end;
-                }
-                MessageRange r = MessageRange.range(start, to);
-                ranges.add(r);
-                start = to;
-            }
+            throw new MessageRangeException("Unknown message range type: 
"+rangeType);
         }
-        return ranges;
     }
     
     private FetchGroup getFetchGroup(FetchData fetch) {

Modified: 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
URL: 
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java?rev=1073919&r1=1073918&r2=1073919&view=diff
==============================================================================
--- 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
 (original)
+++ 
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
 Wed Feb 23 20:04:50 2011
@@ -36,12 +36,12 @@ import org.apache.james.imap.api.message
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.imap.message.response.FetchResponse;
-import org.apache.james.imap.processor.base.MessageRangeException;
 import org.apache.james.mailbox.Content;
 import org.apache.james.mailbox.MailboxException;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageRange;
+import org.apache.james.mailbox.MessageRangeException;
 import org.apache.james.mailbox.MessageResult;
 import org.apache.james.mailbox.MimeDescriptor;
 import org.apache.james.mime4j.field.address.parser.ParseException;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to