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 1df0a9f47a2fc68db2e9f39309f5c26efaa5fdfa
Author: Benoit Tellier <[email protected]>
AuthorDate: Sun Apr 12 20:56:22 2020 +0700

    JAMES-3148 Cleanup MailboxCounters DAO
---
 .../CassandraMailboxSessionMapperFactory.java      |  3 +-
 .../mailbox/cassandra/DeleteMessageListener.java   |  6 +++-
 .../cassandra/mail/CassandraMailboxCounterDAO.java |  8 ++++++
 .../cassandra/CassandraMailboxManagerTest.java     | 33 ++++++++++++++++++++++
 .../mail/CassandraMailboxCounterDAOTest.java       | 17 +++++++++++
 5 files changed, 65 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 ba80ed4..3631d52 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,7 @@ public class CassandraMailboxSessionMapperFactory extends 
MailboxSessionMapperFa
 
     public DeleteMessageListener deleteMessageListener() {
         return new DeleteMessageListener(imapUidDAO, messageIdDAO, messageDAO, 
attachmentDAOV2, ownerDAO,
-            attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, 
applicableFlagDAO, firstUnseenDAO, deletedMessageDAO);
+            attachmentMessageIdDAO, aclMapper, userMailboxRightsDAO, 
applicableFlagDAO, firstUnseenDAO, deletedMessageDAO,
+            mailboxCounterDAO);
     }
 }
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 c0f74d9..ed70a9a 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
@@ -35,6 +35,7 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -71,13 +72,14 @@ public class DeleteMessageListener implements 
MailboxListener.GroupMailboxListen
     private final CassandraApplicableFlagDAO applicableFlagDAO;
     private final CassandraFirstUnseenDAO firstUnseenDAO;
     private final CassandraDeletedMessageDAO deletedMessageDAO;
+    private final CassandraMailboxCounterDAO counterDAO;
 
     @Inject
     public DeleteMessageListener(CassandraMessageIdToImapUidDAO imapUidDAO, 
CassandraMessageIdDAO messageIdDAO, CassandraMessageDAO messageDAO,
                                  CassandraAttachmentDAOV2 attachmentDAO, 
CassandraAttachmentOwnerDAO ownerDAO,
                                  CassandraAttachmentMessageIdDAO 
attachmentMessageIdDAO, CassandraACLMapper aclMapper,
                                  CassandraUserMailboxRightsDAO rightsDAO, 
CassandraApplicableFlagDAO applicableFlagDAO,
-                                 CassandraFirstUnseenDAO firstUnseenDAO, 
CassandraDeletedMessageDAO deletedMessageDAO) {
+                                 CassandraFirstUnseenDAO firstUnseenDAO, 
CassandraDeletedMessageDAO deletedMessageDAO, CassandraMailboxCounterDAO 
counterDAO) {
         this.imapUidDAO = imapUidDAO;
         this.messageIdDAO = messageIdDAO;
         this.messageDAO = messageDAO;
@@ -89,6 +91,7 @@ public class DeleteMessageListener implements 
MailboxListener.GroupMailboxListen
         this.applicableFlagDAO = applicableFlagDAO;
         this.firstUnseenDAO = firstUnseenDAO;
         this.deletedMessageDAO = deletedMessageDAO;
+        this.counterDAO = counterDAO;
     }
 
     @Override
@@ -128,6 +131,7 @@ public class DeleteMessageListener implements 
MailboxListener.GroupMailboxListen
                 .then(applicableFlagDAO.delete(mailboxId))
                 .then(firstUnseenDAO.removeAll(mailboxId))
                 .then(deletedMessageDAO.removeAll(mailboxId))
+                .then(counterDAO.delete(mailboxId))
                 .block();
         }
     }
diff --git 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
index e9fb398..80ae4ba 100644
--- 
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
+++ 
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAO.java
@@ -41,6 +41,7 @@ import com.datastax.driver.core.BoundStatement;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.querybuilder.Assignment;
+import com.datastax.driver.core.querybuilder.QueryBuilder;
 
 import reactor.core.publisher.Mono;
 
