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

Reply via email to