You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2017/03/23 09:12:20 UTC
[4/6] james-project git commit: JAMES-1965 Simplify MessageFactory
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 <qn...@linagora.com>
Authored: Tue Mar 21 15:07:12 2017 +0700
Committer: Quynh Nguyen <qn...@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-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org