JAMES-1692 extract SetMessagesMethod.processDestroy to a class

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

Branch: refs/heads/master
Commit: 8983dbbe0512b394d1063f5c5ee585e5873fc30d
Parents: 9388764
Author: Fabien Vignon <[email protected]>
Authored: Fri Feb 19 18:25:57 2016 +0100
Committer: Raphael Ouazana <[email protected]>
Committed: Tue Mar 1 15:44:51 2016 +0100

----------------------------------------------------------------------
 .../org/apache/james/jmap/MethodsModule.java    |  19 +--
 .../SetMessagesDestructionProcessor.java        | 116 +++++++++++++++++++
 .../james/jmap/methods/SetMessagesMethod.java   |  79 +------------
 3 files changed, 126 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8983dbbe/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
----------------------------------------------------------------------
diff --git 
a/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
 
b/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
index 01257da..b5d254a 100644
--- 
a/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
+++ 
b/server/container/cassandra-guice/src/main/java/org/apache/james/jmap/MethodsModule.java
@@ -19,8 +19,6 @@
 
 package org.apache.james.jmap;
 
-import java.util.List;
-
 import org.apache.james.jmap.json.ObjectMapperFactory;
 import org.apache.james.jmap.methods.GetMailboxesMethod;
 import org.apache.james.jmap.methods.GetMessageListMethod;
@@ -31,14 +29,13 @@ import org.apache.james.jmap.methods.JmapResponseWriter;
 import org.apache.james.jmap.methods.JmapResponseWriterImpl;
 import org.apache.james.jmap.methods.Method;
 import org.apache.james.jmap.methods.SetMessagesCreationProcessor;
+import org.apache.james.jmap.methods.SetMessagesDestructionProcessor;
 import org.apache.james.jmap.methods.SetMessagesMethod;
 import org.apache.james.jmap.methods.SetMessagesProcessor;
 import org.apache.james.jmap.methods.SetMessagesUpdateProcessor;
 import org.apache.james.mailbox.cassandra.CassandraId;
 
-import com.google.common.collect.ImmutableList;
 import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
 import com.google.inject.Singleton;
 import com.google.inject.TypeLiteral;
 import com.google.inject.multibindings.Multibinder;
@@ -59,16 +56,10 @@ public class MethodsModule extends AbstractModule {
         methods.addBinding().to(new 
TypeLiteral<GetMessageListMethod<CassandraId>>(){});
         methods.addBinding().to(new 
TypeLiteral<GetMessagesMethod<CassandraId>>(){});
         methods.addBinding().to(new 
TypeLiteral<SetMessagesMethod<CassandraId>>(){});
-        bind(SetMessagesUpdateProcessor.class).to(new 
TypeLiteral<SetMessagesUpdateProcessor<CassandraId>>(){});
-        bind(SetMessagesCreationProcessor.class).to(new 
TypeLiteral<SetMessagesCreationProcessor<CassandraId>>(){});
-    }
 
