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/05/22 01:03:37 UTC

[james-project] branch master updated (3eba5ad -> 30aa87e)

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 3eba5ad  [PERFORMANCE] JsoupHtmlTextExtractor should use Collectors.joiner
     new da7d108  [PERFORMANCE] Avoid a collect -> stream -> collect pattern
     new 6325662  [PERFORMANCE] MessageViewFactory::getMailboxIds should return a Set
     new 30aa87e  [PERFORMANCE] Keywords::fromFlags should avoid intermediate collections

The 3 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:
 .../apache/james/jmap/draft/model/Keywords.java    | 28 +++++++++++-----------
 .../draft/model/message/view/MessageFastView.java  |  3 ++-
 .../model/message/view/MessageFastViewFactory.java |  4 ++--
 .../draft/model/message/view/MessageFullView.java  |  3 ++-
 .../model/message/view/MessageFullViewFactory.java |  4 ++--
 .../model/message/view/MessageHeaderView.java      |  3 ++-
 .../message/view/MessageHeaderViewFactory.java     |  4 ++--
 .../model/message/view/MessageMetadataView.java    | 12 +++++-----
 .../message/view/MessageMetadataViewFactory.java   |  2 +-
 .../model/message/view/MessageViewFactory.java     |  8 +++----
 .../model/message/view/MessageFullViewTest.java    |  5 ++--
 11 files changed, 39 insertions(+), 37 deletions(-)

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


[james-project] 03/03: [PERFORMANCE] Keywords::fromFlags should avoid intermediate collections

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 30aa87eb668e26653e86bc90164f7e1770ae2ec5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 20 08:51:12 2021 +0700

    [PERFORMANCE] Keywords::fromFlags should avoid intermediate collections
