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 <ldu...@linagora.com> Authored: Tue Feb 28 18:55:14 2017 +0100 Committer: Antoine Duprat <adup...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org