JAMES-1965 Simplify 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/a5207133
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a5207133
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a5207133

Branch: refs/heads/master
Commit: a52071339affde909dd6f193eee972c96ccc58c2
Parents: 030ed62
Author: Quynh Nguyen <qngu...@linagora.com>
Authored: Tue Mar 21 15:07:12 2017 +0700
Committer: Quynh Nguyen <qngu...@linagora.com>
Committed: Thu Mar 23 16:03:18 2017 +0700

----------------------------------------------------------------------
 .../apache/james/jmap/model/MessageFactory.java |  50 ++---
 .../jmap/model/MessagePreviewGenerator.java     |  32 +---
 .../jmap/methods/GetMessagesMethodTest.java     |  17 +-
 .../SetMessagesCreationProcessorTest.java       |   7 +-
 .../james/jmap/model/MessageFactoryTest.java    | 182 ++++++++++++++++++-
 .../jmap/model/MessagePreviewGeneratorTest.java | 155 ++--------------
 .../apache/james/jmap/send/MailFactoryTest.java |   7 +-
 7 files changed, 224 insertions(+), 226 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/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 b49e3dc..53c9d7f 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,7 +18,6 @@
  ****************************************************************/
 package org.apache.james.jmap.model;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.ZoneId;
@@ -39,9 +38,9 @@ import javax.mail.Flags;
 import javax.mail.internet.SharedInputStream;
 
 import org.apache.james.jmap.model.MessageContentExtractor.MessageContent;
+import org.apache.james.jmap.utils.HtmlTextExtractor;
 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;
