You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/06/26 05:06:19 UTC

[james-project] 01/06: [PERFORMANCE] Prefer DefaultMessageBuilder for Mime message parsing

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 f458b0fce276391d43084fe2ebce5a0317ddae0f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 21 13:00:48 2021 +0700

    [PERFORMANCE] Prefer DefaultMessageBuilder for Mime message parsing
    
    This saves the call to Message.Builder::build wich does a copy of all
    messages fields.
---
 .../src/main/java/org/apache/james/jmap/api/model/Preview.java   | 8 ++++----
 .../james/jmap/draft/model/message/view/MessageViewFactory.java  | 9 ++++-----
 .../apache/james/jmap/event/PopulateEmailQueryViewListener.java  | 9 ++++-----
 .../draft/model/message/view/MessageFullViewFactoryTest.java     | 7 ++-----
 .../apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java | 9 ++++-----
 .../src/main/java/org/apache/james/webadmin/dto/MailDto.java     | 9 ++++-----
 6 files changed, 22 insertions(+), 29 deletions(-)

diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java
index e26dbba..c0cc914 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/model/Preview.java
@@ -31,6 +31,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.message.DefaultMessageBuilder;
 import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.util.html.HtmlTextExtractor;
 import org.apache.james.util.mime.MessageContentExtractor;
@@ -72,10 +73,9 @@ public class Preview {
         }
 
         private Message parse(InputStream inputStream) throws IOException {
-            return Message.Builder.of()
-                .use(MimeConfig.PERMISSIVE)
-                .parse(inputStream)
-                .build();
+            DefaultMessageBuilder defaultMessageBuilder = new DefaultMessageBuilder();
+            defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
+            return defaultMessageBuilder.parseMessage(inputStream);
         }
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
index 5a8130a..a720019 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
@@ -43,6 +43,7 @@ import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.codec.DecoderUtil;
 import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.message.DefaultMessageBuilder;
 import org.apache.james.mime4j.stream.Field;
 import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.util.ReactorUtils;
@@ -152,11 +153,9 @@ public interface MessageViewFactory<T extends MessageView> {
         }
 
         static Message parse(InputStream messageContent) throws IOException {
-            return Message.Builder
-                .of()
-                .use(MimeConfig.PERMISSIVE)
-                .parse(messageContent)
-                .build();
+            DefaultMessageBuilder defaultMessageBuilder = new DefaultMessageBuilder();
+            defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
+            return defaultMessageBuilder.parseMessage(messageContent);
         }
     }
 }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
index 722cd52..47a033a 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/event/PopulateEmailQueryViewListener.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.message.DefaultMessageBuilder;
 import org.apache.james.mime4j.stream.MimeConfig;
 import org.reactivestreams.Publisher;
 
@@ -169,10 +170,8 @@ public class PopulateEmailQueryViewListener implements ReactiveGroupEventListene
     }
 
     private Message parseMessage(MessageResult messageResult) throws IOException, MailboxException {
-        return Message.Builder
-            .of()
-            .use(MimeConfig.PERMISSIVE)
-            .parse(messageResult.getFullContent().getInputStream())
-            .build();
+        DefaultMessageBuilder defaultMessageBuilder = new DefaultMessageBuilder();
+        defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
+        return defaultMessageBuilder.parseMessage(messageResult.getFullContent().getInputStream());
     }
 }
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 cbc1165..7882698 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
@@ -186,7 +186,7 @@ class MessageFullViewFactoryTest {
         MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail).block();
         assertThat(testee)
             .extracting(MessageFullView::getPreview, MessageFullView::getSize, MessageFullView::getSubject, MessageFullView::getHeaders, MessageFullView::getDate)
-            .containsExactly(PreviewDTO.of(""), Number.ZERO, "", ImmutableMap.of("MIME-Version", "1.0"), INTERNAL_DATE);
+            .containsExactly(PreviewDTO.of(""), Number.ZERO, "", ImmutableMap.of(), INTERNAL_DATE);
     }
 
     @Test
