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 bt...@apache.org on 2017/01/24 05:49:05 UTC
[05/15] james-project git commit: JAMES-1785 Implement move feature
on JMAP using setInMailboxes
JAMES-1785 Implement move feature on JMAP using setInMailboxes
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/89994c30
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/89994c30
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/89994c30
Branch: refs/heads/master
Commit: 89994c30809c7a963938a7a6eebe9b62baa62774
Parents: 54fe9a4
Author: Quynh Nguyen <qn...@linagora.com>
Authored: Wed Jan 18 11:29:33 2017 +0700
Committer: Quynh Nguyen <qn...@linagora.com>
Committed: Tue Jan 24 09:46:05 2017 +0700
----------------------------------------------------------------------
.../methods/SetMessagesUpdateProcessor.java | 49 ++++++++++++++++++--
.../james/jmap/model/UpdateMessagePatch.java | 32 +++++++------
.../methods/SetMessagesUpdateProcessorTest.java | 4 +-
3 files changed, 64 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/89994c30/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 ba55a8d..f04e180 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
@@ -28,21 +28,28 @@ import java.util.stream.Stream;
import javax.inject.Inject;
import javax.mail.Flags;
+import org.apache.commons.lang.NotImplementedException;
import org.apache.james.jmap.model.MessageProperties;
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.jmap.model.mailbox.Role;
+import org.apache.james.jmap.utils.SystemMailboxesProvider;
+import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageIdManager;
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.FetchGroupImpl;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxId.Factory;
import org.apache.james.mailbox.model.MessageId;
import org.apache.james.mailbox.model.MessageResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.github.steveash.guavate.Guavate;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -54,13 +61,21 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
private final UpdateMessagePatchConverter updatePatchConverter;
private final MessageIdManager messageIdManager;
+ private final Factory mailboxIdFactory;
+ private final MailboxManager mailboxManager;
+ private final SystemMailboxesProvider systemMailboxesProvider;
@Inject
@VisibleForTesting SetMessagesUpdateProcessor(
- UpdateMessagePatchConverter updatePatchConverter,
- MessageIdManager messageIdManager) {
+ UpdateMessagePatchConverter updatePatchConverter,
+ MessageIdManager messageIdManager,
+ Factory mailboxIdFactory,
+ MailboxManager mailboxManager, SystemMailboxesProvider systemMailboxesProvider) {
this.updatePatchConverter = updatePatchConverter;
this.messageIdManager = messageIdManager;
+ this.mailboxIdFactory = mailboxIdFactory;
+ this.mailboxManager = mailboxManager;
+ this.systemMailboxesProvider = systemMailboxesProvider;
}
public SetMessagesResponse process(SetMessagesRequest request, MailboxSession mailboxSession) {
@@ -78,14 +93,16 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
SetMessagesResponse.Builder builder) {
try {
List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, mailboxSession);
+
if (messages.isEmpty()) {
addMessageIdNotFoundToResponse(messageId, builder);
} else {
+ setInMailboxes(messageId, updateMessagePatch, mailboxSession);
Optional<MailboxException> updateError = messages.stream()
.flatMap(message -> updateFlags(messageId, updateMessagePatch, mailboxSession, message))
.findAny();
if (updateError.isPresent()) {
- updateError.ifPresent(e -> handleMessageUpdateException(messageId, builder, e));
+ handleMessageUpdateException(messageId, builder, updateError.get());
} else {
builder.updated(ImmutableList.of(messageId));
}
@@ -106,6 +123,28 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
}
}
+ private void setInMailboxes(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession) throws MailboxException {
+ Optional<List<String>> serializedMailboxIds = updateMessagePatch.getMailboxIds();
+ if (serializedMailboxIds.isPresent()) {
+ List<MailboxId> mailboxIds = serializedMailboxIds.get()
+ .stream()
+ .map(mailboxId -> mailboxIdFactory.fromString(mailboxId))
+ .collect(Guavate.toImmutableList());
+
+ if (isMoveToTrash(mailboxSession, mailboxIds)) {
+ throw new NotImplementedException("Do not support move to trash");
+ }
+
+ messageIdManager.setInMailboxes(messageId, mailboxIds, mailboxSession);
+ }
+ }
+
+ private boolean isMoveToTrash(MailboxSession mailboxSession, List<MailboxId> mailboxIds) throws MailboxException {
+ return mailboxIds.size() == 1
+ && mailboxIds.get(0)
+ .equals(systemMailboxesProvider.findMailbox(Role.TRASH, mailboxSession).getId());
+ }
+
private void addMessageIdNotFoundToResponse(MessageId messageId, SetMessagesResponse.Builder builder) {
builder.notUpdated(ImmutableMap.of(messageId,
SetError.builder()
@@ -115,11 +154,11 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
.build()));
}
- private void handleMessageUpdateException(MessageId messageId,
+ private SetMessagesResponse.Builder handleMessageUpdateException(MessageId messageId,
SetMessagesResponse.Builder builder,
MailboxException e) {
LOGGER.error("An error occurred when updating a message", e);
- builder.notUpdated(ImmutableMap.of(messageId, SetError.builder()
+ return builder.notUpdated(ImmutableMap.of(messageId, SetError.builder()
.type("anErrorOccurred")
.description("An error occurred when updating a message")
.build()));
http://git-wip-us.apache.org/repos/asf/james-project/blob/89994c30/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 9ffac27..cc0e184 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
@@ -25,14 +25,14 @@ 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;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
@JsonDeserialize(builder = UpdateMessagePatch.Builder.class)
public class UpdateMessagePatch {
@@ -43,16 +43,14 @@ public class UpdateMessagePatch {
@JsonPOJOBuilder(withPrefix = "")
public static class Builder {
- private ImmutableList.Builder<String> mailboxIds = ImmutableList.builder();
+ private Optional<List<String>> mailboxIds = Optional.empty();
private Optional<Boolean> isFlagged = Optional.empty();
private Optional<Boolean> isUnread = Optional.empty();
private Optional<Boolean> isAnswered = Optional.empty();
- private Set<ValidationResult> validationResult = ImmutableSet.of();
+ private Set<ValidationResult> validationResult = Sets.newHashSet();
- public Builder mailboxIds(Optional<List<String>> mailboxIds) {
- if (mailboxIds.isPresent()) {
- throw new NotImplementedException("moving a message is not supported");
- }
+ public Builder mailboxIds(List<String> mailboxIds) {
+ this.mailboxIds = Optional.of(ImmutableList.copyOf(mailboxIds));
return this;
}
@@ -72,16 +70,22 @@ public class UpdateMessagePatch {
}
public Builder validationResult(Set<ValidationResult> validationResult) {
- this.validationResult = ImmutableSet.copyOf(validationResult);
+ this.validationResult.addAll(validationResult);
return this;
}
public UpdateMessagePatch build() {
- return new UpdateMessagePatch(mailboxIds.build(), isUnread, isFlagged, isAnswered, ImmutableList.copyOf(validationResult));
+ if (mailboxIds.isPresent() && mailboxIds.get().isEmpty()) {
+ validationResult(ImmutableSet.of(ValidationResult.builder()
+ .property("mailboxIds")
+ .message("mailboxIds property is not supposed to be empty")
+ .build()));
+ }
+ return new UpdateMessagePatch(mailboxIds, isUnread, isFlagged, isAnswered, ImmutableList.copyOf(validationResult));
}
}
- private final List<String> mailboxIds;
+ private final Optional<List<String>> mailboxIds;
private final Optional<Boolean> isUnread;
private final Optional<Boolean> isFlagged;
private final Optional<Boolean> isAnswered;
@@ -89,7 +93,7 @@ public class UpdateMessagePatch {
private final ImmutableList<ValidationResult> validationErrors;
@VisibleForTesting
- UpdateMessagePatch(List<String> mailboxIds,
+ UpdateMessagePatch(Optional<List<String>> mailboxIds,
Optional<Boolean> isUnread,
Optional<Boolean> isFlagged,
Optional<Boolean> isAnswered,
@@ -102,7 +106,7 @@ public class UpdateMessagePatch {
this.validationErrors = validationResults;
}
- public List<String> getMailboxIds() {
+ public Optional<List<String>> getMailboxIds() {
return mailboxIds;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/89994c30/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 d6478ff..5b0387a 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
@@ -42,7 +42,7 @@ public class SetMessagesUpdateProcessorTest {
@Test
public void processShouldReturnEmptyUpdatedWhenRequestHasEmptyUpdate() {
- SetMessagesUpdateProcessor sut = new SetMessagesUpdateProcessor(null, null);
+ SetMessagesUpdateProcessor sut = new SetMessagesUpdateProcessor(null, null, null, null, null);
SetMessagesRequest requestWithEmptyUpdate = SetMessagesRequest.builder().build();
SetMessagesResponse result = sut.process(requestWithEmptyUpdate, null);
@@ -66,7 +66,7 @@ public class SetMessagesUpdateProcessorTest {
when(mockConverter.fromJsonNode(any(ObjectNode.class)))
.thenReturn(mockInvalidPatch);
- SetMessagesUpdateProcessor sut = new SetMessagesUpdateProcessor(mockConverter, null);
+ SetMessagesUpdateProcessor sut = new SetMessagesUpdateProcessor(mockConverter, null, null, null, null);
MessageId requestMessageId = TestMessageId.of(1);
SetMessagesRequest requestWithInvalidUpdate = SetMessagesRequest.builder()
.update(ImmutableMap.of(requestMessageId, JsonNodeFactory.instance.objectNode()))
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org