---
 .../apache/james/jmap/draft/model/Keywords.java    | 28 +++++++++++-----------
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Keywords.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Keywords.java
index 0d5749a..0debde4 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Keywords.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Keywords.java
@@ -65,13 +65,13 @@ public class Keywords {
     public static class KeywordsFactory {
         @FunctionalInterface
         interface KeywordsValidator {
-            KeywordsValidator THROW_ON_IMAP_NON_EXPOSED_KEYWORDS = keywords -> Preconditions.checkArgument(
-                keywords.stream().allMatch(Keyword::isExposedImapKeyword),
+            KeywordsValidator THROW_ON_IMAP_NON_EXPOSED_KEYWORDS = keyword -> Preconditions.checkArgument(
+                keyword.isExposedImapKeyword(),
                 "Does not allow to update 'Deleted' or 'Recent' flag");
 
-            KeywordsValidator IGNORE_NON_EXPOSED_IMAP_KEYWORDS = keywords -> { };
+            KeywordsValidator IGNORE_NON_EXPOSED_IMAP_KEYWORDS = keyword -> { };
 
-            void validate(Set<Keyword> keywords);
+            void validate(Keyword keywords);
         }
 
         @FunctionalInterface
@@ -109,22 +109,23 @@ public class Keywords {
         }
 
         public Keywords fromSet(Set<Keyword> setKeywords) {
-            validator.validate(setKeywords);
+            return fromStream(setKeywords.stream());
+        }
 
-            return new Keywords(setKeywords.stream()
+        public Keywords fromStream(Stream<Keyword> keywordStream) {
+            return new Keywords(keywordStream
+                    .peek(validator::validate)
                     .filter(filter)
                     .collect(Guavate.toImmutableSet()));
         }
 
         public Keywords from(Keyword... keywords) {
-            return fromSet(Arrays.stream(keywords)
-                    .collect(Guavate.toImmutableSet()));
+            return fromStream(Arrays.stream(keywords));
         }
 
         public Keywords fromCollection(Collection<String> keywords) {
-            return fromSet(keywords.stream()
-                    .flatMap(toKeyword::asKeywordStream)
-                    .collect(Guavate.toImmutableSet()));
+            return fromStream(keywords.stream()
+                    .flatMap(toKeyword::asKeywordStream));
         }
 
         @VisibleForTesting
@@ -137,12 +138,11 @@ public class Keywords {
         }
 
         public Keywords fromFlags(Flags flags) {
-            return fromSet(Stream.concat(
+            return fromStream(Stream.concat(
                         Stream.of(flags.getUserFlags())
                             .flatMap(toKeyword::asKeywordStream),
                         Stream.of(flags.getSystemFlags())
-                            .map(Keyword::fromFlag))
-                    .collect(Guavate.toImmutableSet()));
+                            .map(Keyword::fromFlag)));
         }
     }
 

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


[james-project] 02/03: [PERFORMANCE] MessageViewFactory::getMailboxIds should return a Set

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 63256620bd866901b4e08f1e43745d3bc3a11635
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 20 08:40:44 2021 +0700

    [PERFORMANCE] MessageViewFactory::getMailboxIds should return a Set
    
    We thus do not need the unicity constraint anymore
---
 .../james/jmap/draft/model/message/view/MessageFastView.java |  3 ++-
 .../draft/model/message/view/MessageFastViewFactory.java     |  4 ++--
 .../james/jmap/draft/model/message/view/MessageFullView.java |  3 ++-
 .../draft/model/message/view/MessageFullViewFactory.java     |  4 ++--
 .../jmap/draft/model/message/view/MessageHeaderView.java     |  3 ++-
 .../draft/model/message/view/MessageHeaderViewFactory.java   |  4 ++--
 .../jmap/draft/model/message/view/MessageMetadataView.java   | 12 ++++++------
 .../draft/model/message/view/MessageMetadataViewFactory.java |  2 +-
 .../jmap/draft/model/message/view/MessageViewFactory.java    |  6 +++---
 .../jmap/draft/model/message/view/MessageFullViewTest.java   |  5 +++--
 10 files changed, 25 insertions(+), 21 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastView.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastView.java
index 5c0eaae..ea3aa8c 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastView.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastView.java
@@ -39,6 +39,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * This message view holds all Message properties expected to be fast.
@@ -100,7 +101,7 @@ public class MessageFastView extends MessageHeaderView {
     MessageFastView(MessageId id,
                     BlobId blobId,
                     String threadId,
-                    ImmutableList<MailboxId> mailboxIds,
+                    ImmutableSet<MailboxId> mailboxIds,
                     Optional<String> inReplyToMessageId,
                     ImmutableMap<String, String> headers,
                     Optional<Emailer> from,
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
index fdebb16..edcff41 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
@@ -73,7 +73,7 @@ public class MessageFastViewFactory implements MessageViewFactory<MessageFastVie
 
             return Mono.fromCallable(() -> {
                 MessageFastViewPrecomputedProperties messageProjection = fastProjections.get(firstMessageResult.getMessageId());
-                List<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
+                Set<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
 
                 Message mimeMessage = Helpers.parse(firstMessageResult.getFullContent().getInputStream());
 
@@ -81,7 +81,7 @@ public class MessageFastViewFactory implements MessageViewFactory<MessageFastVie
             });
         }
 
-        private MessageFastView instanciateFastView(Collection<MessageResult> messageResults, MessageResult firstMessageResult, MessageFastViewPrecomputedProperties messageProjection, List<MailboxId> mailboxIds, Message mimeMessage) {
+        private MessageFastView instanciateFastView(Collection<MessageResult> messageResults, MessageResult firstMessageResult, MessageFastViewPrecomputedProperties messageProjection, Set<MailboxId> mailboxIds, Message mimeMessage) {
             return MessageFastView.builder()
                 .id(firstMessageResult.getMessageId())
                 .mailboxIds(mailboxIds)
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullView.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullView.java
index 2fbdfcc..190a0f2 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullView.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullView.java
@@ -42,6 +42,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
 @JsonDeserialize(builder = MessageFullView.Builder.class)
 @JsonFilter(JmapResponseWriterImpl.PROPERTIES_FILTER)
@@ -128,7 +129,7 @@ public class MessageFullView extends MessageFastView {
     MessageFullView(MessageId id,
                     BlobId blobId,
                     String threadId,
-                    ImmutableList<MailboxId> mailboxIds,
+                    ImmutableSet<MailboxId> mailboxIds,
                     Optional<String> inReplyToMessageId,
                     boolean hasAttachment,
                     ImmutableMap<String, String> headers,
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 73ca18b..9016143 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
@@ -185,7 +185,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         Helpers.assertOneMessageId(messageResults);
 
         MessageResult firstMessageResult = messageResults.iterator().next();
-        List<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
+        Set<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
         Keywords keywords = Helpers.getKeywords(messageResults);
 
         return MetaDataWithContent.builderFromMessageResult(firstMessageResult)
@@ -304,7 +304,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
                 return this;
             }
 
-            public Builder mailboxIds(List<MailboxId> mailboxIds) {
+            public Builder mailboxIds(Set<MailboxId> mailboxIds) {
                 this.mailboxIds.addAll(mailboxIds);
                 return this;
             }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderView.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderView.java
index c7eb122..d5e0175 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderView.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderView.java
@@ -36,6 +36,7 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
 public class MessageHeaderView extends MessageMetadataView {
 
@@ -145,7 +146,7 @@ public class MessageHeaderView extends MessageMetadataView {
     MessageHeaderView(MessageId id,
                       BlobId blobId,
                       String threadId,
-                      ImmutableList<MailboxId> mailboxIds,
+                      ImmutableSet<MailboxId> mailboxIds,
                       Optional<String> inReplyToMessageId,
                       ImmutableMap<String, String> headers,
                       Optional<Emailer> from,
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactory.java
index 808f7b8..5232e09 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactory.java
@@ -65,14 +65,14 @@ public class MessageHeaderViewFactory implements MessageViewFactory<MessageHeade
 
         return Mono.fromCallable(() -> messageResults.iterator().next())
             .flatMap(Throwing.function(firstMessageResult -> {
-                List<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
+                Collection<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
                 Message mimeMessage = Helpers.parse(firstMessageResult.getFullContent().getInputStream());
                 return instanciateHeaderView(messageResults, firstMessageResult, mailboxIds, mimeMessage);
             }));
     }
 
     private Mono<MessageHeaderView> instanciateHeaderView(Collection<MessageResult> messageResults, MessageResult firstMessageResult,
-                                                          List<MailboxId> mailboxIds, Message mimeMessage) {
+                                                          Collection<MailboxId> mailboxIds, Message mimeMessage) {
         return Mono.just(MessageHeaderView.messageHeaderBuilder()
             .id(firstMessageResult.getMessageId())
             .mailboxIds(mailboxIds)
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataView.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataView.java
index 130a7aa..dc71be5 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataView.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataView.java
@@ -34,8 +34,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
 public class MessageMetadataView implements MessageView {
 
@@ -47,7 +47,7 @@ public class MessageMetadataView implements MessageView {
         protected MessageId id;
         protected BlobId blobId;
         protected String threadId;
-        protected ImmutableList<MailboxId> mailboxIds;
+        protected ImmutableSet<MailboxId> mailboxIds;
         protected Number size;
         protected Optional<Keywords> keywords = Optional.empty();
 
@@ -77,7 +77,7 @@ public class MessageMetadataView implements MessageView {
         }
 
         public S mailboxIds(Collection<MailboxId> mailboxIds) {
-            this.mailboxIds = ImmutableList.copyOf(mailboxIds);
+            this.mailboxIds = ImmutableSet.copyOf(mailboxIds);
             return (S) this;
         }
 
@@ -109,12 +109,12 @@ public class MessageMetadataView implements MessageView {
     private final MessageId id;
     private final BlobId blobId;
     private final String threadId;
-    private final ImmutableList<MailboxId> mailboxIds;
+    private final ImmutableSet<MailboxId> mailboxIds;
     private final Number size;
     private final Keywords keywords;
 
     @VisibleForTesting
-    MessageMetadataView(MessageId id, BlobId blobId, String threadId, ImmutableList<MailboxId> mailboxIds, Number size, Keywords keywords) {
+    MessageMetadataView(MessageId id, BlobId blobId, String threadId, ImmutableSet<MailboxId> mailboxIds, Number size, Keywords keywords) {
         this.id = id;
         this.blobId = blobId;
         this.threadId = threadId;
@@ -135,7 +135,7 @@ public class MessageMetadataView implements MessageView {
         return threadId;
     }
 
-    public ImmutableList<MailboxId> getMailboxIds() {
+    public ImmutableSet<MailboxId> getMailboxIds() {
         return mailboxIds;
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactory.java
index 0114837..d2920cc 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactory.java
@@ -61,7 +61,7 @@ public class MessageMetadataViewFactory implements MessageViewFactory<MessageMet
         Helpers.assertOneMessageId(messageResults);
 
         MessageResult firstMessageResult = messageResults.iterator().next();
-        List<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
+        Collection<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
 
         return Mono.just(MessageMetadataView.messageMetadataBuilder()
             .id(firstMessageResult.getMessageId())
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 6729674..5a8130a 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
@@ -29,6 +29,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
@@ -85,11 +86,10 @@ public interface MessageViewFactory<T extends MessageView> {
                 .count() == 1;
         }
 
-        static List<MailboxId> getMailboxIds(Collection<MessageResult> messageResults) {
+        static Set<MailboxId> getMailboxIds(Collection<MessageResult> messageResults) {
             return messageResults.stream()
                 .map(MessageResult::getMailboxId)
-                .distinct()
-                .collect(Guavate.toImmutableList());
+                .collect(Guavate.toImmutableSet());
         }
 
         static Keywords getKeywords(Collection<MessageResult> messageResults) {
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewTest.java
index b8756f8..b7ac9a3 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewTest.java
@@ -39,6 +39,7 @@ import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 
 class MessageFullViewTest {
 
@@ -173,7 +174,7 @@ class MessageFullViewTest {
         Number messageSize = Number.fromLong(123);
 
         MessageFullView expected = new MessageFullView(TestMessageId.of(1), BlobId.of("blobId"), "threadId",
-            ImmutableList.of(InMemoryId.of(456)), Optional.empty(), false, ImmutableMap.of("key", "value"),
+            ImmutableSet.of(InMemoryId.of(456)), Optional.empty(), false, ImmutableMap.of("key", "value"),
             Optional.empty(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(),
             "subject", currentDate, messageSize, PREVIEW_DTO, Optional.empty(), Optional.empty(),
             ImmutableList.of(), ImmutableMap.of(), Keywords.DEFAULT_VALUE);
@@ -249,7 +250,7 @@ class MessageFullViewTest {
             TestMessageId.of(1),
             BlobId.of("blobId"),
             "threadId",
-            ImmutableList.of(InMemoryId.of(456)),
+            ImmutableSet.of(InMemoryId.of(456)),
             Optional.of("inReplyToMessageId"),
             true,
             ImmutableMap.of("key", "value"),

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


[james-project] 01/03: [PERFORMANCE] Avoid a collect -> stream -> collect pattern

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 da7d1083ce6b87ac2d68b2a1e294e9afa99ead0a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 20 08:35:22 2021 +0700

    [PERFORMANCE] Avoid a collect -> stream -> collect pattern
    
    This was costing 0.36% of the CPU for my performance test
    scenario according to async-profiler
---
 .../apache/james/jmap/draft/model/message/view/MessageViewFactory.java  | 2 --
 1 file changed, 2 deletions(-)

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 d0c3e78..6729674 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
@@ -113,8 +113,6 @@ public interface MessageViewFactory<T extends MessageView> {
                 .stream()
                 .map(Field::getBody)
                 .map(body -> DecoderUtil.decodeEncodedWords(body, DecodeMonitor.SILENT))
-                .collect(Collectors.toList())
-                .stream()
                 .collect(Collectors.joining(JMAP_MULTIVALUED_FIELD_DELIMITER));
 
             return Multimaps.index(fields, Field::getName)

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