@@ -68,26 +67,24 @@ public class MessageFactory {
 
     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 final MessagePreviewGenerator messagePreview;
     private final MessageContentExtractor messageContentExtractor;
-    private final TextExtractor textExtractor;
+    private final HtmlTextExtractor htmlTextExtractor;
 
     @Inject
-    public MessageFactory(MessagePreviewGenerator messagePreview, 
MessageContentExtractor messageContentExtractor, TextExtractor textExtractor) {
+    public MessageFactory(MessagePreviewGenerator messagePreview, 
MessageContentExtractor messageContentExtractor, HtmlTextExtractor 
htmlTextExtractor) {
         this.messagePreview = messagePreview;
         this.messageContentExtractor = messageContentExtractor;
-        this.textExtractor = textExtractor;
+        this.htmlTextExtractor = htmlTextExtractor;
     }
 
     public Message fromMetaDataWithContent(MetaDataWithContent message) throws 
MailboxException {
         org.apache.james.mime4j.dom.Message mimeMessage = parse(message);
         MessageContent messageContent = extractContent(mimeMessage);
         Optional<String> htmlBody = messageContent.getHtmlBody();
-        Optional<String> textBody = 
textBodyAndComputeFromHtmlBodyIfNeeded(htmlBody, messageContent.getTextBody());
+        Optional<String> mainTextContent = mainTextContent(messageContent);
+        Optional<String> textBody = computeTextBodyIfNeeded(messageContent, 
mainTextContent);
+        String preview = messagePreview.compute(mainTextContent);
         return Message.builder()
                 .id(message.getMessageId())
                 .blobId(BlobId.of(String.valueOf(message.getUid().asLong())))
@@ -109,23 +106,23 @@ public class MessageFactory {
                 .date(message.getInternalDateAsZonedDateTime())
                 .textBody(textBody)
                 .htmlBody(htmlBody)
-                .preview(getPreview(messageContent, textBody))
+                .preview(preview)
                 .attachments(getAttachments(message.getAttachments()))
                 .build();
     }
 
-    private Optional<String> 
textBodyAndComputeFromHtmlBodyIfNeeded(Optional<String> htmlBody, 
Optional<String> textBody) {
-        if (textBody.isPresent()) {
-            return textBody;
-        }
-        if (!htmlBody.isPresent()) {
-            return Optional.empty();
-        }
-        try {
-            return Optional.of(textExtractor.extractContent(new 
ByteArrayInputStream(htmlBody.get().getBytes()), HTML_CONTENT, 
EMPTY_FILE_NAME).getTextualContent());
-        } catch (Exception e) {
-            return Optional.empty();
-        }
+    private Optional<String> computeTextBodyIfNeeded(MessageContent 
messageContent, Optional<String> mainTextContent) {
+        return messageContent.getTextBody()
+            .map(Optional::of)
+            .orElse(mainTextContent);
+    }
+
+    private Optional<String> mainTextContent(MessageContent messageContent) {
+        return messageContent.getHtmlBody()
+            .map(htmlTextExtractor::toPlainText)
+            .filter(s -> !Strings.isNullOrEmpty(s))
+            .map(Optional::of)
+            .orElse(messageContent.getTextBody());
     }
 
     private org.apache.james.mime4j.dom.Message parse(MetaDataWithContent 
message) throws MailboxException {
@@ -149,13 +146,6 @@ public class MessageFactory {
         }
     }
 
-    private String getPreview(MessageContent messageContent, Optional<String> 
computedTextBody) {
-        if (messageContent.getHtmlBody().isPresent() && 
messageContent.getTextBody().isPresent()) {
-            return messagePreview.forHTMLBody(messageContent.getHtmlBody());
-        }
-        return messagePreview.forTextBody(computedTextBody);
-    }
-
     private Emailer firstFromMailboxList(MailboxList list) {
         if (list == null) {
             return null;

http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java
index 5a162cd..b5a15ea 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MessagePreviewGenerator.java
@@ -21,46 +21,20 @@ package org.apache.james.jmap.model;
 
 import java.util.Optional;
 
-import javax.inject.Inject;
-
 import org.apache.commons.lang3.StringUtils;
-import org.apache.james.jmap.utils.HtmlTextExtractor;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
 
 public class MessagePreviewGenerator {
     
     public static final String NO_BODY = "(Empty)";
     public static final int MAX_PREVIEW_LENGTH = 256;
 
-    private final HtmlTextExtractor htmlTextExtractor;
-
-    @Inject
-    public MessagePreviewGenerator(HtmlTextExtractor htmlTextExtractor) {
-        this.htmlTextExtractor = htmlTextExtractor;
-    }
-
-    public String forHTMLBody(Optional<String> body) {
-        return body.filter(text -> !text.isEmpty())
-                .map(this::asText)
-                .map(this::abbreviate)
-                .orElse(NO_BODY);
-    }
-
-    public String forTextBody(Optional<String> body) {
-        return body.filter(text -> !text.isEmpty())
+    public String compute(Optional<String> textBody) {
+        return textBody.filter(text -> !text.isEmpty())
                 .map(this::abbreviate)
                 .orElse(NO_BODY);
     }
 
-    @VisibleForTesting String asText(String body) throws 
IllegalArgumentException {
-       Preconditions.checkArgument(body != null);
-       return htmlTextExtractor.toPlainText(body);
-    }
-
-    @VisibleForTesting String abbreviate(String body) {
+    private String abbreviate(String body) {
         return StringUtils.abbreviate(body, MAX_PREVIEW_LENGTH);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
index 4686c3a..15873ee 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
@@ -20,9 +20,7 @@ package org.apache.james.jmap.methods;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 import java.io.ByteArrayInputStream;
 import java.util.Date;
@@ -43,20 +41,21 @@ import org.apache.james.jmap.model.MessageContentExtractor;
 import org.apache.james.jmap.model.MessageFactory;
 import org.apache.james.jmap.model.MessagePreviewGenerator;
 import org.apache.james.jmap.model.MessageProperties.MessageProperty;
+import org.apache.james.jmap.utils.HtmlTextExtractor;
+import org.apache.james.jmap.utils.MailboxBasedHtmlTextExtractor;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.inmemory.InMemoryMessageIdManager;
-import org.apache.james.mailbox.inmemory.JsoupTextExtractor;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.tika.extractor.TikaTextExtractor;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.assertj.core.api.Condition;
 import org.assertj.core.data.MapEntry;
@@ -117,12 +116,10 @@ public class GetMessagesMethodTest {
     @Before
     public void setup() throws Exception {
         clientId = ClientId.of("#0");
-        MessagePreviewGenerator messagePreview = 
mock(MessagePreviewGenerator.class);
-        when(messagePreview.forHTMLBody(any())).thenReturn("html preview");
-        when(messagePreview.forTextBody(any())).thenReturn("text preview");
+        HtmlTextExtractor htmlTextExtractor = new 
MailboxBasedHtmlTextExtractor(new TikaTextExtractor());
+        MessagePreviewGenerator messagePreview = new MessagePreviewGenerator();
         MessageContentExtractor messageContentExtractor = new 
MessageContentExtractor();
-        TextExtractor textExtractor = new JsoupTextExtractor();
-        MessageFactory messageFactory = new MessageFactory(messagePreview, 
messageContentExtractor, textExtractor);
+        MessageFactory messageFactory = new MessageFactory(messagePreview, 
messageContentExtractor, htmlTextExtractor);
         InMemoryIntegrationResources inMemoryIntegrationResources = new 
InMemoryIntegrationResources();
         GroupMembershipResolver groupMembershipResolver = 
inMemoryIntegrationResources.createGroupMembershipResolver();
         mailboxManager = 
inMemoryIntegrationResources.createMailboxManager(groupMembershipResolver);
@@ -248,7 +245,6 @@ public class GetMessagesMethodTest {
                 .build();
 
         Stream<JmapResponse> result = testee.process(request, clientId, 
session);
-
         assertThat(result).hasSize(1)
             .extracting(JmapResponse::getProperties)
             .flatExtracting(Optional::get)
@@ -271,7 +267,6 @@ public class GetMessagesMethodTest {
         Set<MessageProperty> expected = Sets.newHashSet(MessageProperty.id, 
MessageProperty.subject);
 
         List<JmapResponse> result = testee.process(request, clientId, 
session).collect(Collectors.toList());
-
         assertThat(result).hasSize(1)
             .extracting(JmapResponse::getProperties)
             .flatExtracting(Optional::get)

http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/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 bf9de1b..3d06a3b 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
@@ -53,6 +53,7 @@ import org.apache.james.jmap.model.mailbox.Role;
 import org.apache.james.jmap.send.MailFactory;
 import org.apache.james.jmap.send.MailMetadata;
 import org.apache.james.jmap.send.MailSpool;
+import org.apache.james.jmap.utils.HtmlTextExtractor;
 import org.apache.james.jmap.utils.SystemMailboxesProvider;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -117,11 +118,11 @@ public class SetMessagesCreationProcessorTest {
 
     @Before
     public void setUp() throws MailboxException {
+        HtmlTextExtractor htmlTextExtractor = mock(HtmlTextExtractor.class);
         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, textExtractor);
+        when(messagePreview.compute(any())).thenReturn("text preview");
+        messageFactory = new MessageFactory(messagePreview, 
messageContentExtractor, htmlTextExtractor);
         mockedMailSpool = mock(MailSpool.class);
         mockedMailFactory = mock(MailFactory.class);
         mockedAttachmentManager = mock(AttachmentManager.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/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 74dad6f..1e0130c 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,8 +19,6 @@
 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;
@@ -35,14 +33,14 @@ 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.MailboxBasedHtmlTextExtractor;
 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;
 import org.apache.james.mailbox.model.TestMessageId;
+import org.apache.james.mailbox.tika.extractor.TikaTextExtractor;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -62,13 +60,12 @@ public class MessageFactoryTest {
     
     @Before
     public void setUp() {
-        htmlTextExtractor = mock(HtmlTextExtractor.class);
-        TextExtractor textExtractor = new JsoupTextExtractor();
+        htmlTextExtractor = new MailboxBasedHtmlTextExtractor(new 
TikaTextExtractor());
 
-        messagePreview = new MessagePreviewGenerator(htmlTextExtractor);
+        messagePreview = new MessagePreviewGenerator();
         MessageContentExtractor messageContentExtractor = new 
MessageContentExtractor();
 
-        messageFactory = new MessageFactory(messagePreview, 
messageContentExtractor, textExtractor);
+        messageFactory = new MessageFactory(messagePreview, 
messageContentExtractor, htmlTextExtractor);
     }
     @Test
     public void emptyMailShouldBeLoadedIntoMessage() throws Exception {
@@ -193,6 +190,42 @@ public class MessageFactoryTest {
     }
 
     @Test
+    public void textBodyShouldNotOverrideWhenItIsThere() throws Exception {
+        ByteArrayInputStream messageContent = new 
ByteArrayInputStream(("Subject\n"
+            + "MIME-Version: 1.0\n"
+            + "Content-Type: multipart/alternative;\n"
+            + "\tboundary=\"----=_Part_370449_1340169331.1489506420401\"\n"
+            + "\n"
+            + "------=_Part_370449_1340169331.1489506420401\n"
+            + "Content-Type: text/plain; charset=UTF-8\n"
+            + "Content-Transfer-Encoding: 7bit\n"
+            + "\n"
+            + "My plain message\n"
+            + "------=_Part_370449_1340169331.1489506420401\n"
+            + "Content-Type: text/html; charset=UTF-8\n"
+            + "Content-Transfer-Encoding: 7bit\n"
+            + "\n"
+            + "<a>The </a> <strong>HTML</strong> message"
+        ).getBytes(Charsets.UTF_8));
+
+        MetaDataWithContent testMail = MetaDataWithContent.builder()
+            .uid(MessageUid.of(2))
+            .flags(new Flags(Flag.SEEN))
+            .internalDate(INTERNAL_DATE)
+            .size(1000)
+            .content(messageContent)
+            .attachments(ImmutableList.of())
+            .mailboxId(MAILBOX_ID)
+            .messageId(TestMessageId.of(2))
+            .build();
+        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+
+        assertThat(testee.getTextBody())
+            .isPresent()
+            .isEqualTo(Optional.of("My plain message"));
+    }
+
+    @Test
     public void previewShouldBeLimitedTo256Length() throws Exception {
         String headers = "Subject: test subject\n";
         String body300 = 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
@@ -365,4 +398,137 @@ public class MessageFactoryTest {
         assertThat(testee.getHtmlBody()).contains("");
         assertThat(testee.getTextBody()).isEmpty();
     }
+
+    @Test
+    public void 
previewBodyShouldReturnTruncatedStringWithoutHtmlTagWhenHtmlBodyContainTags() 
throws Exception {
+        String body = "This is a <b>HTML</b> mail containing <u>underlined 
part</u>, <i>italic part</i> and <u><i>underlined AND italic 
part</i></u>9999999999"
+            + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
+            + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
+            + "000000000011111111112222222222333333333344444444445555555";
+        String expected = "This is a HTML mail containing underlined part, 
italic part and underlined AND italic part9999999999"
+            + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
+            + "00000000001111111111222222222233333333334444444444555...";
+
+        ByteArrayInputStream messageContent = new 
ByteArrayInputStream(("CContent-Type: text/html\r\n"
+            + "Subject: message 1 subject\r\n"
+            + "\r\n"
+            + body).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(expected);
+    }
+
+    @Test
+    public void previewBodyShouldReturnTextBodyWhenNoHtmlBody() throws 
Exception {
+        ByteArrayInputStream messageContent = new 
ByteArrayInputStream(("CContent-Type: text/plain\r\n"
+            + "Subject: message 1 subject\r\n"
+            + "\r\n"
+            + "My plain text").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 plain text");
+    }
+
+    @Test
+    public void 
previewBodyShouldReturnStringEmptyWhenNoHtmlBodyAndNoTextBody() throws 
Exception {
+        ByteArrayInputStream messageContent = new 
ByteArrayInputStream(("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)
+            .extracting(Message::getPreview, Message::getHtmlBody, 
Message::getTextBody)
+            .containsExactly(MessagePreviewGenerator.NO_BODY, 
Optional.empty(), Optional.of(""));
+    }
+
+    @Test
+    public void 
previewBodyShouldReturnStringEmptyWhenNoMeaningHtmlBodyAndNoTextBody() throws 
Exception {
+        ByteArrayInputStream messageContent = new 
ByteArrayInputStream(("CContent-Type: text/html\r\n"
+            + "Subject: message 1 subject\r\n"
+            + "\r\n"
+            + "<html><body></body></html>").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)
+            .extracting(Message::getPreview, Message::getHtmlBody, 
Message::getTextBody)
+            .containsExactly(MessagePreviewGenerator.NO_BODY, 
Optional.of("<html><body></body></html>"), Optional.empty());
+    }
+
+    @Test
+    public void 
previewBodyShouldReturnTextBodyWhenNoMeaningHtmlBodyAndTextBody() throws 
Exception {
+        ByteArrayInputStream messageContent = new 
ByteArrayInputStream(("Subject\n"
+            + "MIME-Version: 1.0\n"
+            + "Content-Type: multipart/alternative;\n"
+            + "\tboundary=\"----=_Part_370449_1340169331.1489506420401\"\n"
+            + "\n"
+            + "------=_Part_370449_1340169331.1489506420401\n"
+            + "Content-Type: text/plain; charset=UTF-8\n"
+            + "Content-Transfer-Encoding: 7bit\n"
+            + "\n"
+            + "My plain message\n"
+            + "------=_Part_370449_1340169331.1489506420401\n"
+            + "Content-Type: text/html; charset=UTF-8\n"
+            + "Content-Transfer-Encoding: 7bit\n"
+            + "\n"
+            + "<html></html>"
+        ).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)
+            .extracting(Message::getPreview, Message::getHtmlBody, 
Message::getTextBody)
+            .containsExactly("My plain message", Optional.of("<html></html>"), 
Optional.of("My plain message"));
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java
index f9ae3b3..7874117 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MessagePreviewGeneratorTest.java
@@ -20,168 +20,39 @@
 package org.apache.james.jmap.model;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 import java.util.Optional;
 
-import org.apache.james.jmap.utils.HtmlTextExtractor;
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
 public class MessagePreviewGeneratorTest {
     
     private MessagePreviewGenerator testee;
-    private HtmlTextExtractor htmlTextExtractor;
-    
+
     @Before
     public void setUp() {
-        htmlTextExtractor = mock(HtmlTextExtractor.class);
-        testee = new MessagePreviewGenerator(htmlTextExtractor);
+        testee = new MessagePreviewGenerator();
     }
 
     @Test
-    public void 
forHTMLBodyShouldReturnTruncatedStringWithoutHtmlTagWhenStringContainTagsAndIsLongerThan256Characters()
 {
-        //Given
-        String body = "This is a <b>HTML</b> mail containing <u>underlined 
part</u>, <i>italic part</i> and <u><i>underlined AND italic 
part</i></u>9999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "000000000011111111112222222222333333333344444444445555555";
-        String bodyWithoutTags = "This is a HTML mail containing underlined 
part, italic part and underlined AND italic part9999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "000000000011111111112222222222333333333344444444445555555";
-        String expected = "This is a HTML mail containing underlined part, 
italic part and underlined AND italic part9999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "00000000001111111111222222222233333333334444444444555...";
-        //When
-        when(htmlTextExtractor.toPlainText(body))
-            .thenReturn(bodyWithoutTags);
-        String actual = testee.forHTMLBody(Optional.of(body));
-        //Then
-        assertThat(actual).isEqualTo(expected);
+    public void computeShouldReturnStringEmptyWhenEmptyTextBody() throws 
Exception {
+        
assertThat(testee.compute(Optional.empty())).isEqualTo(MessagePreviewGenerator.NO_BODY);
     }
 
     @Test
-    public void forHTMLBodyShouldReturnStringContainingEmptyWhenEmptyString() {
-        //Given
-        String body = "" ;
-        String expected = "(Empty)" ;
-        //When
-        when(htmlTextExtractor.toPlainText(body))
-            .thenReturn(expected);
-        String actual = testee.forHTMLBody(Optional.of(body));
-        //Then
-        assertThat(actual).isEqualTo(expected);
+    public void computeShouldReturnStringEmptyWhenStringEmptyTextBody() throws 
Exception {
+        
assertThat(testee.compute(Optional.of(""))).isEqualTo(MessagePreviewGenerator.NO_BODY);
     }
 
     @Test
-    public void 
forTextBodyShouldReturnTruncatedStringWhenStringContainTagsAndIsLongerThan256Characters()
 {
-        //Given
-        String body = 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "This is a <b>HTML</b> mail containing <u>underlined 
part</u>, <i>italic part</i>88888888889999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "000000000011111111112222222222333333333344444444445555555";
-        String expected = 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "This is a <b>HTML</b> mail containing <u>underlined 
part</u>, <i>italic part</i>88888888889999999999"
-                + "00000000001111111111222222222233333333334444444444555...";
-        //When
-        String actual = testee.forTextBody(Optional.of(body));
-        //Then
-        assertThat(actual).isEqualTo(expected);
-    }
+    public void computeShouldReturnStringIsLimitedTo256Length() throws 
Exception {
+        String body = StringUtils.leftPad("a", 300, "b");
+        String expected = StringUtils.leftPad("b", 
MessagePreviewGenerator.MAX_PREVIEW_LENGTH - 3, "b") + "...";
 
-    @Test
-    public void forTextBodyShouldReturnStringContainingEmptyWhenEmptyString() {
-        //Given
-        String expected = "(Empty)" ;
-        //When
-        String actual = testee.forTextBody(Optional.empty());
-        //Then
-        assertThat(actual).isEqualTo(expected);
-    }
-
-    @Test
-    public void asTextShouldReturnStringWithoutHtmlTag() {
-        //Given
-        String body = "This is a <b>HTML</b> mail";
-        String expected = "This is a HTML mail";
-        //When
-        when(htmlTextExtractor.toPlainText(body))
-            .thenReturn(expected);
-        String actual = testee.asText(body);
-        //Then
-        assertThat(actual).isEqualTo(expected);
+        assertThat(testee.compute(Optional.of(body)))
+            .hasSize(MessagePreviewGenerator.MAX_PREVIEW_LENGTH)
+            .isEqualTo(expected);
     }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void asTextShouldThrowWhenNullString () {
-        testee.asText(null);
-    }
-
-    @Test
-    public void asTextShouldReturnEmptyStringWhenEmptyString() {
-        //Given
-        String body = "";
-        String expected = "";
-        //When
-        when(htmlTextExtractor.toPlainText(body))
-            .thenReturn(expected);
-        String actual = testee.asText(body);
-        //Then
-        assertThat(actual).isEqualTo(expected);
-    }
-
-    @Test
-    public void abbreviateShouldNotTruncateAbodyWith256Length() {
-        //Given
-        String body256 = 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "00000000001111111111222222222233333333334444444444555555";
-        //When
-        String actual = testee.abbreviate(body256);
-        //Then
-        assertThat(body256.length()).isEqualTo(256);
-        assertThat(actual).isEqualTo(body256);
-    }
-
-    @Test
-    public void abbreviateShouldTruncateAbodyWith257Length() {
-        //Given
-        String body257 = 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "000000000011111111112222222222333333333344444444445555555";
-        String expected = 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + 
"0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
-                + "00000000001111111111222222222233333333334444444444555...";
-        //When
-        String actual = testee.abbreviate(body257);
-        //Then
-        assertThat(body257.length()).isEqualTo(257);
-        assertThat(expected.length()).isEqualTo(256);
-        assertThat(actual).isEqualTo(expected);
-    }
-
-    @Test
-    public void abbreviateShouldReturnNullStringWhenNullString() {
-        //Given
-        String body = null;
-        String expected = null;
-        //When
-        String actual = testee.abbreviate(body);
-        //Then
-        assertThat(actual).isEqualTo(expected);
-    }
-
-    @Test
-    public void abbreviateShouldReturnEmptyStringWhenEmptyString() {
-        //Given
-        String body = "";
-        String expected = "";
-        //When
-        String actual = testee.abbreviate(body);
-        //Then
-        assertThat(actual).isEqualTo(expected);
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/a5207133/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 add4e29..34e4c59 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
@@ -35,6 +35,7 @@ import org.apache.james.jmap.model.MessageContentExtractor;
 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.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -78,11 +79,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");
+        HtmlTextExtractor htmlTextExtractor = mock(HtmlTextExtractor.class);
+        when(messagePreview.compute(any())).thenReturn("text preview");
 
         MessageContentExtractor messageContentExtractor = new 
MessageContentExtractor();
-        MessageFactory messageFactory = new MessageFactory(messagePreview, 
messageContentExtractor, textExtractor);
+        MessageFactory messageFactory = new MessageFactory(messagePreview, 
messageContentExtractor, htmlTextExtractor);
         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