You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/05/07 02:12:39 UTC
[james-project] 15/22: JAMES-3148 Cleanup First Unseen DAO
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 05bd2f6a8620d64114ab3a0f4518c266c6fd6053
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Apr 12 20:36:49 2020 +0700
JAMES-3148 Cleanup First Unseen DAO
---
.../CassandraMailboxSessionMapperFactory.java | 2 +-
.../mailbox/cassandra/DeleteMessageListener.java | 8 +++++-
.../cassandra/mail/CassandraFirstUnseenDAO.java | 13 +++++++++
.../cassandra/CassandraMailboxManagerTest.java | 33 ++++++++++++++++++++++
.../mail/CassandraFirstUnseenDAOTest.java | 27 ++++++++++++++++++
5 files changed, 81 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 62ccb3a..13a6d95 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
@@ -205,6 +205,6 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
public DeleteMessageListener deleteMessageListener() {
return new DeleteMessageListener(imapUidDAO, messageIdDAO, messageDAO, attachmentDAOV2, ownerDAO,
- attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, applicableFlagDAO);
+ attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, applicableFlagDAO, firstUnseenDAO);
}
}
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 c4de8cc..7c24b4e 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
@@ -33,6 +33,7 @@ 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;
+import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -67,11 +68,14 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen
private final CassandraACLMapper aclMapper;
private final CassandraUserMailboxRightsDAO rightsDAO;
private final CassandraApplicableFlagDAO applicableFlagDAO;
+ private final CassandraFirstUnseenDAO firstUnseenDAO;
@Inject
public DeleteMessageListener(CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMessageIdDAO messageIdDAO, CassandraMessageDAO messageDAO,
CassandraAttachmentDAOV2 attachmentDAO, CassandraAttachmentOwnerDAO ownerDAO,
- CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, CassandraACLMapper aclMapper, CassandraUserMailboxRightsDAO rightsDAO, CassandraApplicableFlagDAO applicableFlagDAO) {
+ CassandraAttachmentMessageIdDAO attachmentMessageIdDAO, CassandraACLMapper aclMapper,
+ CassandraUserMailboxRightsDAO rightsDAO, CassandraApplicableFlagDAO applicableFlagDAO,
+ CassandraFirstUnseenDAO firstUnseenDAO) {
this.imapUidDAO = imapUidDAO;
this.messageIdDAO = messageIdDAO;
this.messageDAO = messageDAO;
@@ -81,6 +85,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen
this.aclMapper = aclMapper;
this.rightsDAO = rightsDAO;
this.applicableFlagDAO = applicableFlagDAO;
+ this.firstUnseenDAO = firstUnseenDAO;
}
@Override
@@ -118,6 +123,7 @@ public class DeleteMessageListener implements MailboxListener.GroupMailboxListen
.then(messageIdDAO.delete(mailboxId, metadata.getUid())))
.then(deleteAcl(mailboxId))
.then(applicableFlagDAO.delete(mailboxId))
+ .then(firstUnseenDAO.removeAll(mailboxId))
.block();
}
}
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
index 94fc03b..d3fffc2 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAO.java
@@ -44,6 +44,7 @@ public class CassandraFirstUnseenDAO {
private final CassandraAsyncExecutor cassandraAsyncExecutor;
private final PreparedStatement addStatement;
private final PreparedStatement deleteStatement;
+ private final PreparedStatement deleteAllStatement;
private final PreparedStatement readStatement;
@Inject
@@ -51,6 +52,7 @@ public class CassandraFirstUnseenDAO {
this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
this.addStatement = prepareAddStatement(session);
this.deleteStatement = prepareDeleteStatement(session);
+ this.deleteAllStatement = prepareDeleteAllStatement(session);
this.readStatement = prepareReadStatement(session);
}
@@ -69,6 +71,12 @@ public class CassandraFirstUnseenDAO {
.and(eq(UID, bindMarker(UID))));
}
+ private PreparedStatement prepareDeleteAllStatement(Session session) {
+ return session.prepare(delete()
+ .from(TABLE_NAME)
+ .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID))));
+ }
+
private PreparedStatement prepareAddStatement(Session session) {
return session.prepare(insertInto(TABLE_NAME)
.value(MAILBOX_ID, bindMarker(MAILBOX_ID))
@@ -88,6 +96,11 @@ public class CassandraFirstUnseenDAO {
.setLong(UID, uid.asLong()));
}
+ public Mono<Void> removeAll(CassandraId cassandraId) {
+ return cassandraAsyncExecutor.executeVoid(deleteAllStatement.bind()
+ .setUUID(MAILBOX_ID, cassandraId.asUuid()));
+ }
+
public Mono<MessageUid> retrieveFirstUnread(CassandraId cassandraId) {
return cassandraAsyncExecutor.executeSingleRow(
readStatement.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 de77b65..56d9221 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
@@ -45,6 +45,7 @@ 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;
+import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -613,6 +614,38 @@ public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMai
.isEmpty();
}
+ @Test
+ void deleteMailboxShouldCleanUpFirstUnseenWhenFail(CassandraCluster cassandraCluster) throws Exception {
+ inboxManager.appendMessage(MessageManager.AppendCommand.builder()
+ .withFlags(new Flags())
+ .build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")), session);
+
+ mailboxManager.deleteMailbox(inbox, session);
+
+ assertThat(firstUnseenDAO(cassandraCluster).retrieveFirstUnread((CassandraId) inboxId).blockOptional())
+ .isEmpty();
+ }
+
+ @Test
+ void deleteMailboxShouldCleanUpFirstUnseen(CassandraCluster cassandraCluster) throws Exception {
+ inboxManager.appendMessage(MessageManager.AppendCommand.builder()
+ .withFlags(new Flags())
+ .build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")), session);
+
+ cassandraCluster.getConf().registerScenario(fail()
+ .times(1)
+ .whenQueryStartsWith("DELETE FROM firstUnseen WHERE mailboxId=:mailboxId;"));
+
+ mailboxManager.deleteMailbox(inbox, session);
+
+ assertThat(firstUnseenDAO(cassandraCluster).retrieveFirstUnread((CassandraId) inboxId).blockOptional())
+ .isEmpty();
+ }
+
+ private CassandraFirstUnseenDAO firstUnseenDAO(CassandraCluster cassandraCluster) {
+ return new CassandraFirstUnseenDAO(cassandraCluster.getConf());
+ }
+
private CassandraApplicableFlagDAO applicableFlagDAO(CassandraCluster cassandraCluster) {
return new CassandraApplicableFlagDAO(cassandraCluster.getConf());
}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
index 882ed3c..f9f54aa 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.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 org.apache.james.backends.cassandra.CassandraCluster;
import org.apache.james.backends.cassandra.CassandraClusterExtension;
@@ -60,6 +61,32 @@ class CassandraFirstUnseenDAOTest {
}
@Test
+ void addUnreadShouldNotReturnRemovedEntries() {
+ testee.addUnread(MAILBOX_ID, UID_1).block();
+
+ testee.removeAll(MAILBOX_ID).block();
+
+ assertThat(testee.retrieveFirstUnread(MAILBOX_ID).blockOptional())
+ .isEmpty();
+ }
+
+ @Test
+ void removeAllShouldDeleteAllUidEntries() {
+ testee.addUnread(MAILBOX_ID, UID_1).block();
+ testee.addUnread(MAILBOX_ID, UID_2).block();
+
+ testee.removeAll(MAILBOX_ID).block();
+
+ assertThat(testee.retrieveFirstUnread(MAILBOX_ID).blockOptional())
+ .isEmpty();
+ }
+
+ @Test
+ void removeAllShouldNotThrowWhenAbsent() {
+ assertThatCode(() -> testee.removeAll(MAILBOX_ID).block()).doesNotThrowAnyException();
+ }
+
+ @Test
void retrieveFirstUnreadShouldReturnLowestUnreadUid() {
testee.addUnread(MAILBOX_ID, UID_1).block();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org