-    @Provides
-    public List<SetMessagesProcessor<CassandraId>> setMessagesProcessors(
-            SetMessagesUpdateProcessor<CassandraId> messageUpdater,
-            SetMessagesCreationProcessor<CassandraId> messageCreator) {
-
-        return ImmutableList.of( messageUpdater, messageCreator);
+        Multibinder<SetMessagesProcessor<CassandraId>> setMessagesProcessors = 
Multibinder.newSetBinder(binder(), new 
TypeLiteral<SetMessagesProcessor<CassandraId>>(){});
+        setMessagesProcessors.addBinding().to(new 
TypeLiteral<SetMessagesUpdateProcessor<CassandraId>>(){});
+        setMessagesProcessors.addBinding().to(new 
TypeLiteral<SetMessagesCreationProcessor<CassandraId>>(){});
+        setMessagesProcessors.addBinding().to(new 
TypeLiteral<SetMessagesDestructionProcessor<CassandraId>>(){});
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8983dbbe/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
new file mode 100644
index 0000000..9424fff
--- /dev/null
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesDestructionProcessor.java
@@ -0,0 +1,116 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.methods;
+
+import java.util.Iterator;
+import java.util.function.Function;
+
+import javax.inject.Inject;
+
+import org.apache.james.jmap.exceptions.MessageNotFoundException;
+import org.apache.james.jmap.model.MessageId;
+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.exception.MailboxException;
+import org.apache.james.mailbox.model.MessageRange;
+import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
+import org.apache.james.mailbox.store.mail.MessageMapper;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxId;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Throwables;
+
+public class SetMessagesDestructionProcessor<Id extends MailboxId> implements 
SetMessagesProcessor<Id> {
+
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(SetMessagesCreationProcessor.class);
+    private static final int LIMIT_BY_ONE = 1;
+
+    private final MailboxMapperFactory<Id> mailboxMapperFactory;
+    private final MailboxSessionMapperFactory<Id> mailboxSessionMapperFactory;
+
+    @Inject
+    @VisibleForTesting
+    SetMessagesDestructionProcessor(MailboxMapperFactory<Id> 
mailboxMapperFactory,
+                                           MailboxSessionMapperFactory<Id> 
mailboxSessionMapperFactory) {
+        this.mailboxMapperFactory = mailboxMapperFactory;
+        this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
+    }
+
+    @Override
+    public SetMessagesResponse process(SetMessagesRequest request, 
MailboxSession mailboxSession) {
+        MessageMapper<Id> messageMapper;
+        try {
+            messageMapper = 
mailboxSessionMapperFactory.createMessageMapper(mailboxSession);
+        } catch (MailboxException e) {
+            throw Throwables.propagate(e);
+        }
+        return request.getDestroy().stream()
+                .map(delete(messageMapper, mailboxSession))
+                .reduce(SetMessagesResponse.builder(),  
SetMessagesResponse.Builder::accumulator, SetMessagesResponse.Builder::combiner)
+                .build();
+    }
+
+    private Function<? super MessageId, SetMessagesResponse> 
delete(MessageMapper<Id> messageMapper, MailboxSession mailboxSession) {
+        return (messageId) -> {
+            try {
+                Mailbox<Id> mailbox = mailboxMapperFactory
+                        .getMailboxMapper(mailboxSession)
+                        .findMailboxByPath(messageId.getMailboxPath());
+
+                MailboxMessage<Id> mailboxMessage = 
getMailboxMessage(messageMapper, messageId, mailbox);
+
+                messageMapper.delete(mailbox, mailboxMessage);
+                return 
SetMessagesResponse.builder().destroyed(messageId).build();
+            } catch (MessageNotFoundException e) {
+                return SetMessagesResponse.builder().notDestroyed(messageId,
+                        SetError.builder()
+                                .type("notFound")
+                                .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("anErrorOccurred")
+                                .description("An error occurred while deleting 
message " + messageId.serialize())
+                                .build())
+                        .build();
+            }
+        };
+    }
+
+    private MailboxMessage<Id> getMailboxMessage(MessageMapper<Id> 
messageMapper, MessageId messageId, Mailbox<Id> mailbox)
+            throws MailboxException, MessageNotFoundException {
+
+        Iterator<MailboxMessage<Id>> mailboxMessage = 
messageMapper.findInMailbox(mailbox, MessageRange.one(messageId.getUid()), 
MessageMapper.FetchType.Metadata, LIMIT_BY_ONE);
+        if (!mailboxMessage.hasNext()) {
+            throw new MessageNotFoundException();
+        }
+        return mailboxMessage.next();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8983dbbe/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
index 7bb606b..76c97ee 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesMethod.java
@@ -19,51 +19,30 @@
 
 package org.apache.james.jmap.methods;
 
-import java.util.*;
-import java.util.function.Consumer;
+import java.util.Set;
 import java.util.stream.Stream;
+
 import javax.inject.Inject;
 
-import org.apache.james.jmap.exceptions.MessageNotFoundException;
 import org.apache.james.jmap.model.ClientId;
-import org.apache.james.jmap.model.MessageId;
-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.exception.MailboxException;
-import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
-import org.apache.james.mailbox.store.mail.MessageMapper;
-import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxId;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 public class SetMessagesMethod<Id extends MailboxId> implements Method {
 
-    private static final int LIMIT_BY_ONE = 1;
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(SetMessagesMethod.class);
     private static final Method.Request.Name METHOD_NAME = 
Method.Request.name("setMessages");
     private static final Method.Response.Name RESPONSE_NAME = 
Method.Response.name("messagesSet");
 
-    private final MailboxMapperFactory<Id> mailboxMapperFactory;
-    private final MailboxSessionMapperFactory<Id> mailboxSessionMapperFactory;
-    private final List<SetMessagesProcessor<Id>> messagesProcessors;
+    private final Set<SetMessagesProcessor<Id>> messagesProcessors;
 
     @Inject
-    @VisibleForTesting SetMessagesMethod(MailboxMapperFactory<Id> 
mailboxMapperFactory,
-                                         MailboxSessionMapperFactory<Id> 
mailboxSessionMapperFactory,
-                                         List<SetMessagesProcessor<Id>> 
messagesProcessors) {
-        this.mailboxMapperFactory = mailboxMapperFactory;
-        this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
+    @VisibleForTesting SetMessagesMethod(Set<SetMessagesProcessor<Id>> 
messagesProcessors) {
         this.messagesProcessors = messagesProcessors;
     }
 
@@ -95,60 +74,12 @@ public class SetMessagesMethod<Id extends MailboxId> 
implements Method {
     }
 
     private SetMessagesResponse setMessagesResponse(SetMessagesRequest 
request, MailboxSession mailboxSession) throws MailboxException {
-        SetMessagesResponse.Builder responseBuilder = 
SetMessagesResponse.builder();
-        processDestroy(request.getDestroy(), mailboxSession, responseBuilder);
         return messagesProcessors.stream()
                 .map(processor -> processor.process(request, mailboxSession))
-                .reduce(responseBuilder,
+                .reduce(SetMessagesResponse.builder(),
                         (builder, resp) -> resp.mergeInto(builder) ,
                         (builder1, builder2) -> 
builder2.build().mergeInto(builder1)
                 )
                 .build();
     }
-
-    private void processDestroy(List<MessageId> messageIds, MailboxSession 
mailboxSession, SetMessagesResponse.Builder responseBuilder) throws 
MailboxException {
-        MessageMapper<Id> messageMapper = 
mailboxSessionMapperFactory.createMessageMapper(mailboxSession);
-        Consumer<? super MessageId> delete = delete(messageMapper, 
mailboxSession, responseBuilder);
-
-        messageIds.stream()
-            .forEach(delete);
-    }
-
-    private Consumer<? super MessageId> delete(MessageMapper<Id> 
messageMapper, MailboxSession mailboxSession, SetMessagesResponse.Builder 
responseBuilder) {
-        return (messageId) -> {
-            try {
-                Mailbox<Id> mailbox = mailboxMapperFactory
-                        .getMailboxMapper(mailboxSession)
-                        .findMailboxByPath(messageId.getMailboxPath());
-
-                MailboxMessage<Id> mailboxMessage = 
getMailboxMessage(messageMapper, messageId, mailbox);
-
-                messageMapper.delete(mailbox, mailboxMessage);
-                responseBuilder.destroyed(messageId);
-            } catch (MessageNotFoundException e) {
-                responseBuilder.notDestroyed(messageId,
-                        SetError.builder()
-                        .type("notFound")
-                        .description("The message " + messageId.serialize() + 
" can't be found")
-                        .build());
-            } catch (MailboxException e) {
-                LOGGER.error("An error occurred when deleting a message", e);
-                responseBuilder.notDestroyed(messageId,
-                        SetError.builder()
-                        .type("anErrorOccurred")
-                        .description("An error occurred while deleting message 
" + messageId.serialize())
-                        .build());
-            }
-        };
-    }
-
-    private MailboxMessage<Id> getMailboxMessage(MessageMapper<Id> 
messageMapper, MessageId messageId, Mailbox<Id> mailbox) 
-            throws MailboxException, MessageNotFoundException {
-
-        Iterator<MailboxMessage<Id>> mailboxMessage = 
messageMapper.findInMailbox(mailbox, MessageRange.one(messageId.getUid()), 
FetchType.Metadata, LIMIT_BY_ONE);
-        if (!mailboxMessage.hasNext()) {
-            throw new MessageNotFoundException();
-        }
-        return mailboxMessage.next();
-    }
 }


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

Reply via email to