This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit d1dc8ad37763b6fcaace1f28ca3d9eca7d473c58 Author: Benoit Tellier <[email protected]> AuthorDate: Sun Apr 12 20:24:56 2020 +0700 JAMES-3148 Cleanup ApplicableFlags --- .../CassandraMailboxSessionMapperFactory.java | 3 +- .../mailbox/cassandra/DeleteMessageListener.java | 6 +++- .../cassandra/mail/CassandraApplicableFlagDAO.java | 15 +++++++++ .../cassandra/CassandraMailboxManagerTest.java | 36 ++++++++++++++++++++++ .../mail/CassandraApplicableFlagDAOTest.java | 16 ++++++++++ 5 files changed, 74 insertions(+), 2 deletions(-) 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 b61508b..62ccb3a 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 @@ -204,6 +204,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa } public DeleteMessageListener deleteMessageListener() { - return new DeleteMessageListener(imapUidDAO, messageIdDAO, messageDAO, attachmentDAOV2, ownerDAO, attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO); + return new DeleteMessageListener(imapUidDAO, messageIdDAO, messageDAO, attachmentDAOV2, ownerDAO, + attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, applicableFlagDAO); } } diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java index 1831416..c4de8cc 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/DeleteMessageListener.java @@ -29,6 +29,7 @@ import org.apache.james.mailbox.acl.ACLDiff; import org.apache.james.mailbox.cassandra.ids.CassandraId; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper; +import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO; @@ -65,11 +66,12 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen private final CassandraAttachmentMessageIdDAO attachmentMessageIdDAO; private final CassandraACLMapper aclMapper; private final CassandraUserMailboxRightsDAO rightsDAO; + private final CassandraApplicableFlagDAO applicableFlagDAO; @Inject public DeleteMessageListener(CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageDAO messageDAO, CassandraAttachmentDAOV2 attachmentDAO, CassandraAttachmentOwnerDAO ownerDAO, - CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, CassandraACLMapper aclMapper, CassandraUserMailboxRightsDAO rightsDAO) { + CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, CassandraACLMapper aclMapper, CassandraUserMailboxRightsDAO rightsDAO, CassandraApplicableFlagDAO applicableFlagDAO) { this.imapUidDAO = imapUidDAO; this.messageIdDAO = messageIdDAO; this.messageDAO = messageDAO; @@ -78,6 +80,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen this.attachmentMessageIdDAO = attachmentMessageIdDAO; this.aclMapper = aclMapper; this.rightsDAO = rightsDAO; + this.applicableFlagDAO = applicableFlagDAO; } @Override @@ -114,6 +117,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen .then(imapUidDAO.delete((CassandraMessageId) metadata.getMessageId(), mailboxId)) .then(messageIdDAO.delete(mailboxId, metadata.getUid()))) .then(deleteAcl(mailboxId)) + .then(applicableFlagDAO.delete(mailboxId)) .block(); } } diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java index cd7398d..2fdb846 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAO.java @@ -39,6 +39,7 @@ import org.apache.james.mailbox.cassandra.ids.CassandraId; import com.datastax.driver.core.PreparedStatement; import com.datastax.driver.core.Session; +import com.datastax.driver.core.querybuilder.QueryBuilder; import com.datastax.driver.core.querybuilder.Update; import com.datastax.driver.core.querybuilder.Update.Assignments; @@ -48,11 +49,13 @@ public class CassandraApplicableFlagDAO { private final CassandraAsyncExecutor cassandraAsyncExecutor; private final PreparedStatement select; + private final PreparedStatement delete; @Inject public CassandraApplicableFlagDAO(Session session) { this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session); this.select = prepareSelect(session); + this.delete = prepareDelete(session); } private PreparedStatement prepareSelect(Session session) { @@ -61,6 +64,18 @@ public class CassandraApplicableFlagDAO { .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))); } + private PreparedStatement prepareDelete(Session session) { + return session.prepare(QueryBuilder.delete() + .from(TABLE_NAME) + .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID)))); + } + + public Mono<Void> delete(CassandraId mailboxId) { + return cassandraAsyncExecutor.executeVoid( + delete.bind() + .setUUID(MAILBOX_ID, mailboxId.asUuid())); + } + public Mono<Flags> retrieveApplicableFlag(CassandraId mailboxId) { return cassandraAsyncExecutor.executeSingleRow( select.bind() 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 b08c9a0..de77b65 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 @@ -19,11 +19,14 @@ package org.apache.james.mailbox.cassandra; import static org.apache.james.backends.cassandra.Scenario.Builder.fail; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import java.util.Collection; import java.util.Optional; +import javax.mail.Flags; + import org.apache.commons.lang3.tuple.Pair; import org.apache.james.backends.cassandra.CassandraCluster; import org.apache.james.backends.cassandra.CassandraClusterExtension; @@ -38,6 +41,7 @@ import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.cassandra.ids.CassandraId; import org.apache.james.mailbox.cassandra.ids.CassandraMessageId; import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper; +import org.apache.james.mailbox.cassandra.mail.CassandraApplicableFlagDAO; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO; import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO; @@ -581,6 +585,38 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai }); } + @Test + void deleteMailboxShouldCleanUpApplicableFlags(CassandraCluster cassandraCluster) throws Exception { + inboxManager.appendMessage(MessageManager.AppendCommand.builder() + .withFlags(new Flags("custom")) + .build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")), session); + + mailboxManager.deleteMailbox(inbox, session); + + assertThat(applicableFlagDAO(cassandraCluster).retrieveApplicableFlag((CassandraId) inboxId).blockOptional()) + .isEmpty(); + } + + @Test + void deleteMailboxShouldCleanUpApplicableFlagsAfterAFailure(CassandraCluster cassandraCluster) throws Exception { + inboxManager.appendMessage(MessageManager.AppendCommand.builder() + .withFlags(new Flags("custom")) + .build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")), session); + + cassandraCluster.getConf().registerScenario(fail() + .times(1) + .whenQueryStartsWith("DELETE FROM applicableFlag WHERE mailboxId=:mailboxId;")); + + mailboxManager.deleteMailbox(inbox, session); + + assertThat(applicableFlagDAO(cassandraCluster).retrieveApplicableFlag((CassandraId) inboxId).blockOptional()) + .isEmpty(); + } + + private CassandraApplicableFlagDAO applicableFlagDAO(CassandraCluster cassandraCluster) { + return new CassandraApplicableFlagDAO(cassandraCluster.getConf()); + } + private CassandraACLMapper aclMapper(CassandraCluster cassandraCluster) { return new CassandraACLMapper(cassandraCluster.getConf(), rightsDAO(cassandraCluster), CassandraConfiguration.DEFAULT_CONFIGURATION); } diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java index 55f7b5c..710f400 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java @@ -20,6 +20,7 @@ package org.apache.james.mailbox.cassandra.mail; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; import javax.mail.Flags; @@ -73,6 +74,21 @@ class CassandraApplicableFlagDAOTest { } @Test + void retrieveApplicableFlagShouldReturnEmptyWhenDeleted() { + testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).block(); + + testee.delete(CASSANDRA_ID).block(); + + assertThat(testee.retrieveApplicableFlag(CASSANDRA_ID).blockOptional()) + .isEmpty(); + } + @Test + void deleteShouldNotThrowWhenEmpty() { + assertThatCode(() -> testee.delete(CASSANDRA_ID).block()) + .doesNotThrowAnyException(); + } + + @Test void updateApplicableFlagsShouldUnionUserFlags() { testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG)).block(); testee.updateApplicableFlags(CASSANDRA_ID, ImmutableSet.of(USER_FLAG2)).block(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
