JAMES-1818 Remove store usage in destruction processor by using managers
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/198f6cee Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/198f6cee Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/198f6cee Branch: refs/heads/master Commit: 198f6cee83a9d023c259e0bc774d307a494e2753 Parents: b7fe5df Author: Raphael Ouazana <[email protected]> Authored: Thu Aug 18 18:01:02 2016 +0200 Committer: Raphael Ouazana <[email protected]> Committed: Mon Aug 29 15:15:43 2016 +0200 ---------------------------------------------------------------------- .../SetMessagesDestructionProcessor.java | 57 ++++++++------------ .../org/apache/james/jmap/model/MessageId.java | 5 ++ 2 files changed, 26 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/198f6cee/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 eac8707..a1d3d18 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 @@ -19,70 +19,53 @@ package org.apache.james.jmap.methods; -import java.util.Iterator; import java.util.function.Function; import javax.inject.Inject; +import javax.mail.Flags; 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.MailboxManager; import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageManager; 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.MailboxMessage; +import org.apache.james.mailbox.model.FetchGroupImpl; +import org.apache.james.mailbox.model.MessageResultIterator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; public class SetMessagesDestructionProcessor implements SetMessagesProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(SetMessagesCreationProcessor.class); - private static final int LIMIT_BY_ONE = 1; - private final MailboxMapperFactory mailboxMapperFactory; - private final MailboxSessionMapperFactory mailboxSessionMapperFactory; + private final MailboxManager mailboxManager; @Inject @VisibleForTesting - SetMessagesDestructionProcessor(MailboxMapperFactory mailboxMapperFactory, - MailboxSessionMapperFactory mailboxSessionMapperFactory) { - this.mailboxMapperFactory = mailboxMapperFactory; - this.mailboxSessionMapperFactory = mailboxSessionMapperFactory; + SetMessagesDestructionProcessor(MailboxManager mailboxManager) { + this.mailboxManager = mailboxManager; } @Override public SetMessagesResponse process(SetMessagesRequest request, MailboxSession mailboxSession) { - MessageMapper messageMapper; - try { - messageMapper = mailboxSessionMapperFactory.createMessageMapper(mailboxSession); - } catch (MailboxException e) { - throw Throwables.propagate(e); - } return request.getDestroy().stream() - .map(delete(messageMapper, mailboxSession)) + .map(delete(mailboxSession)) .reduce(SetMessagesResponse.builder(), SetMessagesResponse.Builder::accumulator, SetMessagesResponse.Builder::combiner) .build(); } - private Function<? super MessageId, SetMessagesResponse> delete(MessageMapper messageMapper, MailboxSession mailboxSession) { + private Function<? super MessageId, SetMessagesResponse> delete(MailboxSession mailboxSession) { return (messageId) -> { try { - Mailbox mailbox = mailboxMapperFactory - .getMailboxMapper(mailboxSession) - .findMailboxByPath(messageId.getMailboxPath()); - - MailboxMessage mailboxMessage = getMailboxMessage(messageMapper, messageId, mailbox); - - messageMapper.delete(mailbox, mailboxMessage); + MessageManager messageManager = mailboxManager.getMailbox(messageId.getMailboxPath(), mailboxSession); + checkThatMessageExists(messageManager, messageId, mailboxSession); + removeMessage(messageManager, messageId, mailboxSession); return SetMessagesResponse.builder().destroyed(messageId).build(); } catch (MessageNotFoundException e) { return SetMessagesResponse.builder().notDestroyed(messageId, @@ -103,13 +86,15 @@ public class SetMessagesDestructionProcessor implements SetMessagesProcessor { }; } - private MailboxMessage getMailboxMessage(MessageMapper messageMapper, MessageId messageId, Mailbox mailbox) - throws MailboxException, MessageNotFoundException { - - Iterator<MailboxMessage> mailboxMessage = messageMapper.findInMailbox(mailbox, MessageRange.one(messageId.getUid()), MessageMapper.FetchType.Metadata, LIMIT_BY_ONE); - if (!mailboxMessage.hasNext()) { + private void checkThatMessageExists(MessageManager messageManager, MessageId messageId, MailboxSession mailboxSession) throws MailboxException, MessageNotFoundException { + MessageResultIterator messages = messageManager.getMessages(messageId.getUidAsRange(), FetchGroupImpl.MINIMAL, mailboxSession); + if (!messages.hasNext()) { throw new MessageNotFoundException(); } - return mailboxMessage.next(); + } + + private void removeMessage(MessageManager messageManager, MessageId messageId, MailboxSession mailboxSession) throws MailboxException { + messageManager.setFlags(new Flags(Flags.Flag.DELETED), MessageManager.FlagsUpdateMode.ADD, messageId.getUidAsRange(), mailboxSession); + messageManager.expunge(messageId.getUidAsRange(), mailboxSession); } } http://git-wip-us.apache.org/repos/asf/james-project/blob/198f6cee/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageId.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageId.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageId.java index 40e00f9..117124c 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageId.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageId.java @@ -23,6 +23,7 @@ import java.util.Objects; import org.apache.james.mailbox.MailboxSession.User; import org.apache.james.mailbox.model.MailboxConstants; import org.apache.james.mailbox.model.MailboxPath; +import org.apache.james.mailbox.model.MessageRange; import org.javatuples.Triplet; import com.fasterxml.jackson.annotation.JsonCreator; @@ -67,6 +68,10 @@ public class MessageId { return uid; } + public MessageRange getUidAsRange() { + return MessageRange.one(uid); + } + public MailboxPath getMailboxPath() { return new MailboxPath(MailboxConstants.USER_NAMESPACE, username, mailboxPath); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
