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]