@@ -56,6 +57,7 @@ public class CassandraMailboxCounterDAO {
     private final PreparedStatement decrementMessageCountStatement;
     private final PreparedStatement incrementUnseenAndCountStatement;
     private final PreparedStatement decrementUnseenAndCountStatement;
+    private final PreparedStatement deleteStatement;
 
     @Inject
     public CassandraMailboxCounterDAO(Session session) {
@@ -81,6 +83,8 @@ public class CassandraMailboxCounterDAO {
             .with(decr(COUNT))
             .and(decr(UNSEEN))
             .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID))));
+        deleteStatement = 
session.prepare(QueryBuilder.delete().from(TABLE_NAME)
+            .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID))));
     }
 
     private PreparedStatement createReadStatement(Session session) {
@@ -97,6 +101,10 @@ public class CassandraMailboxCounterDAO {
                 .where(eq(MAILBOX_ID, bindMarker(MAILBOX_ID))));
     }
 
+    public Mono<Void> delete(CassandraId mailboxId) {
+        return cassandraAsyncExecutor.executeVoid(bindWithMailbox(mailboxId, 
deleteStatement));
+    }
+
     public Mono<MailboxCounters> retrieveMailboxCounters(CassandraId 
mailboxId) {
         return 
cassandraAsyncExecutor.executeSingleRow(bindWithMailbox(mailboxId, 
readStatement))
             .map(row ->  MailboxCounters.builder()
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 5f78c72..36ca5d8 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
@@ -47,6 +47,7 @@ import 
org.apache.james.mailbox.cassandra.mail.CassandraAttachmentMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentOwnerDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraDeletedMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraFirstUnseenDAO;
+import org.apache.james.mailbox.cassandra.mail.CassandraMailboxCounterDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdDAO;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageIdToImapUidDAO;
@@ -673,6 +674,38 @@ public class CassandraMailboxManagerTest extends 
MailboxManagerTest<CassandraMai
                 .isEmpty();
         }
 
+        @Test
+        void deleteMailboxShouldCleanUpMailboxCounters(CassandraCluster 
cassandraCluster) throws Exception {
+            inboxManager.appendMessage(MessageManager.AppendCommand.builder()
+                
.build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")),
 session);
+
+            mailboxManager.deleteMailbox(inbox, session);
+
+            
assertThat(countersDAO(cassandraCluster).retrieveMailboxCounters((CassandraId) 
inboxId)
+                .blockOptional())
+                .isEmpty();
+        }
+
+        @Test
+        void 
deleteMailboxShouldCleanUpMailboxCountersWhenFailure(CassandraCluster 
cassandraCluster) throws Exception {
+            inboxManager.appendMessage(MessageManager.AppendCommand.builder()
+                
.build(ClassLoaderUtils.getSystemResourceAsByteArray("eml/emailWithOnlyAttachment.eml")),
 session);
+
+            cassandraCluster.getConf().registerScenario(fail()
+                .times(1)
+                .whenQueryStartsWith("DELETE FROM mailboxCounters WHERE 
mailboxId=:mailboxId;"));
+
+            mailboxManager.deleteMailbox(inbox, session);
+
+            
assertThat(countersDAO(cassandraCluster).retrieveMailboxCounters((CassandraId) 
inboxId)
+                .blockOptional())
+                .isEmpty();
+        }
+
+        private CassandraMailboxCounterDAO countersDAO(CassandraCluster 
cassandraCluster) {
+            return new CassandraMailboxCounterDAO(cassandraCluster.getConf());
+        }
+
         private CassandraDeletedMessageDAO deletedMessageDAO(CassandraCluster 
cassandraCluster) {
             return new CassandraDeletedMessageDAO(cassandraCluster.getConf());
         }
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
index 558e58a..e00c0e0 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.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;
@@ -143,6 +144,22 @@ class CassandraMailboxCounterDAOTest {
     }
 
     @Test
+    void retrieveMailboxCounterShouldNotReturnDeletedItems() {
+        testee.incrementCount(MAILBOX_ID).block();
+        testee.incrementUnseen(MAILBOX_ID).block();
+
+        testee.delete(MAILBOX_ID).block();
+
+        assertThat(testee.retrieveMailboxCounters(MAILBOX_ID).blockOptional())
+            .isEmpty();
+    }
+
+    @Test
+    void deleteShouldNotThrowWhenNoData() {
+        assertThatCode(() -> 
testee.delete(MAILBOX_ID).block()).doesNotThrowAnyException();
+    }
+
+    @Test
     void decrementCountShouldRemoveOne() {
         testee.incrementCount(MAILBOX_ID).block();
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to