JAMES-1945 Update FirstUnseen after messages operations
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/72bb769b Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/72bb769b Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/72bb769b Branch: refs/heads/master Commit: 72bb769b14945e628b7a7f0fcd67c1c492c70c0e Parents: 62c2153 Author: Benoit Tellier <[email protected]> Authored: Tue Feb 21 15:46:28 2017 +0700 Committer: Antoine Duprat <[email protected]> Committed: Tue Feb 21 16:41:54 2017 +0100 ---------------------------------------------------------------------- .../CassandraMailboxSessionMapperFactory.java | 11 +- .../mail/CassandraIndexTableHandler.java | 35 +++++- .../cassandra/CassandraMailboxManagerTest.java | 9 +- .../CassandraSubscriptionManagerTest.java | 5 +- .../cassandra/CassandraTestSystemFixture.java | 9 +- .../mail/CassandraIndexTableHandlerTest.java | 121 ++++++++++++++++++- .../CassandraMailboxManagerAttachmentTest.java | 8 +- .../cassandra/mail/CassandraMapperProvider.java | 8 +- .../cassandra/host/CassandraHostSystem.java | 7 +- 9 files changed, 198 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java index 782a4e2..927bee5 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java @@ -25,6 +25,7 @@ import javax.inject.Named; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.cassandra.mail.CassandraAnnotationMapper; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMapper; +import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraIndexTableHandler; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO; @@ -67,13 +68,14 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa private final CassandraIndexTableHandler indexTableHandler; private final CassandraMailboxDAO mailboxDAO; private final CassandraMailboxPathDAO mailboxPathDAO; + private final CassandraFirstUnseenDAO firstUnseenDAO; private int maxRetry; @Inject public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider, Session session, CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO, - CassandraMailboxPathDAO mailboxPathDAO, @Named(CassandraMailboxDAO.MAX_ACL_RETRY) Integer maxRetry) { + CassandraMailboxPathDAO mailboxPathDAO, CassandraFirstUnseenDAO firstUnseenDAO, @Named(CassandraMailboxDAO.MAX_ACL_RETRY) Integer maxRetry) { this.uidProvider = uidProvider; this.modSeqProvider = modSeqProvider; this.session = session; @@ -84,16 +86,17 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa this.mailboxRecentsDAO = mailboxRecentsDAO; this.mailboxDAO = mailboxDAO; this.mailboxPathDAO = mailboxPathDAO; - this.indexTableHandler = new CassandraIndexTableHandler(mailboxRecentsDAO, mailboxCounterDAO); + this.firstUnseenDAO = firstUnseenDAO; + this.indexTableHandler = new CassandraIndexTableHandler(mailboxRecentsDAO, mailboxCounterDAO, this.firstUnseenDAO); this.maxRetry = maxRetry; } public CassandraMailboxSessionMapperFactory(UidProvider uidProvider, ModSeqProvider modSeqProvider, Session session, CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMailboxCounterDAO mailboxCounterDAO, CassandraMailboxRecentsDAO mailboxRecentsDAO, CassandraMailboxDAO mailboxDAO, - CassandraMailboxPathDAO mailboxPathDAO) { + CassandraMailboxPathDAO mailboxPathDAO, CassandraFirstUnseenDAO firstUnseenDAO) { this(uidProvider, modSeqProvider, session, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, - mailboxRecentsDAO, mailboxDAO, mailboxPathDAO, DEFAULT_MAX_RETRY); + mailboxRecentsDAO, mailboxDAO, mailboxPathDAO, firstUnseenDAO, DEFAULT_MAX_RETRY); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java index 860a632..a980b41 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandler.java @@ -24,6 +24,7 @@ import java.util.concurrent.CompletableFuture; import javax.inject.Inject; import javax.mail.Flags; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData; import org.apache.james.mailbox.model.UpdatedFlags; @@ -33,16 +34,20 @@ public class CassandraIndexTableHandler { private final CassandraMailboxRecentsDAO mailboxRecentDAO; private final CassandraMailboxCounterDAO mailboxCounterDAO; + private final CassandraFirstUnseenDAO firstUnseenDAO; @Inject public CassandraIndexTableHandler(CassandraMailboxRecentsDAO mailboxRecentDAO, - CassandraMailboxCounterDAO mailboxCounterDAO) { + CassandraMailboxCounterDAO mailboxCounterDAO, + CassandraFirstUnseenDAO firstUnseenDAO) { this.mailboxRecentDAO = mailboxRecentDAO; this.mailboxCounterDAO = mailboxCounterDAO; + this.firstUnseenDAO = firstUnseenDAO; } public CompletableFuture<Void> updateIndexOnDelete(ComposedMessageIdWithMetaData composedMessageIdWithMetaData, CassandraId mailboxId) { return CompletableFuture.allOf( + updateFirstUnseenOnDelete(mailboxId, composedMessageIdWithMetaData.getFlags(), composedMessageIdWithMetaData.getComposedMessageId().getUid()), mailboxRecentDAO.removeFromRecent(mailboxId, composedMessageIdWithMetaData.getComposedMessageId().getUid()), mailboxCounterDAO.decrementCount(mailboxId), decrementUnseenOnDelete(mailboxId, composedMessageIdWithMetaData.getFlags())); @@ -50,6 +55,7 @@ public class CassandraIndexTableHandler { public CompletableFuture<Void> updateIndexOnAdd(MailboxMessage message, CassandraId mailboxId) { return CompletableFuture.allOf( + updateFirstUnseenOnAdd(mailboxId, message.createFlags(), message.getUid()), addRecentOnSave(mailboxId, message), incrementUnseenOnSave(mailboxId, message.createFlags()), mailboxCounterDAO.incrementCount(mailboxId)); @@ -57,7 +63,8 @@ public class CassandraIndexTableHandler { public CompletableFuture<Void> updateIndexOnFlagsUpdate(CassandraId mailboxId, UpdatedFlags updatedFlags) { return CompletableFuture.allOf(manageUnseenMessageCountsOnFlagsUpdate(mailboxId, updatedFlags), - manageRecentOnFlagsUpdate(mailboxId, updatedFlags)); + manageRecentOnFlagsUpdate(mailboxId, updatedFlags), + updateFirstUnseenOnFlagsUpdate(mailboxId, updatedFlags)); } private CompletableFuture<Void> decrementUnseenOnDelete(CassandraId mailboxId, Flags flags) { @@ -100,4 +107,28 @@ public class CassandraIndexTableHandler { } return CompletableFuture.completedFuture(null); } + + private CompletableFuture<Void> updateFirstUnseenOnAdd(CassandraId mailboxId, Flags flags, MessageUid uid) { + if (flags.contains(Flags.Flag.SEEN)) { + return CompletableFuture.completedFuture(null); + } + return firstUnseenDAO.addUnread(mailboxId, uid); + } + + private CompletableFuture<Void> updateFirstUnseenOnDelete(CassandraId mailboxId, Flags flags, MessageUid uid) { + if (flags.contains(Flags.Flag.SEEN)) { + return CompletableFuture.completedFuture(null); + } + return firstUnseenDAO.removeUnread(mailboxId, uid); + } + + private CompletableFuture<Void> updateFirstUnseenOnFlagsUpdate(CassandraId mailboxId, UpdatedFlags updatedFlags) { + if (updatedFlags.isModifiedToUnset(Flags.Flag.SEEN)) { + return firstUnseenDAO.addUnread(mailboxId, updatedFlags.getUid()); + } + if (updatedFlags.isModifiedToSet(Flags.Flag.SEEN)) { + return firstUnseenDAO.removeUnread(mailboxId, updatedFlags.getUid()); + } + return CompletableFuture.completedFuture(null); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java index 1a57076..afc275a 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java @@ -24,6 +24,7 @@ import org.apache.james.mailbox.acl.GroupMembershipResolver; import org.apache.james.mailbox.acl.MailboxACLResolver; import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver; import org.apache.james.mailbox.acl.UnionMailboxACLResolver; +import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO; @@ -36,6 +37,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule; import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule; +import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule; @@ -69,6 +71,7 @@ public class CassandraMailboxManagerTest { new CassandraMessageModule(), new CassandraMailboxCounterModule(), new CassandraMailboxRecentsModule(), + new CassandraFirstUnseenModule(), new CassandraUidModule(), new CassandraModSeqModule(), new CassandraSubscriptionModule(), @@ -90,6 +93,7 @@ public class CassandraMailboxManagerTest { CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(CASSANDRA.getConf()); CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_ACL_RETRY); CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider()); + CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(CASSANDRA.getConf()); CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider, modSeqProvider, @@ -98,7 +102,10 @@ public class CassandraMailboxManagerTest { messageIdDAO, imapUidDAO, mailboxCounterDAO, - mailboxRecentsDAO, mailboxDAO, mailboxPathDAO); + mailboxRecentsDAO, + mailboxDAO, + mailboxPathDAO, + firstUnseenDAO); MailboxACLResolver aclResolver = new UnionMailboxACLResolver(); GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver(); http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java index 29c0785..b0b334e 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java @@ -23,6 +23,7 @@ import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.init.CassandraModuleComposite; import org.apache.james.mailbox.AbstractSubscriptionManagerTest; import org.apache.james.mailbox.SubscriptionManager; +import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO; @@ -53,6 +54,7 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage CassandraMailboxRecentsDAO mailboxRecentsDAO = null; CassandraMailboxDAO mailboxDAO = null; CassandraMailboxPathDAO mailboxPathDAO = null; + CassandraFirstUnseenDAO firstUnseenDAO = null; return new CassandraSubscriptionManager( new CassandraMailboxSessionMapperFactory( new CassandraUidProvider(cassandra.getConf()), @@ -64,7 +66,8 @@ public class CassandraSubscriptionManagerTest extends AbstractSubscriptionManage mailboxCounterDAO, mailboxRecentsDAO, mailboxDAO, - mailboxPathDAO) + mailboxPathDAO, + firstUnseenDAO) ); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java index a6f6214..553d92b 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.init.CassandraModuleComposite; +import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO; @@ -35,6 +36,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule; import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule; +import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule; @@ -57,6 +59,7 @@ public class CassandraTestSystemFixture { new CassandraMessageModule(), new CassandraMailboxCounterModule(), new CassandraMailboxRecentsModule(), + new CassandraFirstUnseenModule(), new CassandraUidModule(), new CassandraModSeqModule(), new CassandraAttachmentModule(), @@ -77,6 +80,7 @@ public class CassandraTestSystemFixture { CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider(), MAX_ACL_RETRY); CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(CASSANDRA.getConf(), CASSANDRA.getTypesProvider()); + CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(CASSANDRA.getConf()); return new CassandraMailboxSessionMapperFactory(uidProvider, modSeqProvider, CASSANDRA.getConf(), @@ -84,7 +88,10 @@ public class CassandraTestSystemFixture { messageIdDAO, imapUidDAO, mailboxCounterDAO, - mailboxRecentsDAO, mailboxDAO, mailboxPathDAO); + mailboxRecentsDAO, + mailboxDAO, + mailboxPathDAO, + firstUnseenDAO); } public static CassandraMailboxManager createMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory) throws Exception{ http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java index 93d14e4..baca0aa 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java @@ -32,6 +32,7 @@ import org.apache.james.backends.cassandra.init.CassandraModuleComposite; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.cassandra.CassandraId; import org.apache.james.mailbox.cassandra.CassandraMessageId; +import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule; import org.apache.james.mailbox.model.ComposedMessageId; @@ -56,6 +57,7 @@ public class CassandraIndexTableHandlerTest { private CassandraCluster cassandra; private CassandraMailboxCounterDAO mailboxCounterDAO; private CassandraMailboxRecentsDAO mailboxRecentsDAO; + private CassandraFirstUnseenDAO firstUnseenDAO; private CassandraIndexTableHandler testee; private Mailbox mailbox; @@ -64,12 +66,15 @@ public class CassandraIndexTableHandlerTest { cassandra = CassandraCluster.create( new CassandraModuleComposite( new CassandraMailboxCounterModule(), - new CassandraMailboxRecentsModule())); + new CassandraMailboxRecentsModule(), + new CassandraFirstUnseenModule())); cassandra.ensureAllTables(); mailboxCounterDAO = new CassandraMailboxCounterDAO(cassandra.getConf()); mailboxRecentsDAO = new CassandraMailboxRecentsDAO(cassandra.getConf()); - testee = new CassandraIndexTableHandler(mailboxRecentsDAO, mailboxCounterDAO); + firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf()); + + testee = new CassandraIndexTableHandler(mailboxRecentsDAO, mailboxCounterDAO, firstUnseenDAO); mailbox = new SimpleMailbox(new MailboxPath("#private", "user", "name"), UID_VALIDITY, @@ -366,4 +371,116 @@ public class CassandraIndexTableHandlerTest { .isEmpty(); } + @Test + public void updateIndexOnAddShouldUpdateFirstUnseenWhenUnseen() throws Exception { + MailboxMessage message = mock(MailboxMessage.class); + when(message.createFlags()).thenReturn(new Flags()); + when(message.getUid()).thenReturn(MESSAGE_UID); + testee.updateIndexOnAdd(message, MAILBOX_ID).join(); + + Optional<MessageUid> actual = firstUnseenDAO.retrieveFirstUnread(MAILBOX_ID).join(); + assertThat(actual.isPresent()).isTrue(); + assertThat(actual.get()).isEqualTo(MESSAGE_UID); + } + + @Test + public void updateIndexOnAddShouldNotUpdateFirstUnseenWhenSeen() throws Exception { + MailboxMessage message = mock(MailboxMessage.class); + when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN)); + when(message.getUid()).thenReturn(MESSAGE_UID); + testee.updateIndexOnAdd(message, MAILBOX_ID).join(); + + Optional<MessageUid> actual = firstUnseenDAO.retrieveFirstUnread(MAILBOX_ID).join(); + assertThat(actual.isPresent()).isFalse(); + } + + @Test + public void updateIndexOnFlagsUpdateShouldUpdateLastUnseenWhenSetToSeen() throws Exception { + MailboxMessage message = mock(MailboxMessage.class); + when(message.createFlags()).thenReturn(new Flags()); + when(message.getUid()).thenReturn(MESSAGE_UID); + testee.updateIndexOnAdd(message, MAILBOX_ID).join(); + + testee.updateIndexOnFlagsUpdate(MAILBOX_ID, UpdatedFlags.builder() + .uid(MESSAGE_UID) + .newFlags(new Flags(Flags.Flag.SEEN)) + .oldFlags(new Flags()) + .modSeq(MODSEQ) + .build()).join(); + + Optional<MessageUid> actual = firstUnseenDAO.retrieveFirstUnread(MAILBOX_ID).join(); + assertThat(actual.isPresent()).isFalse(); + } + + @Test + public void updateIndexOnFlagsUpdateShouldUpdateLastUnseenWhenSetToUnseen() throws Exception { + MailboxMessage message = mock(MailboxMessage.class); + when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN)); + when(message.getUid()).thenReturn(MESSAGE_UID); + testee.updateIndexOnAdd(message, MAILBOX_ID).join(); + + testee.updateIndexOnFlagsUpdate(MAILBOX_ID, UpdatedFlags.builder() + .uid(MESSAGE_UID) + .newFlags(new Flags()) + .oldFlags(new Flags(Flags.Flag.SEEN)) + .modSeq(MODSEQ) + .build()).join(); + + Optional<MessageUid> actual = firstUnseenDAO.retrieveFirstUnread(MAILBOX_ID).join(); + assertThat(actual.isPresent()).isTrue(); + assertThat(actual.get()).isEqualTo(MESSAGE_UID); + } + + @Test + public void updateIndexOnFlagsUpdateShouldNotUpdateLastUnseenWhenKeepUnseen() throws Exception { + MailboxMessage message = mock(MailboxMessage.class); + when(message.createFlags()).thenReturn(new Flags()); + when(message.getUid()).thenReturn(MESSAGE_UID); + testee.updateIndexOnAdd(message, MAILBOX_ID).join(); + + testee.updateIndexOnFlagsUpdate(MAILBOX_ID, UpdatedFlags.builder() + .uid(MESSAGE_UID) + .newFlags(new Flags()) + .oldFlags(new Flags()) + .modSeq(MODSEQ) + .build()).join(); + + Optional<MessageUid> actual = firstUnseenDAO.retrieveFirstUnread(MAILBOX_ID).join(); + assertThat(actual.isPresent()).isTrue(); + assertThat(actual.get()).isEqualTo(MESSAGE_UID); + } + + @Test + public void updateIndexOnFlagsUpdateShouldNotUpdateLastUnseenWhenKeepSeen() throws Exception { + MailboxMessage message = mock(MailboxMessage.class); + when(message.createFlags()).thenReturn(new Flags(Flags.Flag.SEEN)); + when(message.getUid()).thenReturn(MESSAGE_UID); + testee.updateIndexOnAdd(message, MAILBOX_ID).join(); + + testee.updateIndexOnFlagsUpdate(MAILBOX_ID, UpdatedFlags.builder() + .uid(MESSAGE_UID) + .newFlags(new Flags(Flags.Flag.SEEN)) + .oldFlags(new Flags(Flags.Flag.SEEN)) + .modSeq(MODSEQ) + .build()).join(); + + Optional<MessageUid> actual = firstUnseenDAO.retrieveFirstUnread(MAILBOX_ID).join(); + assertThat(actual.isPresent()).isFalse(); + } + + @Test + public void updateIndexOnDeleteShouldUpdateFirstUnseenWhenUnseen() throws Exception { + MailboxMessage message = mock(MailboxMessage.class); + when(message.createFlags()).thenReturn(new Flags()); + when(message.getUid()).thenReturn(MESSAGE_UID); + testee.updateIndexOnAdd(message, MAILBOX_ID).join(); + + testee.updateIndexOnDelete(new ComposedMessageIdWithMetaData( + new ComposedMessageId(MAILBOX_ID, CASSANDRA_MESSAGE_ID, MESSAGE_UID), + new Flags(), + MODSEQ), MAILBOX_ID).join(); + + Optional<MessageUid> actual = firstUnseenDAO.retrieveFirstUnread(MAILBOX_ID).join(); + assertThat(actual.isPresent()).isFalse(); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java index e220626..fb4ca45 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java @@ -30,6 +30,7 @@ import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory; import org.apache.james.mailbox.cassandra.CassandraMessageId; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule; +import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule; @@ -50,6 +51,7 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage new CassandraMessageModule(), new CassandraMailboxCounterModule(), new CassandraMailboxRecentsModule(), + new CassandraFirstUnseenModule(), new CassandraModSeqModule(), new CassandraUidModule(), new CassandraAttachmentModule())); @@ -64,6 +66,7 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider(), MAX_ACL_RETRY); CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider()); + CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf()); mailboxSessionMapperFactory = new CassandraMailboxSessionMapperFactory( new CassandraUidProvider(cassandra.getConf()), new CassandraModSeqProvider(cassandra.getConf()), @@ -72,7 +75,10 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage new CassandraMessageIdDAO(cassandra.getConf(), messageIdFactory), new CassandraMessageIdToImapUidDAO(cassandra.getConf(), messageIdFactory), new CassandraMailboxCounterDAO(cassandra.getConf()), - new CassandraMailboxRecentsDAO(cassandra.getConf()), mailboxDAO, mailboxPathDAO); + new CassandraMailboxRecentsDAO(cassandra.getConf()), + mailboxDAO, + mailboxPathDAO, + firstUnseenDAO); Authenticator noAuthenticator = null; Authorizator noAuthorizator = null; mailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(), new MessageParser(), messageIdFactory); http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java index a43fb88..5a6d69f 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java @@ -31,6 +31,7 @@ import org.apache.james.mailbox.cassandra.CassandraMessageId.Factory; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule; import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule; +import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule; @@ -64,7 +65,8 @@ public class CassandraMapperProvider implements MapperProvider { new CassandraModSeqModule(), new CassandraUidModule(), new CassandraAttachmentModule(), - new CassandraAnnotationModule())); + new CassandraAnnotationModule(), + new CassandraFirstUnseenModule())); public static final int MAX_ACL_RETRY = 10; private final MessageUidProvider messageUidProvider; @@ -98,6 +100,7 @@ public class CassandraMapperProvider implements MapperProvider { private CassandraMailboxSessionMapperFactory createMapperFactory() { CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider(), MAX_ACL_RETRY); CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(cassandra.getConf(), cassandra.getTypesProvider()); + CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(cassandra.getConf()); return new CassandraMailboxSessionMapperFactory( new CassandraUidProvider(cassandra.getConf()), cassandraModSeqProvider, @@ -108,7 +111,8 @@ public class CassandraMapperProvider implements MapperProvider { new CassandraMailboxCounterDAO(cassandra.getConf()), new CassandraMailboxRecentsDAO(cassandra.getConf()), mailboxDAO, - mailboxPathDAO); + mailboxPathDAO, + firstUnseenDAO); } @Override http://git-wip-us.apache.org/repos/asf/james-project/blob/72bb769b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java ---------------------------------------------------------------------- diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java index ea3e2ae..4b21a47 100644 --- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java +++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java @@ -29,6 +29,7 @@ import org.apache.james.mailbox.SubscriptionManager; import org.apache.james.mailbox.cassandra.CassandraMailboxManager; import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory; import org.apache.james.mailbox.cassandra.CassandraMessageId; +import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxDAO; import org.apache.james.mailbox.cassandra.mail.CassandraMailboxPathDAO; @@ -41,6 +42,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider; import org.apache.james.mailbox.cassandra.modules.CassandraAclModule; import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule; import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule; +import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule; import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule; @@ -83,6 +85,7 @@ public class CassandraHostSystem extends JamesImapHostSystem { new CassandraMessageModule(), new CassandraMailboxCounterModule(), new CassandraMailboxRecentsModule(), + new CassandraFirstUnseenModule(), new CassandraUidModule(), new CassandraModSeqModule(), new CassandraSubscriptionModule(), @@ -102,9 +105,11 @@ public class CassandraHostSystem extends JamesImapHostSystem { CassandraMailboxRecentsDAO mailboxRecentsDAO = new CassandraMailboxRecentsDAO(session); CassandraMailboxDAO mailboxDAO = new CassandraMailboxDAO(session, typesProvider, MAX_ACL_RETRY); CassandraMailboxPathDAO mailboxPathDAO = new CassandraMailboxPathDAO(session, typesProvider); + CassandraFirstUnseenDAO firstUnseenDAO = new CassandraFirstUnseenDAO(session); CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider, modSeqProvider, - session, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, mailboxRecentsDAO, mailboxDAO, mailboxPathDAO); + session, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, mailboxRecentsDAO, mailboxDAO, mailboxPathDAO, + firstUnseenDAO); mailboxManager = new CassandraMailboxManager(mapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory); QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mapperFactory); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
