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/12/15 07:15:05 UTC

[01/11] james-project git commit: JAMES-2257 Remove unused OldKeywords parameter from Keywords

Repository: james-project
Updated Branches:
  refs/heads/master 38acce230 -> 9d3bbbd31


JAMES-2257 Remove unused OldKeywords parameter from Keywords

This parameter was never used...


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

Branch: refs/heads/master
Commit: 14e53dc8c444ebd15014ffdb5f0c8cae4f71c1ef
Parents: 0e6082e
Author: benwa <bt...@linagora.com>
Authored: Tue Dec 12 08:51:20 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:00:36 2017 +0700

----------------------------------------------------------------------
 .../org/apache/james/jmap/model/Keywords.java   | 28 +++++++-------------
 .../james/jmap/utils/KeywordsCombiner.java      |  4 +--
 .../james/jmap/json/ParsingWritingObjects.java  |  2 +-
 .../apache/james/jmap/model/KeywordsTest.java   | 23 ++++++++--------
 4 files changed, 23 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/14e53dc8/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Keywords.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Keywords.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Keywords.java
index 5df79fa..7a5fc79 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Keywords.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Keywords.java
@@ -43,7 +43,7 @@ import com.google.common.collect.ImmutableSet;
 
 public class Keywords {
 
-    public static final Keywords DEFAULT_VALUE = factory().fromSet(ImmutableSet.of(), Optional.empty());
+    public static final Keywords DEFAULT_VALUE = factory().fromSet(ImmutableSet.of());
     private static final Logger LOGGER = LoggerFactory.getLogger(Keywords.class);
 
     public interface KeywordsValidator {
@@ -78,27 +78,24 @@ public class Keywords {
             return this;
         }
 
-        public Keywords fromSet(Set<Keyword> setKeywords, Optional<OldKeyword> oldKeyword) {
+        public Keywords fromSet(Set<Keyword> setKeywords) {
             validator.orElse(keywords -> {})
                 .validate(setKeywords);
 
             return new Keywords(setKeywords.stream()
                     .filter(filter.orElse(keyword -> true))
-                    .collect(Guavate.toImmutableSet()),
-                oldKeyword);
+                    .collect(Guavate.toImmutableSet()));
         }
 
         public Keywords from(Keyword... keywords) {
             return fromSet(Arrays.stream(keywords)
-                    .collect(Guavate.toImmutableSet()),
-                Optional.empty());
+                    .collect(Guavate.toImmutableSet()));
         }
 
         public Keywords fromList(List<String> keywords) {
             return fromSet(keywords.stream()
                     .map(Keyword::new)
-                    .collect(Guavate.toImmutableSet()),
-                Optional.empty());
+                    .collect(Guavate.toImmutableSet()));
         }
 
         @VisibleForTesting
