JAMES-2362 Update flags of original message when answered or forwarded

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

Branch: refs/heads/master
Commit: aab77f5360499736c5d606d6a4d97955dbd64328
Parents: edc0e42
Author: Raphael Ouazana <raphael.ouaz...@linagora.com>
Authored: Thu Mar 22 16:16:40 2018 +0100
Committer: benwa <btell...@linagora.com>
Committed: Tue Mar 27 15:16:32 2018 +0700

----------------------------------------------------------------------
 .../integration/SetMessagesMethodTest.java      | 286 ++++++++++++++++++-
 .../james/jmap/methods/ReferenceUpdater.java    | 105 +++++++
 .../methods/SetMessagesCreationProcessor.java   |   8 +-
 .../methods/SetMessagesUpdateProcessor.java     |  14 +-
 .../SetMessagesCreationProcessorTest.java       |  10 +-
 .../methods/SetMessagesUpdateProcessorTest.java |   8 +-
 6 files changed, 420 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/aab77f53/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
index bdc88aa..0575403 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMessagesMethodTest.java
@@ -4134,7 +4134,7 @@ public abstract class SetMessagesMethodTest {
 
     private boolean isAnyMessageFoundInInbox(AccessToken recipientToken) {
         try {
-            String inboxId = getMailboxId(accessToken, Role.INBOX);
+            String inboxId = getMailboxId(recipientToken, Role.INBOX);
             with()
                 .header("Authorization", recipientToken.serialize())
                 .body("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" 
+ inboxId + "\"]}}, \"#0\"]]")
@@ -4585,6 +4585,290 @@ public abstract class SetMessagesMethodTest {
     }
 
     @Test
+    public void 
setMessagesShouldUpdateIsAnsweredWhenInReplyToHeaderSentViaOutbox() throws 
Exception {
+        OriginalMessage firstMessage = receiveFirstMessage();
+
+        String messageCreationId = "creationId1337";
+        String requestBody = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"create\": { \"" + messageCreationId  + "\" : {" +
+            "        \"from\": { \"name\": \"Me\", \"email\": \"" + USERNAME + 
"\"}," +
+            "        \"to\": [{ \"name\": \"Bob\", \"email\": \"" + BOB + 
"\"}]," +
+            "        \"headers\": { \"In-Reply-To\": \"" + 
firstMessage.mimeMessageId + "\"}," +
+            "        \"subject\": \"RE: Hi!\"," +
+            "        \"textBody\": \"Fine, thank you!\"," +
+            "        \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body(requestBody)
+        .when()
+            .post("/jmap");
+
+        calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> 
isAnyMessageFoundInInbox(bobAccessToken));
+
+        String message = ARGUMENTS + ".list[0]";
+
+        with()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + 
firstMessage.jmapMessageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .log().ifValidationFails()
+            .body(NAME, equalTo("messages"))
+            .body(ARGUMENTS + ".list", hasSize(1))
+            .body(message + ".keywords.$Answered", equalTo(true))
+            .body(message + ".isAnswered", equalTo(true));
+    }
+
+    @Test
+    public void 
setMessagesShouldUpdateIsForwardedWhenXForwardedHeaderSentViaOutbox() throws 
Exception {
+        OriginalMessage firstMessage = receiveFirstMessage();
+
+        String messageCreationId = "creationId1337";
+        String requestBody = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"create\": { \"" + messageCreationId  + "\" : {" +
+            "        \"from\": { \"name\": \"Me\", \"email\": \"" + USERNAME + 
"\"}," +
+            "        \"to\": [{ \"name\": \"Bob\", \"email\": \"" + BOB + 
"\"}]," +
+            "        \"headers\": { \"X-Forwarded-Message-Id\": \"" + 
firstMessage.mimeMessageId + "\"}," +
+            "        \"subject\": \"Fwd: Hi!\"," +
+            "        \"textBody\": \"You talking to me?\"," +
+            "        \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body(requestBody)
+        .when()
+            .post("/jmap");
+
+        calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> 
isAnyMessageFoundInInbox(bobAccessToken));
+
+        String message = ARGUMENTS + ".list[0]";
+
+        with()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + 
firstMessage.jmapMessageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .log().ifValidationFails()
+            .body(NAME, equalTo("messages"))
+            .body(ARGUMENTS + ".list", hasSize(1))
+            .body(message + ".keywords.$Forwarded", equalTo(true))
+            .body(message + ".isForwarded", equalTo(true));
+    }
+
+    @Test
+    public void 
setMessagesShouldUpdateIsAnsweredWhenInReplyToHeaderSentViaDraft() throws 
Exception {
+        OriginalMessage firstMessage = receiveFirstMessage();
+        
+        String draftCreationId = "creationId1337";
+        String createDraft = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"create\": { \"" + draftCreationId  + "\" : {" +
+            "        \"from\": { \"name\": \"Me\", \"email\": \"" + USERNAME + 
"\"}," +
+            "        \"to\": [{ \"name\": \"Bob\", \"email\": \"" + BOB + 
"\"}]," +
+            "        \"headers\": { \"In-Reply-To\": \"" + 
firstMessage.mimeMessageId + "\"}," +
+            "        \"subject\": \"RE: Hi!\"," +
+            "        \"textBody\": \"Fine, thank you!\"," +
+            "        \"keywords\": {\"$Draft\": true}," +
+            "        \"mailboxIds\": [\"" + getDraftId(accessToken) + "\"]" +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        String draftId =
+            with()
+                .header("Authorization", accessToken.serialize())
+                .body(createDraft)
+                .post("/jmap")
+            .then()
+                .extract()
+                .path(ARGUMENTS + ".created[\"" + draftCreationId + "\"].id");
+
+        String moveDraftToOutBox = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"update\": { \"" + draftId + "\" : {" +
+            "        \"keywords\": {}," +
+            "        \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        with()
+            .header("Authorization", accessToken.serialize())
+            .body(moveDraftToOutBox)
+            .post("/jmap");
+
+        calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> 
isAnyMessageFoundInInbox(bobAccessToken));
+
+        String message = ARGUMENTS + ".list[0]";
+
+        with()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + 
firstMessage.jmapMessageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .log().ifValidationFails()
+            .body(NAME, equalTo("messages"))
+            .body(ARGUMENTS + ".list", hasSize(1))
+            .body(message + ".keywords.$Answered", equalTo(true))
+            .body(message + ".isAnswered", equalTo(true));
+    }
+
+    @Test
+    public void 
setMessagesShouldUpdateIsForwardedWhenXForwardedHeaderSentViaDraft() throws 
Exception {
+        OriginalMessage firstMessage = receiveFirstMessage();
+        
+        String draftCreationId = "creationId1337";
+        String createDraft = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"create\": { \"" + draftCreationId  + "\" : {" +
+            "        \"from\": { \"name\": \"Me\", \"email\": \"" + USERNAME + 
"\"}," +
+            "        \"to\": [{ \"name\": \"Bob\", \"email\": \"" + BOB + 
"\"}]," +
+            "        \"headers\": { \"X-Forwarded-Message-Id\": \"" + 
firstMessage.mimeMessageId + "\"}," +
+            "        \"subject\": \"Fwd: Hi!\"," +
+            "        \"textBody\": \"You talking to me?\"," +
+            "        \"keywords\": {\"$Draft\": true}," +
+            "        \"mailboxIds\": [\"" + getDraftId(accessToken) + "\"]" +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        String draftId =
+            with()
+                .header("Authorization", accessToken.serialize())
+                .body(createDraft)
+                .post("/jmap")
+            .then()
+                .extract()
+                .path(ARGUMENTS + ".created[\"" + draftCreationId + "\"].id");
+
+        String moveDraftToOutBox = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"update\": { \"" + draftId + "\" : {" +
+            "        \"keywords\": {}," +
+            "        \"mailboxIds\": [\"" + getOutboxId(accessToken) + "\"]" +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        with()
+            .header("Authorization", accessToken.serialize())
+            .body(moveDraftToOutBox)
+            .post("/jmap");
+
+        calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> 
isAnyMessageFoundInInbox(bobAccessToken));
+
+        String message = ARGUMENTS + ".list[0]";
+
+        with()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + 
firstMessage.jmapMessageId + "\"]}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .log().ifValidationFails()
+            .body(NAME, equalTo("messages"))
+            .body(ARGUMENTS + ".list", hasSize(1))
+            .body(message + ".keywords.$Forwarded", equalTo(true))
+            .body(message + ".isForwarded", equalTo(true));
+    }
+
+    private OriginalMessage receiveFirstMessage() {
+        String messageCreationId = "creationId1337";
+        String requestBody = "[" +
+            "  [" +
+            "    \"setMessages\"," +
+            "    {" +
+            "      \"create\": { \"" + messageCreationId  + "\" : {" +
+            "        \"from\": { \"name\": \"Bob\", \"email\": \"" + BOB + 
"\"}," +
+            "        \"to\": [{ \"name\": \"Me\", \"email\": \"" + USERNAME + 
"\"}]," +
+            "        \"subject\": \"Hi!\"," +
+            "        \"textBody\": \"How are you?\"," +
+            "        \"mailboxIds\": [\"" + getOutboxId(bobAccessToken) + 
"\"]" +
+            "      }}" +
+            "    }," +
+            "    \"#0\"" +
+            "  ]" +
+            "]";
+
+        with()
+            .header("Authorization", bobAccessToken.serialize())
+            .body(requestBody)
+        .post("/jmap");
+
+        calmlyAwait.atMost(30, TimeUnit.SECONDS).until(() -> 
isAnyMessageFoundInInbox(accessToken));
+
+        String jmapMessageId = with()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessageList\", {}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .extract()
+            .<String>path(ARGUMENTS + ".messageIds[0]");
+
+        String mimeMessageId = with()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMessages\", {\"ids\": [\"" + jmapMessageId + "\"]}, 
\"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .extract()
+            .<String>path(ARGUMENTS + ".list[0].headers['Message-ID']");
+        return new OriginalMessage(jmapMessageId, mimeMessageId);
+    }
+
+    private static class OriginalMessage {
+        final String jmapMessageId;
+        final String mimeMessageId;
+
+        OriginalMessage(String jmapMessageId, String mimeMessageId) {
+            this.jmapMessageId = jmapMessageId;
+            this.mimeMessageId = mimeMessageId;
+        }
+    }
+
+    @Test
     public void setMessagesShouldSetUserAddedHeadersInSent() throws Exception {
         String toUsername = "username1@" + USERS_DOMAIN;
         String password = "password";

http://git-wip-us.apache.org/repos/asf/james-project/blob/aab77f53/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ReferenceUpdater.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ReferenceUpdater.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ReferenceUpdater.java
new file mode 100644
index 0000000..6fb13ea
--- /dev/null
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/ReferenceUpdater.java
@@ -0,0 +1,105 @@
+/****************************************************************
+ * 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.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+import javax.inject.Inject;
+import javax.mail.Flags;
+
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageIdManager;
+import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.Headers;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.MessageResult.Header;
+import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
+import org.apache.james.mailbox.model.SearchQuery;
+import org.apache.james.util.streams.Iterators;
+import org.apache.mailet.base.RFC2822Headers;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.Iterables;
+
+public class ReferenceUpdater {
+    public static final String X_FORWARDED_ID_HEADER = 
"X-Forwarded-Message-Id";
+    public static final Flags FORWARDED_FLAG = new Flags("$Forwarded");
+
+    private static final Logger logger = 
LoggerFactory.getLogger(ReferenceUpdater.class);
+
+    private final MessageIdManager messageIdManager;
+    private final MailboxManager mailboxManager;
+
+    @Inject
+    public ReferenceUpdater(MessageIdManager messageIdManager, MailboxManager 
mailboxManager) {
+        this.messageIdManager = messageIdManager;
+        this.mailboxManager = mailboxManager;
+    }
+
+    public void updateReferences(Headers headers, MailboxSession session) 
throws MailboxException {
+        Map<String, String> headersAsMap = 
Iterators.toStream(headers.headers())
+            .collect(Guavate.toImmutableMap(Header::getName, 
Header::getValue));
+        updateReferences(headersAsMap, session);
+    }
+
+    public void updateReferences(Map<String, String> headers, MailboxSession 
session) throws MailboxException {
+        Optional<String> inReplyToId = 
Optional.ofNullable(headers.get(RFC2822Headers.IN_REPLY_TO));
+        Optional<String> forwardedId = 
Optional.ofNullable(headers.get(X_FORWARDED_ID_HEADER));
+        inReplyToId.ifPresent(Throwing.consumer((String id) -> 
updateAnswered(id, session)).sneakyThrow());
+        forwardedId.ifPresent(Throwing.consumer((String id) -> 
updateForwarded(id, session)).sneakyThrow());
+    }
+
+    private void updateAnswered(String messageId, MailboxSession session) 
throws MailboxException {
+        updateFlag(messageId, session, new Flags(Flags.Flag.ANSWERED));
+    }
+
+    private void updateForwarded(String messageId, MailboxSession session) 
throws MailboxException {
+        updateFlag(messageId, session, FORWARDED_FLAG);
+    }
+
+    private void updateFlag(String messageId, MailboxSession session, Flags 
flag) throws MailboxException {
+        int limit = 2;
+        MultimailboxesSearchQuery searchByRFC822MessageId = 
MultimailboxesSearchQuery.from(new 
SearchQuery(SearchQuery.headerContains(RFC2822Headers.MESSAGE_ID, 
messageId))).build();
+        List<MessageId> references = 
mailboxManager.search(searchByRFC822MessageId, session, limit);
+        try {
+            MessageId reference = Iterables.getOnlyElement(references);
+            List<MailboxId> mailboxIds = 
messageIdManager.getMessages(references, FetchGroupImpl.MINIMAL, 
session).stream()
+                .map(result -> result.getMailboxId())
+                .collect(Guavate.toImmutableList());
+            messageIdManager.setFlags(flag, FlagsUpdateMode.ADD, reference, 
mailboxIds, session);
+        } catch (NoSuchElementException e) {
+            logger.info("Unable to find a message with this Mime Message Id: " 
+ messageId);
+            return;
+        } catch (IllegalArgumentException e) {
+            logger.info("Too many messages are matching this Mime Message Id: 
" + messageId);
+            return;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/aab77f53/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
index eaaf6da..090dfed 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/SetMessagesCreationProcessor.java
@@ -82,6 +82,7 @@ public class SetMessagesCreationProcessor implements 
SetMessagesProcessor {
     private final MailboxId.Factory mailboxIdFactory;
     private final MessageAppender messageAppender;
     private final MessageSender messageSender;
+    private final ReferenceUpdater referenceUpdater;
     
     @VisibleForTesting
     @Inject
@@ -90,7 +91,10 @@ public class SetMessagesCreationProcessor implements 
SetMessagesProcessor {
                                  AttachmentChecker attachmentChecker,
                                  MetricFactory metricFactory,
                                  MailboxManager mailboxManager,
-                                 MailboxId.Factory mailboxIdFactory, 
MessageAppender messageAppender, MessageSender messageSender) {
+                                 MailboxId.Factory mailboxIdFactory,
+                                 MessageAppender messageAppender,
+                                 MessageSender messageSender,
+                                 ReferenceUpdater referenceUpdater) {
         this.messageFactory = messageFactory;
         this.systemMailboxesProvider = systemMailboxesProvider;
         this.attachmentChecker = attachmentChecker;
@@ -99,6 +103,7 @@ public class SetMessagesCreationProcessor implements 
SetMessagesProcessor {
         this.mailboxIdFactory = mailboxIdFactory;
         this.messageAppender = messageAppender;
         this.messageSender = messageSender;
+        this.referenceUpdater = referenceUpdater;
     }
 
     @Override
@@ -272,6 +277,7 @@ public class SetMessagesCreationProcessor implements 
SetMessagesProcessor {
         Message jmapMessage = 
messageFactory.fromMetaDataWithContent(newMessage);
         Envelope envelope = Envelope.fromMessage(jmapMessage);
         messageSender.sendMessage(newMessage, envelope, session);
+        referenceUpdater.updateReferences(entry.getValue().getHeaders(), 
session);
         return new ValueWithId.MessageWithId(entry.getCreationId(), 
jmapMessage);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/aab77f53/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 079bbda1..e2ec3ba 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
@@ -82,6 +82,8 @@ public class SetMessagesUpdateProcessor implements 
SetMessagesProcessor {
     private final MetricFactory metricFactory;
     private final MessageSender messageSender;
 
+    private final ReferenceUpdater referenceUpdater;
+
     @Inject
     @VisibleForTesting SetMessagesUpdateProcessor(
             UpdateMessagePatchConverter updatePatchConverter,
@@ -89,13 +91,15 @@ public class SetMessagesUpdateProcessor implements 
SetMessagesProcessor {
             SystemMailboxesProvider systemMailboxesProvider,
             Factory mailboxIdFactory,
             MessageSender messageSender,
-            MetricFactory metricFactory) {
+            MetricFactory metricFactory,
+            ReferenceUpdater referenceUpdater) {
         this.updatePatchConverter = updatePatchConverter;
         this.messageIdManager = messageIdManager;
         this.systemMailboxesProvider = systemMailboxesProvider;
         this.mailboxIdFactory = mailboxIdFactory;
         this.metricFactory = metricFactory;
         this.messageSender = messageSender;
+        this.referenceUpdater = referenceUpdater;
     }
 
     @Override
@@ -165,15 +169,17 @@ public class SetMessagesUpdateProcessor implements 
SetMessagesProcessor {
 
     private void sendMessageWhenOutboxInTargetMailboxIds(MessageId messageId, 
UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, 
SetMessagesResponse.Builder builder) throws MailboxException, 
MessagingException, IOException {
         if (isTargetingOutbox(mailboxSession, 
listTargetMailboxIds(updateMessagePatch))) {
-            Optional<MessageResult> messagesToSend =
+            Optional<MessageResult> maybeMessageToSend =
                 messageIdManager.getMessages(
                     ImmutableList.of(messageId), FetchGroupImpl.FULL_CONTENT, 
mailboxSession)
                     .stream()
                     .findFirst();
-            if (messagesToSend.isPresent()) {
-                MailImpl mail = buildMailFromMessage(messagesToSend.get());
+            if (maybeMessageToSend.isPresent()) {
+                MessageResult messageToSend = maybeMessageToSend.get();
+                MailImpl mail = buildMailFromMessage(messageToSend);
                 assertUserIsSender(mailboxSession, mail.getSender());
                 messageSender.sendMessage(messageId, mail, mailboxSession);
+                referenceUpdater.updateReferences(messageToSend.getHeaders(), 
mailboxSession);
             } else {
                 addMessageIdNotFoundToResponse(messageId, builder);
             }

http://git-wip-us.apache.org/repos/asf/james-project/blob/aab77f53/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
index 628b67e..c9896d7 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java
@@ -121,6 +121,7 @@ public class SetMessagesCreationProcessorTest {
     public ExpectedException expectedException = ExpectedException.none();
     private MessageAppender messageAppender;
     private MessageSender messageSender;
+    private ReferenceUpdater referenceUpdater;
 
     @Before
     public void setUp() throws MailboxException {
@@ -143,6 +144,7 @@ public class SetMessagesCreationProcessorTest {
         MIMEMessageConverter mimeMessageConverter = new MIMEMessageConverter();
         messageAppender = new MessageAppender(mockedMailboxManager, 
mockMessageIdManager, mockedAttachmentManager, mimeMessageConverter);
         messageSender = new MessageSender(mockedMailSpool, mockedMailFactory);
+        referenceUpdater = new ReferenceUpdater(mockMessageIdManager, 
mockedMailboxManager);
         sut = new SetMessagesCreationProcessor(messageFactory,
             fakeSystemMailboxesProvider,
             new AttachmentChecker(mockedAttachmentManager),
@@ -150,7 +152,8 @@ public class SetMessagesCreationProcessorTest {
             mockedMailboxManager,
             mockedMailboxIdFactory,
             messageAppender,
-            messageSender);
+            messageSender,
+            referenceUpdater);
         
         outbox = mock(MessageManager.class);
         when(mockedMailboxIdFactory.fromString(OUTBOX_ID.serialize()))
@@ -234,7 +237,7 @@ public class SetMessagesCreationProcessorTest {
     @Test
     public void 
processShouldReturnNonEmptyCreatedWhenRequestHasNonEmptyCreate() throws 
MailboxException {
         // Given
-        sut = new SetMessagesCreationProcessor(messageFactory, 
fakeSystemMailboxesProvider, new AttachmentChecker(mockedAttachmentManager), 
new NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory, 
messageAppender, messageSender);
+        sut = new SetMessagesCreationProcessor(messageFactory, 
fakeSystemMailboxesProvider, new AttachmentChecker(mockedAttachmentManager), 
new NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory, 
messageAppender, messageSender, referenceUpdater);
 
         // When
         SetMessagesResponse result = sut.process(createMessageInOutbox, 
session);
@@ -252,7 +255,8 @@ public class SetMessagesCreationProcessorTest {
         SetMessagesCreationProcessor sut = new 
SetMessagesCreationProcessor(messageFactory, doNotProvideOutbox,
             new AttachmentChecker(mockedAttachmentManager), new 
NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory,
             messageAppender,
-            messageSender);
+            messageSender,
+            referenceUpdater);
         // When
         SetMessagesResponse actual = sut.process(createMessageInOutbox, 
session);
         

http://git-wip-us.apache.org/repos/asf/james-project/blob/aab77f53/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 2264fda..0d04935 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
@@ -50,12 +50,14 @@ public class SetMessagesUpdateProcessorTest {
         SystemMailboxesProvider systemMailboxesProvider = null;
         MailboxId.Factory mailboxIdFactory = null;
         MessageSender messageSender = null;
+        ReferenceUpdater referenceUpdater = null;
         SetMessagesUpdateProcessor sut = new 
SetMessagesUpdateProcessor(updatePatchConverter,
             messageIdManager,
             systemMailboxesProvider,
             mailboxIdFactory,
             messageSender,
-            new NoopMetricFactory());
+            new NoopMetricFactory(),
+            referenceUpdater);
         SetMessagesRequest requestWithEmptyUpdate = 
SetMessagesRequest.builder().build();
 
         SetMessagesResponse result = sut.process(requestWithEmptyUpdate, null);
@@ -83,12 +85,14 @@ public class SetMessagesUpdateProcessorTest {
         SystemMailboxesProvider systemMailboxesProvider = null;
         MailboxId.Factory mailboxIdFactory = null;
         MessageSender messageSender = null;
+        ReferenceUpdater referenceUpdater = null;
         SetMessagesUpdateProcessor sut = new 
SetMessagesUpdateProcessor(mockConverter,
             messageIdManager,
             systemMailboxesProvider,
             mailboxIdFactory,
             messageSender,
-            new NoopMetricFactory());
+            new NoopMetricFactory(),
+            referenceUpdater);
         MessageId requestMessageId = TestMessageId.of(1);
         SetMessagesRequest requestWithInvalidUpdate = 
SetMessagesRequest.builder()
                 .update(ImmutableMap.of(requestMessageId, 
JsonNodeFactory.instance.objectNode()))


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

Reply via email to