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