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