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 4e57d20d42d..01257da6e31 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,6 +19,8 @@ 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; @@ -30,10 +32,13 @@ import org.apache.james.jmap.methods.Method; import org.apache.james.jmap.methods.SetMessagesCreationProcessor; 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; @@ -58,4 +63,12 @@ protected void configure() { bind(SetMessagesCreationProcessor.class).to(new TypeLiteral>(){}); } + @Provides + public List> setMessagesProcessors( + SetMessagesUpdateProcessor messageUpdater, + SetMessagesCreationProcessor messageCreator) { + + return ImmutableList.of( messageUpdater, messageCreator); + } + } 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 52020262bc4..7bb606b40af 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 @@ -43,6 +43,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,18 +56,15 @@ public class SetMessagesMethod implements Method { private final MailboxMapperFactory mailboxMapperFactory; private final MailboxSessionMapperFactory mailboxSessionMapperFactory; - private final SetMessagesUpdateProcessor messageUpdater; - private final SetMessagesCreationProcessor messageCreator; + private final List> messagesProcessors; @Inject @VisibleForTesting SetMessagesMethod(MailboxMapperFactory mailboxMapperFactory, MailboxSessionMapperFactory mailboxSessionMapperFactory, - SetMessagesUpdateProcessor messageUpdater, - SetMessagesCreationProcessor messageCreator) { + List> messagesProcessors) { this.mailboxMapperFactory = mailboxMapperFactory; this.mailboxSessionMapperFactory = mailboxSessionMapperFactory; - this.messageUpdater = messageUpdater; - this.messageCreator = messageCreator; + this.messagesProcessors = messagesProcessors; } @Override @@ -99,9 +97,13 @@ public Stream process(JmapRequest request, ClientId clientId, Mail private SetMessagesResponse setMessagesResponse(SetMessagesRequest request, MailboxSession mailboxSession) throws MailboxException { SetMessagesResponse.Builder responseBuilder = SetMessagesResponse.builder(); processDestroy(request.getDestroy(), mailboxSession, responseBuilder); - messageUpdater.process(request, mailboxSession).mergeInto(responseBuilder); - messageCreator.process(request, mailboxSession).mergeInto(responseBuilder); - return responseBuilder.build(); + return messagesProcessors.stream() + .map(processor -> processor.process(request, mailboxSession)) + .reduce(responseBuilder, + (builder, resp) -> resp.mergeInto(builder) , + (builder1, builder2) -> builder2.build().mergeInto(builder1) + ) + .build(); } private void processDestroy(List messageIds, MailboxSession mailboxSession, SetMessagesResponse.Builder responseBuilder) throws MailboxException {