You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2016/08/29 13:28:06 UTC

[09/17] james-project git commit: JAMES-1818 Remove store usage in update processor by using managers

JAMES-1818 Remove store usage in update 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/dc564ba2
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/dc564ba2
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/dc564ba2

Branch: refs/heads/master
Commit: dc564ba27d71a57adedaaecdb70b3677d8a0f2c2
Parents: 198f6ce
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Fri Aug 19 11:46:39 2016 +0200
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Mon Aug 29 15:15:43 2016 +0200

----------------------------------------------------------------------
 .../methods/SetMessagesUpdateProcessor.java     | 51 ++++++--------------
 .../james/jmap/model/UpdateMessagePatch.java    | 11 ++---
 .../methods/SetMessagesUpdateProcessorTest.java |  4 +-
 .../jmap/model/UpdateMessagePatchTest.java      | 16 +++---
 4 files changed, 29 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/dc564ba2/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
index 11c9c99..d7918b3 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessor.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.jmap.methods;
 
-import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
@@ -34,16 +33,13 @@ 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.jmap.model.UpdateMessagePatch;
+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.FlagsUpdateCalculator;
-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.MessageResult;
+import org.apache.james.mailbox.model.MessageResultIterator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,21 +50,17 @@ import com.google.common.collect.ImmutableSet;
 
 public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
 
-    private static final int LIMIT_BY_ONE = 1;
     private static final Logger LOGGER = LoggerFactory.getLogger(SetMessagesUpdateProcessor.class);
 
     private final UpdateMessagePatchConverter updatePatchConverter;
-    private final MailboxMapperFactory mailboxMapperFactory;
-    private final MailboxSessionMapperFactory mailboxSessionMapperFactory;
+    private final MailboxManager mailboxManager;
 
     @Inject
     @VisibleForTesting SetMessagesUpdateProcessor(
             UpdateMessagePatchConverter updatePatchConverter,
-            MailboxMapperFactory mailboxMapperFactory,
-            MailboxSessionMapperFactory mailboxSessionMapperFactory) {
+            MailboxManager mailboxManager) {
         this.updatePatchConverter = updatePatchConverter;
-        this.mailboxMapperFactory = mailboxMapperFactory;
-        this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
+        this.mailboxManager = mailboxManager;
     }
 
     public SetMessagesResponse process(SetMessagesRequest request,  MailboxSession mailboxSession) {
@@ -85,13 +77,10 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
     private void update(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession,
                         SetMessagesResponse.Builder builder) {
         try {
-            MessageMapper messageMapper = mailboxSessionMapperFactory.createMessageMapper(mailboxSession);
-            Mailbox mailbox = mailboxMapperFactory.getMailboxMapper(mailboxSession)
-                    .findMailboxByPath(messageId.getMailboxPath());
-            Iterator<MailboxMessage> mailboxMessage = messageMapper.findInMailbox(
-                    mailbox, MessageRange.one(messageId.getUid()), MessageMapper.FetchType.Metadata, LIMIT_BY_ONE);
-            MailboxMessage messageWithUpdatedFlags = applyMessagePatch(messageId, mailboxMessage.next(), updateMessagePatch, builder);
-            savePatchedMessage(mailbox, messageId, messageWithUpdatedFlags, messageMapper);
+            MessageManager messageManager = mailboxManager.getMailbox(messageId.getMailboxPath(), mailboxSession);
+            MessageResultIterator message = messageManager.getMessages(messageId.getUidAsRange(), FetchGroupImpl.MINIMAL, mailboxSession);
+            updateFlags(messageId, updateMessagePatch, mailboxSession, messageManager, message.next());
+            builder.updated(ImmutableList.of(messageId));
         } catch (NoSuchElementException e) {
             addMessageIdNotFoundToResponse(messageId, builder);
         } catch (MailboxException e) {
@@ -99,13 +88,9 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
         }
     }
 
-    private boolean savePatchedMessage(Mailbox mailbox, MessageId messageId,
-                                       MailboxMessage message,
-                                       MessageMapper messageMapper) throws MailboxException {
-        return messageMapper.updateFlags(mailbox, new FlagsUpdateCalculator(message.createFlags(),
-                        MessageManager.FlagsUpdateMode.REPLACE),
-                MessageRange.one(messageId.getUid()))
-                .hasNext();
+    private void updateFlags(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, MessageManager messageManager, MessageResult messageResult) throws MailboxException {
+        Flags newState = updateMessagePatch.applyToState(messageResult.getFlags());
+        messageManager.setFlags(newState, MessageManager.FlagsUpdateMode.REPLACE, messageId.getUidAsRange(), mailboxSession);
     }
 
     private void addMessageIdNotFoundToResponse(MessageId messageId, SetMessagesResponse.Builder builder) {
@@ -117,14 +102,6 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
                         .build()));
     }
 
