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 ad...@apache.org on 2017/06/09 21:29:11 UTC

[3/7] james-project git commit: JAMES-1951 use MessageManager.getApplicableFlag

JAMES-1951 use MessageManager.getApplicableFlag

As ApplicableFlags are always merged with System flags, we decided that Applicable flags should always contains system flags. We corrected MessageMapper tests accordingly.

Also s/getApplicableFlag/getApplicableFlags/


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

Branch: refs/heads/master
Commit: e56bb6a12419ed2ef77e88c78c6d6adf9c5847d0
Parents: 587c0eb
Author: Luc DUZAN <ld...@linagora.com>
Authored: Tue Feb 28 18:55:14 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Fri Jun 9 21:56:01 2017 +0200

----------------------------------------------------------------------
 .../apache/james/mailbox/MessageManager.java    |   2 +-
 .../cassandra/mail/CassandraMessageMapper.java  |   9 +-
 .../mailbox/store/StoreMessageManager.java      |   2 +-
 .../mail/utils/ApplicableFlagCalculator.java    |  27 ++---
 .../store/AbstractCombinationManagerTest.java   |  54 +++++----
 .../store/mail/model/MessageMapperTest.java     | 117 +++++++++++++------
 .../utils/ApplicableFlagCalculatorTest.java     |  55 ++++++---
 .../processor/base/SelectedMailboxImpl.java     |  48 +++-----
 .../base/MailboxEventAnalyserTest.java          |   4 +-
 9 files changed, 191 insertions(+), 127 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index e0a2d40..edad736 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -170,7 +170,7 @@ public interface MessageManager {
      */
     MailboxPath getMailboxPath() throws MailboxException;
 
-    Flags getApplicableFlag(MailboxSession session) throws MailboxException;
+    Flags getApplicableFlags(MailboxSession session) throws MailboxException;
 
     /**
      * Gets current meta data for the mailbox.<br>

http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index b4ac929..80fc5c1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -32,6 +32,7 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.james.mailbox.ApplicableFlagBuilder;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
@@ -359,9 +360,11 @@ public class CassandraMessageMapper implements MessageMapper {
 
     @Override
     public Flags getApplicableFlag(Mailbox mailbox) throws MailboxException {
-        return applicableFlagDAO.retrieveApplicableFlag((CassandraId) mailbox.getMailboxId())
-            .join()
-            .orElse(new Flags());
+        return ApplicableFlagBuilder.builder()
+            .add(applicableFlagDAO.retrieveApplicableFlag((CassandraId) mailbox.getMailboxId())
+                .join()
+                .orElse(new Flags()))
+            .build();
     }
 
     private CompletableFuture<Void> save(Mailbox mailbox, MailboxMessage message) throws MailboxException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 5f7e279..5554acc 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -868,7 +868,7 @@ public class StoreMessageManager implements org.apache.james.mailbox.MessageMana
     }
 
     @Override
-    public Flags getApplicableFlag(MailboxSession session) throws MailboxException {
+    public Flags getApplicableFlags(MailboxSession session) throws MailboxException {
         return mapperFactory.getMessageMapper(session)
             .getApplicableFlag(mailbox);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculator.java
index 2d01fcd..110430f 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculator.java
@@ -19,11 +19,9 @@
 
 package org.apache.james.mailbox.store.mail.utils;
 
-import java.util.List;
-
 import javax.mail.Flags;
-import javax.mail.Flags.Flag;
 
+import org.apache.james.mailbox.ApplicableFlagBuilder;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
 import com.google.common.base.Function;
@@ -31,6 +29,7 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.FluentIterable;
 
 public class ApplicableFlagCalculator {
+
     private static Function<MailboxMessage, Flags> toFlags() {
         return new Function<MailboxMessage, Flags>() {
             @Override
@@ -48,22 +47,10 @@ public class ApplicableFlagCalculator {
     }
 
     public Flags computeApplicableFlags() {
-        List<Flags> messageFlags = FluentIterable.from(mailboxMessages)
-            .transform(toFlags())
-            .toList();
-        return getFlags(messageFlags);
-    }
-
-    private Flags getFlags(List<Flags> messageFlags) {
-        Flags flags = new Flags();
-
-        for (Flags flag : messageFlags) {
-            flags.add(flag);
-        }
-
-        flags.remove(Flag.RECENT);
-        flags.remove(Flag.USER);
-
-        return flags;
+        return ApplicableFlagBuilder.builder()
+                .add(FluentIterable.from(mailboxMessages)
+                    .transform(toFlags())
+                    .toArray(Flags.class))
+                .build();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
index bba5bc0..c2d1e41 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
@@ -28,6 +28,7 @@ import java.util.List;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
+import org.apache.james.mailbox.ApplicableFlagBuilder;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -375,10 +376,16 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager1.getApplicableFlag(session))
-            .isEqualTo(messageFlag);
-        assertThat(messageManager2.getApplicableFlag(session))
-            .isEqualTo(messageFlag);
+        Flags expected = ApplicableFlagBuilder
+            .builder()
+            .add(messageFlag)
+            .build();
+
+        assertThat(messageManager1.getApplicableFlags(session))
+            .isEqualTo(expected);
+
+        assertThat(messageManager2.getApplicableFlags(session))
+            .isEqualTo(expected);
     }
 
     @Test
@@ -397,39 +404,46 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setFlags(deleted, FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId()), session);
 
-        assertThat(messageManager1.getApplicableFlag(session))
-            .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED)
+        assertThat(messageManager1.getApplicableFlags(session))
+            .isEqualTo(ApplicableFlagBuilder.builder()
                 .add(USER_FLAGS_VALUE, ANOTHER_USER_FLAGS_VALUE)
                 .build());
     }
 
     @Test
     public void setFlagsFromMessageManagerAndSetFlagsFromMessageIdManagerShouldUpdateSameApplicableFlag() throws Exception {
-        Flags messageFlag = new Flags(Flag.ANSWERED);
-        Flags deleted = new Flags(Flag.DELETED);
-        MessageId messageId = messageManager1.appendMessage(new ByteArrayInputStream(MAIL_CONTENT), new Date(), session, false, messageFlag).getMessageId();
+        Flags customFlag1 = new Flags(Flag.ANSWERED);
+        Flags customFlag2 = new Flags("customFlag2");
+        MessageId messageId = messageManager1.appendMessage(new ByteArrayInputStream(MAIL_CONTENT), new Date(), session, false, customFlag1).getMessageId();
 
-        messageIdManager.setFlags(deleted, FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId()), session);
-        messageManager1.setFlags(deleted, FlagsUpdateMode.ADD, MessageRange.all(), session);
+        messageIdManager.setFlags(customFlag2, FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId()), session);
+        messageManager1.setFlags(customFlag2, FlagsUpdateMode.ADD, MessageRange.all(), session);
 
-        Flags applicableFlags = messageManager1.getApplicableFlag(session);
+        Flags applicableFlags = messageManager1.getApplicableFlags(session);
 
         assertThat(applicableFlags)
-            .isEqualTo(new FlagsBuilder().add(Flag.ANSWERED, Flag.DELETED).build());
+            .isEqualTo(ApplicableFlagBuilder.builder()
+                .add(customFlag1)
+                .add(customFlag2)
+                .build());
     }
 
     @Test
     public void setInMailboxFromMessageIdManagerAndSetFlagsFromMessageManagerShouldUnionApplicableFlag() throws Exception {
-        Flags messageFlag = new Flags(Flag.ANSWERED);
-        Flags deleted = new Flags(Flag.DELETED);
-        MessageId messageId = messageManager1.appendMessage(new ByteArrayInputStream(MAIL_CONTENT), new Date(), session, false, messageFlag).getMessageId();
+        Flags custom1 = new Flags("custom1");
+        Flags custom2 = new Flags("custom2");
+        MessageId messageId = messageManager1.appendMessage(new ByteArrayInputStream(MAIL_CONTENT), new Date(), session, false, custom1).getMessageId();
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
-        messageManager2.setFlags(deleted, FlagsUpdateMode.ADD, MessageRange.all(), session);
+        messageManager2.setFlags(custom2, FlagsUpdateMode.ADD, MessageRange.all(), session);
+
+        Flags expected = ApplicableFlagBuilder.builder()
+            .add(custom1)
+            .add(custom2)
+            .build();
 
-        assertThat(messageManager2.getApplicableFlag(session))
-            .isEqualTo(new FlagsBuilder().add(Flag.ANSWERED, Flag.DELETED).build());
+        assertThat(messageManager2.getApplicableFlags(session))
+            .isEqualTo(expected);
     }
 
     private Predicate<MessageResult> messageInMailbox2() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index 90cbada..aafbbed 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -51,6 +51,7 @@ import org.apache.james.mailbox.store.mail.model.MapperProvider.Capabilities;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMessage;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.After;
 import org.junit.Assume;
@@ -592,7 +593,7 @@ public abstract class MessageMapperTest {
     public void flagsReplacementShouldReturnAnUpdatedFlagHighlightingTheReplacement() throws MailboxException {
         saveMessages();
         long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        Iterator<UpdatedFlags> updatedFlags = messageMapper.updateFlags(benwaInboxMailbox, 
+        Iterator<UpdatedFlags> updatedFlags = messageMapper.updateFlags(benwaInboxMailbox,
                 new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         assertThat(Lists.newArrayList(updatedFlags))
             .containsOnly(UpdatedFlags.builder()
@@ -853,14 +854,17 @@ public abstract class MessageMapperTest {
 
     @Test
     public void getApplicableFlagShouldUnionAllMessageFlags() throws Exception {
-        message1.setFlags(new Flags(Flag.ANSWERED));
-        message2.setFlags(new Flags(Flag.DELETED));
+        String customFlags1 = "custom1";
+        String customFlags2 = "custom2";
+        message1.setFlags(new Flags(customFlags1));
+        message2.setFlags(new Flags(customFlags2));
 
         saveMessages();
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
-            .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED)
+            .isEqualTo(FlagsBuilder.builder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .add(customFlags1, customFlags2)
                 .build());
     }
 
@@ -877,31 +881,44 @@ public abstract class MessageMapperTest {
         saveMessages();
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
-            .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED)
+            .isEqualTo(FlagsBuilder.builder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
                 .add(CUSTOMS_USER_FLAGS_VALUE)
                 .build());
     }
 
     @Test
+    public void getApplicableFlagShouldContainSystemFlagsByDefault() throws Exception {
+        assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
+            .isEqualTo(FlagsBuilder.builder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .build());
+    }
+
+
+    @Test
     public void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByAddingThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         message1.setFlags(new Flags(Flag.ANSWERED));
         message2.setFlags(new Flags(Flag.DELETED));
-        FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.ADD);
+
+        String customFlag = "custom1";
+        FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(customFlag), FlagsUpdateMode.ADD);
 
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, newFlags, message1.getUid().toRange());
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
-            .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED, Flag.SEEN)
+            .isEqualTo(FlagsBuilder.builder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .add(customFlag)
                 .build());
     }
 
     @Test
     public void getApplicableFlagShouldHaveNotEffectWhenUpdateFlagsByReplaceThenIncrementalApplicableFlags() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
-        message1.setFlags(new Flags(Flag.ANSWERED));
+        String customFlags = "custom";
+        message1.setFlags(new Flags(customFlags));
         message2.setFlags(new Flags(Flag.DELETED));
         FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE);
 
@@ -910,14 +927,16 @@ public abstract class MessageMapperTest {
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
             .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED, Flag.SEEN)
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .add(customFlags)
                 .build());
     }
 
     @Test
     public void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByReplaceThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         Assume.assumeFalse(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
-        message1.setFlags(new Flags(Flag.ANSWERED));
+        String customFlags = "custom";
+        message1.setFlags(new Flags(customFlags));
         message2.setFlags(new Flags(Flag.DELETED));
         FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE);
 
@@ -925,64 +944,73 @@ public abstract class MessageMapperTest {
         messageMapper.updateFlags(benwaInboxMailbox, newFlags, message1.getUid().toRange());
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
-            .isEqualTo(new FlagsBuilder()
-                .add(Flag.DELETED, Flag.SEEN)
+            .isEqualTo(FlagsBuilder.builder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
                 .build());
     }
 
     @Test
     public void getApplicableFlagShouldHaveNotEffectWhenUpdateFlagsByRemoveThenIncrementalApplicableFlags() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
-        message1.setFlags(new FlagsBuilder().add(Flag.ANSWERED, Flag.SEEN).build());
+        String customFlags = "custom";
+        message1.setFlags(new FlagsBuilder().add(Flag.ANSWERED).add(customFlags).build());
         message2.setFlags(new Flags(Flag.DELETED));
-        FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REMOVE);
+        FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(customFlags), FlagsUpdateMode.REMOVE);
 
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, newFlags, message1.getUid().toRange());
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
             .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED, Flag.SEEN)
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .add(customFlags)
                 .build());
     }
 
     @Test
     public void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByRemoveThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         Assume.assumeFalse(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
-        message1.setFlags(new FlagsBuilder().add(Flag.ANSWERED, Flag.SEEN).build());
+        String customFlags = "custom";
+        message1.setFlags(new FlagsBuilder().add(Flag.ANSWERED).add(customFlags).build());
         message2.setFlags(new Flags(Flag.DELETED));
-        FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REMOVE);
+        FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(customFlags), FlagsUpdateMode.REMOVE);
 
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, newFlags, message1.getUid().toRange());
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
-            .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED)
+            .isEqualTo(FlagsBuilder.builder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
                 .build());
     }
 
     @Test
     public void getApplicableFlagShouldHaveEffectWhenUnsetMessageFlagThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         Assume.assumeFalse(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
-        message1.setFlags(new FlagsBuilder().add(Flag.ANSWERED, Flag.SEEN).build());
-        message2.setFlags(new Flags(Flag.DELETED));
+        String customFlag1 = "custom1";
+        String customFlag2 = "custom2";
+        String customFlag3 = "custom3";
+        message1.setFlags(new FlagsBuilder().add(customFlag1, customFlag2).build());
+        message2.setFlags(new Flags(customFlag3));
         FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(), FlagsUpdateMode.REPLACE);
 
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, newFlags, message1.getUid().toRange());
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
-            .isEqualTo(new FlagsBuilder()
-                .add(Flag.DELETED)
+            .isEqualTo(FlagsBuilder.builder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .add(customFlag3)
                 .build());
     }
 
     @Test
     public void getApplicableFlagShouldHaveNotEffectWhenUnsetMessageFlagThenIncrementalApplicableFlags() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.THREAD_SAFE_FLAGS_UPDATE));
-        message1.setFlags(new Flags(Flag.ANSWERED));
-        message2.setFlags(new Flags(Flag.DELETED));
+        String customFlag1 = "custom1";
+        String customFlag2 = "custom2";
+        message1.setFlags(new Flags(customFlag1));
+        message2.setFlags(new Flags(customFlag2));
         FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(), FlagsUpdateMode.REPLACE);
 
         saveMessages();
@@ -990,7 +1018,8 @@ public abstract class MessageMapperTest {
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
             .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED)
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .add(customFlag1, customFlag2)
                 .build());
     }
 
@@ -998,29 +1027,47 @@ public abstract class MessageMapperTest {
     @Test
     public void getApplicableFlagShouldHaveNotEffectWhenDeleteMessageThenIncrementalApplicableFlags() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
-        message1.setFlags(new Flags(Flag.ANSWERED));
-        message2.setFlags(new Flags(Flag.DELETED));
+        String customFlag1 = "custom1";
+        String customFlag2 = "custom2";
+        message1.setFlags(new Flags(customFlag1));
+        message2.setFlags(new Flags(customFlag2));
 
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message1);
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
             .isEqualTo(new FlagsBuilder()
-                .add(Flag.ANSWERED, Flag.DELETED)
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .add(customFlag1, customFlag2)
+                .build());
+    }
+
+    @Test
+    public void getApplicableFlagShouldShouldReturnDefaultApplicableFlagsWhenMailboxEmpty() throws Exception {
+        SimpleMailbox emptyMailbox = createMailbox(new MailboxPath("#private", "benwa", "EMPTY"));
+
+        assertThat(messageMapper.getApplicableFlag(emptyMailbox))
+            .isEqualTo(new FlagsBuilder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
                 .build());
     }
 
     @Test
     public void getApplicableFlagShouldHaveEffectWhenDeleteMessageThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         Assume.assumeFalse(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
-        message1.setFlags(new Flags(Flag.ANSWERED));
-        message2.setFlags(new Flags(Flag.DELETED));
+        String customFlag1 = "custom1";
+        String customFlag2 = "custom2";
+        message1.setFlags(new Flags(customFlag1));
+        message2.setFlags(new Flags(customFlag2));
 
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message1);
 
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
-            .isEqualTo(new Flags(Flag.DELETED));
+            .isEqualTo(FlagsBuilder.builder()
+                .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
+                .add(customFlag2)
+                .build());
     }
 
     private Map<MessageUid, MessageMetaData> markThenPerformExpunge(MessageRange range) throws MailboxException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java
index 2912692..3ac6800 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/utils/ApplicableFlagCalculatorTest.java
@@ -28,12 +28,13 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 import javax.mail.util.SharedByteArrayInputStream;
 
-import org.apache.james.mailbox.FlagsBuilder;
+import org.apache.james.mailbox.ApplicableFlagBuilder;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+import org.assertj.core.api.JUnitSoftAssertions;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -42,11 +43,12 @@ import com.google.common.collect.ImmutableList;
 
 public class ApplicableFlagCalculatorTest {
 
-    private static final String USER_FLAGS_VALUE = "UserFlags";
-
     @Rule
     public ExpectedException expectedException = ExpectedException.none();
 
+    @Rule
+    public final JUnitSoftAssertions softly = new JUnitSoftAssertions();
+
     @Test
     public void constructorShouldThrowWhenNull() throws Exception {
         expectedException.expect(NullPointerException.class);
@@ -54,29 +56,53 @@ public class ApplicableFlagCalculatorTest {
     }
 
     @Test
-    public void unionFlagsShouldWelWhenEmpty() throws Exception {
+    public void computeApplicableFlagsShouldReturnOnlyDefaultApplicableFlagsWhenNoMessage() throws Exception {
         ApplicableFlagCalculator calculator = new ApplicableFlagCalculator(ImmutableList.<MailboxMessage>of());
 
-        assertThat(calculator.computeApplicableFlags()).isEqualTo(new Flags());
+        assertThat(calculator.computeApplicableFlags()).isEqualTo(getDefaultApplicableFlag());
     }
 
     @Test
-    public void unionFlagsShouldUnionAllMessageFlagsExceptRecentAndUser() throws Exception {
+    public void computeApplicableFlagsShouldReturnOnlyDefaultApplicableFlagWhenNoMessageWithUserCustomFlag() throws Exception {
         List<MailboxMessage> mailboxMessages = ImmutableList.of(
             createMessage(new Flags(Flag.ANSWERED)),
             createMessage(new Flags(Flag.DELETED)),
             createMessage(new Flags(Flag.USER)),
+            createMessage(new Flags(Flag.RECENT)));
+
+        ApplicableFlagCalculator calculator = new ApplicableFlagCalculator(mailboxMessages);
+
+        assertThat(calculator.computeApplicableFlags()).isEqualTo(getDefaultApplicableFlag());
+    }
+
+    @Test
+    public void computeApplicableFlagsShouldReturnOnlyDefaultApplicableFlagAndAllUserCustomFlagUsedOneMessage() throws Exception {
+        List<MailboxMessage> mailboxMessages = ImmutableList.of(
+            createMessage(new Flags("capture me")),
+            createMessage(new Flags("french")));
+
+        ApplicableFlagCalculator calculator = new ApplicableFlagCalculator(mailboxMessages);
+
+        Flags expected = ApplicableFlagBuilder
+            .builder()
+            .add("capture me", "french")
+            .build();
+
+        assertThat(calculator.computeApplicableFlags()).isEqualTo(expected);
+    }
+
+    @Test
+    public void unionFlagsShouldAlwaysIgnoreRecentAndUser() throws  Exception {
+        List<MailboxMessage> mailboxMessages = ImmutableList.of(
             createMessage(new Flags(Flag.RECENT)),
-            createMessage(new FlagsBuilder().add(Flag.ANSWERED)
-                .add(USER_FLAGS_VALUE)
-                .build()));
+            createMessage(new Flags(Flag.USER)));
 
         ApplicableFlagCalculator calculator = new ApplicableFlagCalculator(mailboxMessages);
 
-        assertThat(calculator.computeApplicableFlags()).isEqualTo(new FlagsBuilder()
-            .add(Flag.ANSWERED, Flag.DELETED)
-            .add(USER_FLAGS_VALUE)
-            .build());
+        Flags result = calculator.computeApplicableFlags();
+
+        softly.assertThat(result.contains(Flag.RECENT)).isFalse();
+        softly.assertThat(result.contains(Flag.USER)).isFalse();
     }
 
     private MailboxMessage createMessage(Flags messageFlags) {
@@ -86,4 +112,7 @@ public class ApplicableFlagCalculatorTest {
             new SharedByteArrayInputStream(content.getBytes()), messageFlags, new PropertyBuilder(), TestId.of(1));
     }
 
+    private Flags getDefaultApplicableFlag() {
+        return ApplicableFlagBuilder.builder().build();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/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 74a861e..70ef72c 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
@@ -38,6 +38,7 @@ import org.apache.james.imap.api.process.SelectedMailbox;
 import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MailboxManager;
 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;
@@ -63,17 +64,7 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener{
     private MailboxPath path;
 
     private final ImapSession session;
-    
 
-    private final static Flags FLAGS = new Flags();
-    static {
-        FLAGS.add(Flags.Flag.ANSWERED);
-        FLAGS.add(Flags.Flag.DELETED);
-        FLAGS.add(Flags.Flag.DRAFT);
-        FLAGS.add(Flags.Flag.FLAGGED);
-        FLAGS.add(Flags.Flag.SEEN);
-    }
-    
     private final long sessionId;
     private final Set<MessageUid> flagUpdateUids = new TreeSet<MessageUid>();
     private final Flags.Flag uninterestingFlag = Flags.Flag.RECENT;
@@ -82,7 +73,7 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener{
     private boolean isDeletedByOtherSession = false;
     private boolean sizeChanged = false;
     private boolean silentFlagChanges = false;
-    private final Flags applicableFlags = new Flags(FLAGS);
+    private final Flags applicableFlags;
 
     private boolean applicableFlagsChanged;
     
@@ -102,37 +93,30 @@ public class SelectedMailboxImpl implements SelectedMailbox, MailboxListener{
         // Ignore events from our session
         setSilentFlagChanges(true);
         this.path = path;
-        init();
-    }
-
-    @Override
-    public ListenerType getType() {
-        return ListenerType.MAILBOX;
-    }
-
-    @Override
-    public ExecutionMode getExecutionMode() {
-        return ExecutionMode.SYNCHRONOUS;
-    }
 
-    private void init() throws MailboxException {
         MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
-        
+
         mailboxManager.addListener(path, this, mailboxSession);
 
-        MessageResultIterator messages = mailboxManager.getMailbox(path, mailboxSession).getMessages(MessageRange.all(), FetchGroupImpl.MINIMAL, mailboxSession);
+        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();
-                applicableFlags.add(mr.getFlags());
                 add(mr.getUid());
             }
-            
-          
-            // \RECENT is not a applicable flag in imap so remove it from the list
-            applicableFlags.remove(Flags.Flag.RECENT);
         }
-       
+    }
+
+    @Override
+    public ListenerType getType() {
+        return ListenerType.MAILBOX;
+    }
+
+    @Override
+    public ExecutionMode getExecutionMode() {
+        return ExecutionMode.SYNCHRONOUS;
     }
 
     private void add(int msn, MessageUid uid) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/e56bb6a1/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index a02d070..5ce5ea5 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -324,8 +324,8 @@ public class MailboxEventAnalyserTest {
                 }
 
                 @Override
-                public Flags getApplicableFlag(MailboxSession session) throws MailboxException {
-                    throw new NotImplementedException();
+                public Flags getApplicableFlags(MailboxSession session) throws MailboxException {
+                    return new Flags();
                 }
             };
         }


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