JAMES-2037 Use getUids rather than getMessages during SELECTs

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/7d3c8efa
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/7d3c8efa
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/7d3c8efa

Branch: refs/heads/master
Commit: 7d3c8efae3e228628a3d2123aff49984351280e8
Parents: e6f33c3
Author: benwa <[email protected]>
Authored: Thu Jun 8 14:46:40 2017 +0700
Committer: Antoine Duprat <[email protected]>
Committed: Fri Jun 9 21:56:32 2017 +0200

----------------------------------------------------------------------
 .../processor/base/SelectedMailboxImpl.java     | 124 +++----------------
 1 file changed, 20 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7d3c8efa/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
index e93ac53..d929b76 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/SelectedMailboxImpl.java
@@ -25,8 +25,6 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
 import java.util.TreeSet;
 
 import javax.mail.Flags;
@@ -41,11 +39,8 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mailbox.model.MessageResultIterator;
+import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.UpdatedFlags;
 
 import com.google.common.base.Optional;
@@ -69,6 +64,7 @@ public class SelectedMailboxImpl implements SelectedMailbox, 
MailboxListener{
     private final Set<MessageUid> flagUpdateUids = new TreeSet<MessageUid>();
     private final Flags.Flag uninterestingFlag = Flags.Flag.RECENT;
     private final Set<MessageUid> expungedUids = new TreeSet<MessageUid>();
+    private final UidMsnConverter uidMsnConverter;
 
     private boolean isDeletedByOtherSession = false;
     private boolean sizeChanged = false;
@@ -77,14 +73,6 @@ public class SelectedMailboxImpl implements SelectedMailbox, 
MailboxListener{
 
     private boolean applicableFlagsChanged;
 
-    private final SortedMap<Integer, MessageUid> msnToUid =new 
TreeMap<Integer, MessageUid>();
-
-    private final SortedMap<MessageUid, Integer> uidToMsn = new 
TreeMap<MessageUid, Integer>();
-
-    private MessageUid highestUid = MessageUid.MIN_VALUE;
-
-    private int highestMsn = 0;
-    
     public SelectedMailboxImpl(MailboxManager mailboxManager, ImapSession 
session, MailboxPath path) throws MailboxException {
         this.session = session;
         this.sessionId = 
ImapSessionUtils.getMailboxSession(session).getSessionId();
@@ -100,13 +88,13 @@ public class SelectedMailboxImpl implements 
SelectedMailbox, MailboxListener{
 
         MessageManager messageManager = mailboxManager.getMailbox(path, 
mailboxSession);
         applicableFlags = messageManager.getApplicableFlags(mailboxSession);
-        MessageResultIterator messages = 
messageManager.getMessages(MessageRange.all(), FetchGroupImpl.MINIMAL, 
mailboxSession);
-        synchronized (this) {
-            while(messages.hasNext()) {
-                MessageResult mr = messages.next();
-                add(mr.getUid());
-            }
-        }
+        uidMsnConverter = getUidMsnConverter(mailboxSession, messageManager);
+    }
+    
+    private UidMsnConverter getUidMsnConverter(MailboxSession mailboxSession , 
MessageManager messageManager) throws MailboxException {
+        return new UidMsnConverter(
+                messageManager.search(
+                        new SearchQuery(SearchQuery.all()), mailboxSession));
     }
 
     @Override
@@ -119,68 +107,16 @@ public class SelectedMailboxImpl implements 
SelectedMailbox, MailboxListener{
         return ExecutionMode.SYNCHRONOUS;
     }
 
-    private void add(int msn, MessageUid uid) {
-        if (uid.compareTo(highestUid) > 0) {
-            highestUid = uid;
-        }
-        msnToUid.put(msn, uid);
-        uidToMsn.put(uid, msn);
-    }
-
-    /**
-     * Expunge the message with the given uid
-     */
-    private void expunge(MessageUid uid) {
-        final int msn = msn(uid);
-        remove(msn, uid);
-
-        for (int aMsn = msn + 1; aMsn <= msnToUid.size() + 1; aMsn++) {
-            Optional<MessageUid> aUid = uid(aMsn);
-            if (aUid.isPresent()) {
-                remove(aMsn, aUid.get());
-                add(aMsn - 1, aUid.get());
-            }
-        }
-        highestMsn--;
-    }
-
-    private void remove(int msn, MessageUid uid) {
-        uidToMsn.remove(uid);
-        msnToUid.remove(msn);
-    }
-
-    /**
-     * Add the give uid
-     * 
-     * @param uid
-     */
-    private void add(MessageUid uid) {
-        if (!uidToMsn.containsKey(uid)) {
-            highestMsn++;
-            add(highestMsn, uid);
-        }
-    }
-
     @Override
     public synchronized Optional<MessageUid> getFirstUid() {
-        if (uidToMsn.isEmpty()) {
-            return Optional.absent();
-        } else {
-            return Optional.of(uidToMsn.firstKey());
-        }
+        return uidMsnConverter.getFirstUid();
     }
 
     @Override
     public synchronized Optional<MessageUid> getLastUid() {
-        if (uidToMsn.isEmpty()) {
-            return Optional.absent();
-        } else {
-            return Optional.of(uidToMsn.lastKey());
-        }
+        return uidMsnConverter.getLastUid();
     }
 
-
-    
     public synchronized void deselect() {
         MailboxSession mailboxSession = 
ImapSessionUtils.getMailboxSession(session);
 
@@ -192,14 +128,11 @@ public class SelectedMailboxImpl implements 
SelectedMailbox, MailboxListener{
             }
         }
         
-        uidToMsn.clear();
-        msnToUid.clear();
+        uidMsnConverter.clear();
         flagUpdateUids.clear();
 
         expungedUids.clear();
         recentUids.clear();
- 
-
     }
 
     @Override
@@ -265,12 +198,10 @@ public class SelectedMailboxImpl implements 
SelectedMailbox, MailboxListener{
     @Override
     public synchronized  int remove(MessageUid uid) {
         final int result = msn(uid);
-        expunge(uid);
+        uidMsnConverter.remove(uid);
         return result;
     }
 
-
-
     private boolean interestingFlags(UpdatedFlags updated) {
         boolean result;
         final Iterator<Flags.Flag> it = updated.systemFlagIterator();
@@ -361,12 +292,8 @@ public class SelectedMailboxImpl implements 
SelectedMailbox, MailboxListener{
         
     }
 
-
-
-
-    
     public synchronized Flags getApplicableFlags() {
-        return applicableFlags;
+        return new Flags(applicableFlags);
     }
 
     
@@ -392,7 +319,7 @@ public class SelectedMailboxImpl implements 
SelectedMailbox, MailboxListener{
                     final List<MessageUid> uids = ((Added) event).getUids();
                     SelectedMailbox sm = session.getSelected();
                     for (MessageUid uid : uids) {
-                        add(uid);
+                        uidMsnConverter.addUid(uid);
                         if (sm != null) {
                             sm.addRecent(uid);
                         }
@@ -467,31 +394,20 @@ public class SelectedMailboxImpl implements 
SelectedMailbox, MailboxListener{
 
     @Override
     public synchronized int msn(MessageUid uid) {
-        Integer msn = uidToMsn.get(uid);
-        if (msn != null) {
-            return msn.intValue();
-        } else {
-            return SelectedMailbox.NO_SUCH_MESSAGE;
-        }
+        return uidMsnConverter.getMsn(uid).or(NO_SUCH_MESSAGE);
     }
 
     @Override
     public synchronized Optional<MessageUid> uid(int msn) {
-        if (msn == -1) {
-            return Optional.absent();
-        }
-        MessageUid uid = msnToUid.get(msn);
-        if (uid != null) {
-            return Optional.of(uid);
-        } else {
+        if (msn == NO_SUCH_MESSAGE) {
             return Optional.absent();
         }
+
+        return uidMsnConverter.getUid(msn);
     }
 
     
     public synchronized long existsCount() {
-        return uidToMsn.size();
+        return uidMsnConverter.getNumMessage();
     }
-    
-
 }


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

Reply via email to