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