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