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/06/30 10:52:59 UTC

[james-project] 06/07: JAMES-3277 Rework MessageIdMapper APIs

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 0f5e381fac65f91e45559c25c8259d697be49239
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Jun 26 10:29:50 2020 +0700

    JAMES-3277 Rework MessageIdMapper APIs
    
     - Reactify delete (easy win)
     - Copy in mailboxes should take as an argument the target mailbox so that we don't need to ensure it exists
---
 .../cassandra/mail/CassandraMessageIdMapper.java   | 17 +++++++-------
 .../inmemory/mail/InMemoryMessageIdMapper.java     |  4 ++--
 .../james/mailbox/store/mail/MessageIdMapper.java  |  8 ++++++-
 .../store/mail/model/MessageIdMapperTest.java      | 26 +++++-----------------
 4 files changed, 23 insertions(+), 32 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
index 2777ec4..b0293d1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
+import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -140,11 +141,10 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
     }
 
     @Override
-    public void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxException {
-        CassandraId mailboxId = (CassandraId) mailboxMessage.getMailboxId();
-        MailboxReactorUtils.block(mailboxMapper.findMailboxById(mailboxId)
-            .switchIfEmpty(Mono.error(() -> new MailboxNotFoundException(mailboxId)))
-            .then(saveMessageMetadata(mailboxMessage, mailboxId)));
+    public void copyInMailbox(MailboxMessage mailboxMessage, Mailbox mailbox) throws MailboxException {
+        CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
+
+        MailboxReactorUtils.block(saveMessageMetadata(mailboxMessage, mailboxId));
     }
 
     private Mono<Void> saveMessageMetadata(MailboxMessage mailboxMessage, CassandraId mailboxId) {
@@ -172,10 +172,11 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
 
     @Override
     public void delete(MessageId messageId, Collection<MailboxId> mailboxIds) {
-        deleteAsMono(messageId, mailboxIds).block();
+        deleteReactive(messageId, mailboxIds).block();
     }
 
-    public Mono<Void> deleteAsMono(MessageId messageId, Collection<MailboxId> mailboxIds) {
+    @Override
+    public Mono<Void> deleteReactive(MessageId messageId, Collection<MailboxId> mailboxIds) {
         CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId;
         return Flux.fromStream(mailboxIds.stream())
             .flatMap(mailboxId -> retrieveAndDeleteIndices(cassandraMessageId, Optional.of((CassandraId) mailboxId)))
@@ -187,7 +188,7 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
         Flux.fromIterable(ids.asMap()
             .entrySet())
             .publishOn(Schedulers.elastic())
-            .flatMap(entry -> deleteAsMono(entry.getKey(), entry.getValue()), cassandraConfiguration.getExpungeChunkSize())
+            .flatMap(entry -> deleteReactive(entry.getKey(), entry.getValue()), cassandraConfiguration.getExpungeChunkSize())
             .then()
             .block();
     }
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
index 2fe2bee..c16968b 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapper.java
@@ -87,8 +87,8 @@ public class InMemoryMessageIdMapper implements MessageIdMapper {
     }
 
     @Override
-    public void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxException {
-        boolean isAlreadyInMailbox = findMailboxes(mailboxMessage.getMessageId()).contains(mailboxMessage.getMailboxId());
+    public void copyInMailbox(MailboxMessage mailboxMessage, Mailbox mailbox) throws MailboxException {
+        boolean isAlreadyInMailbox = findMailboxes(mailboxMessage.getMessageId()).contains(mailbox.getMailboxId());
         if (!isAlreadyInMailbox) {
             save(mailboxMessage);
         }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
index eeecd30..6e422e2 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageIdMapper.java
@@ -26,6 +26,7 @@ import javax.mail.Flags;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -35,6 +36,7 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import com.google.common.collect.Multimap;
 
 import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
 
 public interface MessageIdMapper {
 
@@ -48,12 +50,16 @@ public interface MessageIdMapper {
 
     void save(MailboxMessage mailboxMessage) throws MailboxNotFoundException, MailboxException;
 
-    void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxNotFoundException, MailboxException;
+    void copyInMailbox(MailboxMessage mailboxMessage, Mailbox mailbox) throws MailboxException;
 
     void delete(MessageId messageId);
 
     void delete(MessageId messageId, Collection<MailboxId> mailboxIds);
 
+    default Mono<Void> deleteReactive(MessageId messageId, Collection<MailboxId> mailboxIds) {
+        return Mono.fromRunnable(() -> delete(messageId, mailboxIds));
+    }
+
     default void delete(Multimap<MessageId, MailboxId> ids) {
         ids.asMap()
             .forEach(this::delete);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index 944301b..3abb0c9 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -202,22 +202,6 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    void copyInMailboxShouldThrowWhenMailboxDoesntExist() throws Exception {
-        message1.setUid(mapperProvider.generateMessageUid());
-        message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
-        sut.save(message1);
-
-        Mailbox notPersistedMailbox = new Mailbox(MailboxPath.forUser(BENWA, "mybox"), UID_VALIDITY, mapperProvider.generateId());
-
-        SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(notPersistedMailbox.getMailboxId(), message1);
-        message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
-        message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
-
-        assertThatThrownBy(() -> sut.copyInMailbox(message1InOtherMailbox))
-            .isInstanceOf(MailboxNotFoundException.class);
-    }
-
-    @Test
     void copyInMailboxShouldSaveMessageInAnotherMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
@@ -226,7 +210,7 @@ public abstract class MessageIdMapperTest {
         SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
         message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
         message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
-        sut.copyInMailbox(message1InOtherMailbox);
+        sut.copyInMailbox(message1InOtherMailbox, benwaWorkMailbox);
 
         List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
         assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), benwaWorkMailbox.getMailboxId());
@@ -241,8 +225,8 @@ public abstract class MessageIdMapperTest {
         copiedMessage.setUid(mapperProvider.generateMessageUid());
         copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
 
-        sut.copyInMailbox(copiedMessage);
-        sut.copyInMailbox(copiedMessage);
+        sut.copyInMailbox(copiedMessage, benwaWorkMailbox);
+        sut.copyInMailbox(copiedMessage, benwaWorkMailbox);
 
         List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
         assertThat(mailboxes)
@@ -894,7 +878,7 @@ public abstract class MessageIdMapperTest {
         SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
         copiedMessage.setUid(mapperProvider.generateMessageUid());
         copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
-        sut.copyInMailbox(copiedMessage);
+        sut.copyInMailbox(copiedMessage, benwaWorkMailbox);
 
         sut.delete(
             ImmutableMultimap.<MessageId, MailboxId>builder()
@@ -919,7 +903,7 @@ public abstract class MessageIdMapperTest {
         SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
         copiedMessage.setUid(mapperProvider.generateMessageUid());
         copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
-        sut.copyInMailbox(copiedMessage);
+        sut.copyInMailbox(copiedMessage, benwaWorkMailbox);
 
         sut.delete(
             ImmutableMultimap.<MessageId, MailboxId>builder()


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