JAMES-2183 Refactoring: MessageFactory should rely on JMAP Keywords

We need to generate Keywords from a set of MessageResult. Thus, one 
MessageResult can not be enough anymore for generating a message's keyword.

In a first step, we decrease the spead of javax.Flags usage in JMAP code, and 
make keywords an explicit parameter of MessageFactory.


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

Branch: refs/heads/master
Commit: ce13804ed95ec755ed696b8ded7c2dea0680d5b8
Parents: f0b2771
Author: benwa <btell...@linagora.com>
Authored: Fri Oct 13 09:51:37 2017 +0700
Committer: benwa <btell...@linagora.com>
Committed: Wed Oct 18 09:00:56 2017 +0700

----------------------------------------------------------------------
 .../cucumber/GetMessagesMethodStepdefs.java     |   2 +-
 .../test/resources/cucumber/GetMessages.feature |  11 ++
 .../james/jmap/methods/GetMessagesMethod.java   |   5 +
 .../methods/SetMessagesCreationProcessor.java   |  11 +-
 .../org/apache/james/jmap/model/Message.java    |  13 +-
 .../apache/james/jmap/model/MessageFactory.java |  26 ++--
 .../james/jmap/json/ParsingWritingObjects.java  |   5 +-
 .../james/jmap/model/MessageFactoryTest.java    | 122 ++++++-------------
 .../apache/james/jmap/model/MessageTest.java    |  53 +-------
 .../apache/james/jmap/send/MailFactoryTest.java |   6 +-
 10 files changed, 85 insertions(+), 169 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
