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/08/25 08:32:44 UTC

[06/13] james-project git commit: JAMES-2110 GetMessage should support keywords

JAMES-2110 GetMessage should support keywords


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

Branch: refs/heads/master
Commit: c1387efaea253d6f29577d31f8938f1ec6008841
Parents: 53fdcbd
Author: quynhn <qn...@linagora.com>
Authored: Tue Aug 15 16:40:11 2017 +0700
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Thu Aug 24 15:47:27 2017 +0200

----------------------------------------------------------------------
 .../org/apache/james/jmap/model/Message.java    | 65 +++++---------
 .../apache/james/jmap/model/MessageFactory.java |  6 +-
 .../james/jmap/model/MessageProperties.java     |  1 +
 .../james/jmap/model/MessageFactoryTest.java    | 94 ++++++++++++++++++--
 .../james/jmap/model/MessagePropertiesTest.java | 10 ++-
 .../apache/james/jmap/model/MessageTest.java    | 65 +++++++-------
 6 files changed, 156 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c1387efa/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 969525d..86762fe 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,6 +26,7 @@ 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;
@@ -57,10 +58,6 @@ public class Message {
         private String threadId;
         private ImmutableList<MailboxId> mailboxIds;
         private String inReplyToMessageId;
-        private boolean isUnread;
-        private boolean isFlagged;
-        private boolean isAnswered;
-        private boolean isDraft;
         private ImmutableMap<String, String> headers;
         private Emailer from;
         private final ImmutableList.Builder<Emailer> to;
@@ -75,6 +72,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 Builder() {
             to = ImmutableList.builder();
@@ -120,23 +118,8 @@ public class Message {
             return this;
         }
 
-        public Builder isUnread(boolean isUnread) {
-            this.isUnread = isUnread;
-            return this;
-        }
-
-        public Builder isFlagged(boolean isFlagged) {
-            this.isFlagged = isFlagged;
-            return this;
-        }
-
-        public Builder isAnswered(boolean isAnswered) {
-            this.isAnswered = isAnswered;
-            return this;
-        }
-
-        public Builder isDraft(boolean isDraft) {
-            this.isDraft = isDraft;
+        public Builder flags(Flags flags) {
+            this.flags = Optional.ofNullable(flags);
             return this;
         }
 
@@ -223,9 +206,15 @@ 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);
-
-            return new Message(id, blobId, threadId, mailboxIds, Optional.ofNullable(inReplyToMessageId), isUnread, isFlagged, isAnswered, isDraft, hasAttachment, headers, Optional.ofNullable(from),
-                    to.build(), cc.build(), bcc.build(), replyTo.build(), subject, date, size, preview, textBody, htmlBody, attachments, attachedMessages);
+            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);
         }
     }
 
