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 aa380531071d6b6149ad06af625b41886f5c2e35
Author: Benoit Tellier <btell...@linagora.com>
AuthorDate: Sun Mar 22 17:46:02 2020 +0700

    JAMES-3087 Reactify MailboxManager::mailboxExist
    
    The happy path scenario of DefaultMailboxesReactiveProvisioner is then
    fully reactive.
---
 .../org/apache/james/mailbox/MailboxManager.java   |  7 ++--
 .../apache/james/mailbox/MailboxManagerTest.java   | 38 +++++++++++-----------
 .../james/mailbox/store/StoreMailboxManager.java   | 15 +++++----
 .../imap/processor/AbstractAuthProcessor.java      |  4 ++-
 .../processor/AbstractMessageRangeProcessor.java   |  4 ++-
 .../james/imap/processor/RenameProcessor.java      |  4 ++-
 .../james/imap/processor/CopyProcessorTest.java    |  8 +++--
 .../james/imap/processor/MoveProcessorTest.java    |  8 +++--
 .../mailets/delivery/MailboxAppender.java          |  4 ++-
 .../mailets/delivery/LocalDeliveryTest.java        |  3 ++
 .../mailets/delivery/ToRecipientFolderTest.java    |  3 ++
 .../http/DefaultMailboxesReactiveProvisioner.java  | 37 ++++++++++-----------
 ...aultMailboxesReactiveProvisionerThreadTest.java |  4 ++-
 .../hook/MailboxDeliverToRecipientHandler.java     |  4 ++-
 .../james/pop3server/core/PassCmdHandler.java      |  4 ++-
 .../apache/james/pop3server/POP3ServerTest.java    | 10 +++---
 .../webadmin/service/UserMailboxesService.java     |  7 ++--
 .../webadmin/routes/UserMailboxesRoutesTest.java   |  6 ++--
 18 files changed, 100 insertions(+), 70 deletions(-)

diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index 782aeb1..6b83d9f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.reactivestreams.Publisher;
 
 /**
  * <p>
@@ -259,10 +260,10 @@ public interface MailboxManager extends RequestAware, 
RightManager, MailboxAnnot
      *            not null
      * @param session
      *            the context for this call, not null
-     * @return true when the mailbox exists and is accessible for the given
+     * @return A publisher holding true when the mailbox exists and is 
accessible for the given
      *            user, false otherwise
      */
-    boolean mailboxExists(MailboxPath mailboxPath, MailboxSession session) 
throws MailboxException;
+    Publisher<Boolean> mailboxExists(MailboxPath mailboxPath, MailboxSession 
session) throws MailboxException;
 
     /**
      * Does the user INBOX exist?
@@ -272,7 +273,7 @@ public interface MailboxManager extends RequestAware, 
RightManager, MailboxAnnot
      * @return true when the INBOX exists and is accessible for the given
      *            user, false otherwise
      */
-    default boolean hasInbox(MailboxSession session) throws MailboxException {
+    default Publisher<Boolean> hasInbox(MailboxSession session) throws 
MailboxException {
         return mailboxExists(MailboxPath.inbox(session), session);
     }
 
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java 
b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index 04f7918..5397ed9 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -182,7 +182,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             session = mailboxManager.createSystemSession(USER_1);
             mailboxManager.startProcessingRequest(session);
 
-            assertThat(mailboxManager.hasInbox(session)).isFalse();
+            
assertThat(Mono.from(mailboxManager.hasInbox(session)).block()).isFalse();
         }
 
         @Test
@@ -194,7 +194,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             Optional<MailboxId> mailboxId = 
mailboxManager.createMailbox(mailboxPath, session);
             MessageManager retrievedMailbox = 
mailboxManager.getMailbox(mailboxPath, session);
 
-            assertThat(mailboxManager.hasInbox(session)).isTrue();
+            
assertThat(Mono.from(mailboxManager.hasInbox(session)).block()).isTrue();
             assertThat(mailboxId.get()).isEqualTo(retrievedMailbox.getId());
         }
 
@@ -206,7 +206,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             Optional<MailboxId> mailboxId = 
mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "iNbOx"), session);
             MessageManager retrievedMailbox = 
