Repository: james-project Updated Branches: refs/heads/master b119f624d -> 844b9519c
JAMES-1965 Compute textBody when htmlBody is available Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/0678047b Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/0678047b Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/0678047b Branch: refs/heads/master Commit: 0678047b004eece18a258c9a7741610d2f703e2f Parents: b119f62 Author: Quynh Nguyen <qngu...@linagora.com> Authored: Wed Mar 15 11:04:48 2017 +0700 Committer: Quynh Nguyen <qngu...@linagora.com> Committed: Thu Mar 23 16:02:45 2017 +0700 ---------------------------------------------------------------------- .../apache/james/jmap/model/MessageFactory.java | 37 +++++++++++--- .../SetMessagesCreationProcessorTest.java | 4 +- .../james/jmap/model/MessageFactoryTest.java | 53 +++++++++++++++++++- .../apache/james/jmap/send/MailFactoryTest.java | 4 +- 4 files changed, 88 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/0678047b/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 9dc1acf..5d7b2fa 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 @@ -18,6 +18,7 @@ ****************************************************************/ package org.apache.james.jmap.model; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.time.ZoneId; @@ -27,6 +28,7 @@ import java.util.Date; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; import java.util.TimeZone; import java.util.function.Function; @@ -39,6 +41,7 @@ import javax.mail.internet.SharedInputStream; import org.apache.james.jmap.model.MessageContentExtractor.MessageContent; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.extractor.TextExtractor; import org.apache.james.mailbox.model.Cid; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageAttachment; @@ -63,21 +66,30 @@ public class MessageFactory { private static final int NO_LINE_LENGTH_LIMIT_PARSING = -1; - public static final ZoneId UTC_ZONE_ID = ZoneId.of("Z"); + private static final ZoneId UTC_ZONE_ID = ZoneId.of("Z"); + + private static final String HTML_CONTENT = "text/html"; + + private static final String EMPTY_FILE_NAME = ""; + + private static final String NO_BODY = ""; private final MessagePreviewGenerator messagePreview; private final MessageContentExtractor messageContentExtractor; + private final TextExtractor textExtractor; @Inject - public MessageFactory(MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor) { + public MessageFactory(MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor, TextExtractor textExtractor) { this.messagePreview = messagePreview; this.messageContentExtractor = messageContentExtractor; + this.textExtractor = textExtractor; } public Message fromMetaDataWithContent(MetaDataWithContent message) throws MailboxException { org.apache.james.mime4j.dom.Message mimeMessage = parse(message); MessageContent messageContent = extractContent(mimeMessage); - + String htmlBody = messageContent.getHtmlBody().orElse(NO_BODY); + String textBody = messageContent.getTextBody().orElseGet(() -> textBodyFromHtmlBody(htmlBody).orElse(NO_BODY)); return Message.builder() .id(message.getMessageId()) .blobId(BlobId.of(String.valueOf(message.getUid().asLong()))) @@ -97,13 +109,21 @@ public class MessageFactory { .replyTo(fromAddressList(mimeMessage.getReplyTo())) .size(message.getSize()) .date(message.getInternalDateAsZonedDateTime()) - .textBody(messageContent.getTextBody().orElse(null)) - .htmlBody(messageContent.getHtmlBody().orElse(null)) - .preview(getPreview(messageContent)) + .textBody(textBody) + .htmlBody(htmlBody) + .preview(getPreview(messageContent, textBody)) .attachments(getAttachments(message.getAttachments())) .build(); } + private Optional<String> textBodyFromHtmlBody(String htmlBody) { + try { + return Optional.of(textExtractor.extractContent(new ByteArrayInputStream(htmlBody.getBytes()), HTML_CONTENT, EMPTY_FILE_NAME).getTextualContent()); + } catch (Exception e) { + return Optional.empty(); + } + } + private org.apache.james.mime4j.dom.Message parse(MetaDataWithContent message) throws MailboxException { try { return MessageBuilder @@ -125,8 +145,11 @@ public class MessageFactory { } } - private String getPreview(MessageContent messageContent) { + private String getPreview(MessageContent messageContent, String computedTextBody) { if (messageContent.getHtmlBody().isPresent()) { + if (!messageContent.getTextBody().isPresent()) { + return messagePreview.forTextBody(Optional.of(computedTextBody)); + } return messagePreview.forHTMLBody(messageContent.getHtmlBody()); } return messagePreview.forTextBody(messageContent.getTextBody()); http://git-wip-us.apache.org/repos/asf/james-project/blob/0678047b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java index bace5d9..bf9de1b 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/SetMessagesCreationProcessorTest.java @@ -60,6 +60,7 @@ import org.apache.james.mailbox.MessageManager; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.AttachmentNotFoundException; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.extractor.TextExtractor; import org.apache.james.mailbox.inmemory.InMemoryId; import org.apache.james.mailbox.mock.MockMailboxSession; import org.apache.james.mailbox.model.AttachmentId; @@ -117,9 +118,10 @@ public class SetMessagesCreationProcessorTest { @Before public void setUp() throws MailboxException { MessagePreviewGenerator messagePreview = mock(MessagePreviewGenerator.class); + TextExtractor textExtractor = mock(TextExtractor.class); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); when(messagePreview.forTextBody(any())).thenReturn("text preview"); - messageFactory = new MessageFactory(messagePreview, messageContentExtractor); + messageFactory = new MessageFactory(messagePreview, messageContentExtractor, textExtractor); mockedMailSpool = mock(MailSpool.class); mockedMailFactory = mock(MailFactory.class); mockedAttachmentManager = mock(AttachmentManager.class); http://git-wip-us.apache.org/repos/asf/james-project/blob/0678047b/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 c0bd1f3..026d62b 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 @@ -20,11 +20,13 @@ package org.apache.james.jmap.model; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import static org.hamcrest.CoreMatchers.is; import java.io.ByteArrayInputStream; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Date; +import java.util.Optional; import javax.mail.Flags; import javax.mail.Flags.Flag; @@ -34,7 +36,9 @@ 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.mailbox.MessageUid; +import org.apache.james.mailbox.extractor.TextExtractor; import org.apache.james.mailbox.inmemory.InMemoryId; +import org.apache.james.mailbox.inmemory.JsoupTextExtractor; import org.apache.james.mailbox.model.AttachmentId; import org.apache.james.mailbox.model.Cid; import org.apache.james.mailbox.model.MessageAttachment; @@ -59,9 +63,12 @@ public class MessageFactoryTest { @Before public void setUp() { htmlTextExtractor = mock(HtmlTextExtractor.class); + TextExtractor textExtractor = new JsoupTextExtractor(); + messagePreview = new MessagePreviewGenerator(htmlTextExtractor); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); - messageFactory = new MessageFactory(messagePreview, messageContentExtractor); + + messageFactory = new MessageFactory(messagePreview, messageContentExtractor, textExtractor); } @Test public void emptyMailShouldBeLoadedIntoMessage() throws Exception { @@ -161,6 +168,7 @@ public class MessageFactoryTest { .size(headers.length()) .preview("(Empty)") .textBody("") + .htmlBody("") .build(); assertThat(testee).isEqualToComparingFieldByField(expected); } @@ -314,4 +322,47 @@ public class MessageFactoryTest { .containsExactly("(Empty)", 1010L, "", ImmutableMap.of("Date", "Tue, 14 Jul 2015 12:30:42 +0000", "MIME-Version", "1.0"), ZONED_DATE); } + @Test + public void textBodyShouldBeSetIntoMessageInCaseOfHtmlBody() throws Exception { + ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/html\r\n" + + "Subject: message 1 subject\r\n" + + "\r\n" + + "my <b>HTML</b> message").getBytes(Charsets.UTF_8)); + MetaDataWithContent testMail = MetaDataWithContent.builder() + .uid(MessageUid.of(2)) + .flags(new Flags(Flag.SEEN)) + .size(messageContent.read()) + .internalDate(INTERNAL_DATE) + .content(messageContent) + .attachments(ImmutableList.of()) + .mailboxId(MAILBOX_ID) + .messageId(TestMessageId.of(2)) + .build(); + Message testee = messageFactory.fromMetaDataWithContent(testMail); + + assertThat(testee.getPreview()).isEqualTo("my HTML message"); + assertThat(testee.getTextBody()).hasValue("my HTML message"); + assertThat(testee.getHtmlBody()).hasValue("my <b>HTML</b> message"); + } + + @Test + public void textBodyShouldBeEmptyInCaseOfEmptyHtmlBodyAndEmptyTextBody() throws Exception { + ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/html\r\n" + + "Subject: message 1 subject\r\n").getBytes(Charsets.UTF_8)); + MetaDataWithContent testMail = MetaDataWithContent.builder() + .uid(MessageUid.of(2)) + .flags(new Flags(Flag.SEEN)) + .size(messageContent.read()) + .internalDate(INTERNAL_DATE) + .content(messageContent) + .attachments(ImmutableList.of()) + .mailboxId(MAILBOX_ID) + .messageId(TestMessageId.of(2)) + .build(); + Message testee = messageFactory.fromMetaDataWithContent(testMail); + + assertThat(testee.getPreview()).isEqualTo(MessagePreviewGenerator.NO_BODY); + assertThat(testee.getHtmlBody()).hasValue(""); + assertThat(testee.getTextBody()).hasValue(""); + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/0678047b/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 be8cda9..add4e29 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 @@ -38,6 +38,7 @@ import org.apache.james.jmap.model.MessagePreviewGenerator; import org.apache.james.mailbox.FlagsBuilder; import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.extractor.TextExtractor; import org.apache.james.mailbox.inmemory.InMemoryId; import org.apache.james.mailbox.model.TestMessageId; import org.apache.mailet.Mail; @@ -77,10 +78,11 @@ public class MailFactoryTest { .messageId(TestMessageId.of(2)) .build(); MessagePreviewGenerator messagePreview = mock(MessagePreviewGenerator.class); + TextExtractor textExtractor = mock(TextExtractor.class); when(messagePreview.forTextBody(any())).thenReturn("text preview"); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); - MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor); + MessageFactory messageFactory = new MessageFactory(messagePreview, messageContentExtractor, textExtractor); jmapMessage = messageFactory.fromMetaDataWithContent(message); } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org