This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 63287bf14d47dee4544ed2034b1b49226e159605 Author: RĂ©mi Kowalski <rkowal...@linagora.com> AuthorDate: Wed Jun 24 16:53:15 2020 +0200 JAMES-3277 Don't read outbox mailbox for each message in SetMessagesUpdateProcessor --- server/protocols/jmap-draft/pom.xml | 4 ++ .../draft/methods/SetMessagesUpdateProcessor.java | 46 +++++++++++++++------- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/server/protocols/jmap-draft/pom.xml b/server/protocols/jmap-draft/pom.xml index ad8e7cc..9cd06bf 100644 --- a/server/protocols/jmap-draft/pom.xml +++ b/server/protocols/jmap-draft/pom.xml @@ -211,6 +211,10 @@ <scope>test</scope> </dependency> <dependency> + <groupId>io.vavr</groupId> + <artifactId>vavr</artifactId> + </dependency> + <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> </dependency> diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java index 35ba365..edbe6ee 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java @@ -74,6 +74,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import io.vavr.control.Try; + public class SetMessagesUpdateProcessor implements SetMessagesProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(SetMessagesUpdateProcessor.class); @@ -109,24 +111,41 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor { } @Override - public SetMessagesResponse process(SetMessagesRequest request, MailboxSession mailboxSession) { + public SetMessagesResponse process(SetMessagesRequest request, MailboxSession mailboxSession) { TimeMetric timeMetric = metricFactory.timer(JMAP_PREFIX + "SetMessagesUpdateProcessor"); - SetMessagesResponse.Builder responseBuilder = SetMessagesResponse.builder(); + Try.ofCallable(() -> listMailboxIdsForRole(mailboxSession, Role.OUTBOX)) + .map(outboxes -> { + prepareResponse(request, mailboxSession, responseBuilder, outboxes); + return null; + }) + .onFailure(e -> request.buildUpdatePatches(updatePatchConverter) + .forEach((id, patch) -> prepareResponseIfCantReadOutboxes(responseBuilder, e, id, patch))); + + timeMetric.stopAndPublish(); + return responseBuilder.build(); + } + + private void prepareResponseIfCantReadOutboxes(SetMessagesResponse.Builder responseBuilder, Throwable e, MessageId id, UpdateMessagePatch patch) { + if (patch.isValid()) { + handleMessageUpdateException(id, responseBuilder, e); + } else { + handleInvalidRequest(responseBuilder, id, patch.getValidationErrors(), patch); + } + } + + private void prepareResponse(SetMessagesRequest request, MailboxSession mailboxSession, SetMessagesResponse.Builder responseBuilder, Set<MailboxId> outboxes) { request.buildUpdatePatches(updatePatchConverter).forEach((id, patch) -> { if (patch.isValid()) { - update(id, patch, mailboxSession, responseBuilder); + update(outboxes, id, patch, mailboxSession, responseBuilder); } else { handleInvalidRequest(responseBuilder, id, patch.getValidationErrors(), patch); } } ); - - timeMetric.stopAndPublish(); - return responseBuilder.build(); } - private void update(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, + private void update(Set<MailboxId> outboxes, MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, SetMessagesResponse.Builder builder) { try { List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, mailboxSession); @@ -144,7 +163,7 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor { } else { builder.updated(ImmutableList.of(messageId)); } - sendMessageWhenOutboxInTargetMailboxIds(messageId, updateMessagePatch, mailboxSession, builder); + sendMessageWhenOutboxInTargetMailboxIds(outboxes, messageId, updateMessagePatch, mailboxSession, builder); } } catch (DraftMessageMailboxUpdateException e) { handleDraftMessageMailboxUpdateException(messageId, builder, e); @@ -173,8 +192,8 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor { } } - private void sendMessageWhenOutboxInTargetMailboxIds(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, SetMessagesResponse.Builder builder) throws MailboxException, MessagingException, IOException { - if (isTargetingOutbox(mailboxSession, listTargetMailboxIds(updateMessagePatch))) { + private void sendMessageWhenOutboxInTargetMailboxIds(Set<MailboxId> outboxes, MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, SetMessagesResponse.Builder builder) throws MailboxException, MessagingException, IOException { + if (isTargetingOutbox(outboxes, listTargetMailboxIds(updateMessagePatch))) { Optional<MessageResult> maybeMessageToSend = messageIdManager.getMessage(messageId, FetchGroup.FULL_CONTENT, mailboxSession) .stream() @@ -270,8 +289,7 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor { .collect(Guavate.toImmutableSet()); } - private boolean isTargetingOutbox(MailboxSession mailboxSession, Set<MailboxId> targetMailboxIds) throws MailboxException { - Set<MailboxId> outboxes = listMailboxIdsForRole(mailboxSession, Role.OUTBOX); + private boolean isTargetingOutbox(Set<MailboxId> outboxes, Set<MailboxId> targetMailboxIds) throws MailboxException { if (outboxes.isEmpty()) { throw new MailboxNotFoundException("At least one outbox should be accessible"); } @@ -329,8 +347,8 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor { } private SetMessagesResponse.Builder handleMessageUpdateException(MessageId messageId, - SetMessagesResponse.Builder builder, - Exception e) { + SetMessagesResponse.Builder builder, + Throwable e) { LOGGER.error("An error occurred when updating a message", e); return builder.notUpdated(ImmutableMap.of(messageId, SetError.builder() .type(SetError.Type.ERROR) --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org