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 223c9159487d6a0a8d12172d28de5496ddd042ef Author: Benoit Tellier <[email protected]> AuthorDate: Tue Jun 29 09:32:25 2021 +0700 JAMES-3171 Mailbox/get by ids was doing some nested .block() calls --- .../java/org/apache/james/mailbox/MessageManager.java | 2 ++ .../apache/james/mailbox/store/StoreMessageManager.java | 13 +++++++++++++ .../org/apache/james/jmap/draft/model/MailboxFactory.java | 7 +++---- .../scala/org/apache/james/jmap/mail/MailboxFactory.scala | 15 +++++++++++---- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java index e214865..70cc309 100644 --- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java +++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java @@ -85,6 +85,8 @@ public interface MessageManager { */ MailboxCounters getMailboxCounters(MailboxSession mailboxSession) throws MailboxException; + Publisher<MailboxCounters> getMailboxCountersReactive(MailboxSession mailboxSession); + /** * Return if the Mailbox is writable * @deprecated use diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java index 4487e8d..f22323d 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java @@ -227,6 +227,19 @@ public class StoreMessageManager implements MessageManager { .build(); } + + @Override + public Publisher<MailboxCounters> getMailboxCountersReactive(MailboxSession mailboxSession) { + if (storeRightManager.hasRight(mailbox, MailboxACL.Right.Read, mailboxSession)) { + return mapperFactory.createMessageMapper(mailboxSession).getMailboxCountersReactive(mailbox); + } + return Mono.just(MailboxCounters.builder() + .mailboxId(mailbox.getMailboxId()) + .count(0) + .unseen(0) + .build()); + } + /** * Returns the flags which are shared for the current mailbox, i.e. the * flags set up so that changes to those flags are visible to another user. diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MailboxFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MailboxFactory.java index 7f3f723..8b0ba9c 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MailboxFactory.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MailboxFactory.java @@ -50,7 +50,6 @@ import com.google.common.base.Splitter; import com.google.common.primitives.Booleans; import reactor.core.publisher.Mono; -import reactor.core.scheduler.Schedulers; public class MailboxFactory { private static class MailboxTuple { @@ -59,9 +58,9 @@ public class MailboxFactory { } public static Mono<MailboxTuple> from(MessageManager messageManager, MailboxSession session) { - return Mono.fromCallable(() -> - new MailboxTuple(messageManager.getMailboxPath(), messageManager.getMailboxCounters(session).sanitize(), messageManager.getResolvedAcl(session))) - .subscribeOn(Schedulers.elastic()); + return Mono.from(messageManager.getMailboxCountersReactive(session)) + .map(MailboxCounters::sanitize) + .map(Throwing.function(counters -> new MailboxTuple(messageManager.getMailboxPath(), counters, messageManager.getResolvedAcl(session)))); } private final MailboxPath mailboxPath; diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala index d4271cd..b235082 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/MailboxFactory.scala @@ -160,11 +160,18 @@ class MailboxFactory @Inject() (mailboxManager: MailboxManager) { } } - def create(id: MailboxId, mailboxSession: MailboxSession, quotaLoader: QuotaLoader, subscriptions: Subscriptions): SMono[Mailbox] = { - try { - val messageManager: MessageManager = mailboxManager.getMailbox(id, mailboxSession) - val sanitizedCounters: MailboxCounters = messageManager.getMailboxCounters(mailboxSession).sanitize() + def create(id: MailboxId, mailboxSession: MailboxSession, quotaLoader: QuotaLoader, subscriptions: Subscriptions): SMono[Mailbox] = + for { + messageManager <- SMono(mailboxManager.getMailboxReactive(id, mailboxSession)) + counters <- SMono(messageManager.getMailboxCountersReactive(mailboxSession)) + sanitizedCounters = counters.sanitize() + mailbox <- instanciateMailbox(id, mailboxSession, quotaLoader, messageManager, sanitizedCounters, subscriptions) + } yield { + mailbox + } + private def instanciateMailbox(id: MailboxId, mailboxSession: MailboxSession, quotaLoader: QuotaLoader, messageManager: MessageManager, sanitizedCounters: MailboxCounters, subscriptions: Subscriptions): SMono[Mailbox] = { + try { MailboxValidation.validate(messageManager.getMailboxPath, mailboxSession.getPathDelimiter, sanitizedCounters.getUnseen, sanitizedCounters.getUnseen, sanitizedCounters.getCount, sanitizedCounters.getCount) match { case Left(error) => SMono.error(error) case scala.Right(mailboxValidation) => --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
