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:18 UTC

[james-project] branch master updated (c25a378 -> c0c7989)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from c25a378  JAMES-2366 Add missing tests for forwards to remote recipients
     new f458b0f  [PERFORMANCE] Prefer DefaultMessageBuilder for Mime message parsing
     new c2dedfe  [PERFORMANCE] SimpleMailboxMessage: userFlags assignment was done twice
     new 3ef0eb4  [PERFORMANCE] Optimise GetMessagesMethod::messagesNotFound
     new 1636eca  [PERFORMANCE] MessageViewFactory::hasOnlyOneMessageId shortcut on single value
     new f120aa6  [PERFORMANCE] ResultUtils::haveValidContent is doing needless work
     new c0c7989  [REFATORING] Use AddressList::flatten where relevant

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../elasticsearch/v7/json/HeaderCollection.java    | 15 +--------
 .../apache/james/mailbox/store/ResultUtils.java    | 19 ++++-------
 .../mail/model/impl/SimpleMailboxMessage.java      |  1 -
 .../transport/mailets/ICALToJsonAttribute.java     | 12 +------
 .../transport/mailets/UseHeaderRecipients.java     | 24 +++----------
 .../org/apache/james/jmap/api/model/Preview.java   |  8 ++---
 .../jmap/draft/methods/GetMessagesMethod.java      |  6 ++--
 .../jmap/draft/model/GetMessagesResponse.java      | 39 ++++++++++++----------
 .../model/message/view/MessageViewFactory.java     | 12 ++++---
 .../jmap/event/PopulateEmailQueryViewListener.java |  9 +++--
 .../message/view/MessageFullViewFactoryTest.java   |  7 ++--
 .../data/jmap/EmailQueryViewPopulator.java         |  9 +++--
 .../org/apache/james/webadmin/dto/MailDto.java     |  9 +++--
 13 files changed, 63 insertions(+), 107 deletions(-)

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


[james-project] 02/06: [PERFORMANCE] SimpleMailboxMessage: userFlags assignment was done twice

Posted by bt...@apache.org.
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 c2dedfe865d0c62641d115e55d49a70acb34fc9f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 21 13:16:46 2021 +0700

    [PERFORMANCE] SimpleMailboxMessage: userFlags assignment was done twice
    
    Non negligible as a copy of the underlying vector was performed...
