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 bt...@apache.org on 2020/07/23 07:53:13 UTC

[james-project] 02/18: JAMES-3177 group applicableflags with update status

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

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

commit d06faa6746002d4249c09f5adf71c4bca4773c81
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Tue Jun 16 15:36:16 2020 +0200

    JAMES-3177 group applicableflags with update status
    
    	This does not change how the class behaves but it will help
    	for testing as updateApplicableFlags will become a pure function
---
 .../imap/processor/base/SelectedMailboxImpl.java   | 59 ++++++++++++++++++----
 1 file changed, 48 insertions(+), 11 deletions(-)

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 535e8a5..3f73abc 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
@@ -59,6 +59,39 @@ import reactor.core.scheduler.Schedulers;
  * Default implementation of {@link SelectedMailbox}
  */
 public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener {
+
+
+    private static class ApplicableFlags {
+        static ApplicableFlags from(Flags flags) {
+            boolean updated = false;
+            return new ApplicableFlags(flags, updated);
+        }
+
+        private final Flags flags;
+        private final boolean updated;
+
+        private ApplicableFlags(Flags flags, boolean updated) {
+            this.flags = flags;
+            this.updated = updated;
+        }
+
+        public ApplicableFlags ackUpdates() {
+            return new ApplicableFlags(flags, false);
+        }
+
+        public Flags flags() {
+            return new Flags(flags);
+        }
+
+        public boolean updated() {
+            return updated;
+        }
+
+        public ApplicableFlags update(boolean applicableFlagsChanged) {
+            return new ApplicableFlags(flags, true);
+        }
+    }
+
     private final Registration registration;
     private final MailboxManager mailboxManager;
     private final MailboxId mailboxId;
@@ -75,8 +108,7 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener {
     private boolean isDeletedByOtherSession = false;
     private boolean sizeChanged = false;
     private boolean silentFlagChanges = false;
-    private final Flags applicableFlags;
-    private boolean applicableFlagsChanged;
+    private ApplicableFlags applicableFlags;
 
     public SelectedMailboxImpl(MailboxManager mailboxManager, EventBus eventBus, ImapSession session, MessageManager messageManager) throws MailboxException {
         this.session = session;
@@ -96,7 +128,7 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener {
             .subscribeOn(Schedulers.elastic())
             .block();
 
-        applicableFlags = messageManager.getApplicableFlags(mailboxSession);
+        applicableFlags = ApplicableFlags.from(messageManager.getApplicableFlags(mailboxSession));
         try (Stream<MessageUid> stream = messageManager.search(SearchQuery.of(SearchQuery.all()), mailboxSession)) {
             uidMsnConverter.addAll(stream.collect(Guavate.toImmutableList()));
         }
@@ -185,7 +217,7 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener {
         sizeChanged = false;
         flagUpdateUids.clear();
         isDeletedByOtherSession = false;
-        applicableFlagsChanged = false;
+        applicableFlags = applicableFlags.ackUpdates();
     }
 
     @Override
@@ -290,19 +322,19 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener {
 
     @Override
     public synchronized Flags getApplicableFlags() {
-        return new Flags(applicableFlags);
+        return applicableFlags.flags();
     }
 
     
     @Override
     public synchronized boolean hasNewApplicableFlags() {
-        return applicableFlagsChanged;
+        return applicableFlags.updated();
     }
 
     
     @Override
     public synchronized void resetNewApplicableFlags() {
-        applicableFlagsChanged = false;
+        applicableFlags = applicableFlags.ackUpdates();
     }
 
     
@@ -381,22 +413,27 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener {
     }
 
     private void updateApplicableFlags(FlagsUpdated messageEvent) {
-        int size = applicableFlags.getUserFlags().length;
+        Flags updatedFlags = applicableFlags.flags();
+        int size = updatedFlags.getUserFlags().length;
         FlagsUpdated updatedF = messageEvent;
         List<UpdatedFlags> flags = updatedF.getUpdatedFlags();
 
         for (UpdatedFlags flag : flags) {
-            applicableFlags.add(flag.getNewFlags());
+            updatedFlags.add(flag.getNewFlags());
 
         }
 
         // \RECENT is not a applicable flag in imap so remove it
         // from the list
-        applicableFlags.remove(Flag.RECENT);
+        updatedFlags.remove(Flag.RECENT);
 
-        if (size < applicableFlags.getUserFlags().length) {
+        boolean applicableFlagsChanged;
+        if (size < updatedFlags.getUserFlags().length) {
             applicableFlagsChanged = true;
+        } else {
+            applicableFlagsChanged = false;
         }
+        applicableFlags = ApplicableFlags.from(updatedFlags).update(applicableFlagsChanged);
     }
 
     @Override


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