mailboxManager.getMailbox(MailboxPath.inbox(session), session);
 
-            assertThat(mailboxManager.hasInbox(session)).isTrue();
+            
assertThat(Mono.from(mailboxManager.hasInbox(session)).block()).isTrue();
             assertThat(mailboxId.get()).isEqualTo(retrievedMailbox.getId());
         }
 
@@ -242,7 +242,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             Optional<MailboxId> mailboxId = 
mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "iNbOx.submailbox"), 
session);
             MessageManager retrievedMailbox = 
mailboxManager.getMailbox(MailboxPath.inbox(session), session);
 
-            assertThat(mailboxManager.hasInbox(session)).isTrue();
+            
assertThat(Mono.from(mailboxManager.hasInbox(session)).block()).isTrue();
         }
 
         @Test
@@ -254,7 +254,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             Optional<MailboxId> mailboxId = 
mailboxManager.createMailbox(childPath, session);
             MessageManager retrievedMailbox = 
mailboxManager.getMailbox(childPath, session);
 
-            assertThat(mailboxManager.hasInbox(session)).isTrue();
+            
assertThat(Mono.from(mailboxManager.hasInbox(session)).block()).isTrue();
             assertThat(mailboxId.get()).isEqualTo(retrievedMailbox.getId());
         }
     }
@@ -1524,7 +1524,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             mailboxManager.startProcessingRequest(session);
 
             MailboxPath inbox = MailboxPath.inbox(session);
-            assertThat(mailboxManager.mailboxExists(inbox, session)).isFalse();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inbox, 
session)).block()).isFalse();
         }
 
         @Test
@@ -1535,7 +1535,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             MailboxPath inbox = MailboxPath.inbox(session);
             mailboxManager.createMailbox(inbox, session);
 
-            assertThat(mailboxManager.mailboxExists(inbox, session)).isTrue();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inbox, 
session)).block()).isTrue();
         }
 
         @Test
@@ -1661,7 +1661,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             MailboxPath inbox = MailboxPath.inbox(session);
             mailboxManager.createMailbox(inbox, session);
 
-            assertThat(mailboxManager.mailboxExists(new MailboxPath(inbox, 
"INBOX.Test"), session)).isFalse();
+            assertThat(Mono.from(mailboxManager.mailboxExists(new 
MailboxPath(inbox, "INBOX.Test"), session)).block()).isFalse();
         }
 
         @Test
@@ -1674,7 +1674,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             MailboxPath inboxSubMailbox = new MailboxPath(inbox, "INBOX.Test");
             mailboxManager.createMailbox(inboxSubMailbox, session);
 
-            assertThat(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).isTrue();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).block()).isTrue();
         }
 
         @Test
@@ -1689,8 +1689,8 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
 
             mailboxManager.deleteMailbox(inbox, session);
 
-            assertThat(mailboxManager.mailboxExists(inbox, session)).isFalse();
-            assertThat(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).isTrue();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inbox, 
session)).block()).isFalse();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).block()).isTrue();
         }
 
 
@@ -1706,8 +1706,8 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
 
             mailboxManager.deleteMailbox(inboxId, session);
 
-            assertThat(mailboxManager.mailboxExists(inbox, session)).isFalse();
-            assertThat(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).isTrue();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inbox, 
session)).block()).isFalse();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).block()).isTrue();
         }
 
         @Test
@@ -1747,8 +1747,8 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
 
             mailboxManager.deleteMailbox(inboxSubMailbox, session);
 
-            assertThat(mailboxManager.mailboxExists(inbox, session)).isTrue();
-            assertThat(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).isFalse();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inbox, 
session)).block()).isTrue();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).block()).isFalse();
         }
 
         @Test
@@ -1763,8 +1763,8 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
 
             mailboxManager.deleteMailbox(inboxSubMailboxId, session);
 
-            assertThat(mailboxManager.mailboxExists(inbox, session)).isTrue();
-            assertThat(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).isFalse();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inbox, 
session)).block()).isTrue();
+            assertThat(Mono.from(mailboxManager.mailboxExists(inboxSubMailbox, 
session)).block()).isFalse();
         }
 
         @Test