@@ -250,10 +239,6 @@ public class Message {
     private final String threadId;
     private final ImmutableList<MailboxId> mailboxIds;
     private final Optional<String> inReplyToMessageId;
-    private final boolean isUnread;
-    private final boolean isFlagged;
-    private final boolean isAnswered;
-    private final boolean isDraft;
     private final boolean hasAttachment;
     @JsonFilter(GetMessagesMethod.HEADERS_FILTER)
     private final ImmutableMap<String, String> headers;
@@ -270,16 +255,13 @@ public class Message {
     private final Optional<String> htmlBody;
     private final ImmutableList<Attachment> attachments;
     private final ImmutableMap<BlobId, SubMessage> attachedMessages;
+    private final Keywords keywords;
 
     @VisibleForTesting Message(MessageId id,
                                BlobId blobId,
                                String threadId,
                                ImmutableList<MailboxId> mailboxIds,
                                Optional<String> inReplyToMessageId,
-                               boolean isUnread,
-                               boolean isFlagged,
-                               boolean isAnswered,
-                               boolean isDraft,
                                boolean hasAttachment,
                                ImmutableMap<String, String> headers,
                                Optional<Emailer> from,
@@ -294,16 +276,13 @@ public class Message {
                                Optional<String> textBody,
                                Optional<String> htmlBody,
                                ImmutableList<Attachment> attachments,
-                               ImmutableMap<BlobId, SubMessage> attachedMessages) {
+                               ImmutableMap<BlobId, SubMessage> attachedMessages,
+                               Keywords keywords) {
         this.id = id;
         this.blobId = blobId;
         this.threadId = threadId;
         this.mailboxIds = mailboxIds;
         this.inReplyToMessageId = inReplyToMessageId;
-        this.isUnread = isUnread;
-        this.isFlagged = isFlagged;
-        this.isAnswered = isAnswered;
-        this.isDraft = isDraft;
         this.hasAttachment = hasAttachment;
         this.headers = headers;
         this.from = from;
@@ -319,6 +298,7 @@ public class Message {
         this.htmlBody = htmlBody;
         this.attachments = attachments;
         this.attachedMessages = attachedMessages;
+        this.keywords = keywords;
     }
 
     public MessageId getId() {
@@ -342,19 +322,19 @@ public class Message {
     }
 
     public boolean isIsUnread() {
-        return isUnread;
+        return !keywords.contains(Keyword.SEEN);
     }
 
     public boolean isIsFlagged() {
-        return isFlagged;
+        return keywords.contains(Keyword.FLAGGED);
     }
 
     public boolean isIsAnswered() {
-        return isAnswered;
+        return keywords.contains(Keyword.ANSWERED);
     }
 
     public boolean isIsDraft() {
-        return isDraft;
+        return keywords.contains(Keyword.DRAFT);
     }
 
     public boolean isHasAttachment() {
@@ -417,4 +397,7 @@ public class Message {
         return attachedMessages;
     }
 
+    public ImmutableMap<String, Boolean> getKeywords() {
+        return keywords.asMap();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1387efa/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 b5e5e1d..a84085b 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
@@ -30,7 +30,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
-
 import javax.inject.Inject;
 import javax.mail.Flags;
 import javax.mail.internet.SharedInputStream;
@@ -94,10 +93,7 @@ public class MessageFactory {
                 .threadId(message.getMessageId().serialize())
                 .mailboxIds(message.getMailboxIds())
                 .inReplyToMessageId(getHeader(mimeMessage, "in-reply-to"))
-                .isUnread(! message.getFlags().contains(Flags.Flag.SEEN))
-                .isFlagged(message.getFlags().contains(Flags.Flag.FLAGGED))
-                .isAnswered(message.getFlags().contains(Flags.Flag.ANSWERED))
-                .isDraft(message.getFlags().contains(Flags.Flag.DRAFT))
+                .flags(message.getFlags())
                 .subject(Strings.nullToEmpty(mimeMessage.getSubject()).trim())
                 .headers(toMap(mimeMessage.getHeader().getFields()))
                 .from(firstFromMailboxList(mimeMessage.getFrom()))

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1387efa/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java
index d8b23db..bf1bff5 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessageProperties.java
@@ -143,6 +143,7 @@ public class MessageProperties {
         htmlBody("htmlBody"),
         attachments("attachments"),
         attachedMessages("attachedMessages"),
+        keywords("keywords"),
         body("body", PropertyType.INPUTONLY);
     
         private final String property;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1387efa/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 4e0141d..76a5e14 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
@@ -19,19 +19,16 @@
 package org.apache.james.jmap.model;
 
 import static org.assertj.core.api.Assertions.assertThat;
-
 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.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.AttachmentId;
@@ -39,14 +36,18 @@ import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.util.mime.MessageContentExtractor;
-import org.junit.Before;
-import org.junit.Test;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
+import org.junit.Before;
+import org.junit.Test;
+
 public class MessageFactoryTest {
+    private static final String FORWARDED = "forwarded";
     private static final InMemoryId MAILBOX_ID = InMemoryId.of(18L);
     private static final Instant INTERNAL_DATE = Instant.parse("2012-02-03T14:30:42Z");
 
@@ -107,6 +108,7 @@ public class MessageFactoryTest {
 
     @Test
     public void headersShouldBeSetIntoMessage() throws Exception {
+        Flags flags = new Flags(Flag.SEEN);
         String headers = "From: user <us...@domain>\n"
                 + "Subject: test subject\n"
                 + "To: user1 <us...@domain>, user2 <us...@domain>\n"
@@ -118,7 +120,7 @@ public class MessageFactoryTest {
                 + "Other-header: other header value";
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
-                .flags(new Flags(Flag.SEEN))
+                .flags(flags)
                 .size(headers.length())
                 .internalDate(INTERNAL_DATE)
                 .content(new ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -145,6 +147,7 @@ public class MessageFactoryTest {
                 .put("Date", "Tue, 14 Jul 2015 12:30:42 +0000")
                 .put("MIME-Version", "1.0")
                 .build();
+
         Message testee = messageFactory.fromMetaDataWithContent(testMail);
         Message expected = Message.builder()
                 .id(TestMessageId.of(2))
@@ -164,12 +167,14 @@ public class MessageFactoryTest {
                 .preview("(Empty)")
                 .textBody(Optional.of(""))
                 .htmlBody(Optional.empty())
+                .flags(flags)
                 .build();
         assertThat(testee).isEqualToComparingFieldByField(expected);
     }
 
     @Test
     public void headersShouldBeUnfoldedAndDecoded() throws Exception {
+        Flags flags = new Flags(Flag.SEEN);
         String headers = "From: user <us...@domain>\n"
             + "Subject: test subject\n"
             + "To: user1 <us...@domain>,\r\n"
@@ -177,7 +182,7 @@ public class MessageFactoryTest {
             + "Cc: =?UTF-8?Q?Beno=c3=aet_TELLIER?= <te...@linagora.com>";
         MetaDataWithContent testMail = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
-            .flags(new Flags(Flag.SEEN))
+            .flags(flags)
             .size(headers.length())
             .internalDate(INTERNAL_DATE)
             .content(new ByteArrayInputStream(headers.getBytes(Charsets.UTF_8)))
@@ -213,7 +218,9 @@ public class MessageFactoryTest {
             .preview("(Empty)")
             .textBody(Optional.of(""))
             .htmlBody(Optional.empty())
+            .flags(flags)
             .build();
+
         assertThat(testee).isEqualToComparingFieldByField(expected);
     }
 
@@ -674,4 +681,75 @@ public class MessageFactoryTest {
             .extracting(Message::getPreview, Message::getHtmlBody, Message::getTextBody)
             .containsExactly("My plain message", Optional.of("<html></html>"), Optional.of("My plain message"));
     }
+
+    @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();
+
+        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 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();
+
+        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);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1387efa/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePropertiesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePropertiesTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePropertiesTest.java
index 89c5e41..3e38e60 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePropertiesTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePropertiesTest.java
@@ -50,7 +50,15 @@ public class MessagePropertiesTest {
             .hasValueSatisfying(value -> 
                 assertThat(value).contains(MessageProperty.textBody).doesNotContain(MessageProperty.body));
     }
-    
+
+    @Test
+    public void toOutputPropertiesShouldReturnIsUnread() {
+        MessageProperties actual = new MessageProperties(Optional.of(ImmutableSet.of("isUnread"))).toOutputProperties();
+        assertThat(actual.getOptionalMessageProperties())
+                .hasValueSatisfying(value ->
+                        assertThat(value).contains(MessageProperty.isUnread));
+    }
+
     @Test
     public void toOutputPropertiesShouldReturnMandatoryPropertiesWhenEmptyRequest() {
         MessageProperties actual = new MessageProperties(Optional.of(ImmutableSet.of())).toOutputProperties();

http://git-wip-us.apache.org/repos/asf/james-project/blob/c1387efa/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 494ae77..d1c0914 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,6 +23,9 @@ 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;
@@ -101,8 +104,9 @@ public class MessageTest {
     @Test
     public void buildShouldWorkWhenMandatoryFieldsArePresent() {
         Instant currentDate = Instant.now();
-        Message expected = new Message(TestMessageId.of(1), BlobId.of("blobId"), "threadId", ImmutableList.of(InMemoryId.of(456)), Optional.empty(), false, false, false, false, false, ImmutableMap.of("key", "value"), Optional.empty(),
-                ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), "subject", currentDate, 123, "preview", Optional.empty(), Optional.empty(), ImmutableList.of(), ImmutableMap.of());
+        Message expected = new Message(TestMessageId.of(1), BlobId.of("blobId"), "threadId", ImmutableList.of(InMemoryId.of(456)), Optional.empty(), false, ImmutableMap.of("key", "value"), Optional.empty(),
+                ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), "subject", currentDate, 123, "preview", Optional.empty(), Optional.empty(),
+                ImmutableList.of(), ImmutableMap.of(), Keywords.DEFAULT_VALUE);
         Message tested = Message.builder()
                 .id(TestMessageId.of(1))
                 .blobId(BlobId.of("blobId"))
@@ -158,41 +162,42 @@ 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);
+
         Message expected = new Message(
-                TestMessageId.of(1),
-                BlobId.of("blobId"),
-                "threadId",
-                ImmutableList.of(InMemoryId.of(456)),
-                Optional.of("inReplyToMessageId"), 
-                true,
-                true,
-                true,
-                true,
-                true,
-                ImmutableMap.of("key", "value"),
-                Optional.of(from),
-                to,
-                cc,
-                bcc,
-                replyTo,
-                "subject",
-                currentDate,
-                123,
-                "preview",
-                Optional.of("textBody"), 
-                Optional.of("htmlBody"),
-                attachments,
-                attachedMessages);
+            TestMessageId.of(1),
+            BlobId.of("blobId"),
+            "threadId",
+            ImmutableList.of(InMemoryId.of(456)),
+            Optional.of("inReplyToMessageId"),
+            true,
+            ImmutableMap.of("key", "value"),
+            Optional.of(from),
+            to,
+            cc,
+            bcc,
+            replyTo,
+            "subject",
+            currentDate,
+            123,
+            "preview",
+            Optional.of("textBody"),
+            Optional.of("htmlBody"),
+            attachments,
+            attachedMessages,
+            keywords);
         Message tested = Message.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
             .mailboxId(InMemoryId.of(456))
             .inReplyToMessageId("inReplyToMessageId")
-            .isUnread(true)
-            .isFlagged(true)
-            .isAnswered(true)
-            .isDraft(true)
+            .flags(flags)
             .headers(ImmutableMap.of("key", "value"))
             .from(from)
             .to(to)


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