You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2019/05/17 12:25:40 UTC

[james-project] 01/05: JAMES-2761 get mailbox capabilities out of the loop on its messages

This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 9bdf4f0c09fd70d1a8e916ad5d762d67544090d3
Author: RĂ©mi Kowalski <rk...@linagora.com>
AuthorDate: Mon May 13 11:22:53 2019 +0200

    JAMES-2761 get mailbox capabilities out of the loop on its messages
---
 .../imap/processor/AbstractMailboxProcessor.java   | 42 ++++++++++++----------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index 22d7e17..731a3ac 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -53,7 +53,6 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.MetaData;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
@@ -202,12 +201,10 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
     }
     
     private void addFlagsResponses(ImapSession session, SelectedMailbox selected, ImapProcessor.Responder responder, boolean useUid) {
-       
         try {
-  
             // To be lazily initialized only if needed, which is in minority of cases.
             MessageManager messageManager = null;
-
+            MetaData metaData = null;
             final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
 
             // Check if we need to send a FLAGS and PERMANENTFLAGS response before the FETCH response
@@ -216,48 +213,55 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
             if (selected.hasNewApplicableFlags()) {
                 messageManager = getMailbox(session, selected);
                 flags(responder, selected);
-                permanentFlags(responder, messageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT), selected);
+                metaData = messageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT);
+
+                permanentFlags(responder, metaData, selected);
                 selected.resetNewApplicableFlags();
             }
             
             final Collection<MessageUid> flagUpdateUids = selected.flagUpdateUids();
             if (!flagUpdateUids.isEmpty()) {
                 Iterator<MessageRange> ranges = MessageRange.toRanges(flagUpdateUids).iterator();
+                if (messageManager == null) {
+                    messageManager = getMailbox(session, selected);
+                }
+                if (metaData == null) {
+                    metaData = messageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT);
+                }
+                boolean isModSeqPermanent = metaData.isModSeqPermanent();
                 while (ranges.hasNext()) {
-                 if (messageManager == null) {
-                     messageManager = getMailbox(session, selected);
-                 }
-                    addFlagsResponses(session, selected, responder, useUid, ranges.next(), messageManager, mailboxSession);
+                    addFlagsResponses(session, selected, responder, useUid, ranges.next(), messageManager, isModSeqPermanent, mailboxSession);
                 }
-
             }
-            
+
         } catch (MailboxException e) {
             handleResponseException(responder, e, HumanReadableText.FAILURE_TO_LOAD_FLAGS, session);
         }
 
     }
     
-    protected void addFlagsResponses(ImapSession session, SelectedMailbox selected, ImapProcessor.Responder responder, boolean useUid, MessageRange messageSet, MessageManager mailbox, MailboxSession mailboxSession) throws MailboxException {
-
+    private void addFlagsResponses(ImapSession session,
+                                   SelectedMailbox selected,
+                                   ImapProcessor.Responder responder,
+                                   boolean useUid,
+                                   MessageRange messageSet, MessageManager mailbox,
+                                   boolean isModSeqPermanent,
+                                   MailboxSession mailboxSession) throws MailboxException {
         final MessageResultIterator it = mailbox.getMessages(messageSet, FetchGroupImpl.MINIMAL,  mailboxSession);
+        final boolean qresyncEnabled = EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC);
+        final boolean condstoreEnabled = EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_CONDSTORE);
         while (it.hasNext()) {
             MessageResult mr = it.next();
             final MessageUid uid = mr.getUid();
             int msn = selected.msn(uid);
             if (msn == SelectedMailbox.NO_SUCH_MESSAGE) {
                 LOGGER.debug("No message found with uid {} in the uid<->msn mapping for mailbox {}. This may be because it was deleted by a concurrent session. So skip it..", uid, selected.getPath().asString());
-                    
-
                 // skip this as it was not found in the mapping
                 // 
                 // See IMAP-346
                 continue;
             }
 
-            boolean qresyncEnabled = EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC);
-            boolean condstoreEnabled = EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_CONDSTORE);
-
             final Flags flags = mr.getFlags();
             final MessageUid uidOut;
             if (useUid || qresyncEnabled) {
@@ -274,7 +278,7 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
             
             // Check if we also need to return the MODSEQ in the response. This is true if CONDSTORE or
             // if QRESYNC was enabled, and the mailbox supports the permant storage of mod-sequences
-            if ((condstoreEnabled || qresyncEnabled) && mailbox.getMetaData(false, mailboxSession, FetchGroup.NO_COUNT).isModSeqPermanent()) {
+            if ((condstoreEnabled || qresyncEnabled) && isModSeqPermanent) {
                 response = new FetchResponse(msn, flags, uidOut, mr.getModSeq(), null, null, null, null, null, null);
             } else {
                 response = new FetchResponse(msn, flags, uidOut, null, null, null, null, null, null, null);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org