@@ -111,7 +108,7 @@ public class Keywords {
                 .map(Keyword::new)
                 .collect(Guavate.toImmutableSet());
 
-            return fromSet(setKeywords, Optional.empty());
+            return fromSet(setKeywords);
         }
 
         public Keywords fromFlags(Flags flags) {
@@ -120,8 +117,7 @@ public class Keywords {
                             .flatMap(this::asKeyword),
                         Stream.of(flags.getSystemFlags())
                             .map(Keyword::fromFlag))
-                    .collect(Guavate.toImmutableSet()),
-                Optional.empty());
+                    .collect(Guavate.toImmutableSet()));
         }
 
         private Stream<Keyword> asKeyword(String flagName) {
@@ -139,11 +135,9 @@ public class Keywords {
     }
 
     private final ImmutableSet<Keyword> keywords;
-    private final Optional<OldKeyword> oldKeyword;
 
-    private Keywords(ImmutableSet<Keyword> keywords, Optional<OldKeyword> oldKeyword) {
+    private Keywords(ImmutableSet<Keyword> keywords) {
         this.keywords = keywords;
-        this.oldKeyword = oldKeyword;
     }
 
     public Flags asFlags() {
@@ -181,22 +175,20 @@ public class Keywords {
     public final boolean equals(Object other) {
         if (other instanceof Keywords) {
             Keywords otherKeyword = (Keywords) other;
-            return Objects.equal(keywords, otherKeyword.keywords)
-                && Objects.equal(oldKeyword, otherKeyword.oldKeyword);
+            return Objects.equal(keywords, otherKeyword.keywords);
         }
         return false;
     }
 
     @Override
     public final int hashCode() {
-        return Objects.hashCode(keywords, oldKeyword);
+        return Objects.hashCode(keywords);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
             .add("keywords", keywords)
-            .add("oldKeyword", oldKeyword)
             .toString();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/14e53dc8/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/KeywordsCombiner.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/KeywordsCombiner.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/KeywordsCombiner.java
index 2dba575..185be02 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/KeywordsCombiner.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/KeywordsCombiner.java
@@ -20,7 +20,6 @@
 package org.apache.james.jmap.utils;
 
 import java.util.List;
-import java.util.Optional;
 import java.util.Set;
 import java.util.function.BinaryOperator;
 
@@ -47,8 +46,7 @@ public class KeywordsCombiner implements BinaryOperator<Keywords> {
         return keywordsFactory
             .fromSet(Sets.union(
                         union(keywords.getKeywords(), keywords2.getKeywords(), KEYWORD_NOT_TO_UNION),
-                        intersect(keywords.getKeywords(), keywords2.getKeywords(), KEYWORD_TO_INTERSECT)),
-                    Optional.empty());
+                        intersect(keywords.getKeywords(), keywords2.getKeywords(), KEYWORD_TO_INTERSECT)));
     }
 
     public Set<Keyword> union(Set<Keyword> set1, Set<Keyword> set2, List<Keyword> exceptKeywords) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/14e53dc8/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ParsingWritingObjects.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ParsingWritingObjects.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ParsingWritingObjects.java
index 427a6d9..b81731a 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ParsingWritingObjects.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ParsingWritingObjects.java
@@ -77,7 +77,7 @@ public interface ParsingWritingObjects {
             .threadId(Common.THREAD_ID)
             .mailboxIds(Common.MAILBOX_IDS)
             .inReplyToMessageId(Common.IN_REPLY_TO_MESSAGE_ID)
-            .keywords(Keywords.factory().fromSet(Common.KEYWORDS, Optional.empty()))
+            .keywords(Keywords.factory().fromSet(Common.KEYWORDS))
             .headers(Common.HEADERS)
             .from(Common.FROM)
             .to(Common.TO)

http://git-wip-us.apache.org/repos/asf/james-project/blob/14e53dc8/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/KeywordsTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/KeywordsTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/KeywordsTest.java
index 4c3ca03..29f33ba 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/KeywordsTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/KeywordsTest.java
@@ -22,7 +22,6 @@ package org.apache.james.jmap.model;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.Map;
-import java.util.Optional;
 
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
@@ -77,7 +76,7 @@ public class KeywordsTest {
     @Test
     public void fromSetShouldReturnKeywordsFromSetOfKeywords() throws Exception {
         Keywords keywords = Keywords.factory()
-            .fromSet(ImmutableSet.of(Keyword.ANSWERED), Optional.empty());
+            .fromSet(ImmutableSet.of(Keyword.ANSWERED));
 
         assertThat(keywords.getKeywords())
             .containsOnly(Keyword.ANSWERED);
@@ -86,7 +85,7 @@ public class KeywordsTest {
     @Test
     public void asFlagsShouldBuildFlagsFromKeywords() throws Exception {
         assertThat(Keywords.factory()
-                .fromSet(ImmutableSet.of(Keyword.ANSWERED), Optional.empty())
+                .fromSet(ImmutableSet.of(Keyword.ANSWERED))
                 .asFlags())
             .isEqualTo(new Flags(Flags.Flag.ANSWERED));
     }
@@ -102,7 +101,7 @@ public class KeywordsTest {
             .build();
 
         assertThat(Keywords.factory()
-                .fromSet(ImmutableSet.of(Keyword.ANSWERED), Optional.empty())
+                .fromSet(ImmutableSet.of(Keyword.ANSWERED))
                 .asFlagsWithRecentAndDeletedFrom(originFlags))
             .isEqualTo(expectedFlags);
     }
@@ -118,7 +117,7 @@ public class KeywordsTest {
             .build();
 
         assertThat(Keywords.factory()
-                .fromSet(ImmutableSet.of(Keyword.ANSWERED), Optional.empty())
+                .fromSet(ImmutableSet.of(Keyword.ANSWERED))
                 .asFlagsWithRecentAndDeletedFrom(originFlags))
             .isEqualTo(expectedFlags);
     }
@@ -126,7 +125,7 @@ public class KeywordsTest {
     @Test
     public void asMapShouldReturnEmptyWhenEmptyMapOfStringAndBoolean() throws Exception {
         assertThat(Keywords.factory()
-                .fromSet(ImmutableSet.of(), Optional.empty())
+                .fromSet(ImmutableSet.of())
                 .asMap())
             .isEmpty();;
     }
@@ -135,7 +134,7 @@ public class KeywordsTest {
     public void asMapShouldReturnMapOfStringAndBoolean() throws Exception {
         Map<String, Boolean> expectedMap = ImmutableMap.of("$Answered", Keyword.FLAG_VALUE);
         assertThat(Keywords.factory()
-                .fromSet(ImmutableSet.of(Keyword.ANSWERED), Optional.empty())
+                .fromSet(ImmutableSet.of(Keyword.ANSWERED))
                 .asMap())
             .isEqualTo(expectedMap);
     }
@@ -146,14 +145,14 @@ public class KeywordsTest {
 
         Keywords.factory()
             .throwOnImapNonExposedKeywords()
-            .fromSet(ImmutableSet.of(Keyword.DRAFT, Keyword.DELETED), Optional.empty());
+            .fromSet(ImmutableSet.of(Keyword.DRAFT, Keyword.DELETED));
     }
 
     @Test
     public void throwWhenUnsupportedKeywordShouldNotThrowWhenHaveDraft() throws Exception {
         Keywords keywords = Keywords.factory()
             .throwOnImapNonExposedKeywords()
-            .fromSet(ImmutableSet.of(Keyword.ANSWERED, Keyword.DRAFT), Optional.empty());
+            .fromSet(ImmutableSet.of(Keyword.ANSWERED, Keyword.DRAFT));
 
         assertThat(keywords.getKeywords())
             .containsOnly(Keyword.ANSWERED, Keyword.DRAFT);
@@ -163,7 +162,7 @@ public class KeywordsTest {
     public void filterUnsupportedShouldFilter() throws Exception {
         Keywords keywords = Keywords.factory()
             .filterImapNonExposedKeywords()
-            .fromSet(ImmutableSet.of(Keyword.ANSWERED, Keyword.DELETED, Keyword.RECENT, Keyword.DRAFT), Optional.empty());
+            .fromSet(ImmutableSet.of(Keyword.ANSWERED, Keyword.DELETED, Keyword.RECENT, Keyword.DRAFT));
 
         assertThat(keywords.getKeywords())
             .containsOnly(Keyword.ANSWERED, Keyword.DRAFT);
@@ -172,7 +171,7 @@ public class KeywordsTest {
     @Test
     public void containsShouldReturnTrueWhenKeywordsContainKeyword() {
         Keywords keywords = Keywords.factory()
-            .fromSet(ImmutableSet.of(Keyword.SEEN), Optional.empty());
+            .fromSet(ImmutableSet.of(Keyword.SEEN));
 
         assertThat(keywords.contains(Keyword.SEEN)).isTrue();
     }
@@ -180,7 +179,7 @@ public class KeywordsTest {
     @Test
     public void containsShouldReturnFalseWhenKeywordsDoNotContainKeyword() {
         Keywords keywords = Keywords.factory()
-            .fromSet(ImmutableSet.of(), Optional.empty());
+            .fromSet(ImmutableSet.of());
 
         assertThat(keywords.contains(Keyword.SEEN)).isFalse();
     }


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


[02/11] james-project git commit: JAMES-2257 add builder for oldKeywords

Posted by bt...@apache.org.
JAMES-2257 add builder for oldKeywords


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

Branch: refs/heads/master
Commit: 0e6082eb3f5a7f5cf7b2fc0f45b9e91ba63ce564
Parents: e9ef473
Author: Luc DUZAN <ld...@linagora.com>
Authored: Mon Dec 11 18:18:53 2017 +0100
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:00:36 2017 +0700

----------------------------------------------------------------------
 .../james/jmap/model/CreationMessage.java       | 21 +++---
 .../org/apache/james/jmap/model/OldKeyword.java | 77 ++++++++++++++++++--
 .../james/jmap/model/UpdateMessagePatch.java    | 21 ++----
 .../apache/james/jmap/model/OldKeywordTest.java | 68 +++++++++--------
 4 files changed, 126 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/0e6082eb/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
index 625f42d..39840e5 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
@@ -59,11 +59,7 @@ public class CreationMessage {
     public static class Builder {
         private ImmutableList<String> mailboxIds;
         private String inReplyToMessageId;
-        private Optional<Boolean> isUnread = Optional.empty();
-        private Optional<Boolean> isFlagged = Optional.empty();
-        private Optional<Boolean> isAnswered = Optional.empty();
-        private Optional<Boolean> isDraft = Optional.empty();
-        private Optional<Boolean> isForwarded = Optional.empty();
+        private final OldKeyword.Builder oldKeywordBuilder;
         private final ImmutableMap.Builder<String, String> headers;
         private Optional<DraftEmailer> from = Optional.empty();
         private final ImmutableList.Builder<DraftEmailer> to;
@@ -86,6 +82,7 @@ public class CreationMessage {
             attachments = ImmutableList.builder();
             attachedMessages = ImmutableMap.builder();
             headers = ImmutableMap.builder();
+            oldKeywordBuilder = OldKeyword.builder();
         }
 
         public Builder mailboxId(String... mailboxIds) {
@@ -104,27 +101,27 @@ public class CreationMessage {
         }
 
         public Builder isUnread(Optional<Boolean> isUnread) {
-            this.isUnread = isUnread;
+            oldKeywordBuilder.isUnread(isUnread);
             return this;
         }
 
         public Builder isFlagged(Optional<Boolean> isFlagged) {
-            this.isFlagged = isFlagged;
+            oldKeywordBuilder.isFlagged(isFlagged);
             return this;
         }
 
         public Builder isAnswered(Optional<Boolean> isAnswered) {
-            this.isAnswered = isAnswered;
+            oldKeywordBuilder.isAnswered(isAnswered);
             return this;
         }
 
         public Builder isDraft(Optional<Boolean> isDraft) {
-            this.isDraft = isDraft;
+            oldKeywordBuilder.isDraft(isDraft);
             return this;
         }
 
         public Builder isForwarded(Optional<Boolean> isForwarded) {
-            this.isForwarded = isForwarded;
+            oldKeywordBuilder.isForwarded(isForwarded);
             return this;
         }
 
@@ -221,8 +218,8 @@ public class CreationMessage {
             }
 
             Optional<Keywords> maybeKeywords = creationKeywords();
-            Optional<OldKeyword> oldKeywords = OldKeyword.computeOldKeywords(
-                isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+            Optional<OldKeyword> oldKeywords = oldKeywordBuilder.computeOldKeyword();
+
             Preconditions.checkArgument(!(maybeKeywords.isPresent() && oldKeywords.isPresent()), "Does not support keyword and is* at the same time");
             return new CreationMessage(mailboxIds, Optional.ofNullable(inReplyToMessageId), headers.build(), from,
                     to.build(), cc.build(), bcc.build(), replyTo.build(), subject, date, Optional.ofNullable(textBody), Optional.ofNullable(htmlBody),

http://git-wip-us.apache.org/repos/asf/james-project/blob/0e6082eb/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
index b240b54..a3aed3a 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
@@ -28,12 +28,79 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 
 public class OldKeyword {
-    public static Optional<OldKeyword> computeOldKeywords(Optional<Boolean> isUnread, Optional<Boolean> isFlagged, Optional<Boolean> isAnswered,
-                                                          Optional<Boolean> isDraft, Optional<Boolean> isForwarded) {
-        if (isAnswered.isPresent() || isFlagged.isPresent() || isUnread.isPresent() || isForwarded.isPresent() || isDraft.isPresent()) {
-            return Optional.of(new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded));
+
+    public static class Builder {
+        private Optional<Boolean> isUnread;
+        private Optional<Boolean> isFlagged;
+        private Optional<Boolean> isAnswered;
+        private Optional<Boolean> isDraft;
+        private Optional<Boolean> isForwarded;
+
+        private Builder() {
+            isUnread = Optional.empty();
+            isFlagged = Optional.empty();
+            isAnswered = Optional.empty();
+            isDraft = Optional.empty();
+            isForwarded = Optional.empty();
+        }
+
+        public Builder isFlagged(Optional<Boolean> isFlagged) {
+            this.isFlagged = isFlagged;
+            return this;
+        }
+
+        public Builder isFlagged(boolean isFlagged) {
+            return isFlagged(Optional.of(isFlagged));
+        }
+
+        public Builder isUnread(Optional<Boolean> isUnread) {
+            this.isUnread = isUnread;
+            return this;
         }
-        return Optional.empty();
+
+        public Builder isUnread(boolean isUnread) {
+            return isUnread(Optional.of(isUnread));
+        }
+
+        public Builder isAnswered(Optional<Boolean> isAnswered) {
+            this.isAnswered = isAnswered;
+            return this;
+        }
+
+        public Builder isAnswered(boolean isAnswered) {
+            return isAnswered(Optional.of(isAnswered));
+        }
+
+        public Builder isDraft(Optional<Boolean> isDraft) {
+            this.isDraft = isDraft;
+            return this;
+        }
+
+        public Builder isDraft(boolean isDraft) {
+            return isDraft(Optional.of(isDraft));
+        }
+
+        public Builder isForwarded(Optional<Boolean> isForwarded) {
+            this.isForwarded = isForwarded;
+            return this;
+        }
+
+        public Builder isForwarded(boolean isForwarded) {
+            return isForwarded(Optional.of(isForwarded));
+        }
+
+        public Optional<OldKeyword> computeOldKeyword() {
+            if (isAnswered.isPresent() || isFlagged.isPresent() || isUnread.isPresent() || isForwarded.isPresent() || isDraft.isPresent()) {
+                return Optional.of(new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded));
+            }
+
+            return Optional.empty();
+        }
+
+    }
+
+    public static Builder builder() {
+        return new Builder();
     }
 
     private final Optional<Boolean> isUnread;

http://git-wip-us.apache.org/repos/asf/james-project/blob/0e6082eb/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 19671a9..830181b 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
@@ -47,11 +47,7 @@ public class UpdateMessagePatch {
     @JsonPOJOBuilder(withPrefix = "")
     public static class 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 Optional<Boolean> isForwarded = Optional.empty();
-        private Optional<Boolean> isDraft = Optional.empty();
+        private OldKeyword.Builder oldKeyworkBuilder = OldKeyword.builder();
         private Optional<Map<String, Boolean>> keywords = Optional.empty();
         private Set<ValidationResult> validationResult = Sets.newHashSet();
 
@@ -66,27 +62,27 @@ public class UpdateMessagePatch {
         }
 
         public Builder isFlagged(Boolean isFlagged) {
-            this.isFlagged = Optional.of(isFlagged);
+            oldKeyworkBuilder.isFlagged(isFlagged);
             return this;
         }
 
         public Builder isUnread(Boolean isUnread) {
-            this.isUnread = Optional.of(isUnread);
+            oldKeyworkBuilder.isUnread(isUnread);
             return this;
         }
 
         public Builder isAnswered(Boolean isAnswered) {
-            this.isAnswered = Optional.of(isAnswered);
+            oldKeyworkBuilder.isAnswered(isAnswered);
             return this;
         }
 
-        public Builder isDraft(Boolean isAnswered) {
-            this.isDraft = Optional.of(isAnswered);
+        public Builder isDraft(Boolean isDraft) {
+            oldKeyworkBuilder.isDraft(isDraft);
             return this;
         }
 
         public Builder isForwarded(Boolean isForwarded) {
-            this.isForwarded = Optional.of(isForwarded);
+            oldKeyworkBuilder.isForwarded(isForwarded);
             return this;
         }
 
@@ -104,8 +100,7 @@ public class UpdateMessagePatch {
             }
 
             Optional<Keywords> mayBeKeywords = creationKeywords();
-            Optional<OldKeyword> oldKeywords = OldKeyword.computeOldKeywords(
-                isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+            Optional<OldKeyword> oldKeywords = oldKeyworkBuilder.computeOldKeyword();
             Preconditions.checkArgument(!(mayBeKeywords.isPresent() && oldKeywords.isPresent()), "Does not support keyword and is* at the same time");
 
             return new UpdateMessagePatch(mailboxIds, mayBeKeywords, oldKeywords, ImmutableList.copyOf(validationResult));

http://git-wip-us.apache.org/repos/asf/james-project/blob/0e6082eb/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
index 3d28be6..e703098 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
@@ -38,60 +38,66 @@ public class OldKeywordTest {
 
     @Test
     public void computeOldKeywordsShouldReturnEmptyWhenAllEmpty() {
-        Optional<Boolean> isUnread = Optional.empty();
-        Optional<Boolean> isFlagged = Optional.empty();
-        Optional<Boolean> isAnswered = Optional.empty();
-        Optional<Boolean> isDraft = Optional.empty();
-        Optional<Boolean> isForwarded = Optional.empty();
-        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
 
         assertThat(testee).isEmpty();
     }
 
     @Test
     public void applyStateShouldSetFlaggedOnlyWhenIsFlagged() {
-        Optional<Boolean> isUnread = Optional.empty();
-        Optional<Boolean> isFlagged = Optional.of(true);
-        Optional<Boolean> isAnswered = Optional.empty();
-        Optional<Boolean> isDraft = Optional.empty();
-        Optional<Boolean> isForwarded = Optional.empty();
-        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.of(true))
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags())).isEqualTo(new Flags(Flag.FLAGGED));
     }
 
     @Test
     public void applyStateShouldRemoveFlaggedWhenEmptyIsFlaggedOnFlaggedMessage() {
-        Optional<Boolean> isUnread = Optional.empty();
-        Optional<Boolean> isFlagged = Optional.of(false);
-        Optional<Boolean> isAnswered = Optional.empty();
-        Optional<Boolean> isDraft = Optional.empty();
-        Optional<Boolean> isForwarded = Optional.empty();
-        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
-        
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.of(false))
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
         assertThat(testee.get().applyToState(new Flags(Flag.FLAGGED))).isEqualTo(new Flags());
     }
 
+
     @Test
     public void applyStateShouldReturnUnreadFlagWhenUnreadSetOnSeenMessage() {
-        Optional<Boolean> isUnread = Optional.of(true);
-        Optional<Boolean> isFlagged = Optional.empty();
-        Optional<Boolean> isAnswered = Optional.empty();
-        Optional<Boolean> isDraft = Optional.empty();
-        Optional<Boolean> isForwarded = Optional.empty();
-        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.of(true))
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags());
     }
 
     @Test
     public void applyStateShouldReturnSeenWhenPatchSetsSeenOnSeenMessage() {
-        Optional<Boolean> isUnread = Optional.of(false);
-        Optional<Boolean> isFlagged = Optional.empty();
-        Optional<Boolean> isAnswered = Optional.empty();
-        Optional<Boolean> isDraft = Optional.empty();
-        Optional<Boolean> isForwarded = Optional.empty();
-        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.of(false))
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags(Flag.SEEN));
     }


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


[03/11] james-project git commit: JAMES-2257 Correct JMAP integration tests

Posted by bt...@apache.org.
JAMES-2257 Correct JMAP integration tests

Allow reseting draft at the same time of other flags using is\* properties


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

Branch: refs/heads/master
Commit: 9d2f656168ab095efb5d39923826b564e4f3d959
Parents: fb047aa
Author: benwa <bt...@linagora.com>
Authored: Tue Dec 12 10:48:17 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:00:36 2017 +0700

----------------------------------------------------------------------
 .../integration/SetMessagesMethodTest.java       | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9d2f6561/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 196fb6a..2083038 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
@@ -5192,8 +5192,9 @@ public abstract class SetMessagesMethodTest {
             .body(ARGUMENTS + ".list[0].isForwarded", equalTo(true));
     }
 
+    @Ignore("JAMES-2257 isDraft is rejected during message creation")
     @Test
-    public void setMessagesShouldReturnErrorWhenTryingToChangeDraftFlagAmongOthers() {
+    public void setMessagesShouldNotReturnAnErrorWhenTryingToChangeDraftFlagAmongOthers() {
         String messageCreationId = "creationId1337";
         String fromAddress = USERNAME;
         String requestBody = "[" +
@@ -5248,11 +5249,15 @@ public abstract class SetMessagesMethodTest {
         .when()
             .post("/jmap")
         .then()
-            .statusCode(400);
+            .statusCode(200)
+            .body(ARGUMENTS + ".updated", hasSize(1))
+            .body(ARGUMENTS + ".updated", contains(messageId));
+
     }
 
+    @Ignore("JAMES-2257 isDraft is rejected during message creation")
     @Test
-    public void setMessagesShouldNotModifyTheMessageWhenTryingToChangeDraftFlagAmongOthers() {
+    public void setMessagesShouldModifyTheMessageWhenTryingToChangeDraftFlagAmongOthers() {
         String messageCreationId = "creationId1337";
         String fromAddress = USERNAME;
         String requestBody = "[" +
@@ -5315,10 +5320,10 @@ public abstract class SetMessagesMethodTest {
             .log().ifValidationFails()
             .body(NAME, equalTo("messages"))
             .body(ARGUMENTS + ".list", hasSize(1))
-            .body(ARGUMENTS + ".list[0].isUnread", equalTo(true))
-            .body(ARGUMENTS + ".list[0].isFlagged", equalTo(true))
-            .body(ARGUMENTS + ".list[0].isAnswered", equalTo(true))
-            .body(ARGUMENTS + ".list[0].isDraft", equalTo(true))
+            .body(ARGUMENTS + ".list[0].isUnread", equalTo(false))
+            .body(ARGUMENTS + ".list[0].isFlagged", equalTo(false))
+            .body(ARGUMENTS + ".list[0].isAnswered", equalTo(false))
+            .body(ARGUMENTS + ".list[0].isDraft", equalTo(false))
             .body(ARGUMENTS + ".list[0].isForwarded", equalTo(true));
     }
 }


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


[07/11] james-project git commit: JAMES-2257 OldKeyword as Keywords

Posted by bt...@apache.org.
JAMES-2257 OldKeyword as Keywords

We should limit at the maximum the spread of the knowledge of OldKeywords.

In some situation an OldKeyword is a relative view of the data (during updates), sometine an absolute view of the data (while creating it).
When we create a message we can simply concider the OldKeywords as a normal Keywords.

See later on, it brings significant simplifications...


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

Branch: refs/heads/master
Commit: bf9d789b7f3e0ff4248660d71309d58b0b00dc44
Parents: 14e53dc
Author: benwa <bt...@linagora.com>
Authored: Tue Dec 12 08:51:41 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:03:32 2017 +0700

----------------------------------------------------------------------
 .../org/apache/james/jmap/model/OldKeyword.java |  26 ++--
 .../apache/james/jmap/model/OldKeywordTest.java | 141 +++++++++++++++++++
 2 files changed, 157 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/bf9d789b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
index a3aed3a..019d7aa 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
@@ -23,7 +23,10 @@ import java.util.Optional;
 
 import javax.mail.Flags;
 
-import com.google.common.annotations.VisibleForTesting;
+import org.apache.james.util.OptionalUtils;
+import org.apache.james.util.StreamUtils;
+
+import com.github.steveash.guavate.Guavate;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 
@@ -109,15 +112,6 @@ public class OldKeyword {
     private final Optional<Boolean> isDraft;
     private final Optional<Boolean> isForwarded;
 
-    @VisibleForTesting
-    OldKeyword(boolean isUnread, boolean isFlagged, boolean isAnswered, boolean isDraft, boolean isForwarded) {
-        this.isUnread = Optional.of(isUnread);
-        this.isFlagged = Optional.of(isFlagged);
-        this.isAnswered = Optional.of(isAnswered);
-        this.isDraft = Optional.of(isDraft);
-        this.isForwarded = Optional.of(isForwarded);
-    }
-
     private OldKeyword(Optional<Boolean> isUnread, Optional<Boolean> isFlagged, Optional<Boolean> isAnswered,
                       Optional<Boolean> isDraft, Optional<Boolean> isForwarded) {
         this.isUnread = isUnread;
@@ -191,6 +185,18 @@ public class OldKeyword {
         return newStateFlags;
     }
 
+    public Keywords asKeywords() {
+        return Keywords.factory()
+            .fromSet(StreamUtils
+                .flatten(
+                    OptionalUtils.toStream(isAnswered.filter(b -> b).map(b -> Keyword.ANSWERED)),
+                    OptionalUtils.toStream(isDraft.filter(b -> b).map(b -> Keyword.DRAFT)),
+                    OptionalUtils.toStream(isForwarded.filter(b -> b).map(b -> Keyword.FORWARDED)),
+                    OptionalUtils.toStream(isFlagged.filter(b -> b).map(b -> Keyword.FLAGGED)),
+                    OptionalUtils.toStream(isUnread.filter(b -> !b).map(b -> Keyword.SEEN)))
+                .collect(Guavate.toImmutableSet()));
+    }
+
     @Override
     public final boolean equals(Object other) {
         if (other instanceof OldKeyword) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/bf9d789b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
index e703098..9b4d8b3 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
@@ -37,6 +37,147 @@ public class OldKeywordTest {
     }
 
     @Test
+    public void asKeywordsShouldContainFlaggedWhenIsFlagged() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.of(true))
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from(Keyword.FLAGGED));
+    }
+
+    @Test
+    public void asKeywordsShouldNotContainFlaggedWhenIsNotFlagged() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.of(false))
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from());
+    }
+
+    @Test
+    public void asKeywordsShouldNotContainSeenWhenIsUnRead() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.of(true))
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from());
+    }
+
+    @Test
+    public void asKeywordsShouldContainSeenWhenIsRead() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.of(false))
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from(Keyword.SEEN));
+    }
+
+    @Test
+    public void asKeywordsShouldContainAnsweredWhenIsAnswered() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.of(true))
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from(Keyword.ANSWERED));
+    }
+
+    @Test
+    public void asKeywordsShouldNotContainAnsweredWhenIsNotAnswered() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.of(false))
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from());
+    }
+
+    @Test
+    public void asKeywordsShouldContainDraftWhenIsDraft() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.of(true))
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from(Keyword.DRAFT));
+    }
+
+    @Test
+    public void asKeywordsShouldNotContainDraftWhenIsNotDraft() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.of(false))
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from());
+    }
+
+    @Test
+    public void asKeywordsShouldContainForwardedWhenIsForwarded() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.of(true))
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from(Keyword.FORWARDED));
+    }
+
+    @Test
+    public void asKeywordsShouldNotContainForwardedWhenIsNotForwarded() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.empty())
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.of(false))
+            .computeOldKeyword();
+
+        assertThat(testee.get().asKeywords())
+            .isEqualTo(Keywords.factory().from());
+    }
+
+    @Test
     public void computeOldKeywordsShouldReturnEmptyWhenAllEmpty() {
         Optional<OldKeyword> testee = OldKeyword.builder()
             .isUnread(Optional.empty())


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


[06/11] james-project git commit: JAMES-2257 OldKeywords builder empty arguments are redundant

Posted by bt...@apache.org.
JAMES-2257 OldKeywords builder empty arguments are redundant


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

Branch: refs/heads/master
Commit: 9d3bbbd313a90352037fa7041e4869c5284b3b0a
Parents: 71a6b1b
Author: benwa <bt...@linagora.com>
Authored: Tue Dec 12 16:29:59 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:03:32 2017 +0700

----------------------------------------------------------------------
 .../apache/james/jmap/model/OldKeywordTest.java | 69 --------------------
 1 file changed, 69 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9d3bbbd3/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
index 46bdce4..7ef8625 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
@@ -40,11 +40,7 @@ public class OldKeywordTest {
     @Test
     public void asKeywordsShouldContainFlaggedWhenIsFlagged() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
             .isFlagged(Optional.of(true))
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().asKeywords())
@@ -54,11 +50,7 @@ public class OldKeywordTest {
     @Test
     public void asKeywordsShouldNotContainFlaggedWhenIsNotFlagged() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
             .isFlagged(Optional.of(false))
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().asKeywords())
@@ -69,10 +61,6 @@ public class OldKeywordTest {
     public void asKeywordsShouldNotContainSeenWhenIsUnRead() {
         Optional<OldKeyword> testee = OldKeyword.builder()
             .isUnread(Optional.of(true))
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().asKeywords())
@@ -83,10 +71,6 @@ public class OldKeywordTest {
     public void asKeywordsShouldContainSeenWhenIsRead() {
         Optional<OldKeyword> testee = OldKeyword.builder()
             .isUnread(Optional.of(false))
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
 
@@ -97,11 +81,7 @@ public class OldKeywordTest {
     @Test
     public void asKeywordsShouldContainAnsweredWhenIsAnswered() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
-            .isFlagged(Optional.empty())
             .isAnswered(Optional.of(true))
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().asKeywords())
@@ -111,11 +91,7 @@ public class OldKeywordTest {
     @Test
     public void asKeywordsShouldNotContainAnsweredWhenIsNotAnswered() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
-            .isFlagged(Optional.empty())
             .isAnswered(Optional.of(false))
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().asKeywords())
@@ -125,11 +101,7 @@ public class OldKeywordTest {
     @Test
     public void asKeywordsShouldContainDraftWhenIsDraft() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
             .isDraft(Optional.of(true))
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().asKeywords())
@@ -139,11 +111,7 @@ public class OldKeywordTest {
     @Test
     public void asKeywordsShouldNotContainDraftWhenIsNotDraft() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
             .isDraft(Optional.of(false))
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().asKeywords())
@@ -153,10 +121,6 @@ public class OldKeywordTest {
     @Test
     public void asKeywordsShouldContainForwardedWhenIsForwarded() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
             .isForwarded(Optional.of(true))
             .computeOldKeyword();
 
@@ -167,10 +131,6 @@ public class OldKeywordTest {
     @Test
     public void asKeywordsShouldNotContainForwardedWhenIsNotForwarded() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
             .isForwarded(Optional.of(false))
             .computeOldKeyword();
 
@@ -181,11 +141,6 @@ public class OldKeywordTest {
     @Test
     public void computeOldKeywordsShouldReturnEmptyWhenAllEmpty() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee).isEmpty();
@@ -194,11 +149,7 @@ public class OldKeywordTest {
     @Test
     public void applyStateShouldSetFlaggedOnlyWhenIsFlagged() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
             .isFlagged(Optional.of(true))
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags())).isEqualTo(new Flags(Flag.FLAGGED));
@@ -207,11 +158,7 @@ public class OldKeywordTest {
     @Test
     public void applyStateShouldRemoveFlaggedWhenEmptyIsFlaggedOnFlaggedMessage() {
         Optional<OldKeyword> testee = OldKeyword.builder()
-            .isUnread(Optional.empty())
             .isFlagged(Optional.of(false))
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags(Flag.FLAGGED))).isEqualTo(new Flags());
@@ -222,10 +169,6 @@ public class OldKeywordTest {
     public void applyStateShouldReturnUnreadFlagWhenUnreadSetOnSeenMessage() {
         Optional<OldKeyword> testee = OldKeyword.builder()
             .isUnread(Optional.of(true))
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags());
@@ -235,10 +178,6 @@ public class OldKeywordTest {
     public void applyStateShouldReturnSeenWhenPatchSetsSeenOnSeenMessage() {
         Optional<OldKeyword> testee = OldKeyword.builder()
             .isUnread(Optional.of(false))
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags(Flag.SEEN));
@@ -248,10 +187,6 @@ public class OldKeywordTest {
     public void applyStateShouldPreserveRecentFlag() {
         Optional<OldKeyword> testee = OldKeyword.builder()
             .isUnread(Optional.of(false))
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags(Flag.RECENT)))
@@ -262,10 +197,6 @@ public class OldKeywordTest {
     public void applyStateShouldPreserveDeletedFlag() {
         Optional<OldKeyword> testee = OldKeyword.builder()
             .isUnread(Optional.of(false))
-            .isFlagged(Optional.empty())
-            .isAnswered(Optional.empty())
-            .isDraft(Optional.empty())
-            .isForwarded(Optional.empty())
             .computeOldKeyword();
 
         assertThat(testee.get().applyToState(new Flags(Flag.DELETED)))


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


[10/11] james-project git commit: JAMES-2257 Remove now useless OldKeywords::asFlags

Posted by bt...@apache.org.
JAMES-2257 Remove now useless OldKeywords::asFlags

We rely on Keywords::asFlags instead.


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

Branch: refs/heads/master
Commit: 8ef14e2d1e36aca43d82745d3efb4f30555732f5
Parents: bf9d789
Author: benwa <bt...@linagora.com>
Authored: Tue Dec 12 08:56:13 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:03:32 2017 +0700

----------------------------------------------------------------------
 .../james/jmap/methods/MessageAppender.java     |  8 ++++---
 .../methods/SetMessagesCreationProcessor.java   | 12 +++++------
 .../org/apache/james/jmap/model/OldKeyword.java | 22 --------------------
 3 files changed, 10 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8ef14e2d/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java
index 7bb2edc..dd3e7e8 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java
@@ -107,9 +107,11 @@ public class MessageAppender {
 
     private Flags getFlags(CreationMessage message) {
         return message.getOldKeyword()
-                .map(OldKeyword::asFlags)
-                .orElseGet(() -> keywordsOrDefault(message)
-                                    .asFlags());
+            .map(OldKeyword::asKeywords)
+            .map(Optional::of)
+            .orElse(message.getKeywords())
+            .orElse(Keywords.DEFAULT_VALUE)
+            .asFlags();
     }
 
     private Keywords keywordsOrDefault(CreationMessage message) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ef14e2d/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 00e4c1c..21a52c0 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
@@ -45,6 +45,7 @@ import org.apache.james.jmap.model.MessageFactory;
 import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent;
 import org.apache.james.jmap.model.MessageProperties;
 import org.apache.james.jmap.model.MessageProperties.MessageProperty;
+import org.apache.james.jmap.model.OldKeyword;
 import org.apache.james.jmap.model.SetError;
 import org.apache.james.jmap.model.SetMessagesError;
 import org.apache.james.jmap.model.SetMessagesRequest;
@@ -238,13 +239,10 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
 
 
     private Boolean isDraft(CreationMessage creationMessage) {
-        if (creationMessage.getOldKeyword().isPresent()) {
-            return creationMessage.getOldKeyword().get()
-                        .isDraft()
-                        .orElse(false);
-        }
-        return creationMessage
-            .getKeywords()
+        return creationMessage.getOldKeyword()
+            .map(OldKeyword::asKeywords)
+            .map(Optional::of)
+            .orElse(creationMessage.getKeywords())
             .map(keywords -> keywords.contains(Keyword.DRAFT))
             .orElse(false);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8ef14e2d/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
index 019d7aa..f205bb9 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
@@ -163,28 +163,6 @@ public class OldKeyword {
         return newStateFlags;
     }
 
-    public Flags asFlags() {
-        Flags newStateFlags = new Flags();
-
-        if (isFlagged().orElse(false)) {
-            newStateFlags.add(Flags.Flag.FLAGGED);
-        }
-        if (isAnswered().orElse(false)) {
-            newStateFlags.add(Flags.Flag.ANSWERED);
-        }
-        if (isDraft().orElse(false)) {
-            newStateFlags.add(Flags.Flag.DRAFT);
-        }
-        if (isForwarded().orElse(false)) {
-            newStateFlags.add(new Flags("$Forwarded"));
-        }
-        boolean shouldMessageBeMarkSeen = isUnread().map(b -> !b).orElse(false);
-        if (shouldMessageBeMarkSeen) {
-            newStateFlags.add(Flags.Flag.SEEN);
-        }
-        return newStateFlags;
-    }
-
     public Keywords asKeywords() {
         return Keywords.factory()
             .fromSet(StreamUtils


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


[09/11] james-project git commit: JAMES-2257 Centralize OldKeyword knowledge

Posted by bt...@apache.org.
JAMES-2257 Centralize OldKeyword knowledge

We just need to explicitly handle OldKeywords in two points: during updates and during message creations. We should ensure that a single class in each process encapsulate this knowledge and don't leak
it.


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

Branch: refs/heads/master
Commit: 71a6b1b1ab70c71773cfe9df65402d832961460e
Parents: 4357889
Author: benwa <bt...@linagora.com>
Authored: Tue Dec 12 09:07:10 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:03:32 2017 +0700

----------------------------------------------------------------------
 .../james/jmap/methods/MessageAppender.java     | 16 ++-------
 .../methods/SetMessagesUpdateProcessor.java     | 24 ++------------
 .../james/jmap/model/CreationMessage.java       | 35 ++++++++++----------
 .../james/jmap/model/UpdateMessagePatch.java    | 16 +++------
 .../apache/james/jmap/model/OldKeywordTest.java | 13 +++++++-
 .../jmap/model/UpdateMessagePatchTest.java      | 33 ++++++++++++++++++
 6 files changed, 72 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/71a6b1b1/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java
index dd3e7e8..c74f59d 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MessageAppender.java
@@ -30,9 +30,7 @@ import javax.mail.util.SharedByteArrayInputStream;
 import org.apache.james.jmap.methods.ValueWithId.CreationMessageEntry;
 import org.apache.james.jmap.model.Attachment;
 import org.apache.james.jmap.model.CreationMessage;
-import org.apache.james.jmap.model.Keywords;
 import org.apache.james.jmap.model.MessageFactory;
-import org.apache.james.jmap.model.OldKeyword;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -89,7 +87,7 @@ public class MessageAppender {
 
         return MessageFactory.MetaDataWithContent.builder()
             .uid(message.getUid())
-            .keywords(keywordsOrDefault(createdEntry.getValue()))
+            .keywords(createdEntry.getValue().getKeywords())
             .internalDate(internalDate.toInstant())
             .sharedContent(content)
             .size(messageContent.length)
@@ -106,17 +104,7 @@ public class MessageAppender {
     }
 
     private Flags getFlags(CreationMessage message) {
-        return message.getOldKeyword()
-            .map(OldKeyword::asKeywords)
-            .map(Optional::of)
-            .orElse(message.getKeywords())
-            .orElse(Keywords.DEFAULT_VALUE)
-            .asFlags();
-    }
-
-    private Keywords keywordsOrDefault(CreationMessage message) {
-        return message.getKeywords()
-                .orElse(Keywords.DEFAULT_VALUE);
+        return message.getKeywords().asFlags();
     }
 
     private ImmutableList<MessageAttachment> getMessageAttachments(MailboxSession session, ImmutableList<Attachment> attachments) throws MailboxException {

http://git-wip-us.apache.org/repos/asf/james-project/blob/71a6b1b1/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 3fd703b..02ae2d2 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
@@ -40,7 +40,6 @@ import org.apache.james.core.MailAddress;
 import org.apache.james.jmap.exceptions.DraftMessageMailboxUpdateException;
 import org.apache.james.jmap.exceptions.InvalidOutboxMoveException;
 import org.apache.james.jmap.model.MessageProperties;
-import org.apache.james.jmap.model.OldKeyword;
 import org.apache.james.jmap.model.SetError;
 import org.apache.james.jmap.model.SetMessagesRequest;
 import org.apache.james.jmap.model.SetMessagesResponse;
@@ -216,13 +215,6 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
             .orElse(previousMailboxes);
     }
 
-    private List<Flags> flagsFromOldKeyword(List<MessageResult> messagesToBeUpdated, OldKeyword oldKeyword) {
-        return messagesToBeUpdated.stream()
-                .map(MessageResult::getFlags)
-                .map(oldKeyword::applyToState)
-                .collect(Guavate.toImmutableList());
-    }
-
     private List<MailboxId> mailboxIdFor(Role role, MailboxSession session) throws MailboxException {
         return systemMailboxesProvider.getMailboxByRole(role, session)
             .map(MessageManager::getId)
@@ -260,7 +252,9 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
     private Stream<MailboxException> updateFlags(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, MessageResult messageResult) {
         try {
             if (!updateMessagePatch.isFlagsIdentity()) {
-                messageIdManager.setFlags(newState(messageResult, updateMessagePatch), FlagsUpdateMode.REPLACE, messageId, ImmutableList.of(messageResult.getMailboxId()), mailboxSession);
+                messageIdManager.setFlags(
+                    updateMessagePatch.applyToState(messageResult.getFlags()),
+                    FlagsUpdateMode.REPLACE, messageId, ImmutableList.of(messageResult.getMailboxId()), mailboxSession);
             }
             return Stream.of();
         } catch (MailboxException e) {
@@ -268,18 +262,6 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
         }
     }
 
-    private Flags newState(MessageResult messageResult, UpdateMessagePatch updateMessagePatch) {
-        return updateMessagePatch.getOldKeyword()
-                .map(oldKeyword -> firstFlagsFromOldKeyword(ImmutableList.of(messageResult), oldKeyword))
-                .orElse(updateMessagePatch.applyToState(messageResult.getFlags()));
-    }
-
-    private Flags firstFlagsFromOldKeyword(List<MessageResult> messagesToBeUpdated, OldKeyword oldKeyword) {
-        return flagsFromOldKeyword(messagesToBeUpdated, oldKeyword).stream()
-                .findFirst()
-                .orElse(null);
-    }
-
     private void setInMailboxes(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession) throws MailboxException {
         Optional<List<String>> serializedMailboxIds = updateMessagePatch.getMailboxIds();
         if (serializedMailboxIds.isPresent()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/71a6b1b1/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
index 6c7f170..fb45422 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
@@ -34,6 +34,7 @@ import javax.mail.internet.InternetAddress;
 import org.apache.james.jmap.methods.ValidationResult;
 import org.apache.james.jmap.model.MessageProperties.MessageProperty;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.util.OptionalUtils;
 
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
@@ -220,10 +221,9 @@ public class CreationMessage {
             Optional<Keywords> maybeKeywords = creationKeywords();
             Optional<OldKeyword> oldKeywords = oldKeywordBuilder.computeOldKeyword();
 
-            Preconditions.checkArgument(!(maybeKeywords.isPresent() && oldKeywords.isPresent()), "Does not support keyword and is* at the same time");
             return new CreationMessage(mailboxIds, Optional.ofNullable(inReplyToMessageId), headers.build(), from,
                     to.build(), cc.build(), bcc.build(), replyTo.build(), subject, date, Optional.ofNullable(textBody), Optional.ofNullable(htmlBody),
-                    attachments, attachedMessages, maybeKeywords, oldKeywords);
+                    attachments, attachedMessages, computeKeywords(maybeKeywords, oldKeywords));
         }
 
         private Optional<Keywords> creationKeywords() {
@@ -232,6 +232,14 @@ public class CreationMessage {
                     .fromMap(map));
         }
 
+        public Keywords computeKeywords(Optional<Keywords> keywords, Optional<OldKeyword> oldKeywords) {
+            Preconditions.checkArgument(!(keywords.isPresent() && oldKeywords.isPresent()), "Does not support keyword and is* at the same time");
+            return OptionalUtils
+                .or(keywords,
+                    oldKeywords.map(OldKeyword::asKeywords))
+                .orElse(Keywords.DEFAULT_VALUE);
+        }
+
     }
 
     private final ImmutableList<String> mailboxIds;
@@ -248,13 +256,12 @@ public class CreationMessage {
     private final Optional<String> htmlBody;
     private final ImmutableList<Attachment> attachments;
     private final ImmutableMap<BlobId, SubMessage> attachedMessages;
-    private final Optional<Keywords> keywords;
-    private final Optional<OldKeyword> oldKeyword;
+    private final Keywords keywords;
 
     @VisibleForTesting
     CreationMessage(ImmutableList<String> mailboxIds, Optional<String> inReplyToMessageId, ImmutableMap<String, String> headers, Optional<DraftEmailer> from,
                     ImmutableList<DraftEmailer> to, ImmutableList<DraftEmailer> cc, ImmutableList<DraftEmailer> bcc, ImmutableList<DraftEmailer> replyTo, String subject, ZonedDateTime date, Optional<String> textBody, Optional<String> htmlBody, ImmutableList<Attachment> attachments,
-                    ImmutableMap<BlobId, SubMessage> attachedMessages, Optional<Keywords> keywords, Optional<OldKeyword> oldKeyword) {
+                    ImmutableMap<BlobId, SubMessage> attachedMessages, Keywords keywords) {
         this.mailboxIds = mailboxIds;
         this.inReplyToMessageId = inReplyToMessageId;
         this.headers = headers;
@@ -270,7 +277,10 @@ public class CreationMessage {
         this.attachments = attachments;
         this.attachedMessages = attachedMessages;
         this.keywords = keywords;
-        this.oldKeyword = oldKeyword;
+    }
+
+    public Keywords getKeywords() {
+        return keywords;
     }
 
     public ImmutableList<String> getMailboxIds() {
@@ -334,18 +344,7 @@ public class CreationMessage {
     }
 
     public boolean isDraft() {
-        return oldKeyword
-            .map(OldKeyword::isDraft)
-            .orElse(keywords.map(keywords -> keywords.contains(Keyword.DRAFT)))
-            .orElse(false);
-    }
-
-    public Optional<Keywords> getKeywords() {
-        return keywords;
-    }
-
-    public Optional<OldKeyword> getOldKeyword() {
-        return oldKeyword;
+        return keywords.contains(Keyword.DRAFT);
     }
 
     public List<ValidationResult> validate() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/71a6b1b1/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 830181b..34878c6 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
@@ -135,14 +135,6 @@ public class UpdateMessagePatch {
         return mailboxIds;
     }
 
-    public Optional<Keywords> getKeywords() {
-        return keywords;
-    }
-
-    public Optional<OldKeyword> getOldKeyword() {
-        return oldKeywords;
-    }
-
     public boolean isFlagsIdentity() {
         return !oldKeywords.isPresent() && !keywords.isPresent();
     }
@@ -156,8 +148,10 @@ public class UpdateMessagePatch {
     }
 
     public Flags applyToState(Flags currentFlags) {
-        return keywords
-            .map(keyword -> keyword.asFlagsWithRecentAndDeletedFrom(currentFlags))
-            .orElse(currentFlags);
+        return oldKeywords
+            .map(oldKeyword -> oldKeyword.applyToState(currentFlags))
+            .orElse(keywords
+                .map(keyword -> keyword.asFlagsWithRecentAndDeletedFrom(currentFlags))
+                .orElse(currentFlags));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/71a6b1b1/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
index bcc079f..46bdce4 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
@@ -259,7 +259,7 @@ public class OldKeywordTest {
     }
 
     @Test
-    public void applyStateShouldDeletedFlag() {
+    public void applyStateShouldPreserveDeletedFlag() {
         Optional<OldKeyword> testee = OldKeyword.builder()
             .isUnread(Optional.of(false))
             .isFlagged(Optional.empty())
@@ -271,4 +271,15 @@ public class OldKeywordTest {
         assertThat(testee.get().applyToState(new Flags(Flag.DELETED)))
             .isEqualTo(new FlagsBuilder().add(Flag.DELETED, Flag.SEEN).build());
     }
+
+    @Test
+    public void applyStateShouldPreserveCustomFlag() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.of(false))
+            .computeOldKeyword();
+
+        String customFlag = "custom";
+        assertThat(testee.get().applyToState(new Flags(customFlag)))
+            .isEqualTo(new FlagsBuilder().add(Flag.SEEN).add(customFlag).build());
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/71a6b1b1/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 5b8c4a1..faf7f53 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
@@ -47,6 +47,39 @@ public class UpdateMessagePatchTest {
     }
 
     @Test
+    public void applyToStateShouldNotResetSystemFlagsWhenUsingOldKeywords() {
+        UpdateMessagePatch testee = UpdateMessagePatch.builder()
+            .isAnswered(true)
+            .build();
+
+        Flags isSeen = new Flags(Flags.Flag.SEEN);
+        assertThat(testee.applyToState(isSeen).getSystemFlags())
+            .containsExactly(Flags.Flag.ANSWERED, Flags.Flag.SEEN);
+    }
+
+    @Test
+    public void applyToStateShouldNotModifySpecifiedOldKeywordsWhenAlreadySet() {
+        UpdateMessagePatch testee = UpdateMessagePatch.builder()
+            .isAnswered(true)
+            .build();
+
+        Flags isSeen = new Flags(Flags.Flag.ANSWERED);
+        assertThat(testee.applyToState(isSeen).getSystemFlags())
+            .containsExactly(Flags.Flag.ANSWERED);
+    }
+
+    @Test
+    public void applyToStateShouldResetSpecifiedOldKeywords() {
+        UpdateMessagePatch testee = UpdateMessagePatch.builder()
+            .isAnswered(false)
+            .build();
+
+        Flags isSeen = new Flags(Flags.Flag.ANSWERED);
+        assertThat(testee.applyToState(isSeen).getSystemFlags())
+            .containsExactly();
+    }
+
+    @Test
     public void applyStateShouldReturnNewFlagsWhenKeywords() {
         ImmutableMap<String, Boolean> keywords = ImmutableMap.of(
                 "$Answered", true,


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


[11/11] james-project git commit: JAMES-2257 isDraft should be a responsibility of CreationMessage

Posted by bt...@apache.org.
JAMES-2257 isDraft should be a responsibility of CreationMessage


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

Branch: refs/heads/master
Commit: 2f5f9f8c93f473b10d2ec506ea3a0f24c2b0e55f
Parents: 8ef14e2
Author: benwa <bt...@linagora.com>
Authored: Tue Dec 12 09:03:41 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:03:32 2017 +0700

----------------------------------------------------------------------
 .../methods/SetMessagesCreationProcessor.java   | 14 +----
 .../james/jmap/model/CreationMessage.java       |  7 +++
 .../james/jmap/model/CreationMessageTest.java   | 65 ++++++++++++++++++++
 3 files changed, 73 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2f5f9f8c/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 21a52c0..2f510f8 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
@@ -39,13 +39,11 @@ import org.apache.james.jmap.methods.ValueWithId.MessageWithId;
 import org.apache.james.jmap.model.CreationMessage;
 import org.apache.james.jmap.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.model.Envelope;
-import org.apache.james.jmap.model.Keyword;
 import org.apache.james.jmap.model.Message;
 import org.apache.james.jmap.model.MessageFactory;
 import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent;
 import org.apache.james.jmap.model.MessageProperties;
 import org.apache.james.jmap.model.MessageProperties.MessageProperty;
-import org.apache.james.jmap.model.OldKeyword;
 import org.apache.james.jmap.model.SetError;
 import org.apache.james.jmap.model.SetMessagesError;
 import org.apache.james.jmap.model.SetMessagesRequest;
@@ -202,7 +200,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
     private void performCreate(CreationMessageEntry entry, Builder responseBuilder, MailboxSession session) throws MailboxException, InvalidMailboxForCreationException, MessagingException, AttachmentsNotFoundException {
         if (isAppendToMailboxWithRole(Role.OUTBOX, entry.getValue(), session)) {
             sendMailViaOutbox(entry, responseBuilder, session);
-        } else if (isDraft(entry.getValue())) {
+        } else if (entry.getValue().isDraft()) {
             assertNoOutbox(entry, session);
             saveDraft(entry, responseBuilder, session);
         } else {
@@ -237,16 +235,6 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
         responseBuilder.created(created.getCreationId(), created.getValue());
     }
 
-
-    private Boolean isDraft(CreationMessage creationMessage) {
-        return creationMessage.getOldKeyword()
-            .map(OldKeyword::asKeywords)
-            .map(Optional::of)
-            .orElse(creationMessage.getKeywords())
-            .map(keywords -> keywords.contains(Keyword.DRAFT))
-            .orElse(false);
-    }
-
     private void validateArguments(CreationMessageEntry entry, MailboxSession session) throws MailboxInvalidMessageCreationException, AttachmentsNotFoundException, MailboxException {
         CreationMessage message = entry.getValue();
         if (!message.isValid()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/2f5f9f8c/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
index 39840e5..6c7f170 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
@@ -333,6 +333,13 @@ public class CreationMessage {
         return validate().isEmpty();
     }
 
+    public boolean isDraft() {
+        return oldKeyword
+            .map(OldKeyword::isDraft)
+            .orElse(keywords.map(keywords -> keywords.contains(Keyword.DRAFT)))
+            .orElse(false);
+    }
+
     public Optional<Keywords> getKeywords() {
         return keywords;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/2f5f9f8c/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java
index d31e0a1..ebc2660 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/CreationMessageTest.java
@@ -159,4 +159,69 @@ public class CreationMessageTest {
 
         assertThat(message.getMailboxIds()).containsExactly(mailboxId);
     }
+
+    @Test
+    public void isDraftShouldBeFalseWhenNoKeywordsSpecified() {
+        String mailboxId = "123";
+        CreationMessage message = CreationMessage.builder()
+            .mailboxId(mailboxId)
+            .build();
+
+        assertThat(message.isDraft()).isFalse();
+    }
+
+    @Test
+    public void isDraftShouldBeTrueWhenOldKeywordDraft() {
+        String mailboxId = "123";
+        CreationMessage message = CreationMessage.builder()
+            .mailboxId(mailboxId)
+            .isDraft(Optional.of(true))
+            .build();
+
+        assertThat(message.isDraft()).isTrue();
+    }
+
+    @Test
+    public void isDraftShouldBeFalseWhenOldKeywordNonDraft() {
+        String mailboxId = "123";
+        CreationMessage message = CreationMessage.builder()
+            .mailboxId(mailboxId)
+            .isAnswered(Optional.of(true))
+            .build();
+
+        assertThat(message.isDraft()).isFalse();
+    }
+
+    @Test
+    public void isDraftShouldBeFalseWhenEmptyKeywords() {
+        String mailboxId = "123";
+        CreationMessage message = CreationMessage.builder()
+            .keywords(ImmutableMap.of())
+            .mailboxId(mailboxId)
+            .build();
+
+        assertThat(message.isDraft()).isFalse();
+    }
+
+    @Test
+    public void isDraftShouldBeFalseWhenKeywordsDoesNotContainsDraft() {
+        String mailboxId = "123";
+        CreationMessage message = CreationMessage.builder()
+            .keywords(ImmutableMap.of(Keyword.ANSWERED.getFlagName(), true))
+            .mailboxId(mailboxId)
+            .build();
+
+        assertThat(message.isDraft()).isFalse();
+    }
+
+    @Test
+    public void isDraftShouldBeTrueWhenKeywordsContainsDraft() {
+        String mailboxId = "123";
+        CreationMessage message = CreationMessage.builder()
+            .keywords(ImmutableMap.of(Keyword.DRAFT.getFlagName(), true))
+            .mailboxId(mailboxId)
+            .build();
+
+        assertThat(message.isDraft()).isTrue();
+    }
 }
\ No newline at end of file


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


[05/11] james-project git commit: JAMES-2257 Allow Message::isDraft property modification via JMAP

Posted by bt...@apache.org.
JAMES-2257 Allow Message::isDraft property modification via JMAP


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

Branch: refs/heads/master
Commit: e9ef473946a5f8a13100e18d65d19183adde4124
Parents: 9d2f656
Author: benwa <bt...@linagora.com>
Authored: Mon Dec 11 17:19:32 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:00:36 2017 +0700

----------------------------------------------------------------------
 .../integration/SetMessagesMethodTest.java      |  2 --
 .../cucumber/SetMessagesMethodStepdefs.java     | 21 ++++++++++++
 .../test/resources/cucumber/SetMessages.feature |  5 +++
 .../james/jmap/model/CreationMessage.java       |  9 ++----
 .../org/apache/james/jmap/model/OldKeyword.java | 10 +++++-
 .../james/jmap/model/UpdateMessagePatch.java    | 17 +++++-----
 .../apache/james/jmap/model/OldKeywordTest.java | 34 +++++++++++++-------
 7 files changed, 68 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/e9ef4739/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 2083038..4b40022 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
@@ -5192,7 +5192,6 @@ public abstract class SetMessagesMethodTest {
             .body(ARGUMENTS + ".list[0].isForwarded", equalTo(true));
     }
 
-    @Ignore("JAMES-2257 isDraft is rejected during message creation")
     @Test
     public void setMessagesShouldNotReturnAnErrorWhenTryingToChangeDraftFlagAmongOthers() {
         String messageCreationId = "creationId1337";
@@ -5255,7 +5254,6 @@ public abstract class SetMessagesMethodTest {
 
     }
 
-    @Ignore("JAMES-2257 isDraft is rejected during message creation")
     @Test
     public void setMessagesShouldModifyTheMessageWhenTryingToChangeDraftFlagAmongOthers() {
         String messageCreationId = "creationId1337";

http://git-wip-us.apache.org/repos/asf/james-project/blob/e9ef4739/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java
index ffa9981..be925cb 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMessagesMethodStepdefs.java
@@ -199,6 +199,27 @@ public class SetMessagesMethodStepdefs {
         });
     }
 
+    @When("^\"([^\"]*)\" marks the message \"([^\"]*)\" as draft")
+    public void draft(String username, String message) throws Throwable {
+        userStepdefs.execWithUser(username, () -> {
+            MessageId messageId = messageIdStepdefs.getMessageId(message);
+
+            httpClient.post("[" +
+                "  [" +
+                "    \"setMessages\"," +
+                "    {" +
+                "      \"update\": { \"" + messageId.serialize() + "\" : {" +
+                "        \"isDraft\": true" +
+                "      }}" +
+                "    }," +
+                "    \"#0\"" +
+                "  ]" +
+                "]");
+            mainStepdefs.awaitMethod.run();
+        });
+    }
+
+
     @When("^\"([^\"]*)\" destroys message \"([^\"]*)\"$")
     public void destroyMessage(String username, String message) {
         MessageId messageId = messageIdStepdefs.getMessageId(message);

http://git-wip-us.apache.org/repos/asf/james-project/blob/e9ef4739/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature
index ffe6eec..36a1cf9 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/SetMessages.feature
@@ -98,6 +98,11 @@ Feature: SetMessages method
     When "bob@domain.tld" moves "mBob" to user mailbox "Drafts"
     Then message "mBob" is updated
 
+  Scenario: A user can update $Draft keyword using isDraft property
+    Given "bob@domain.tld" has a mailbox "Drafts"
+    When "bob@domain.tld" marks the message "mBob" as draft
+    Then message "mBob" is updated
+
   Scenario: A user can copy draft out of draft mailbox
     Given "bob@domain.tld" has a mailbox "Drafts"
     When "bob@domain.tld" copies "mBob" from mailbox "mailbox" to mailbox "Drafts"

http://git-wip-us.apache.org/repos/asf/james-project/blob/e9ef4739/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
index 377fce9..625f42d 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
@@ -221,7 +221,8 @@ public class CreationMessage {
             }
 
             Optional<Keywords> maybeKeywords = creationKeywords();
-            Optional<OldKeyword> oldKeywords = getOldKeywords();
+            Optional<OldKeyword> oldKeywords = OldKeyword.computeOldKeywords(
+                isUnread, isFlagged, isAnswered, isDraft, isForwarded);
             Preconditions.checkArgument(!(maybeKeywords.isPresent() && oldKeywords.isPresent()), "Does not support keyword and is* at the same time");
             return new CreationMessage(mailboxIds, Optional.ofNullable(inReplyToMessageId), headers.build(), from,
                     to.build(), cc.build(), bcc.build(), replyTo.build(), subject, date, Optional.ofNullable(textBody), Optional.ofNullable(htmlBody),
@@ -234,12 +235,6 @@ public class CreationMessage {
                     .fromMap(map));
         }
 
-        private Optional<OldKeyword> getOldKeywords() {
-            if (isAnswered.isPresent() || isFlagged.isPresent() || isUnread.isPresent() || isDraft.isPresent() || isForwarded.isPresent()) {
-                return Optional.of(new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded));
-            }
-            return Optional.empty();
-        }
     }
 
     private final ImmutableList<String> mailboxIds;

http://git-wip-us.apache.org/repos/asf/james-project/blob/e9ef4739/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
index 7620873..b240b54 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
@@ -28,6 +28,14 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 
 public class OldKeyword {
+    public static Optional<OldKeyword> computeOldKeywords(Optional<Boolean> isUnread, Optional<Boolean> isFlagged, Optional<Boolean> isAnswered,
+                                                          Optional<Boolean> isDraft, Optional<Boolean> isForwarded) {
+        if (isAnswered.isPresent() || isFlagged.isPresent() || isUnread.isPresent() || isForwarded.isPresent() || isDraft.isPresent()) {
+            return Optional.of(new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded));
+        }
+        return Optional.empty();
+    }
+
     private final Optional<Boolean> isUnread;
     private final Optional<Boolean> isFlagged;
     private final Optional<Boolean> isAnswered;
@@ -43,7 +51,7 @@ public class OldKeyword {
         this.isForwarded = Optional.of(isForwarded);
     }
 
-    public OldKeyword(Optional<Boolean> isUnread, Optional<Boolean> isFlagged, Optional<Boolean> isAnswered,
+    private OldKeyword(Optional<Boolean> isUnread, Optional<Boolean> isFlagged, Optional<Boolean> isAnswered,
                       Optional<Boolean> isDraft, Optional<Boolean> isForwarded) {
         this.isUnread = isUnread;
         this.isFlagged = isFlagged;

http://git-wip-us.apache.org/repos/asf/james-project/blob/e9ef4739/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 e735778..19671a9 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
@@ -51,6 +51,7 @@ public class UpdateMessagePatch {
         private Optional<Boolean> isUnread = Optional.empty();
         private Optional<Boolean> isAnswered = Optional.empty();
         private Optional<Boolean> isForwarded = Optional.empty();
+        private Optional<Boolean> isDraft = Optional.empty();
         private Optional<Map<String, Boolean>> keywords = Optional.empty();
         private Set<ValidationResult> validationResult = Sets.newHashSet();
 
@@ -79,6 +80,11 @@ public class UpdateMessagePatch {
             return this;
         }
 
+        public Builder isDraft(Boolean isAnswered) {
+            this.isDraft = Optional.of(isAnswered);
+            return this;
+        }
+
         public Builder isForwarded(Boolean isForwarded) {
             this.isForwarded = Optional.of(isForwarded);
             return this;
@@ -98,7 +104,8 @@ public class UpdateMessagePatch {
             }
 
             Optional<Keywords> mayBeKeywords = creationKeywords();
-            Optional<OldKeyword> oldKeywords = getOldKeywords();
+            Optional<OldKeyword> oldKeywords = OldKeyword.computeOldKeywords(
+                isUnread, isFlagged, isAnswered, isDraft, isForwarded);
             Preconditions.checkArgument(!(mayBeKeywords.isPresent() && oldKeywords.isPresent()), "Does not support keyword and is* at the same time");
 
             return new UpdateMessagePatch(mailboxIds, mayBeKeywords, oldKeywords, ImmutableList.copyOf(validationResult));
@@ -110,14 +117,6 @@ public class UpdateMessagePatch {
                     .fromMap(map));
         }
 
-        private Optional<OldKeyword> getOldKeywords() {
-            if (isAnswered.isPresent() || isFlagged.isPresent() || isUnread.isPresent() || isForwarded.isPresent()) {
-                Optional<Boolean> isDraft = Optional.empty();
-                return Optional.of(new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded));
-            }
-            return Optional.empty();
-        }
-
     }
 
     private final Optional<List<String>> mailboxIds;

http://git-wip-us.apache.org/repos/asf/james-project/blob/e9ef4739/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
index 46db6b8..3d28be6 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
@@ -37,15 +37,27 @@ public class OldKeywordTest {
     }
 
     @Test
+    public void computeOldKeywordsShouldReturnEmptyWhenAllEmpty() {
+        Optional<Boolean> isUnread = Optional.empty();
+        Optional<Boolean> isFlagged = Optional.empty();
+        Optional<Boolean> isAnswered = Optional.empty();
+        Optional<Boolean> isDraft = Optional.empty();
+        Optional<Boolean> isForwarded = Optional.empty();
+        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+
+        assertThat(testee).isEmpty();
+    }
+
+    @Test
     public void applyStateShouldSetFlaggedOnlyWhenIsFlagged() {
         Optional<Boolean> isUnread = Optional.empty();
         Optional<Boolean> isFlagged = Optional.of(true);
         Optional<Boolean> isAnswered = Optional.empty();
         Optional<Boolean> isDraft = Optional.empty();
         Optional<Boolean> isForwarded = Optional.empty();
-        OldKeyword testee = new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
-        
-        assertThat(testee.applyToState(new Flags())).isEqualTo(new Flags(Flag.FLAGGED));
+        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+
+        assertThat(testee.get().applyToState(new Flags())).isEqualTo(new Flags(Flag.FLAGGED));
     }
 
     @Test
@@ -55,9 +67,9 @@ public class OldKeywordTest {
         Optional<Boolean> isAnswered = Optional.empty();
         Optional<Boolean> isDraft = Optional.empty();
         Optional<Boolean> isForwarded = Optional.empty();
-        OldKeyword testee = new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
         
-        assertThat(testee.applyToState(new Flags(Flag.FLAGGED))).isEqualTo(new Flags());
+        assertThat(testee.get().applyToState(new Flags(Flag.FLAGGED))).isEqualTo(new Flags());
     }
 
     @Test
@@ -67,9 +79,9 @@ public class OldKeywordTest {
         Optional<Boolean> isAnswered = Optional.empty();
         Optional<Boolean> isDraft = Optional.empty();
         Optional<Boolean> isForwarded = Optional.empty();
-        OldKeyword testee = new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
-        
-        assertThat(testee.applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags());
+        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+
+        assertThat(testee.get().applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags());
     }
 
     @Test
@@ -79,8 +91,8 @@ public class OldKeywordTest {
         Optional<Boolean> isAnswered = Optional.empty();
         Optional<Boolean> isDraft = Optional.empty();
         Optional<Boolean> isForwarded = Optional.empty();
-        OldKeyword testee = new OldKeyword(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
-        
-        assertThat(testee.applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags(Flag.SEEN));
+        Optional<OldKeyword> testee = OldKeyword.computeOldKeywords(isUnread, isFlagged, isAnswered, isDraft, isForwarded);
+
+        assertThat(testee.get().applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags(Flag.SEEN));
     }
 }
\ No newline at end of file


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


[08/11] james-project git commit: JAMES-2257 Message update using old keywords reset DELETED and RECENT flag

Posted by bt...@apache.org.
JAMES-2257 Message update using old keywords reset DELETED and RECENT flag


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

Branch: refs/heads/master
Commit: 4357889865a96fed7ab449fda32587efdb123256
Parents: 2f5f9f8
Author: benwa <bt...@linagora.com>
Authored: Tue Dec 12 10:21:58 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:03:32 2017 +0700

----------------------------------------------------------------------
 .../org/apache/james/jmap/model/OldKeyword.java |  9 ++++++
 .../apache/james/jmap/model/OldKeywordTest.java | 29 ++++++++++++++++++++
 2 files changed, 38 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/43578898/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
index f205bb9..151a8f1 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/OldKeyword.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.jmap.model;
 
+import java.util.Arrays;
 import java.util.Optional;
 
 import javax.mail.Flags;
@@ -160,6 +161,14 @@ public class OldKeyword {
         if (shouldMessageBeMarkSeen) {
             newStateFlags.add(Flags.Flag.SEEN);
         }
+        Arrays.stream(currentFlags.getUserFlags())
+            .forEach(newStateFlags::add);
+        if (currentFlags.contains(Flags.Flag.RECENT)) {
+            newStateFlags.add(Flags.Flag.RECENT);
+        }
+        if (currentFlags.contains(Flags.Flag.DELETED)) {
+            newStateFlags.add(Flags.Flag.DELETED);
+        }
         return newStateFlags;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/43578898/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
index 9b4d8b3..bcc079f 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/OldKeywordTest.java
@@ -26,6 +26,7 @@ import java.util.Optional;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
+import org.apache.james.mailbox.FlagsBuilder;
 import org.junit.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
@@ -242,4 +243,32 @@ public class OldKeywordTest {
 
         assertThat(testee.get().applyToState(new Flags(Flag.SEEN))).isEqualTo(new Flags(Flag.SEEN));
     }
+
+    @Test
+    public void applyStateShouldPreserveRecentFlag() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.of(false))
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().applyToState(new Flags(Flag.RECENT)))
+            .isEqualTo(new FlagsBuilder().add(Flag.RECENT, Flag.SEEN).build());
+    }
+
+    @Test
+    public void applyStateShouldDeletedFlag() {
+        Optional<OldKeyword> testee = OldKeyword.builder()
+            .isUnread(Optional.of(false))
+            .isFlagged(Optional.empty())
+            .isAnswered(Optional.empty())
+            .isDraft(Optional.empty())
+            .isForwarded(Optional.empty())
+            .computeOldKeyword();
+
+        assertThat(testee.get().applyToState(new Flags(Flag.DELETED)))
+            .isEqualTo(new FlagsBuilder().add(Flag.DELETED, Flag.SEEN).build());
+    }
 }
\ No newline at end of file


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


[04/11] james-project git commit: JAMES-2257 Solve an IntelliJ warning

Posted by bt...@apache.org.
JAMES-2257 Solve an IntelliJ warning


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

Branch: refs/heads/master
Commit: fb047aaed51f0a5cd234e28d0bd0173820ff425d
Parents: 38acce2
Author: benwa <bt...@linagora.com>
Authored: Mon Dec 11 17:20:13 2017 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri Dec 15 14:00:36 2017 +0700

----------------------------------------------------------------------
 .../java/org/apache/james/jmap/model/CreationMessage.java    | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/fb047aae/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
index 1fca744..377fce9 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/CreationMessage.java
@@ -204,11 +204,9 @@ public class CreationMessage {
         }
 
         private static Predicate<BlobId> inAttachments(ImmutableList<Attachment> attachments) {
-            return (key) -> {
-                return attachments.stream()
-                    .map(Attachment::getBlobId)
-                    .anyMatch(blobId -> blobId.equals(key));
-            };
+            return (key) -> attachments.stream()
+                .map(Attachment::getBlobId)
+                .anyMatch(blobId -> blobId.equals(key));
         }
 
         public CreationMessage build() {


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