You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/05/28 01:16:16 UTC

[james-project] 01/07: [PERFORMANCE] Further reactify PostDequeueDecorator

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 823b8728420396edcffcad70611ce6ff52936098
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun May 23 10:15:08 2021 +0700

    [PERFORMANCE] Further reactify PostDequeueDecorator
    
    This allows a single .block call.
---
 .../jmap/draft/send/PostDequeueDecorator.java      | 55 +++++++++++-----------
 .../exception/MailShouldBeInOutboxException.java   |  2 +-
 2 files changed, 29 insertions(+), 28 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
index 0d11502..6a222c3 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.james.jmap.draft.send;
 
-import java.util.List;
 import java.util.Optional;
 
 import javax.mail.Flags;
@@ -32,13 +31,10 @@ import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.Role;
 import org.apache.james.mailbox.SystemMailboxesProvider;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.exception.MailboxRoleNotFoundException;
 import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageId.Factory;
-import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.queue.api.MailQueue.MailQueueException;
 import org.apache.james.queue.api.MailQueue.MailQueueItem;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory.MailQueueItemDecorator;
@@ -50,6 +46,9 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.ImmutableList;
 
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
 public class PostDequeueDecorator extends MailQueueItemDecorator {
     private static final Logger LOG = LoggerFactory.getLogger(PostDequeueDecorator.class);
     private static final Attribute IS_DELIVERED = Attribute.convertToAttribute("DELIVERED", "DELIVERED");
@@ -90,8 +89,6 @@ public class PostDequeueDecorator extends MailQueueItemDecorator {
                     getMail().setAttribute(IS_DELIVERED);
                 } catch (MailShouldBeInOutboxException e) {
                     LOG.info("Message does not exist on Outbox anymore, it could have already been sent", e);
-                } catch (MailboxException e) {
-                    throw new MailQueueException(e.getMessage(), e);
                 }
             }
         }
@@ -134,32 +131,36 @@ public class PostDequeueDecorator extends MailQueueItemDecorator {
         return retrieveUsername().isPresent();
     }
 
-    private void moveFromOutboxToSentWithSeenFlag(MessageId messageId, MailboxSession mailboxSession) throws MailQueueException, MailboxException {
-        assertMessageBelongsToOutbox(messageId, mailboxSession);
-        MailboxId sentMailboxId = getSentMailboxId(mailboxSession);
-        messageIdManager.setInMailboxes(messageId, ImmutableList.of(sentMailboxId), mailboxSession);
-        messageIdManager.setFlags(new Flags(Flag.SEEN), MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(sentMailboxId), mailboxSession);
+    private void moveFromOutboxToSentWithSeenFlag(MessageId messageId, MailboxSession mailboxSession) {
+        assertMessageBelongsToOutbox(messageId, mailboxSession)
+            .then(getSentMailboxId(mailboxSession)
+                .flatMap(sentMailboxId ->
+                        Mono.from(messageIdManager.setInMailboxesReactive(messageId,
+                            ImmutableList.of(sentMailboxId), mailboxSession))
+                        .then(Mono.from(messageIdManager.setFlagsReactive(new Flags(Flag.SEEN),
+                            MessageManager.FlagsUpdateMode.ADD,
+                            messageId, ImmutableList.of(sentMailboxId), mailboxSession)))))
+            .block();
     }
 
-    private void assertMessageBelongsToOutbox(MessageId messageId, MailboxSession mailboxSession) throws MailboxException, MailShouldBeInOutboxException {
-        MailboxId outboxMailboxId = getOutboxMailboxId(mailboxSession);
-        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, mailboxSession);
-        for (MessageResult message: messages) {
-            if (message.getMailboxId().equals(outboxMailboxId)) {
-                return;
-            }
-        }
-        throw new MailShouldBeInOutboxException(messageId);
+    private Mono<Void> assertMessageBelongsToOutbox(MessageId messageId, MailboxSession mailboxSession) {
+        return getOutboxMailboxId(mailboxSession)
+            .flatMap(outboxMailboxId -> Flux.from(messageIdManager.getMessagesReactive(ImmutableList.of(messageId), FetchGroup.MINIMAL, mailboxSession))
+                .filter(message -> message.getMailboxId().equals(outboxMailboxId))
+                .next()
+                .switchIfEmpty(Mono.error(() -> new MailShouldBeInOutboxException(messageId))))
+            .then();
     }
 
-    private MailboxId getSentMailboxId(MailboxSession session) throws MailboxRoleNotFoundException, MailboxException {
-        return systemMailboxesProvider.findMailbox(Role.SENT, session.getUser())
-            .getId();
+    private Mono<MailboxId> getSentMailboxId(MailboxSession session) {
+        return Flux.from(systemMailboxesProvider.getMailboxByRole(Role.SENT, session.getUser()))
+            .next()
+            .map(MessageManager::getId);
     }
     
-    private MailboxId getOutboxMailboxId(MailboxSession session) throws MailboxRoleNotFoundException, MailboxException {
-        return systemMailboxesProvider.findMailbox(Role.OUTBOX, session.getUser())
-            .getId();
+    private Mono<MailboxId> getOutboxMailboxId(MailboxSession session) {
+        return Flux.from(systemMailboxesProvider.getMailboxByRole(Role.OUTBOX, session.getUser()))
+            .next()
+            .map(MessageManager::getId);
     }
-    
 }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/exception/MailShouldBeInOutboxException.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/exception/MailShouldBeInOutboxException.java
index 54f383a..f831bed 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/exception/MailShouldBeInOutboxException.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/exception/MailShouldBeInOutboxException.java
@@ -21,7 +21,7 @@ package org.apache.james.jmap.draft.send.exception;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.queue.api.MailQueue.MailQueueException;
 
-public class MailShouldBeInOutboxException extends MailQueueException {
+public class MailShouldBeInOutboxException extends RuntimeException {
 
     public MailShouldBeInOutboxException(MessageId messageId) {
         super("Message with Id " + messageId + " can't be found in outbox");

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