MAILBOX-337 Improve JMAP message destruction

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/fe3e39d5
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/fe3e39d5
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/fe3e39d5

Branch: refs/heads/master
Commit: fe3e39d53ea00882a28980ff421f151876d0dc7a
Parents: 5bfbc37
Author: benwa <[email protected]>
Authored: Thu May 24 16:11:09 2018 +0700
Committer: Matthieu Baechler <[email protected]>
Committed: Fri May 25 11:07:39 2018 +0200

----------------------------------------------------------------------
 .../SetMessagesDestructionProcessor.java        | 67 ++++++++------------
 1 file changed, 28 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/fe3e39d5/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesDestructionProcessor.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesDestructionProcessor.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesDestructionProcessor.java
index 65fff33..a7bfa64 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesDestructionProcessor.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesDestructionProcessor.java
@@ -22,28 +22,23 @@ package org.apache.james.jmap.methods;
 import static org.apache.james.jmap.methods.Method.JMAP_PREFIX;
 
 import java.util.List;
-import java.util.function.Function;
+import java.util.stream.Stream;
 
 import javax.inject.Inject;
 
-import org.apache.james.jmap.exceptions.MessageNotFoundException;
 import org.apache.james.jmap.model.SetError;
 import org.apache.james.jmap.model.SetMessagesRequest;
 import org.apache.james.jmap.model.SetMessagesResponse;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.FetchGroupImpl;
-import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.DeleteResult;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.metrics.api.MetricFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
 
 public class SetMessagesDestructionProcessor implements SetMessagesProcessor {
 
@@ -62,46 +57,40 @@ public class SetMessagesDestructionProcessor implements 
SetMessagesProcessor {
     @Override
     public SetMessagesResponse process(SetMessagesRequest request, 
MailboxSession mailboxSession) {
         return metricFactory.withMetric(JMAP_PREFIX + 
"SetMessageDestructionProcessor",
-            () -> request.getDestroy().stream()
-                .map(delete(mailboxSession))
+            () -> delete(request.getDestroy(), mailboxSession)
                 .reduce(SetMessagesResponse.builder(),
                     SetMessagesResponse.Builder::accumulator,
                     SetMessagesResponse.Builder::combiner)
                 .build());
     }
 
-    private Function<? super MessageId, SetMessagesResponse> 
delete(MailboxSession mailboxSession) {
-        return (messageId) -> {
-            try {
-                List<MailboxId> mailboxes = listContainingMailboxes(messageId, 
mailboxSession);
-                messageIdManager.delete(messageId, mailboxes, mailboxSession);
-                return 
SetMessagesResponse.builder().destroyed(messageId).build();
-            } catch (MessageNotFoundException e) {
-                return SetMessagesResponse.builder().notDestroyed(messageId,
-                        SetError.builder()
-                                .type(SetError.Type.NOT_FOUND)
-                                .description("The message " + 
messageId.serialize() + " can't be found")
-                                .build())
-                        .build();
-            } catch (MailboxException e) {
-                LOGGER.error("An error occurred when deleting a message", e);
-                return SetMessagesResponse.builder().notDestroyed(messageId,
-                        SetError.builder()
-                                .type(SetError.Type.ERROR)
-                                .description("An error occurred while deleting 
message " + messageId.serialize())
-                                .build())
-                        .build();
+
+    private Stream<SetMessagesResponse> delete(List<MessageId> toBeDestroyed, 
MailboxSession mailboxSession) {
+        try {
+            if (toBeDestroyed.isEmpty()) {
+                return Stream.empty();
             }
-        };
-    }
+            DeleteResult deleteResult = messageIdManager.delete(toBeDestroyed, 
mailboxSession);
 
-    private List<MailboxId> listContainingMailboxes(MessageId messageId, 
MailboxSession mailboxSession) throws MailboxException, 
MessageNotFoundException {
-        List<MessageResult> messages = 
messageIdManager.getMessages(ImmutableList.of(messageId), 
FetchGroupImpl.MINIMAL, mailboxSession);
-        if (messages.isEmpty()) {
-            throw new MessageNotFoundException();
+            Stream<SetMessagesResponse> destroyed = 
deleteResult.getDestroyed().stream()
+                .map(messageId -> 
SetMessagesResponse.builder().destroyed(messageId).build());
+            Stream<SetMessagesResponse> notFound = 
deleteResult.getNotFound().stream()
+                .map(messageId -> 
SetMessagesResponse.builder().notDestroyed(messageId,
+                    SetError.builder()
+                        .type(SetError.Type.NOT_FOUND)
+                        .description("The message " + messageId.serialize() + 
" can't be found")
+                        .build())
+                    .build());
+            return Stream.concat(destroyed, notFound);
+        } catch (MailboxException e) {
+            LOGGER.error("An error occurred when deleting a message", e);
+            return toBeDestroyed.stream()
+                .map(messageId -> 
SetMessagesResponse.builder().notDestroyed(messageId,
+                    SetError.builder()
+                        .type(SetError.Type.ERROR)
+                        .description("An error occurred while deleting 
messages " + messageId.serialize())
+                        .build())
+                    .build());
         }
-        return messages.stream()
-                .map(MessageResult::getMailboxId)
-                .collect(Guavate.toImmutableList());
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to