@@ -1791,7 +1791,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             MailboxPath trash = MailboxPath.forUser(USER_2, "Trash");
             mailboxManager.createMailbox(trash, session);
 
-            assertThat(mailboxManager.mailboxExists(trash, session)).isTrue();
+            assertThat(Mono.from(mailboxManager.mailboxExists(trash, 
session)).block()).isTrue();
         }
 
         @Test
@@ -1800,7 +1800,7 @@ public abstract class MailboxManagerTest<T extends 
MailboxManager> {
             MailboxPath nestedFolder = MailboxPath.forUser(USER_2, 
"INBOX.testfolder");
             mailboxManager.createMailbox(nestedFolder, session);
 
-            assertThat(mailboxManager.mailboxExists(nestedFolder, 
session)).isTrue();
+            assertThat(Mono.from(mailboxManager.mailboxExists(nestedFolder, 
session)).block()).isTrue();
             mailboxManager.getMailbox(MailboxPath.inbox(session), session)
                 .appendMessage(AppendCommand.from(message), session);
         }
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 2854449..6cb08a8 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -93,6 +93,8 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 
+import reactor.core.publisher.Mono;
+
 /**
  * This base class of an {@link MailboxManager} implementation provides a 
high-level api for writing your own
  * {@link MailboxManager} implementation. If you plan to write your own {@link 
MailboxManager} its most times so easiest
@@ -318,7 +320,7 @@ public class StoreMailboxManager implements MailboxManager {
             MailboxPath sanitizedMailboxPath = 
mailboxPath.sanitize(mailboxSession.getPathDelimiter());
             
sanitizedMailboxPath.assertAcceptable(mailboxSession.getPathDelimiter());
 
-            if (mailboxExists(sanitizedMailboxPath, mailboxSession)) {
+            if (mailboxExists(sanitizedMailboxPath, mailboxSession).block()) {
                 throw new 
MailboxExistsException(sanitizedMailboxPath.asString());
             }
 
@@ -346,7 +348,7 @@ public class StoreMailboxManager implements MailboxManager {
 
     private Stream<MailboxId> manageMailboxCreation(MailboxSession 
mailboxSession, boolean isRootPath, MailboxPath mailboxPath) throws 
MailboxException {
         if (mailboxPath.isInbox()) {
-            if (hasInbox(mailboxSession)) {
+            if (Mono.from(hasInbox(mailboxSession)).block()) {
                 return duplicatedINBOXCreation(isRootPath, mailboxPath);
             }
 
@@ -368,7 +370,7 @@ public class StoreMailboxManager implements MailboxManager {
     private List<MailboxId> performConcurrentMailboxCreation(MailboxSession 
mailboxSession, MailboxPath mailboxPath) throws MailboxException {
         List<MailboxId> mailboxIds = new ArrayList<>();
         locker.executeWithLock(mailboxPath, (LockAwareExecution<Void>) () -> {
-            if (!mailboxExists(mailboxPath, mailboxSession)) {
+            if (!mailboxExists(mailboxPath, mailboxSession).block()) {
                 MailboxMapper mapper = 
mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
                 try {
                     mapper.execute(Mapper.toTransaction(() -> {
@@ -494,7 +496,7 @@ public class StoreMailboxManager implements MailboxManager {
     }
 
     private void validateDestinationPath(MailboxPath newMailboxPath, 
MailboxSession session) throws MailboxException {
-        if (mailboxExists(newMailboxPath, session)) {
+        if (mailboxExists(newMailboxPath, session).block()) {
             throw new MailboxExistsException(newMailboxPath.toString());
         }
         assertIsOwner(session, newMailboxPath);
@@ -695,11 +697,10 @@ public class StoreMailboxManager implements 
MailboxManager {
     }
 
     @Override
-    public boolean mailboxExists(MailboxPath mailboxPath, MailboxSession 
session) throws MailboxException {
+    public Mono<Boolean> mailboxExists(MailboxPath mailboxPath, MailboxSession 
session) throws MailboxException {
         MailboxMapper mapper = 
mailboxSessionMapperFactory.getMailboxMapper(session);
         return mapper.findMailboxByPath(mailboxPath)
-            .blockOptional()
-            .isPresent();
+            .hasElement();
     }
 
     /**
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
index 35eac0b..198b101 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
@@ -44,6 +44,8 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 
+import reactor.core.publisher.Mono;
+
 public abstract class AbstractAuthProcessor<R extends ImapRequest> extends 
AbstractMailboxProcessor<R> {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AbstractAuthProcessor.class);
 
@@ -124,7 +126,7 @@ public abstract class AbstractAuthProcessor<R extends 
ImapRequest> extends Abstr
 
     private void provisionInbox(ImapSession session, MailboxManager 
mailboxManager, MailboxSession mailboxSession) throws MailboxException {
         final MailboxPath inboxPath = 
PathConverter.forSession(session).buildFullPath(MailboxConstants.INBOX);
-        if (mailboxManager.mailboxExists(inboxPath, mailboxSession)) {
+        if (Mono.from(mailboxManager.mailboxExists(inboxPath, 
mailboxSession)).block()) {
             LOGGER.debug("INBOX exists. No need to create it.");
         } else {
             try {
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 0d3e1f3..9e7a1c8 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -48,6 +48,8 @@ import org.slf4j.LoggerFactory;
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
 
+import reactor.core.publisher.Mono;
+
 public abstract class AbstractMessageRangeProcessor<R extends 
AbstractMessageRangeRequest> extends AbstractMailboxProcessor<R> {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(AbstractMessageRangeProcessor.class);
 
@@ -70,7 +72,7 @@ public abstract class AbstractMessageRangeProcessor<R extends 
AbstractMessageRan
         try {
             MailboxSession mailboxSession = session.getMailboxSession();
 
-            if (!getMailboxManager().mailboxExists(targetMailbox, 
mailboxSession)) {
+            if (!Mono.from(getMailboxManager().mailboxExists(targetMailbox, 
mailboxSession)).block()) {
                 no(request, responder, 
HumanReadableText.FAILURE_NO_SUCH_MAILBOX, 
StatusResponse.ResponseCode.tryCreate());
             } else {
                 StatusResponse.ResponseCode code = handleRanges(request, 
session, targetMailbox, mailboxSession);
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
index 27de839..a6795e9 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
@@ -40,6 +40,8 @@ import org.apache.james.util.MDCBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import reactor.core.publisher.Mono;
+
 public class RenameProcessor extends AbstractMailboxProcessor<RenameRequest> {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(RenameProcessor.class);
 
@@ -58,7 +60,7 @@ public class RenameProcessor extends 
AbstractMailboxProcessor<RenameRequest> {
             MailboxSession mailboxsession = session.getMailboxSession();
             mailboxManager.renameMailbox(existingPath, newPath, 
mailboxsession);
 
-            if 
(existingPath.getName().equalsIgnoreCase(ImapConstants.INBOX_NAME) && 
!mailboxManager.mailboxExists(existingPath, mailboxsession)) {
+            if 
(existingPath.getName().equalsIgnoreCase(ImapConstants.INBOX_NAME) && 
!Mono.from(mailboxManager.mailboxExists(existingPath, mailboxsession)).block()) 
{
                 mailboxManager.createMailbox(existingPath, mailboxsession);
             }
             okComplete(request, responder);
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
index 2b4bb63..0e6a6b6 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
@@ -57,6 +57,8 @@ import org.junit.Test;
 
 import com.google.common.collect.Lists;
 
+import reactor.core.publisher.Mono;
+
 public class CopyProcessorTest {
     private static final Username USERNAME = Username.of("username");
     private static final MailboxPath INBOX = MailboxPath.inbox(USERNAME);
@@ -95,7 +97,7 @@ public class CopyProcessorTest {
         when(selectedMailbox.existsCount()).thenReturn(8L);
         when(selectedMailbox.getPath()).thenReturn(selected);
         imapSession.selected(selectedMailbox);
-        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(true);
+        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(Mono.just(true));
         MessageManager targetMessageManager = mock(MessageManager.class);
         when(mockMailboxManager.getMailbox(INBOX, 
mailboxSession)).thenReturn(targetMessageManager);
         Mailbox mailbox = mock(Mailbox.class);
@@ -128,7 +130,7 @@ public class CopyProcessorTest {
         when(selectedMailbox.existsCount()).thenReturn(8L);
         when(selectedMailbox.getPath()).thenReturn(selected);
         imapSession.selected(selectedMailbox);
-        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(true);
+        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(Mono.just(true));
         MessageManager targetMessageManager = mock(MessageManager.class);
         when(mockMailboxManager.getMailbox(INBOX, 
mailboxSession)).thenReturn(targetMessageManager);
         Mailbox mailbox = mock(Mailbox.class);
@@ -160,7 +162,7 @@ public class CopyProcessorTest {
         when(selectedMailbox.existsCount()).thenReturn(8L);
         when(selectedMailbox.getPath()).thenReturn(selected);
         imapSession.selected(selectedMailbox);
-        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(false);
+        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(Mono.just(false));
 
         StatusResponse noResponse = mock(StatusResponse.class);
         when(mockStatusResponseFactory.taggedNo(any(Tag.class), 
any(ImapCommand.class), any(HumanReadableText.class), 
any(StatusResponse.ResponseCode.class))).thenReturn(noResponse);
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
index 7837f48..4dcf048 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
@@ -60,6 +60,8 @@ import org.junit.Test;
 
 import com.google.common.collect.Lists;
 
+import reactor.core.publisher.Mono;
+
 public class MoveProcessorTest {
     private static final Username USERNAME = Username.of("username");
     private static final MailboxPath INBOX = MailboxPath.inbox(USERNAME);
@@ -111,7 +113,7 @@ public class MoveProcessorTest {
         when(selectedMailbox.existsCount()).thenReturn(8L);
         when(selectedMailbox.getPath()).thenReturn(selected);
         imapSession.selected(selectedMailbox);
-        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(true);
+        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(Mono.just(true));
         MessageManager targetMessageManager = mock(MessageManager.class);
         when(mockMailboxManager.getMailbox(INBOX, 
mailboxSession)).thenReturn(targetMessageManager);
         Mailbox mailbox = mock(Mailbox.class);
@@ -144,7 +146,7 @@ public class MoveProcessorTest {
         when(selectedMailbox.existsCount()).thenReturn(8L);
         when(selectedMailbox.getPath()).thenReturn(selected);
         imapSession.selected(selectedMailbox);
-        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(true);
+        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(Mono.just(true));
         MessageManager targetMessageManager = mock(MessageManager.class);
         when(mockMailboxManager.getMailbox(INBOX, 
mailboxSession)).thenReturn(targetMessageManager);
         Mailbox mailbox = mock(Mailbox.class);
@@ -175,7 +177,7 @@ public class MoveProcessorTest {
         when(selectedMailbox.existsCount()).thenReturn(8L);
         when(selectedMailbox.getPath()).thenReturn(selected);
         imapSession.selected(selectedMailbox);
-        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(false);
+        when(mockMailboxManager.mailboxExists(INBOX, 
mailboxSession)).thenReturn(Mono.just(false));
 
         StatusResponse noResponse = mock(StatusResponse.class);
         when(mockStatusResponseFactory.taggedNo(any(Tag.class), 
any(ImapCommand.class), any(HumanReadableText.class), 
any(StatusResponse.ResponseCode.class))).thenReturn(noResponse);
diff --git 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
index 7719039..9722c19 100644
--- 
a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
+++ 
b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/delivery/MailboxAppender.java
@@ -36,6 +36,8 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
+import reactor.core.publisher.Mono;
+
 public class MailboxAppender {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(MailboxAppender.class);
 
@@ -86,7 +88,7 @@ public class MailboxAppender {
     }
 
     private void createMailboxIfNotExist(MailboxSession session, MailboxPath 
path) throws MailboxException {
-        if (!mailboxManager.mailboxExists(path, session)) {
+        if (!Mono.from(mailboxManager.mailboxExists(path, session)).block()) {
             try {
                 mailboxManager.createMailbox(path, session);
             } catch (MailboxExistsException e) {
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
index 9c546ed..601a78d 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/LocalDeliveryTest.java
@@ -49,6 +49,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
 
+import reactor.core.publisher.Mono;
+
 public class LocalDeliveryTest {
 
     public static final String RECEIVER_DOMAIN_COM = "recei...@domain.com";
@@ -69,6 +71,7 @@ public class LocalDeliveryTest {
         session = mock(MailboxSession.class);
         when(session.getPathDelimiter()).thenReturn('.');
         
when(mailboxManager.createSystemSession(any(Username.class))).thenReturn(session);
+        when(mailboxManager.mailboxExists(any(), 
any())).thenReturn(Mono.just(true));
 
 
         config = FakeMailetConfig.builder()
diff --git 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
index 00c6d9b..7108eb6 100644
--- 
a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
+++ 
b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/delivery/ToRecipientFolderTest.java
@@ -50,6 +50,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
 
+import reactor.core.publisher.Mono;
+
 @Deprecated
 public class ToRecipientFolderTest {
 
@@ -83,6 +85,7 @@ public class ToRecipientFolderTest {
         session = mock(MailboxSession.class);
         when(session.getPathDelimiter()).thenReturn('.');
         
when(mailboxManager.createSystemSession(any(Username.class))).thenReturn(session);
+        when(mailboxManager.mailboxExists(any(), 
any())).thenReturn(Mono.just(true));
         when(session.getUser()).thenReturn(Username.of(USER));
     }
 
diff --git 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DefaultMailboxesReactiveProvisioner.java
 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DefaultMailboxesReactiveProvisioner.java
index 7b0568d..9f6c9e6 100644
--- 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DefaultMailboxesReactiveProvisioner.java
+++ 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DefaultMailboxesReactiveProvisioner.java
@@ -33,15 +33,16 @@ import 
org.apache.james.mailbox.exception.MailboxExistsException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.metrics.api.MetricFactory;
-import org.apache.james.metrics.api.TimeMetric;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 
+import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
+import reactor.core.scheduler.Schedulers;
 
-public class DefaultMailboxesReactiveProvisioner {
+class DefaultMailboxesReactiveProvisioner {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(DefaultMailboxesReactiveProvisioner.class);
     private final MailboxManager mailboxManager;
     private final SubscriptionManager subscriptionManager;
@@ -57,31 +58,29 @@ public class DefaultMailboxesReactiveProvisioner {
         this.metricFactory = metricFactory;
     }
 
-    public Mono<Void> createMailboxesIfNeeded(MailboxSession session) {
-        return Mono.fromRunnable(() -> {
-            TimeMetric timeMetric = 
metricFactory.timer("JMAP-mailboxes-provisioning");
-            try {
+    Mono<Void> createMailboxesIfNeeded(MailboxSession session) {
+        return 
metricFactory.runPublishingTimerMetric("JMAP-mailboxes-provisioning",
+            () -> {
                 Username username = session.getUser();
-                createDefaultMailboxes(username);
-            } catch (MailboxException e) {
-                throw new RuntimeException(e);
-            } finally {
-                timeMetric.stopAndPublish();
-            }
-        });
+                return createDefaultMailboxes(username);
+            });
     }
 
-    private void createDefaultMailboxes(Username username) throws 
MailboxException {
+    private Mono<Void> createDefaultMailboxes(Username username) {
         MailboxSession session = mailboxManager.createSystemSession(username);
-        DefaultMailboxes.DEFAULT_MAILBOXES.stream()
+
+        return Flux.fromIterable(DefaultMailboxes.DEFAULT_MAILBOXES)
             .map(toMailboxPath(session))
-            .filter(mailboxPath -> mailboxDoesntExist(mailboxPath, session))
-            .forEach(mailboxPath -> createMailbox(mailboxPath, session));
+            .filterWhen(mailboxPath -> mailboxDoesntExist(mailboxPath, 
session))
+            .concatMap(mailboxPath -> Mono.fromRunnable(() -> 
createMailbox(mailboxPath, session))
+                .subscribeOn(Schedulers.elastic()))
+            .then();
     }
 
-    private boolean mailboxDoesntExist(MailboxPath mailboxPath, MailboxSession 
session) {
+    private Mono<Boolean> mailboxDoesntExist(MailboxPath mailboxPath, 
MailboxSession session) {
         try {
-            return !mailboxManager.mailboxExists(mailboxPath, session);
+            return Mono.from(mailboxManager.mailboxExists(mailboxPath, 
session))
+                .map(x -> !x);
         } catch (MailboxException e) {
             throw new RuntimeException(e);
         }
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/DefaultMailboxesReactiveProvisionerThreadTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/DefaultMailboxesReactiveProvisionerThreadTest.java
index d0a5904..3e59213 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/DefaultMailboxesReactiveProvisionerThreadTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/DefaultMailboxesReactiveProvisionerThreadTest.java
@@ -40,6 +40,8 @@ import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.Before;
 import org.junit.Test;
 
+import reactor.core.publisher.Mono;
+
 public class DefaultMailboxesReactiveProvisionerThreadTest {
 
     private static final Username USERNAME = Username.of("username");
@@ -62,7 +64,7 @@ public class DefaultMailboxesReactiveProvisionerThreadTest {
         doNothing().when(subscriptionManager).subscribe(eq(session), 
anyString());
 
         when(mailboxManager.createMailbox(any(MailboxPath.class), 
eq(session))).thenReturn(Optional.of(TestId.of(18L)));
-        when(mailboxManager.mailboxExists(any(MailboxPath.class), 
eq(session))).thenReturn(false);
+        when(mailboxManager.mailboxExists(any(MailboxPath.class), 
eq(session))).thenReturn(Mono.just(false));
         when(mailboxManager.createSystemSession(USERNAME)).thenReturn(session);
 
         ConcurrentTestRunner
diff --git 
a/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/hook/MailboxDeliverToRecipientHandler.java
 
b/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/hook/MailboxDeliverToRecipientHandler.java
index e1bc470..038321a 100644
--- 
a/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/hook/MailboxDeliverToRecipientHandler.java
+++ 
b/server/protocols/protocols-lmtp/src/main/java/org/apache/james/lmtpserver/hook/MailboxDeliverToRecipientHandler.java
@@ -45,6 +45,8 @@ import org.apache.james.user.api.UsersRepositoryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import reactor.core.publisher.Mono;
+
 /**
  * {@link DeliverToRecipientHook} which deliver the message directly to the 
recipients mailbox.
  */
