This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 838f0373ad8d6e7eaab2504e7de5e2a1720b18c7 Author: Rene Cordier <[email protected]> AuthorDate: Tue Dec 3 14:12:00 2019 +0700 JAMES-2991 Refactoring message parsing in MessageFullViewFactory - Move mainTextContent method from MessageFullViewFactory to MessageContentExtractor and rename it extractMainContent - Remove unnecessary extractContent method --- .../org/apache/james/jmap/draft/JMAPModule.java | 2 +- .../apache/james/util/html}/HtmlTextExtractor.java | 2 +- .../james/util/mime/MessageContentExtractor.java | 9 +++++++++ server/protocols/jmap-draft/pom.xml | 4 ++++ .../model/message/view/MessageFullViewFactory.java | 22 +++++++--------------- .../jmap/draft/utils/JsoupHtmlTextExtractor.java | 1 + .../jmap/draft/utils/MimeMessageBodyGenerator.java | 1 + .../jmap/draft/methods/GetMessagesMethodTest.java | 4 ++-- .../jmap/draft/methods/MessageSenderTest.java | 7 ++++--- .../methods/SetMessagesCreationProcessorTest.java | 5 +++-- .../message/view/MessageFastViewFactoryTest.java | 2 +- .../message/view/MessageFullViewFactoryTest.java | 5 ++--- .../draft/utils/MimeMessageBodyGeneratorTest.java | 1 + 13 files changed, 37 insertions(+), 28 deletions(-) diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPModule.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPModule.java index d5a1f34..030261e 100644 --- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPModule.java +++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPModule.java @@ -31,7 +31,6 @@ import org.apache.commons.io.FileUtils; import org.apache.james.filesystem.api.FileSystem; import org.apache.james.jmap.draft.methods.RequestHandler; import org.apache.james.jmap.draft.send.PostDequeueDecoratorFactory; -import org.apache.james.jmap.draft.utils.HtmlTextExtractor; import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor; import org.apache.james.jmap.event.PropagateLookupRightListener; import org.apache.james.jmap.mailet.VacationMailet; @@ -45,6 +44,7 @@ import org.apache.james.modules.server.CamelMailetContainerModule; import org.apache.james.queue.api.MailQueueItemDecoratorFactory; import org.apache.james.server.core.configuration.FileConfigurationProvider; import org.apache.james.transport.matchers.RecipientIsLocal; +import org.apache.james.util.html.HtmlTextExtractor; import org.apache.james.utils.PropertiesProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/HtmlTextExtractor.java b/server/container/util/src/main/java/org/apache/james/util/html/HtmlTextExtractor.java similarity index 96% rename from server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/HtmlTextExtractor.java rename to server/container/util/src/main/java/org/apache/james/util/html/HtmlTextExtractor.java index 323ab71..e6e7df2 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/HtmlTextExtractor.java +++ b/server/container/util/src/main/java/org/apache/james/util/html/HtmlTextExtractor.java @@ -17,7 +17,7 @@ * under the License. * ****************************************************************/ -package org.apache.james.jmap.draft.utils; +package org.apache.james.util.html; public interface HtmlTextExtractor { diff --git a/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java b/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java index 74bb660..32b436a 100644 --- a/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java +++ b/server/container/util/src/main/java/org/apache/james/util/mime/MessageContentExtractor.java @@ -34,9 +34,11 @@ import org.apache.james.mime4j.dom.Body; import org.apache.james.mime4j.dom.Entity; import org.apache.james.mime4j.dom.Multipart; import org.apache.james.mime4j.dom.TextBody; +import org.apache.james.util.html.HtmlTextExtractor; import com.github.fge.lambdas.Throwing; import com.github.fge.lambdas.functions.ThrowingFunction; +import com.google.common.base.Strings; public class MessageContentExtractor { @@ -220,6 +222,13 @@ public class MessageContentExtractor { htmlBody.map(Optional::of).orElse(fromInnerMultipart.getHtmlBody())); } + public Optional<String> extractMainTextContent(HtmlTextExtractor htmlTextExtractor) { + return htmlBody.map(htmlTextExtractor::toPlainText) + .filter(s -> !Strings.isNullOrEmpty(s)) + .map(Optional::of) + .orElse(textBody); + } + @Override public boolean equals(Object other) { if (other == null || !(other instanceof MessageContent)) { diff --git a/server/protocols/jmap-draft/pom.xml b/server/protocols/jmap-draft/pom.xml index c5734e8..479beed 100644 --- a/server/protocols/jmap-draft/pom.xml +++ b/server/protocols/jmap-draft/pom.xml @@ -60,6 +60,10 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>apache-james-mailbox-store</artifactId> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>apache-mailet-test</artifactId> <scope>test</scope> </dependency> diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java index e3223db..c806214 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java @@ -38,7 +38,6 @@ import org.apache.james.jmap.draft.model.Attachment; import org.apache.james.jmap.draft.model.BlobId; import org.apache.james.jmap.draft.model.Emailer; import org.apache.james.jmap.draft.model.Keywords; -import org.apache.james.jmap.draft.utils.HtmlTextExtractor; import org.apache.james.mailbox.BlobManager; import org.apache.james.mailbox.MailboxSession; import org.apache.james.mailbox.MessageIdManager; @@ -51,6 +50,7 @@ import org.apache.james.mailbox.model.MessageAttachment; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.MessageResult; import org.apache.james.mime4j.dom.Message; +import org.apache.james.util.html.HtmlTextExtractor; import org.apache.james.util.mime.MessageContentExtractor; import org.apache.james.util.mime.MessageContentExtractor.MessageContent; import org.slf4j.Logger; @@ -91,11 +91,11 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie return Helpers.toMessageViews(messages, this::fromMessageResults); } - public MessageFullView fromMetaDataWithContent(MetaDataWithContent message) throws MailboxException, IOException { + public MessageFullView fromMetaDataWithContent(MetaDataWithContent message) throws IOException { Message mimeMessage = Helpers.parse(message.getContent()); - MessageContent messageContent = extractContent(mimeMessage); + MessageContent messageContent = messageContentExtractor.extract(mimeMessage); Optional<String> htmlBody = messageContent.getHtmlBody(); - Optional<String> mainTextContent = mainTextContent(messageContent); + Optional<String> mainTextContent = messageContent.extractMainTextContent(htmlTextExtractor); Optional<String> textBody = computeTextBodyIfNeeded(messageContent, mainTextContent); MessageFastViewPrecomputedProperties messageProjection = retrieveProjection( @@ -168,11 +168,11 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie .orElse(message.getInternalDate()); } - MessageFullView fromMessageResults(Collection<MessageResult> messageResults) throws MailboxException, IOException { + public MessageFullView fromMessageResults(Collection<MessageResult> messageResults) throws MailboxException, IOException { return fromMetaDataWithContent(toMetaDataWithContent(messageResults)); } - MetaDataWithContent toMetaDataWithContent(Collection<MessageResult> messageResults) throws MailboxException { + private MetaDataWithContent toMetaDataWithContent(Collection<MessageResult> messageResults) throws MailboxException { Helpers.assertOneMessageId(messageResults); MessageResult firstMessageResult = messageResults.iterator().next(); @@ -192,21 +192,13 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie .orElse(mainTextContent); } - Optional<String> mainTextContent(MessageContent messageContent) { + private Optional<String> mainTextContent(MessageContent messageContent) { return messageContent.getHtmlBody() .map(htmlTextExtractor::toPlainText) .filter(s -> !Strings.isNullOrEmpty(s)) .map(Optional::of) .orElse(messageContent.getTextBody()); } - - MessageContent extractContent(Message mimeMessage) throws MailboxException { - try { - return messageContentExtractor.extract(mimeMessage); - } catch (IOException e) { - throw new MailboxException("Unable to extract content: " + e.getMessage(), e); - } - } private List<Attachment> getAttachments(List<MessageAttachment> attachments) { return attachments.stream() diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/JsoupHtmlTextExtractor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/JsoupHtmlTextExtractor.java index 79ec3ac..c697c4e 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/JsoupHtmlTextExtractor.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/JsoupHtmlTextExtractor.java @@ -23,6 +23,7 @@ import java.util.Optional; import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; +import org.apache.james.util.html.HtmlTextExtractor; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/MimeMessageBodyGenerator.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/MimeMessageBodyGenerator.java index 671c4fb..aebab3e 100644 --- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/MimeMessageBodyGenerator.java +++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/MimeMessageBodyGenerator.java @@ -32,6 +32,7 @@ import javax.mail.internet.MimeMultipart; import javax.mail.util.ByteArrayDataSource; import org.apache.james.mime4j.dom.field.ContentTypeField; +import org.apache.james.util.html.HtmlTextExtractor; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java index 8b38bd8..d8539b6 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMessagesMethodTest.java @@ -50,7 +50,6 @@ import org.apache.james.jmap.draft.model.message.view.MessageHeaderViewFactory; import org.apache.james.jmap.draft.model.message.view.MessageMetadataView; import org.apache.james.jmap.draft.model.message.view.MessageMetadataViewFactory; import org.apache.james.jmap.draft.model.message.view.MetaMessageViewFactory; -import org.apache.james.jmap.draft.utils.HtmlTextExtractor; import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor; import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection; import org.apache.james.mailbox.BlobManager; @@ -72,6 +71,7 @@ import org.apache.james.metrics.logger.DefaultMetricFactory; import org.apache.james.mime4j.message.BodyPartBuilder; import org.apache.james.mime4j.message.MultipartBuilder; import org.apache.james.mime4j.stream.RawField; +import org.apache.james.util.html.HtmlTextExtractor; import org.apache.james.util.mime.MessageContentExtractor; import org.assertj.core.api.Condition; import org.assertj.core.data.MapEntry; @@ -108,8 +108,8 @@ public class GetMessagesMethodTest { @Before public void setup() throws Exception { methodCallId = MethodCallId.of("#0"); - HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor(); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); + HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor(); BlobManager blobManager = mock(BlobManager.class); when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake")); InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources(); diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java index 1da53f4..bffb867 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java @@ -39,7 +39,7 @@ import org.apache.james.jmap.draft.model.Keywords; import org.apache.james.jmap.draft.model.message.view.MessageFullView; import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory; import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory.MetaDataWithContent; -import org.apache.james.jmap.draft.utils.HtmlTextExtractor; +import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor; import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection; import org.apache.james.mailbox.BlobManager; import org.apache.james.mailbox.MessageIdManager; @@ -50,6 +50,7 @@ import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.TestMessageId; import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.server.core.Envelope; +import org.apache.james.util.html.HtmlTextExtractor; import org.apache.james.util.mime.MessageContentExtractor; import org.apache.mailet.Mail; import org.junit.jupiter.api.BeforeEach; @@ -85,9 +86,9 @@ class MessageSenderTest { .messageId(TestMessageId.of(2)) .build(); - HtmlTextExtractor htmlTextExtractor = mock(HtmlTextExtractor.class); - MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); + HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor(); + BlobManager blobManager = mock(BlobManager.class); when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake")); MessageIdManager messageIdManager = mock(MessageIdManager.class); diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java index f5059d6..f5b8ebb 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java @@ -42,7 +42,7 @@ import org.apache.james.jmap.draft.model.SetMessagesResponse; import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory; import org.apache.james.jmap.draft.send.MailMetadata; import org.apache.james.jmap.draft.send.MailSpool; -import org.apache.james.jmap.draft.utils.HtmlTextExtractor; +import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor; import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection; import org.apache.james.mailbox.AttachmentManager; import org.apache.james.mailbox.BlobManager; @@ -65,6 +65,7 @@ import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.TestMessageId; import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.util.OptionalUtils; +import org.apache.james.util.html.HtmlTextExtractor; import org.apache.james.util.mime.MessageContentExtractor; import org.apache.mailet.Mail; import org.junit.Before; @@ -121,8 +122,8 @@ public class SetMessagesCreationProcessorTest { @Before public void setUp() throws MailboxException { - HtmlTextExtractor htmlTextExtractor = mock(HtmlTextExtractor.class); MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); + HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor(); BlobManager blobManager = mock(BlobManager.class); when(blobManager.toBlobId(any(MessageId.class))).thenReturn(org.apache.james.mailbox.model.BlobId.fromString("fake")); MessageIdManager messageIdManager = mock(MessageIdManager.class); diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java index 2dcc64c..ccc5bde 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactoryTest.java @@ -42,7 +42,6 @@ import org.apache.james.jmap.draft.model.Keyword; import org.apache.james.jmap.draft.model.Keywords; import org.apache.james.jmap.draft.model.Number; import org.apache.james.jmap.draft.model.PreviewDTO; -import org.apache.james.jmap.draft.utils.HtmlTextExtractor; import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor; import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection; import org.apache.james.mailbox.MailboxSession; @@ -57,6 +56,7 @@ import org.apache.james.mailbox.model.MailboxPath; import org.apache.james.mailbox.store.StoreBlobManager; import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.util.ClassLoaderUtils; +import org.apache.james.util.html.HtmlTextExtractor; import org.apache.james.util.mime.MessageContentExtractor; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java index b1dd9f8..760d35f 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java @@ -48,7 +48,6 @@ import org.apache.james.jmap.draft.model.Keywords; import org.apache.james.jmap.draft.model.Number; import org.apache.james.jmap.draft.model.PreviewDTO; import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory.MetaDataWithContent; -import org.apache.james.jmap.draft.utils.HtmlTextExtractor; import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor; import org.apache.james.jmap.memory.projections.MemoryMessageFastViewProjection; import org.apache.james.mailbox.MailboxSession; @@ -71,6 +70,7 @@ import org.apache.james.mailbox.model.MessageResult; import org.apache.james.mailbox.model.TestMessageId; import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.util.ClassLoaderUtils; +import org.apache.james.util.html.HtmlTextExtractor; import org.apache.james.util.mime.MessageContentExtractor; import org.assertj.core.api.SoftAssertions; import org.junit.jupiter.api.BeforeEach; @@ -99,9 +99,8 @@ class MessageFullViewFactoryTest { @BeforeEach void setUp() throws Exception { - HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor(); - MessageContentExtractor messageContentExtractor = new MessageContentExtractor(); + HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor(); InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources(); messageIdManager = resources.getMessageIdManager(); diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/utils/MimeMessageBodyGeneratorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/utils/MimeMessageBodyGeneratorTest.java index efd4608..574019f 100644 --- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/utils/MimeMessageBodyGeneratorTest.java +++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/utils/MimeMessageBodyGeneratorTest.java @@ -32,6 +32,7 @@ import javax.mail.internet.MimeMessage; import org.apache.commons.io.IOUtils; import org.apache.james.util.MimeMessageUtil; +import org.apache.james.util.html.HtmlTextExtractor; import org.junit.Before; import org.junit.Test; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