@@ -246,7 +246,6 @@ class MessageFullViewFactoryTest {
                 .put("In-Reply-To", "<SN...@phx.gbl>")
                 .put("Other-header", "other header value")
                 .put("Date", "Tue, 14 Jul 2015 12:30:42 +0000")
-                .put("MIME-Version", "1.0")
                 .build();
 
         MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail).block();
@@ -302,7 +301,6 @@ class MessageFullViewFactoryTest {
             .put("Subject", "test subject")
             .put("From", "user <us...@domain>")
             .put("To", "user1 <us...@domain>, user2 <us...@domain>")
-            .put("MIME-Version", "1.0")
             .build();
         MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail).block();
         MessageFullView expected = MessageFullView.builder()
@@ -353,7 +351,6 @@ class MessageFullViewFactoryTest {
             .put("Subject", "test subject")
             .put("Multi-header", "first value\nsecond value")
             .put("To", "user1 <us...@domain>")
-            .put("MIME-Version", "1.0")
             .build();
         MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail).block();
         MessageFullView expected = MessageFullView.builder()
@@ -657,7 +654,7 @@ class MessageFullViewFactoryTest {
         MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail).block();
         assertThat(testee)
             .extracting(MessageFullView::getPreview, MessageFullView::getSize, MessageFullView::getSubject, MessageFullView::getHeaders, MessageFullView::getDate)
-            .containsExactly(PreviewDTO.of(""), Number.fromLong(1010L), "", ImmutableMap.of("MIME-Version", "1.0"), INTERNAL_DATE);
+            .containsExactly(PreviewDTO.of(""), Number.fromLong(1010L), "", ImmutableMap.of(), INTERNAL_DATE);
     }
 
     @Test
diff --git a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
index 76c1e0e..9b22911 100644
--- a/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
+++ b/server/protocols/webadmin/webadmin-jmap/src/main/java/org/apache/james/webadmin/data/jmap/EmailQueryViewPopulator.java
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.message.DefaultMessageBuilder;
 import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.task.Task;
 import org.apache.james.task.Task.Result;
@@ -204,10 +205,8 @@ public class EmailQueryViewPopulator {
     }
 
     private Message parseMessage(MessageResult messageResult) throws IOException, MailboxException {
-        return Message.Builder
-            .of()
-            .use(MimeConfig.PERMISSIVE)
-            .parse(messageResult.getFullContent().getInputStream())
-            .build();
+        DefaultMessageBuilder defaultMessageBuilder = new DefaultMessageBuilder();
+        defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
+        return defaultMessageBuilder.parseMessage(messageResult.getFullContent().getInputStream());
     }
 }
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
index f0589f0..e369a1b 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/dto/MailDto.java
@@ -34,6 +34,7 @@ import javax.mail.internet.MimeMessage;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.message.DefaultMessageBuilder;
 import org.apache.james.mime4j.stream.MimeConfig;
 import org.apache.james.mime4j.util.MimeUtil;
 import org.apache.james.server.core.MimeMessageInputStream;
@@ -113,11 +114,9 @@ public class MailDto {
     }
 
     private static Message convertMessage(MimeMessage message) throws IOException, MessagingException {
-        return Message.Builder
-            .of()
-            .use(MimeConfig.PERMISSIVE)
-            .parse(new MimeMessageInputStream(message))
-            .build();
+        DefaultMessageBuilder defaultMessageBuilder = new DefaultMessageBuilder();
+        defaultMessageBuilder.setMimeEntityConfig(MimeConfig.PERMISSIVE);
+        return defaultMessageBuilder.parseMessage(new MimeMessageInputStream(message));
     }
 
     private static Optional<HeadersDto> fetchHeaders(Set<AdditionalField> additionalFields, Mail mail) throws InaccessibleFieldException {

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org