You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/03/26 02:41:35 UTC
[james-project] 13/16: JAMES-3087 Reactify
MailboxManager::mailboxExist
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 <bt...@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 = "receiver@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org