-    private MailboxMessage applyMessagePatch(MessageId messageId, MailboxMessage message,
-                                                 UpdateMessagePatch updatePatch, SetMessagesResponse.Builder builder) {
-        Flags newStateFlags = updatePatch.applyToState(message.isSeen(), message.isAnswered(), message.isFlagged());
-        message.setFlags(newStateFlags);
-        builder.updated(ImmutableList.of(messageId));
-        return message;
-    }
-
     private void handleMessageUpdateException(MessageId messageId,
                                               SetMessagesResponse.Builder builder,
                                               MailboxException e) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/dc564ba2/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java
index 05eded8..9ffac27 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/UpdateMessagePatch.java
@@ -26,6 +26,7 @@ import java.util.Set;
 import javax.mail.Flags;
 
 import com.google.common.collect.ImmutableSet;
+
 import org.apache.commons.lang.NotImplementedException;
 import org.apache.james.jmap.methods.ValidationResult;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@@ -125,18 +126,16 @@ public class UpdateMessagePatch {
         return getValidationErrors().isEmpty();
     }
 
-    public Flags applyToState(boolean isSeen, boolean isAnswered, boolean isFlagged) {
+    public Flags applyToState(Flags currentFlags) {
         Flags newStateFlags = new Flags();
 
-        boolean shouldMessageBeFlagged = isFlagged().isPresent() && isFlagged().get() || (!isFlagged().isPresent() && isFlagged);
-        if (shouldMessageBeFlagged) {
+        if (isFlagged().orElse(currentFlags.contains(Flags.Flag.FLAGGED))) {
             newStateFlags.add(Flags.Flag.FLAGGED);
         }
-        boolean shouldMessageBeMarkAnswered = isAnswered().isPresent() && isAnswered().get() || (!isAnswered().isPresent() && isAnswered);
-        if (shouldMessageBeMarkAnswered) {
+        if (isAnswered().orElse(currentFlags.contains(Flags.Flag.ANSWERED))) {
             newStateFlags.add(Flags.Flag.ANSWERED);
         }
-        boolean shouldMessageBeMarkSeen = isUnread().isPresent() && !isUnread().get() || (!isUnread().isPresent() && isSeen);
+        boolean shouldMessageBeMarkSeen = isUnread().map(b -> !b).orElse(currentFlags.contains(Flags.Flag.SEEN));
         if (shouldMessageBeMarkSeen) {
             newStateFlags.add(Flags.Flag.SEEN);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/dc564ba2/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessorTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessorTest.java
index 43a610a..c135e0c 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessorTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesUpdateProcessorTest.java
@@ -40,7 +40,7 @@ public class SetMessagesUpdateProcessorTest {
 
     @Test
     public void processShouldReturnEmptyUpdatedWhenRequestHasEmptyUpdate() {
-        SetMessagesUpdateProcessor sut = new SetMessagesUpdateProcessor(null, null, null);
+        SetMessagesUpdateProcessor sut = new SetMessagesUpdateProcessor(null, null);
         SetMessagesRequest requestWithEmptyUpdate = SetMessagesRequest.builder().build();
 
         SetMessagesResponse result = sut.process(requestWithEmptyUpdate, null);
@@ -64,7 +64,7 @@ public class SetMessagesUpdateProcessorTest {
         when(mockConverter.fromJsonNode(any(ObjectNode.class)))
                 .thenReturn(mockInvalidPatch);
 
-        SetMessagesUpdateProcessor sut = new SetMessagesUpdateProcessor(mockConverter, null, null);
+        SetMessagesUpdateProcessor sut = new SetMessagesUpdateProcessor(mockConverter, null);
         MessageId requestMessageId = MessageId.of("user|inbox|1");
         SetMessagesRequest requestWithInvalidUpdate = SetMessagesRequest.builder()
                 .update(ImmutableMap.of(requestMessageId, JsonNodeFactory.instance.objectNode()))

http://git-wip-us.apache.org/repos/asf/james-project/blob/dc564ba2/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java
index cc98092..515532c 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/UpdateMessagePatchTest.java
@@ -49,8 +49,8 @@ public class UpdateMessagePatchTest {
     @Test
     public void applyStateShouldSetFlaggedOnlyWhenUnsetPatchAppliedToFlaggedState() {
         UpdateMessagePatch testee = UpdateMessagePatch.builder().build();
-        boolean isFlaggedSet = true;
-        List<Flags.Flag> updatedFlags = Arrays.asList(testee.applyToState(false, false, isFlaggedSet).getSystemFlags());
+        Flags isFlaggedSet = new Flags(Flags.Flag.FLAGGED);
+        List<Flags.Flag> updatedFlags = Arrays.asList(testee.applyToState(isFlaggedSet).getSystemFlags());
         assertThat(updatedFlags).containsExactly(Flags.Flag.FLAGGED);
     }
 
@@ -58,24 +58,24 @@ public class UpdateMessagePatchTest {
     @Test
     public void applyStateShouldReturnUnreadFlagWhenUnreadSetOnSeenMessage() {
         UpdateMessagePatch testee = UpdateMessagePatch.builder().isUnread(true).build();
-        boolean isSeen = true;
-        List<Flags.Flag> updatedFlags = Arrays.asList(testee.applyToState(isSeen, false, false).getSystemFlags());
+        Flags isSeen = new Flags(Flags.Flag.SEEN);
+        List<Flags.Flag> updatedFlags = Arrays.asList(testee.applyToState(isSeen).getSystemFlags());
         assertThat(updatedFlags).doesNotContain(Flags.Flag.SEEN);
     }
 
     @Test
     public void applyStateShouldReturnFlaggedWhenEmptyPatchOnFlaggedMessage() {
         UpdateMessagePatch testee = UpdateMessagePatch.builder().build();
-        boolean isFlagged = true;
-        List<Flags.Flag> updatedFlags = Arrays.asList(testee.applyToState(false, false, isFlagged).getSystemFlags());
+        Flags isFlagged = new Flags(Flags.Flag.FLAGGED);
+        List<Flags.Flag> updatedFlags = Arrays.asList(testee.applyToState(isFlagged).getSystemFlags());
         assertThat(updatedFlags).containsExactly(Flags.Flag.FLAGGED);
     }
 
     @Test
     public void applyStateShouldReturnSeenWhenPatchSetsSeenOnSeenMessage() {
         UpdateMessagePatch testee = UpdateMessagePatch.builder().isUnread(false).build();
-        boolean isSeen = true;
-        List<Flags.Flag> updatedFlags = Arrays.asList(testee.applyToState(isSeen, false, false).getSystemFlags());
+        Flags isSeen = new Flags(Flags.Flag.SEEN);
+        List<Flags.Flag> updatedFlags = Arrays.asList(testee.applyToState(isSeen).getSystemFlags());
         assertThat(updatedFlags).containsExactly(Flags.Flag.SEEN);
     }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org