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 <[email protected]> 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("[email protected]") + .addToRecipient("[email protected]") + .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("[email protected]") 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: [email protected] For additional commands, e-mail: [email protected]