index cc9f465..b477c2c 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
@@ -248,7 +248,7 @@ public class GetMessagesMethodStepdefs {
 
     @Given("^the user has a message \"([^\"]*)\" in the \"([^\"]*)\" mailbox 
with flags \"([^\"]*)\"$")
     public void appendMessageWithFlags(String messageName, String mailbox, 
List<String> flagList) throws Exception {
-        appendMessage(messageName, FlagListToFlags.fromFlagList(flagList));
+        appendMessage(messageName, StringListToFlags.fromFlagList(flagList));
     }
 
     private void appendMessage(String messageName, Flags flags) throws 
Exception {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
index a74acb7..10d0f56 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
@@ -349,6 +349,17 @@ Feature: GetMessages method
             |flags                          |keyword                        |
             |"$Flagged,$Answered,$Draft"    |$Flagged,$Answered,$Draft      |
 
+  Scenario Outline: GetMessages should filter invalid keywords
+    Given the user has a message "m1" in the "inbox" mailbox with flags <flags>
+    When the user ask for messages "m1"
+    Then no error is returned
+    And the list should contain 1 message
+    And the keywords of the message is <keyword>
+
+    Examples:
+      |flags                               |keyword                |
+      |"$Draft,@ert,t^a,op§,$user_flag"    |$Draft,$user_flag      |
+
   Scenario Outline: Retrieving message should display keywords without 
unsupported jmap flag
     Given the user has a message "m1" in the "inbox" mailbox with flags <flags>
     When the user ask for messages "m1"

http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
index 4b8470b..47a501a 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/GetMessagesMethod.java
@@ -32,6 +32,7 @@ import org.apache.james.jmap.json.FieldNamePropertyFilter;
 import org.apache.james.jmap.model.ClientId;
 import org.apache.james.jmap.model.GetMessagesRequest;
 import org.apache.james.jmap.model.GetMessagesResponse;
+import org.apache.james.jmap.model.Keywords;
 import org.apache.james.jmap.model.Message;
 import org.apache.james.jmap.model.MessageFactory;
 import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent;
@@ -65,6 +66,7 @@ public class GetMessagesMethod implements Method {
     private final MessageFactory messageFactory;
     private final MessageIdManager messageIdManager;
     private final MetricFactory metricFactory;
+    private final Keywords.KeywordsFactory keywordsFactory;
 
     @Inject
     @VisibleForTesting GetMessagesMethod(
@@ -74,6 +76,8 @@ public class GetMessagesMethod implements Method {
         this.messageFactory = messageFactory;
         this.messageIdManager = messageIdManager;
         this.metricFactory = metricFactory;
+        this.keywordsFactory = Keywords.factory()
+            .filterImapNonExposedKeywords();
     }
     
     @Override
@@ -167,6 +171,7 @@ public class GetMessagesMethod implements Method {
                     
MetaDataWithContent.builderFromMessageResult(firstMessageResult)
                         .messageId(firstMessageResult.getMessageId())
                         .mailboxIds(mailboxIds)
+                        
.keywords(keywordsFactory.fromFlags(firstMessageResult.getFlags()))
                         .build());
             } catch (Exception e) {
                 LOGGER.error("Can not convert MessageResults to MetaData with 
content for messageId " + firstMessageResult.getMessageId() + " in " + 
mailboxIds, e);

http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/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 0b2ce96..3087e71 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
@@ -29,7 +29,6 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
-import javax.mail.Flags;
 import javax.mail.MessagingException;
 import javax.mail.util.SharedByteArrayInputStream;
 
@@ -293,16 +292,16 @@ public class SetMessagesCreationProcessor implements 
SetMessagesProcessor {
         SharedByteArrayInputStream content = new 
SharedByteArrayInputStream(messageContent);
         Date internalDate = 
Date.from(createdEntry.getValue().getDate().toInstant());
 
-        Flags flags = createdEntry.getValue()
+        Keywords keywords = createdEntry.getValue()
             .getKeywords()
-            .map(Keywords::asFlags)
-            .orElse(new Flags());
+            .orElse(Keywords.DEFAULT_VALUE);
+        boolean notRecent = false;
 
-        ComposedMessageId message = outbox.appendMessage(content, 
internalDate, session, flags.contains(Flags.Flag.RECENT), flags);
+        ComposedMessageId message = outbox.appendMessage(content, 
internalDate, session, notRecent, keywords.asFlags());
 
         return MetaDataWithContent.builder()
                 .uid(message.getUid())
-                .flags(flags)
+                .keywords(keywords)
                 .internalDate(internalDate.toInstant())
                 .sharedContent(content)
                 .size(messageContent.length)

http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
index 86762fe..797d191 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/Message.java
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.function.Predicate;
-import javax.mail.Flags;
 
 import org.apache.james.jmap.methods.GetMessagesMethod;
 import org.apache.james.jmap.methods.JmapResponseWriterImpl;
@@ -72,7 +71,7 @@ public class Message {
         private Optional<String> htmlBody = Optional.empty();
         private final ImmutableList.Builder<Attachment> attachments;
         private final ImmutableMap.Builder<BlobId, SubMessage> 
attachedMessages;
-        private Optional<Flags> flags = Optional.empty();
+        private Optional<Keywords> keywords = Optional.empty();
 
         private Builder() {
             to = ImmutableList.builder();
@@ -118,8 +117,8 @@ public class Message {
             return this;
         }
 
-        public Builder flags(Flags flags) {
-            this.flags = Optional.ofNullable(flags);
+        public Builder keywords(Keywords keywords) {
+            this.keywords = Optional.ofNullable(keywords);
             return this;
         }
 
@@ -206,15 +205,11 @@ public class Message {
             ImmutableMap<BlobId, SubMessage> attachedMessages = 
this.attachedMessages.build();
             
Preconditions.checkState(areAttachedMessagesKeysInAttachments(attachments, 
attachedMessages), "'attachedMessages' keys must be in 'attachements'");
             boolean hasAttachment = hasAttachment(attachments);
-            Keywords keywords = flags.map(flag -> Keywords.factory()
-                    .filterImapNonExposedKeywords()
-                    .fromFlags(flag))
-                .orElse(Keywords.DEFAULT_VALUE);
 
             return new Message(id, blobId, threadId, mailboxIds, 
Optional.ofNullable(inReplyToMessageId),
                 hasAttachment, headers, Optional.ofNullable(from),
                 to.build(), cc.build(), bcc.build(), replyTo.build(), subject, 
date, size, preview, textBody, htmlBody, attachments, attachedMessages,
-                keywords);
+                keywords.orElse(Keywords.DEFAULT_VALUE));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
index 05f2589..f70db5c 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageFactory.java
@@ -32,7 +32,6 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import javax.inject.Inject;
-import javax.mail.Flags;
 import javax.mail.internet.SharedInputStream;
 
 import org.apache.james.jmap.utils.HtmlTextExtractor;
@@ -99,7 +98,7 @@ public class MessageFactory {
                 .threadId(message.getMessageId().serialize())
                 .mailboxIds(message.getMailboxIds())
                 .inReplyToMessageId(getHeader(mimeMessage, "in-reply-to"))
-                .flags(message.getFlags())
+                .keywords(message.getKeywords())
                 .subject(Strings.nullToEmpty(mimeMessage.getSubject()).trim())
                 .headers(toMap(mimeMessage.getHeader().getFields()))
                 .from(firstFromMailboxList(mimeMessage.getFrom()))
@@ -240,7 +239,6 @@ public class MessageFactory {
             Builder builder = builder()
                 .uid(messageResult.getUid())
                 .modSeq(messageResult.getModSeq())
-                .flags(messageResult.getFlags())
                 .size(messageResult.getSize())
                 .internalDate(messageResult.getInternalDate().toInstant())
                 .attachments(messageResult.getAttachments())
@@ -255,7 +253,7 @@ public class MessageFactory {
         public static class Builder {
             private MessageUid uid;
             private Long modSeq;
-            private Flags flags;
+            private Keywords keywords;
             private Long size;
             private Instant internalDate;
             private InputStream content;
@@ -274,11 +272,11 @@ public class MessageFactory {
                 return this;
             }
             
-            public Builder flags(Flags flags) {
-                this.flags = flags;
+            public Builder keywords(Keywords keywords) {
+                this.keywords = keywords;
                 return this;
             }
-            
+
             public Builder size(long size) {
                 this.size = size;
                 return this;
@@ -324,20 +322,20 @@ public class MessageFactory {
                 if (modSeq == null) {
                     modSeq = -1L;
                 }
-                Preconditions.checkArgument(flags != null);
+                Preconditions.checkArgument(keywords != null);
                 Preconditions.checkArgument(size != null);
                 Preconditions.checkArgument(internalDate != null);
                 Preconditions.checkArgument(content != null ^ sharedContent != 
null);
                 Preconditions.checkArgument(attachments != null);
                 Preconditions.checkArgument(mailboxIds != null);
                 Preconditions.checkArgument(messageId != null);
-                return new MetaDataWithContent(uid, modSeq, flags, size, 
internalDate, content, sharedContent, attachments, mailboxIds, messageId);
+                return new MetaDataWithContent(uid, modSeq, keywords, size, 
internalDate, content, sharedContent, attachments, mailboxIds, messageId);
             }
         }
 
         private final MessageUid uid;
         private final long modSeq;
-        private final Flags flags;
+        private final Keywords keywords;
         private final long size;
         private final Instant internalDate;
         private final InputStream content;
@@ -348,7 +346,7 @@ public class MessageFactory {
 
         private MetaDataWithContent(MessageUid uid,
                                     long modSeq,
-                                    Flags flags,
+                                    Keywords keywords,
                                     long size,
                                     Instant internalDate,
                                     InputStream content,
@@ -358,7 +356,7 @@ public class MessageFactory {
                                     MessageId messageId) {
             this.uid = uid;
             this.modSeq = modSeq;
-            this.flags = flags;
+            this.keywords = keywords;
             this.size = size;
             this.internalDate = internalDate;
             this.content = content;
@@ -376,8 +374,8 @@ public class MessageFactory {
             return modSeq;
         }
 
-        public Flags getFlags() {
-            return flags;
+        public Keywords getKeywords() {
+            return keywords;
         }
 
         public long getSize() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/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 f84b91e..7a7a04e 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
@@ -27,6 +27,7 @@ import javax.mail.Flags;
 import org.apache.james.jmap.model.BlobId;
 import org.apache.james.jmap.model.Emailer;
 import org.apache.james.jmap.model.Keyword;
+import org.apache.james.jmap.model.Keywords;
 import org.apache.james.jmap.model.Message;
 import org.apache.james.jmap.model.SubMessage;
 import org.apache.james.mailbox.FlagsBuilder;
@@ -41,7 +42,7 @@ import com.google.common.collect.ImmutableSet;
 
 public interface ParsingWritingObjects {
 
-    public interface Common {
+    interface Common {
         MessageId MESSAGE_ID = TestMessageId.of(1);
         BlobId BLOB_ID = BlobId.of("myBlobId");
         String THREAD_ID = "myThreadId";
@@ -76,7 +77,7 @@ public interface ParsingWritingObjects {
             .threadId(Common.THREAD_ID)
             .mailboxIds(Common.MAILBOX_IDS)
             .inReplyToMessageId(Common.IN_REPLY_TO_MESSAGE_ID)
-            .flags(Common.FLAGS)
+            .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/ce13804e/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
index 24b0a1e..5637620 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageFactoryTest.java
@@ -27,16 +27,12 @@ import java.io.ByteArrayInputStream;
 import java.time.Instant;
 import java.util.Optional;
 
-import javax.mail.Flags;
-import javax.mail.Flags.Flag;
-
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.james.jmap.model.MessageFactory.MetaDataWithContent;
 import org.apache.james.jmap.utils.HtmlTextExtractor;
 import org.apache.james.jmap.utils.JsoupHtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
-import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.AttachmentId;
@@ -58,14 +54,12 @@ public class MessageFactoryTest {
     private static final Instant INTERNAL_DATE = 
Instant.parse("2012-02-03T14:30:42Z");
 
     private MessageFactory messageFactory;
-    private MessagePreviewGenerator messagePreview ;
-    private HtmlTextExtractor htmlTextExtractor;
-    
+
     @Before
     public void setUp() {
-        htmlTextExtractor = new JsoupHtmlTextExtractor();
+        HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor();
 
-        messagePreview = new MessagePreviewGenerator();
+        MessagePreviewGenerator messagePreview = new MessagePreviewGenerator();
         MessageContentExtractor messageContentExtractor = new 
MessageContentExtractor();
 
         BlobManager blobManager = mock(BlobManager.class);
@@ -77,7 +71,7 @@ public class MessageFactoryTest {
     public void emptyMailShouldBeLoadedIntoMessage() throws Exception {
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(new Flags(Flag.SEEN))
+                .keywords(Keywords.factory().from(Keyword.SEEN))
                 .size(0)
                 .internalDate(INTERNAL_DATE)
                 .content(new ByteArrayInputStream("".getBytes(Charsets.UTF_8)))
@@ -94,13 +88,9 @@ public class MessageFactoryTest {
 
     @Test
     public void flagsShouldBeSetIntoMessage() throws Exception {
-        Flags flags = new Flags();
-        flags.add(Flag.ANSWERED);
-        flags.add(Flag.FLAGGED);
-        flags.add(Flag.DRAFT);
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(flags)
+                .keywords(Keywords.factory().from(Keyword.ANSWERED, 
Keyword.FLAGGED, Keyword.DRAFT))
                 .size(0)
                 .internalDate(INTERNAL_DATE)
                 .content(new ByteArrayInputStream("".getBytes(Charsets.UTF_8)))
@@ -116,7 +106,7 @@ public class MessageFactoryTest {
 
     @Test
     public void headersShouldBeSetIntoMessage() throws Exception {
-        Flags flags = new Flags(Flag.SEEN);
+        Keywords keywords = Keywords.factory().from(Keyword.SEEN);
         String headers = "From: user <user@domain>\n"
                 + "Subject: test subject\n"
                 + "To: user1 <user1@domain>, user2 <user2@domain>\n"
@@ -128,7 +118,7 @@ public class MessageFactoryTest {
                 + "Other-header: other header value";
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(flags)
+                .keywords(keywords)
                 .size(headers.length())
                 .internalDate(INTERNAL_DATE)
                 .content(new 
ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -175,14 +165,14 @@ public class MessageFactoryTest {
                 .preview("(Empty)")
                 .textBody(Optional.of(""))
                 .htmlBody(Optional.empty())
-                .flags(flags)
+                .keywords(keywords)
                 .build();
         assertThat(testee).isEqualToComparingFieldByField(expected);
     }
 
     @Test
     public void headersShouldBeUnfoldedAndDecoded() throws Exception {
-        Flags flags = new Flags(Flag.SEEN);
+        Keywords keywords = Keywords.factory().from(Keyword.SEEN);
         String headers = "From: user <user@domain>\n"
             + "Subject: test subject\n"
             + "To: user1 <user1@domain>,\r\n"
@@ -190,7 +180,7 @@ public class MessageFactoryTest {
             + "Cc: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <tell...@linagora.com>";
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(flags)
+            .keywords(keywords)
             .size(headers.length())
             .internalDate(INTERNAL_DATE)
             .content(new 
ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -226,7 +216,7 @@ public class MessageFactoryTest {
             .preview("(Empty)")
             .textBody(Optional.of(""))
             .htmlBody(Optional.empty())
-            .flags(flags)
+            .keywords(keywords)
             .build();
 
         assertThat(testee).isEqualToComparingFieldByField(expected);
@@ -234,7 +224,7 @@ public class MessageFactoryTest {
 
     @Test
     public void multivaluedHeadersShouldBeSeparatedByLineFeed() throws 
Exception {
-        Flags flags = new Flags(Flag.SEEN);
+        Keywords keywords = Keywords.factory().from(Keyword.SEEN);
         String headers = "From: user <user@domain>\n"
             + "Subject: test subject\n"
             + "Multi-header: first value\n"
@@ -242,7 +232,7 @@ public class MessageFactoryTest {
             + "Multi-header: second value\n";
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(flags)
+            .keywords(keywords)
             .size(headers.length())
             .internalDate(INTERNAL_DATE)
             .content(new 
ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -275,7 +265,7 @@ public class MessageFactoryTest {
             .preview("(Empty)")
             .textBody(Optional.of(""))
             .htmlBody(Optional.empty())
-            .flags(flags)
+            .keywords(keywords)
             .build();
 
         assertThat(testee).isEqualToComparingFieldByField(expected);
@@ -283,12 +273,13 @@ public class MessageFactoryTest {
 
     @Test
     public void textBodyShouldBeSetIntoMessage() throws Exception {
+        Keywords keywords = Keywords.factory().from(Keyword.SEEN);
         String headers = "Subject: test subject\n";
         String body = "Mail body";
         String mail = headers + "\n" + body;
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(new Flags(Flag.SEEN))
+                .keywords(keywords)
                 .size(mail.length())
                 .internalDate(INTERNAL_DATE)
                 .content(new 
ByteArrayInputStream(mail.getBytes(Charsets.UTF_8)))
@@ -321,7 +312,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .internalDate(INTERNAL_DATE)
             .size(1000)
             .content(messageContent)
@@ -350,7 +341,7 @@ public class MessageFactoryTest {
         String mail = headers + "\n" + body300;
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
                 .size(mail.length())
                 .internalDate(INTERNAL_DATE)
                 .content(new 
ByteArrayInputStream(mail.getBytes(Charsets.UTF_8)))
@@ -366,7 +357,7 @@ public class MessageFactoryTest {
     public void attachmentsShouldBeEmptyWhenNone() throws Exception {
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
                 .size(0)
                 .internalDate(INTERNAL_DATE)
                 .content(new 
ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("spamMail.eml"))))
@@ -392,7 +383,7 @@ public class MessageFactoryTest {
                 .build();
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
                 .size(0)
                 .internalDate(INTERNAL_DATE)
                 .content(new 
ByteArrayInputStream(IOUtils.toByteArray(ClassLoader.getSystemResourceAsStream("spamMail.eml"))))
@@ -424,7 +415,7 @@ public class MessageFactoryTest {
             + "Subject: test subject\n";
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(headers.length())
             .internalDate(INTERNAL_DATE)
             .content(new 
ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -453,7 +444,7 @@ public class MessageFactoryTest {
             + "Subject: test subject\n";
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(headers.length())
             .internalDate(INTERNAL_DATE)
             .content(new 
ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -478,7 +469,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(headers.length())
             .internalDate(INTERNAL_DATE)
             .content(new 
ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -504,7 +495,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(headers.length())
             .internalDate(INTERNAL_DATE)
             .content(new 
ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -529,7 +520,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(headers.length())
             .internalDate(INTERNAL_DATE)
             .content(new 
ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -547,7 +538,7 @@ public class MessageFactoryTest {
     public void mailWithBigLinesShouldBeLoadedIntoMessage() throws Exception {
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
                 .size(1010)
                 .internalDate(INTERNAL_DATE)
                 .content(new 
ByteArrayInputStream((StringUtils.repeat("0123456789", 
101).getBytes(Charsets.UTF_8))))
@@ -570,7 +561,7 @@ public class MessageFactoryTest {
             + "my <b>HTML</b> message").getBytes(Charsets.UTF_8));
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(messageContent.read())
             .internalDate(INTERNAL_DATE)
             .content(messageContent)
@@ -591,7 +582,7 @@ public class MessageFactoryTest {
             + "Subject: message 1 subject\r\n").getBytes(Charsets.UTF_8));
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(messageContent.read())
             .internalDate(INTERNAL_DATE)
             .content(messageContent)
@@ -623,7 +614,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(messageContent.read())
             .internalDate(INTERNAL_DATE)
             .content(messageContent)
@@ -645,7 +636,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(messageContent.read())
             .internalDate(INTERNAL_DATE)
             .content(messageContent)
@@ -664,7 +655,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(messageContent.read())
             .internalDate(INTERNAL_DATE)
             .content(messageContent)
@@ -688,7 +679,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(messageContent.read())
             .internalDate(INTERNAL_DATE)
             .content(messageContent)
@@ -724,7 +715,7 @@ public class MessageFactoryTest {
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .keywords(Keywords.factory().from(Keyword.SEEN))
             .size(messageContent.read())
             .internalDate(INTERNAL_DATE)
             .content(messageContent)
@@ -741,16 +732,11 @@ public class MessageFactoryTest {
 
     @Test
     public void keywordShouldBeSetIntoMessage() throws Exception {
-        Flags flags = FlagsBuilder.builder()
-            .add(Flag.ANSWERED, Flag.DRAFT)
-            .build();
-        ImmutableMap<String, Boolean> keywords = Keywords.factory()
-            .fromFlags(flags)
-            .asMap();
+        Keywords keywords = Keywords.factory().from(Keyword.SEEN, 
Keyword.DRAFT);
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(flags)
+            .keywords(keywords)
             .size(0)
             .internalDate(INTERNAL_DATE)
             .content(new ByteArrayInputStream("".getBytes(Charsets.UTF_8)))
@@ -759,46 +745,16 @@ public class MessageFactoryTest {
             .messageId(TestMessageId.of(2))
             .build();
         Message testee = messageFactory.fromMetaDataWithContent(testMail);
-        assertThat(testee.getKeywords()).containsAllEntriesOf(keywords);
+        
assertThat(testee.getKeywords()).containsAllEntriesOf(keywords.asMap());
     }
 
     @Test
     public void keywordWithUserFlagShouldBeSetIntoMessage() throws Exception {
-        Flags flags = FlagsBuilder.builder()
-            .add(Flag.ANSWERED)
-            .add(FORWARDED)
-            .build();
-        ImmutableMap<String, Boolean> keywords = Keywords.factory()
-            .fromFlags(flags)
-            .asMap();
-        MetaDataWithContent testMail = MetaDataWithContent.builder()
-            .uid(MessageUid.of(2))
-            .flags(flags)
-            .size(0)
-            .internalDate(INTERNAL_DATE)
-            .content(new ByteArrayInputStream("".getBytes(Charsets.UTF_8)))
-            .attachments(ImmutableList.of())
-            .mailboxId(MAILBOX_ID)
-            .messageId(TestMessageId.of(2))
-            .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
-        assertThat(testee.getKeywords()).containsAllEntriesOf(keywords);
-    }
-
-    @Test
-    public void fromMetaDataWithContentShouldRemoveUnsupportedKeyword() throws 
Exception {
-        Flags flags = FlagsBuilder.builder()
-            .add(Flag.ANSWERED, Flag.DELETED, Flag.RECENT)
-            .add(FORWARDED)
-            .build();
-        ImmutableMap<String, Boolean> keywords = Keywords.factory()
-            .filterImapNonExposedKeywords()
-            .fromFlags(flags)
-            .asMap();
+        Keywords keywords = Keywords.factory().from(Keyword.ANSWERED, new 
Keyword(FORWARDED));
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(flags)
+            .keywords(keywords)
             .size(0)
             .internalDate(INTERNAL_DATE)
             .content(new ByteArrayInputStream("".getBytes(Charsets.UTF_8)))
@@ -807,6 +763,6 @@ public class MessageFactoryTest {
             .messageId(TestMessageId.of(2))
             .build();
         Message testee = messageFactory.fromMetaDataWithContent(testMail);
-        assertThat(testee.getKeywords()).containsAllEntriesOf(keywords);
+        
assertThat(testee.getKeywords()).containsAllEntriesOf(keywords.asMap());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
index 2e690ba..3a838fb 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessageTest.java
@@ -23,16 +23,12 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.time.Instant;
 import java.util.Optional;
 
-import javax.mail.Flags;
-
-import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Maps;
 
 public class MessageTest {
 
@@ -163,12 +159,9 @@ public class MessageTest {
                 .date(currentDate)
                 .build();
         ImmutableMap<BlobId, SubMessage> attachedMessages = 
ImmutableMap.of(BlobId.of("blobId"), simpleMessage);
-        Flags flags = FlagsBuilder.builder()
-            .add(Flags.Flag.DRAFT, Flags.Flag.ANSWERED, Flags.Flag.FLAGGED)
-            .build();
 
         Keywords keywords = Keywords.factory()
-            .fromFlags(flags);
+            .from(Keyword.DRAFT, Keyword.ANSWERED, Keyword.FLAGGED);
 
         Message expected = new Message(
             TestMessageId.of(1),
@@ -198,7 +191,7 @@ public class MessageTest {
             .threadId("threadId")
             .mailboxId(InMemoryId.of(456))
             .inReplyToMessageId("inReplyToMessageId")
-            .flags(flags)
+            .keywords(keywords)
             .headers(ImmutableMap.of("key", "value"))
             .from(from)
             .to(to)
@@ -263,48 +256,6 @@ public class MessageTest {
     }
 
     @Test
-    public void buildShouldNotThrowWhenNonValidFlags() throws Exception {
-        Message.builder()
-            .id(TestMessageId.of(1))
-            .blobId(BlobId.of("blobId"))
-            .threadId("threadId")
-            .mailboxId(InMemoryId.of(456))
-            .headers(ImmutableMap.of("key", "value"))
-            .subject("subject")
-            .size(1)
-            .date(Instant.now())
-            .preview("preview")
-            .attachments(ImmutableList.of())
-            .flags(FlagsBuilder.builder()
-                    .add("@ert", "t^a", "op§")
-                    .build())
-            .build();
-    }
-
-    @Test
-    public void buildShouldIgnoreNonValidFlag() throws Exception {
-        Message message = Message.builder()
-            .id(TestMessageId.of(1))
-            .blobId(BlobId.of("blobId"))
-            .threadId("threadId")
-            .mailboxId(InMemoryId.of(456))
-            .headers(ImmutableMap.of("key", "value"))
-            .subject("subject")
-            .size(1)
-            .date(Instant.now())
-            .preview("preview")
-            .attachments(ImmutableList.of())
-            .flags(FlagsBuilder.builder()
-                    .add("$Draft", "@ert", "t^a", "op§", "$user_flag")
-                    .build())
-            .build();
-
-        assertThat(message.getKeywords()).containsOnly(
-                Maps.immutableEntry("$Draft", true), 
-                Maps.immutableEntry("$user_flag", true));
-    }
-
-    @Test
     public void hasAttachmentShouldReturnFalseWhenNoAttachment() throws 
Exception {
         Message message = Message.builder()
             .id(TestMessageId.of(1))

http://git-wip-us.apache.org/repos/asf/james-project/blob/ce13804e/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
index dd5e0f7..501e9c1 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/send/MailFactoryTest.java
@@ -26,17 +26,17 @@ import static org.mockito.Mockito.when;
 import java.time.Instant;
 import java.util.Collection;
 
-import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.jmap.model.Keyword;
+import org.apache.james.jmap.model.Keywords;
 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.MessagePreviewGenerator;
 import org.apache.james.jmap.utils.HtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
-import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
@@ -71,7 +71,7 @@ public class MailFactoryTest {
         
         message = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(new FlagsBuilder().add(Flags.Flag.SEEN).build())
+                .keywords(Keywords.factory().from(Keyword.SEEN))
                 .size(content.length())
                 .internalDate(Instant.now())
                 .sharedContent(new 
SharedByteArrayInputStream(content.getBytes(Charsets.UTF_8)))


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

Reply via email to