@@ -71,7 +73,7 @@ public class MailboxDeliverToRecipientHandler implements 
DeliverToRecipientHook
             mailboxManager.startProcessingRequest(mailboxSession);
 
             // create inbox if not exist
-            if (!mailboxManager.mailboxExists(inbox, mailboxSession)) {
+            if (!Mono.from(mailboxManager.mailboxExists(inbox, 
mailboxSession)).block()) {
                 Optional<MailboxId> mailboxId = 
mailboxManager.createMailbox(inbox, mailboxSession);
                 LOGGER.info("Provisioning INBOX. {} created.", mailboxId);
             }
diff --git 
a/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java
 
b/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java
index 4c04fa5..47a1945 100644
--- 
a/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java
+++ 
b/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/core/PassCmdHandler.java
@@ -43,6 +43,8 @@ import org.apache.james.protocols.pop3.mailbox.Mailbox;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import reactor.core.publisher.Mono;
+
 /**
  * {@link PassCmdHandler} which also handles POP3 Before SMTP
  * 
@@ -76,7 +78,7 @@ public class PassCmdHandler extends AbstractPassCmdHandler  {
             MailboxPath inbox = MailboxPath.inbox(mSession);
             
             // check if the mailbox exists, if not create it
-            if (!manager.mailboxExists(inbox, mSession)) {
+            if (!Mono.from(manager.mailboxExists(inbox, mSession)).block()) {
                 Optional<MailboxId> mailboxId = manager.createMailbox(inbox, 
mSession);
                 LOGGER.info("Provisioning INBOX. {} created.", mailboxId);
             }
diff --git 
a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
 
b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
index affc673..bc3b7f3 100644
--- 
a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
+++ 
b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
@@ -210,7 +210,7 @@ public class POP3ServerTest {
         pop3Client.disconnect();
         MailboxPath mailboxPath = MailboxPath.inbox(username);
         MailboxSession session = mailboxManager.login(username, "bar");
-        if (!mailboxManager.mailboxExists(mailboxPath, session)) {
+        if (!mailboxManager.mailboxExists(mailboxPath, session).block()) {
             mailboxManager.createMailbox(mailboxPath, session);
         }
         setupTestMails(session, mailboxManager.getMailbox(mailboxPath, 
session));
@@ -297,7 +297,7 @@ public class POP3ServerTest {
         MailboxPath mailboxPath = MailboxPath.inbox(username);
         MailboxSession session = mailboxManager.login(username, "bar2");
 
-        if (!mailboxManager.mailboxExists(mailboxPath, session)) {
+        if (!mailboxManager.mailboxExists(mailboxPath, session).block()) {
             mailboxManager.createMailbox(mailboxPath, session);
         }
 
@@ -387,7 +387,7 @@ public class POP3ServerTest {
         MailboxPath mailboxPath = MailboxPath.inbox(username);
         MailboxSession session = mailboxManager.login(username, "bar2");
 
-        if (!mailboxManager.mailboxExists(mailboxPath, session)) {
+        if (!mailboxManager.mailboxExists(mailboxPath, session).block()) {
             mailboxManager.createMailbox(mailboxPath, session);
         }
 
@@ -441,7 +441,7 @@ public class POP3ServerTest {
         MailboxPath mailboxPath = MailboxPath.inbox(username);
         MailboxSession session = mailboxManager.login(username, "bar2");
 
-        if (!mailboxManager.mailboxExists(mailboxPath, session)) {
+        if (!mailboxManager.mailboxExists(mailboxPath, session).block()) {
             mailboxManager.createMailbox(mailboxPath, session);
         }
 
@@ -653,7 +653,7 @@ public class POP3ServerTest {
         MailboxPath mailboxPath = MailboxPath.inbox(username);
 
         mailboxManager.startProcessingRequest(session);
-        if (!mailboxManager.mailboxExists(mailboxPath, session)) {
+        if (!mailboxManager.mailboxExists(mailboxPath, session).block()) {
             mailboxManager.createMailbox(mailboxPath, session);
         }
 
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
index 7b25ba1..003220f 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
@@ -45,6 +45,8 @@ import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Preconditions;
 
+import reactor.core.publisher.Mono;
+
 
 public class UserMailboxesService {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(UserMailboxesService.class);
@@ -89,9 +91,10 @@ public class UserMailboxesService {
     public boolean testMailboxExists(Username username, MailboxName 
mailboxName) throws MailboxException, UsersRepositoryException {
         usernamePreconditions(username);
         MailboxSession mailboxSession = 
mailboxManager.createSystemSession(username);
-        return mailboxManager.mailboxExists(
+        return Mono.from(mailboxManager.mailboxExists(
             MailboxPath.forUser(username, mailboxName.asString()),
-            mailboxSession);
+            mailboxSession))
+            .block();
     }
 
     public void deleteMailbox(Username username, MailboxName mailboxName) 
throws MailboxException, UsersRepositoryException, MailboxHaveChildrenException 
{
diff --git 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index 2dc0a3b..6f52c47 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -29,6 +29,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -83,6 +84,7 @@ import com.google.common.collect.ImmutableSet;
 
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
+import reactor.core.publisher.Mono;
 
 class UserMailboxesRoutesTest {
     private static final Username USERNAME = Username.of("username");
@@ -942,7 +944,7 @@ class UserMailboxesRoutesTest {
 
         @Test
         void getShouldGenerateInternalErrorOnUnknownException() throws 
Exception {
-            doThrow(new 
RuntimeException()).when(mailboxManager).mailboxExists(any(), any());
+            doReturn(Mono.error(new 
RuntimeException())).when(mailboxManager).mailboxExists(any(), any());
 
             when()
                 .get(MAILBOX_NAME)
@@ -952,7 +954,7 @@ class UserMailboxesRoutesTest {
 
         @Test
         void getShouldGenerateInternalErrorOnUnknownMailboxException() throws 
Exception {
-            doThrow(new 
MailboxException()).when(mailboxManager).mailboxExists(any(), any());
+            doReturn(Mono.error(new 
MailboxException())).when(mailboxManager).mailboxExists(any(), any());
 
             when()
                 .get(MAILBOX_NAME)


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

Reply via email to