---
 .../apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java | 1 -
 1 file changed, 1 deletion(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
index 7d8ee37..ef2aaba 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java
@@ -206,7 +206,6 @@ public class SimpleMailboxMessage extends DelegatingMailboxMessage {
 
             setFlags(flags);
             this.mailboxId = mailboxId;
-            this.userFlags = flags.getUserFlags();
     }
 
     public SimpleMailboxMessage(MessageId messageId, Date internalDate, long size, int bodyStartOctet,

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


[james-project] 06/06: [REFATORING] Use AddressList::flatten where relevant

Posted by bt...@apache.org.
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 c0c7989b8a5c0e84ea69fbddc3c327f61b41a9c6
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 21 16:29:57 2021 +0700

    [REFATORING] Use AddressList::flatten where relevant
---
 .../elasticsearch/v7/json/HeaderCollection.java    | 15 +-------------
 .../transport/mailets/ICALToJsonAttribute.java     | 12 +----------
 .../transport/mailets/UseHeaderRecipients.java     | 24 +++++-----------------
 3 files changed, 7 insertions(+), 44 deletions(-)

diff --git a/mailbox/elasticsearch-v7/src/main/java/org/apache/james/mailbox/elasticsearch/v7/json/HeaderCollection.java b/mailbox/elasticsearch-v7/src/main/java/org/apache/james/mailbox/elasticsearch/v7/json/HeaderCollection.java
index 5f4cc7b..a168e0d 100644
--- a/mailbox/elasticsearch-v7/src/main/java/org/apache/james/mailbox/elasticsearch/v7/json/HeaderCollection.java
+++ b/mailbox/elasticsearch-v7/src/main/java/org/apache/james/mailbox/elasticsearch/v7/json/HeaderCollection.java
@@ -25,12 +25,8 @@ import java.util.Locale;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
-import java.util.stream.Stream;
 
 import org.apache.james.mailbox.store.search.comparator.SentDateComparator;
-import org.apache.james.mime4j.dom.address.Address;
-import org.apache.james.mime4j.dom.address.Group;
-import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.mime4j.stream.Field;
 import org.apache.james.mime4j.util.MimeUtil;
@@ -152,21 +148,12 @@ public class HeaderCollection {
             ImmutableSet.Builder<EMailer> addressSet = getAddressSet(headerName);
             LenientAddressParser.DEFAULT
                 .parseAddressList(rawHeaderValue)
+                .flatten()
                 .stream()
-                .flatMap(this::convertAddressToMailboxStream)
                 .map((mailbox) -> new EMailer(Optional.ofNullable(mailbox.getName()), mailbox.getAddress()))
                 .forEach(addressSet::add);
         }
 
-        private Stream<Mailbox> convertAddressToMailboxStream(Address address) {
-            if (address instanceof Mailbox) {
-                return Stream.of((Mailbox) address);
-            } else if (address instanceof Group) {
-                return ((Group) address).getMailboxes().stream();
-            }
-            return Stream.empty();
-        }
-
         private ImmutableSet.Builder<EMailer> getAddressSet(String headerName) {
             switch (headerName) {
                 case TO:
diff --git a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java
index 07e013b..e7cb9e8 100644
--- a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java
+++ b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICALToJsonAttribute.java
@@ -34,7 +34,6 @@ import javax.mail.internet.MimeMessage;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
-import org.apache.james.mime4j.dom.address.Group;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.transport.mailets.model.ICALAttributeDTO;
@@ -202,8 +201,8 @@ public class ICALToJsonAttribute extends GenericMailet {
     private Optional<MailAddress> retrieveReplyTo(String headerValue) {
         return LenientAddressParser.DEFAULT
             .parseAddressList(headerValue)
+            .flatten()
             .stream()
-            .flatMap(this::convertAddressToMailboxStream)
             .flatMap(this::convertMailboxToMailAddress)
             .findFirst();
 
@@ -217,15 +216,6 @@ public class ICALToJsonAttribute extends GenericMailet {
         }
     }
 
-    private Stream<Mailbox> convertAddressToMailboxStream(org.apache.james.mime4j.dom.address.Address address) {
-        if (address instanceof Mailbox) {
-            return Stream.of((Mailbox) address);
-        } else if (address instanceof Group) {
-            return ((Group) address).getMailboxes().stream();
-        }
-        return Stream.empty();
-    }
-
     private Stream<Pair<String, byte[]>> toJson(Map.Entry<String, Calendar> entry,
                                                 Map<String, byte[]> rawCalendars,
                                                 Mail mail,
diff --git a/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java b/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java
index efb4886..98072b0 100644
--- a/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java
+++ b/mailet/standard/src/main/java/org/apache/james/transport/mailets/UseHeaderRecipients.java
@@ -22,7 +22,6 @@ package org.apache.james.transport.mailets;
 
 import java.io.UnsupportedEncodingException;
 import java.util.Collection;
-import java.util.stream.Stream;
 
 import javax.mail.MessagingException;
 import javax.mail.internet.AddressException;
@@ -30,9 +29,6 @@ import javax.mail.internet.MimeMessage;
 import javax.mail.internet.MimeUtility;
 
 import org.apache.james.core.MailAddress;
-import org.apache.james.mime4j.dom.address.Address;
-import org.apache.james.mime4j.dom.address.AddressList;
-import org.apache.james.mime4j.dom.address.Group;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.mime4j.util.MimeUtil;
@@ -168,12 +164,11 @@ public class UseHeaderRecipients extends GenericMailet {
         return result.build();
     }
 
-    private Collection<MailAddress> readMailAddresses(String headerPart) throws AddressException {
-        AddressList addressList = LenientAddressParser.DEFAULT
-            .parseAddressList(MimeUtil.unfold(headerPart));
-
-        return addressList.stream()
-            .flatMap(address -> convertAddressToMailboxCollection(address))
+    private Collection<MailAddress> readMailAddresses(String headerPart) {
+        return LenientAddressParser.DEFAULT
+            .parseAddressList(MimeUtil.unfold(headerPart))
+            .flatten()
+            .stream()
             .map(this::toMailAddress)
             .collect(Guavate.toImmutableList());
     }
@@ -186,15 +181,6 @@ public class UseHeaderRecipients extends GenericMailet {
         }
     }
 
-    private Stream<Mailbox> convertAddressToMailboxCollection(Address address) {
-        if (address instanceof Mailbox) {
-            return ImmutableList.of((Mailbox) address).stream();
-        } else if (address instanceof Group) {
-            return ImmutableList.copyOf(((Group) address).getMailboxes()).stream();
-        }
-        return Stream.of();
-    }
-
     private String sanitizeHeaderString(String header) throws MessagingException {
         try {
             return MimeUtility.unfold(MimeUtility.decodeText(header));

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


[james-project] 04/06: [PERFORMANCE] MessageViewFactory::hasOnlyOneMessageId shortcut on single value

Posted by bt...@apache.org.
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 1636eca5a2010bd7244641f1cbd94a2e1b6e757f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 21 14:48:48 2021 +0700

    [PERFORMANCE] MessageViewFactory::hasOnlyOneMessageId shortcut on single value
    
    This takes 0.20% of CPU and represents 0.34% of memory allocation...
---
 .../apache/james/jmap/draft/model/message/view/MessageViewFactory.java | 3 +++
 1 file changed, 3 insertions(+)

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 a720019..3333bca 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
@@ -80,6 +80,9 @@ public interface MessageViewFactory<T extends MessageView> {
         }
 
         private static boolean hasOnlyOneMessageId(Collection<MessageResult> messageResults) {
+            if (messageResults.size() == 1) {
+                return true;
+            }
             return messageResults
                 .stream()
                 .map(MessageResult::getMessageId)

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


[james-project] 03/06: [PERFORMANCE] Optimise GetMessagesMethod::messagesNotFound

Posted by bt...@apache.org.
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 3ef0eb4d0275759cad1b6300ffbe255c25729d3d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 21 14:41:06 2021 +0700

    [PERFORMANCE] Optimise GetMessagesMethod::messagesNotFound
    
    The nominal case (messages are all to be found) can be checked faster.
---
 .../jmap/draft/methods/GetMessagesMethod.java      |  6 ++--
 .../jmap/draft/model/GetMessagesResponse.java      | 39 ++++++++++++----------
 2 files changed, 24 insertions(+), 21 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
index 9368b42..fd98cdf 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMessagesMethod.java
@@ -21,7 +21,6 @@ package org.apache.james.jmap.draft.methods;
 
 import static org.apache.james.util.ReactorUtils.context;
 
-import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -47,6 +46,7 @@ import org.apache.james.util.MDCBuilder;
 
 import com.fasterxml.jackson.databind.ser.PropertyFilter;
 import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
+import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
@@ -127,8 +127,8 @@ public class GetMessagesMethod implements Method {
 
         MessageProperties.ReadProfile readProfile = getMessagesRequest.getProperties().computeReadLevel();
         MessageViewFactory<? extends MessageView> factory = messageViewFactory.getFactory(readProfile);
-        Mono<? extends List<? extends MessageView>> messageViewsMono = factory.fromMessageIds(getMessagesRequest.getIds(), mailboxSession)
-            .collectList();
+        Mono<? extends Set<? extends MessageView>> messageViewsMono = factory.fromMessageIds(getMessagesRequest.getIds(), mailboxSession)
+            .collect(Guavate.toImmutableSet());
 
         return messageViewsMono.map(messageViews ->
             GetMessagesResponse.builder()
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMessagesResponse.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMessagesResponse.java
index 53ddd60..1c84742 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMessagesResponse.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/GetMessagesResponse.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.jmap.draft.model;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -31,7 +32,8 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 
 @JsonDeserialize(builder = GetMessagesResponse.Builder.class)
 public class GetMessagesResponse implements Method.Response {
@@ -42,26 +44,26 @@ public class GetMessagesResponse implements Method.Response {
     
     @JsonPOJOBuilder(withPrefix = "")
     public static class Builder {
-        private ImmutableList<MessageView> messages;
-        private List<MessageId> expectedMessageIds;
+        private ImmutableSet<MessageView> messages;
+        private Set<MessageId> expectedMessageIds;
 
         private Builder() {
-            this.messages = ImmutableList.of();
+            this.messages = ImmutableSet.of();
         }
 
         @JsonIgnore
         public Builder message(MessageView message) {
-            this.messages = ImmutableList.of(message);
+            this.messages = ImmutableSet.of(message);
             return this;
         }
 
-        public Builder messages(List<? extends MessageView> messages) {
-            this.messages = ImmutableList.copyOf(messages);
+        public Builder messages(Collection<? extends MessageView> messages) {
+            this.messages = ImmutableSet.copyOf(messages);
             return this;
         }
 
         public Builder expectedMessageIds(List<MessageId> expectedMessageIds) {
-            this.expectedMessageIds = ImmutableList.copyOf(expectedMessageIds);
+            this.expectedMessageIds = ImmutableSet.copyOf(expectedMessageIds);
             return this;
         }
         
@@ -71,31 +73,32 @@ public class GetMessagesResponse implements Method.Response {
         }
         
 
-        private List<MessageId> messagesNotFound() {
-            Set<MessageId> foundMessageIds = messages.stream().map(MessageView::getId).collect(Collectors.toSet());
-            return ImmutableList.copyOf(expectedMessageIds.stream()
-                .filter(id -> !foundMessageIds.contains(id))
-                .collect(Collectors.toList()));
+        private Set<MessageId> messagesNotFound() {
+            if (expectedMessageIds.size() == messages.size()) {
+                return ImmutableSet.of();
+            }
+            return Sets.difference(expectedMessageIds,
+                messages.stream().map(MessageView::getId).collect(Collectors.toSet()));
         }
     }
     
     
     
-    private final List<MessageView> messages;
-    private final List<MessageId> messagesNotFound;
+    private final Set<MessageView> messages;
+    private final Set<MessageId> messagesNotFound;
 
-    private GetMessagesResponse(List<MessageView> messages, List<MessageId> messagesNotFound) {
+    private GetMessagesResponse(Set<MessageView> messages, Set<MessageId> messagesNotFound) {
         this.messages = messages;
         this.messagesNotFound = messagesNotFound;
     }
 
     @JsonSerialize
-    public List<MessageView> list() {
+    public Set<MessageView> list() {
         return messages;
     }
     
     @JsonSerialize
-    public List<MessageId> notFound() {
+    public Set<MessageId> notFound() {
         return messagesNotFound;
     }
 

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


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

Posted by bt...@apache.org.
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


[james-project] 05/06: [PERFORMANCE] ResultUtils::haveValidContent is doing needless work

Posted by bt...@apache.org.
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 f120aa65d26bf60a829782360301650b72976a6a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Jun 21 16:17:40 2021 +0700

    [PERFORMANCE] ResultUtils::haveValidContent is doing needless work
    
     - collect is not needed
     - the enumset can be shared
    
    This takes 0.2% of CPU and 0.5% of memory allocation
---
 .../org/apache/james/mailbox/store/ResultUtils.java   | 19 +++++++------------
 1 file changed, 7 insertions(+), 12 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java
index 1c00394..2066469 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/ResultUtils.java
@@ -44,10 +44,14 @@ import org.apache.james.mime4j.stream.RawField;
 import org.apache.james.mime4j.util.ByteSequence;
 import org.apache.james.mime4j.util.ContentUtil;
 
-import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 
 public class ResultUtils {
+    private static final EnumSet<FetchGroup.Profile> SUPPORTED_GROUPS = EnumSet.of(
+        FetchGroup.Profile.HEADERS,
+        FetchGroup.Profile.BODY_CONTENT,
+        FetchGroup.Profile.FULL_CONTENT,
+        FetchGroup.Profile.MIME_DESCRIPTOR);
 
     public static List<Header> createHeaders(MailboxMessage document) throws IOException {
         List<Header> results = new ArrayList<>();
@@ -113,18 +117,9 @@ public class ResultUtils {
 
     @VisibleForTesting
     static boolean haveValidContent(FetchGroup fetchGroup) {
-        EnumSet<FetchGroup.Profile> supportedGroups = EnumSet.of(
-            FetchGroup.Profile.HEADERS,
-            FetchGroup.Profile.BODY_CONTENT,
-            FetchGroup.Profile.FULL_CONTENT,
-            FetchGroup.Profile.MIME_DESCRIPTOR);
-
-        Collection<FetchGroup.Profile> unsupportedProfiles = fetchGroup.profiles()
+        return fetchGroup.profiles()
             .stream()
-            .filter(value -> !supportedGroups.contains(value))
-            .collect(Guavate.toImmutableSet());
-
-        return unsupportedProfiles.isEmpty();
+            .allMatch(SUPPORTED_GROUPS::contains);
     }
 
     private static void addPartContent(FetchGroup fetchGroup, MailboxMessage message, MessageResultImpl messageResult)

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