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 <btell...@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-unsubscr...@james.apache.org
For additional commands, e-mail: notifications-h...@james.apache.org

Reply via email to