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 rc...@apache.org on 2020/07/28 03:20:51 UTC

[james-project] 23/25: JAMES-3319 MimeMessageStore should support deletion

This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 110947ca0e66a2a03eb4d6899f4dcd3569b80bd5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Jul 24 13:38:02 2020 +0700

    JAMES-3319 MimeMessageStore should support deletion
---
 .../main/java/org/apache/james/blob/api/Store.java |  9 +++++++
 .../james/blob/mail/MimeMessageStoreTest.java      | 30 ++++++++++++++++++++++
 .../cassandra/CassandraMailRepository.java         | 22 ++++++++--------
 .../cassandra/CassandraMailRepositoryTest.java     |  4 +--
 ...aMailRepositoryWithFakeImplementationsTest.java |  2 +-
 5 files changed, 52 insertions(+), 15 deletions(-)

diff --git a/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java b/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java
index 0c51da6..8deba51 100644
--- a/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java
+++ b/server/blob/blob-common/src/main/java/org/apache/james/blob/api/Store.java
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.stream.Stream;
 
 import org.apache.commons.lang3.tuple.Pair;
+import org.reactivestreams.Publisher;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -35,6 +36,8 @@ public interface Store<T, I> {
 
     Mono<T> read(I blobIds);
 
+    Publisher<Void> delete(I blobIds);
+
     class Impl<T, I extends BlobPartsId> implements Store<T, I> {
 
         public interface ValueToSave {
@@ -101,5 +104,11 @@ public interface Store<T, I> {
                 .map(Collection::stream)
                 .map(decoder::decode);
         }
+
+        @Override
+        public Publisher<Void> delete(I blobIds) {
+            return Flux.fromIterable(blobIds.asMap().values())
+                .flatMap(id -> blobStore.delete(blobStore.getDefaultBucketName(), id));
+        }
     }
 }
diff --git a/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java b/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java
index bb24ab5..39e278e 100644
--- a/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java
+++ b/server/blob/mail-store/src/test/java/org/apache/james/blob/mail/MimeMessageStoreTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.blob.mail;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.nio.charset.StandardCharsets;
@@ -29,6 +30,7 @@ import javax.mail.internet.MimeMessage;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.HashBlobId;
+import org.apache.james.blob.api.ObjectNotFoundException;
 import org.apache.james.blob.api.Store;
 import org.apache.james.blob.memory.MemoryBlobStoreFactory;
 import org.apache.james.core.builder.MimeMessageBuilder;
@@ -84,6 +86,34 @@ class MimeMessageStoreTest {
     }
 
     @Test
+    void readShouldNotReturnDeletedMessage() throws Exception {
+        MimeMessage message = MimeMessageBuilder.mimeMessageBuilder()
+            .addFrom("any@any.com")
+            .addToRecipient("toddy@any.com")
+            .setSubject("Important Mail")
+            .setText("Important mail content")
+            .build();
+
+        MimeMessagePartsId parts = testee.save(message).block();
+
+        Mono.from(testee.delete(parts)).block();
+
+        assertThatThrownBy(() -> testee.read(parts).block())
+            .isInstanceOf(ObjectNotFoundException.class);
+    }
+
+    @Test
+    void deleteShouldNotThrowWhenCalledOnNonExistingData() throws Exception {
+        MimeMessagePartsId parts = MimeMessagePartsId.builder()
+            .headerBlobId(BLOB_ID_FACTORY.randomId())
+            .bodyBlobId(BLOB_ID_FACTORY.randomId())
+            .build();
+
+        assertThatCode(() -> Mono.from(testee.delete(parts)).block())
+            .doesNotThrowAnyException();
+    }
+
+    @Test
     void mailStoreShouldPreserveMailWithoutBody() throws Exception {
         MimeMessage message = MimeMessageBuilder.mimeMessageBuilder()
             .addFrom("any@any.com")
diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
index a0b1805..4024c7f 100644
--- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
+++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java
@@ -29,7 +29,6 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.Store;
 import org.apache.james.blob.mail.MimeMessagePartsId;
 import org.apache.james.blob.mail.MimeMessageStore;
@@ -48,18 +47,16 @@ public class CassandraMailRepository implements MailRepository {
     private final CassandraMailRepositoryCountDAO countDAO;
     private final CassandraMailRepositoryMailDaoAPI mailDAO;
     private final Store<MimeMessage, MimeMessagePartsId> mimeMessageStore;
-    private final BlobStore blobStore;
 
     @Inject
     CassandraMailRepository(MailRepositoryUrl url, CassandraMailRepositoryKeysDAO keysDAO,
                             CassandraMailRepositoryCountDAO countDAO, CassandraMailRepositoryMailDaoAPI mailDAO,
-                            MimeMessageStore.Factory mimeMessageStoreFactory, BlobStore blobStore) {
+                            MimeMessageStore.Factory mimeMessageStoreFactory) {
         this.url = url;
         this.keysDAO = keysDAO;
         this.countDAO = countDAO;
         this.mailDAO = mailDAO;
         this.mimeMessageStore = mimeMessageStoreFactory.mimeMessageStore();
-        this.blobStore = blobStore;
     }
 
     @Override
@@ -100,10 +97,7 @@ public class CassandraMailRepository implements MailRepository {
     }
 
     private Mono<Mail> toMail(MailDTO mailDTO) {
-        MimeMessagePartsId parts = MimeMessagePartsId.builder()
-            .headerBlobId(mailDTO.getHeaderBlobId())
-            .bodyBlobId(mailDTO.getBodyBlobId())
-            .build();
+        MimeMessagePartsId parts = blobIds(mailDTO);
 
         return mimeMessageStore.read(parts)
             .map(mimeMessage -> mailDTO.getMailBuilder()
@@ -111,6 +105,13 @@ public class CassandraMailRepository implements MailRepository {
                 .build());
     }
 
+    private MimeMessagePartsId blobIds(MailDTO mailDTO) {
+        return MimeMessagePartsId.builder()
+                .headerBlobId(mailDTO.getHeaderBlobId())
+                .bodyBlobId(mailDTO.getBodyBlobId())
+                .build();
+    }
+
     @Override
     public void remove(Mail mail) {
         removeAsync(MailKey.forMail(mail)).block();
@@ -141,10 +142,7 @@ public class CassandraMailRepository implements MailRepository {
 
     private Mono<Void> deleteBlobs(Optional<MailDTO> maybeMailDTO) {
         return Mono.justOrEmpty(maybeMailDTO)
-            .flatMap(mailDTO -> Flux.merge(
-                    blobStore.delete(blobStore.getDefaultBucketName(), mailDTO.getHeaderBlobId()),
-                    blobStore.delete(blobStore.getDefaultBucketName(), mailDTO.getBodyBlobId()))
-                .then());
+            .flatMap(mailDTO -> Mono.from(mimeMessageStore.delete(blobIds(mailDTO))));
     }
 
     private Mono<Void> decreaseSizeIfDeleted(Boolean isDeleted) {
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
index 009b9a7..3545bdb 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
@@ -70,7 +70,7 @@ class CassandraMailRepositoryTest {
                 .passthrough();
 
             cassandraMailRepository = new CassandraMailRepository(URL,
-                keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore), blobStore);
+                keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore));
         }
 
         @Override
@@ -110,7 +110,7 @@ class CassandraMailRepositoryTest {
                 .deduplication();
 
             cassandraMailRepository = new CassandraMailRepository(URL,
-                keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore), blobStore);
+                keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore));
         }
 
         @Override
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
index 8bc6d06..a420ac5 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
@@ -70,7 +70,7 @@ class CassandraMailRepositoryWithFakeImplementationsTest {
             .passthrough();
 
         cassandraMailRepository = new CassandraMailRepository(URL,
-            keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore), blobStore);
+            keysDAO, countDAO, mailDAO, MimeMessageStore.factory(blobStore));
     }
 
     @Nested


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org