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 b4d4fcc60516ecb46961f1a733b88eeb1da58167
Author: Tran Tien Duc <[email protected]>
AuthorDate: Fri Nov 29 10:41:46 2019 +0700

    JAMES-2992 MessageViewFactory getMessageViews from MessageIds
    
    Turn the MessageViewFactory to take List<MessageId> instead of
    MessageResult. This is the effort of optimize fetching message in case
    of FastMessage, we need to determine whether a MessageId is in the
    MessagePreviewStore first then take the decision to give the good
    FetchType to MessageIdManager
---
 .../jmap/draft/methods/GetMessagesMethod.java      |  30 +---
 .../jmap/draft/model/GetMessagesResponse.java      |   2 +-
 .../model/message/view/MessageFullViewFactory.java |  36 +++--
 .../message/view/MessageHeaderViewFactory.java     |  35 +++--
 .../message/view/MessageMetadataViewFactory.java   |  24 ++-
 .../model/message/view/MessageViewFactory.java     | 168 +++++++++++++--------
 .../model/message/view/MetaMessageViewFactory.java |   2 +-
 .../jmap/draft/methods/GetMessagesMethodTest.java  | 164 ++++++++++----------
 .../jmap/draft/methods/MessageSenderTest.java      |   4 +-
 .../methods/SetMessagesCreationProcessorTest.java  |   3 +-
 .../message/view/MessageFullViewFactoryTest.java   |  15 +-
 .../message/view/MessageHeaderViewFactoryTest.java |  15 +-
 .../view/MessageMetadataViewFactoryTest.java       |  16 +-
 13 files changed, 269 insertions(+), 245 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 f4a8315..a3e07e7 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
@@ -19,9 +19,8 @@
 
 package org.apache.james.jmap.draft.methods;
 
-import java.util.Collection;
+import java.util.List;
 import java.util.Optional;
-import java.util.function.Function;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
@@ -39,7 +38,6 @@ import 
org.apache.james.jmap.draft.model.message.view.MetaMessageViewFactory;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.MDCBuilder;
 import org.slf4j.Logger;
@@ -47,7 +45,6 @@ import org.slf4j.LoggerFactory;
 
 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;
@@ -123,19 +120,11 @@ public class GetMessagesMethod implements Method {
 
         try {
             MessageProperties.ReadProfile readProfile = 
getMessagesRequest.getProperties().computeReadLevel();
-            MessageViewFactory factory = 
messageViewFactory.getFactory(readProfile);
+            MessageViewFactory<? extends MessageView> factory = 
messageViewFactory.getFactory(readProfile);
+            List<? extends MessageView> messageViews = 
factory.fromMessageIds(getMessagesRequest.getIds(), mailboxSession);
 
             return GetMessagesResponse.builder()
-                .messages(
-                    messageIdManager.getMessages(getMessagesRequest.getIds(), 
readProfile.getFetchGroup(), mailboxSession)
-                        .stream()
-                        
.collect(Guavate.toImmutableListMultimap(MessageResult::getMessageId))
-                        .asMap()
-                        .values()
-                        .stream()
-                        .filter(collection -> !collection.isEmpty())
-                        .flatMap(toMessageViews(factory))
-                        .collect(Guavate.toImmutableList()))
+                .messages(messageViews)
                 .expectedMessageIds(getMessagesRequest.getIds())
                 .build();
         } catch (MailboxException e) {
@@ -143,17 +132,6 @@ public class GetMessagesMethod implements Method {
         }
     }
 
-    private Function<Collection<MessageResult>, Stream<MessageView>> 
toMessageViews(MessageViewFactory factory) {
-        return messageResults -> {
-            try {
-                return Stream.of(factory.fromMessageResults(messageResults));
-            } catch (Exception e) {
-                LOGGER.error("Can not convert MessageResults to Message for 
{}", messageResults.iterator().next().getMessageId().serialize(), e);
-                return Stream.of();
-            }
-        };
-    }
-
     private static void notImplemented(String field) {
         throw new JmapFieldNotSupportedException(ISSUER, field);
     }
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 14b813f..53ddd60 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
@@ -55,7 +55,7 @@ public class GetMessagesResponse implements Method.Response {
             return this;
         }
 
-        public Builder messages(List<MessageView> messages) {
+        public Builder messages(List<? extends MessageView> messages) {
             this.messages = ImmutableList.copyOf(messages);
             return this;
         }
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 913d547..b5b20c1 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
@@ -34,8 +34,11 @@ import org.apache.james.jmap.api.model.Preview;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.BlobId;
 import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.MessageProperties;
 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;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Cid;
@@ -57,18 +60,21 @@ public class MessageFullViewFactory implements 
MessageViewFactory<MessageFullVie
     private final BlobManager blobManager;
     private final MessageContentExtractor messageContentExtractor;
     private final HtmlTextExtractor htmlTextExtractor;
+    private final MessageIdManager messageIdManager;
 
     @Inject
     public MessageFullViewFactory(BlobManager blobManager, 
MessageContentExtractor messageContentExtractor,
-                                  HtmlTextExtractor htmlTextExtractor) {
+                                  HtmlTextExtractor htmlTextExtractor, 
MessageIdManager messageIdManager) {
         this.blobManager = blobManager;
         this.messageContentExtractor = messageContentExtractor;
         this.htmlTextExtractor = htmlTextExtractor;
+        this.messageIdManager = messageIdManager;
     }
 
     @Override
-    public MessageFullView fromMessageResults(Collection<MessageResult> 
messageResults) throws MailboxException {
-        return fromMetaDataWithContent(toMetaDataWithContent(messageResults));
+    public List<MessageFullView> fromMessageIds(List<MessageId> messageIds, 
MailboxSession mailboxSession) throws MailboxException {
+        List<MessageResult> messages = 
messageIdManager.getMessages(messageIds, 
MessageProperties.ReadProfile.Full.getFetchGroup(), mailboxSession);
+        return Helpers.toMessageViews(messages, this::fromMessageResults);
     }
 
     public MessageFullView fromMetaDataWithContent(MetaDataWithContent 
message) throws MailboxException {
@@ -85,15 +91,15 @@ public class MessageFullViewFactory implements 
MessageViewFactory<MessageFullVie
                 
.blobId(BlobId.of(blobManager.toBlobId(message.getMessageId())))
                 .threadId(message.getMessageId().serialize())
                 .mailboxIds(message.getMailboxIds())
-                .inReplyToMessageId(getHeader(mimeMessage, "in-reply-to"))
+                .inReplyToMessageId(Helpers.getHeader(mimeMessage, 
"in-reply-to"))
                 .keywords(message.getKeywords())
                 .subject(Strings.nullToEmpty(mimeMessage.getSubject()).trim())
-                .headers(toMap(mimeMessage.getHeader().getFields()))
-                .from(firstFromMailboxList(mimeMessage.getFrom()))
-                .to(fromAddressList(mimeMessage.getTo()))
-                .cc(fromAddressList(mimeMessage.getCc()))
-                .bcc(fromAddressList(mimeMessage.getBcc()))
-                .replyTo(fromAddressList(mimeMessage.getReplyTo()))
+                .headers(Helpers.toMap(mimeMessage.getHeader().getFields()))
+                .from(Helpers.firstFromMailboxList(mimeMessage.getFrom()))
+                .to(Helpers.fromAddressList(mimeMessage.getTo()))
+                .cc(Helpers.fromAddressList(mimeMessage.getCc()))
+                .bcc(Helpers.fromAddressList(mimeMessage.getBcc()))
+                .replyTo(Helpers.fromAddressList(mimeMessage.getReplyTo()))
                 .size(message.getSize())
                 .date(getDateFromHeaderOrInternalDateOtherwise(mimeMessage, 
message))
                 .textBody(textBody)
@@ -103,12 +109,16 @@ public class MessageFullViewFactory implements 
MessageViewFactory<MessageFullVie
                 .build();
     }
 
+    private MessageFullView fromMessageResults(Collection<MessageResult> 
messageResults) throws MailboxException {
+        return fromMetaDataWithContent(toMetaDataWithContent(messageResults));
+    }
+
     private MetaDataWithContent 
toMetaDataWithContent(Collection<MessageResult> messageResults) throws 
MailboxException {
-        assertOneMessageId(messageResults);
+        Helpers.assertOneMessageId(messageResults);
 
         MessageResult firstMessageResult = messageResults.iterator().next();
-        List<MailboxId> mailboxIds = getMailboxIds(messageResults);
-        Keywords keywords = getKeywords(messageResults);
+        List<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
+        Keywords keywords = Helpers.getKeywords(messageResults);
 
         return MetaDataWithContent.builderFromMessageResult(firstMessageResult)
             .messageId(firstMessageResult.getMessageId())
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 27392f7..e840d2d 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
@@ -29,9 +29,13 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.MessageProperties;
 import org.apache.james.mailbox.BlobManager;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
+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.mime4j.stream.MimeConfig;
@@ -41,19 +45,26 @@ import com.google.common.base.Strings;
 
 public class MessageHeaderViewFactory implements 
MessageViewFactory<MessageHeaderView> {
     private final BlobManager blobManager;
+    private final MessageIdManager messageIdManager;
 
     @Inject
     @VisibleForTesting
-    public MessageHeaderViewFactory(BlobManager blobManager) {
+    public MessageHeaderViewFactory(BlobManager blobManager, MessageIdManager 
messageIdManager) {
         this.blobManager = blobManager;
+        this.messageIdManager = messageIdManager;
     }
 
     @Override
-    public MessageHeaderView fromMessageResults(Collection<MessageResult> 
messageResults) throws MailboxException {
-        assertOneMessageId(messageResults);
+    public List<MessageHeaderView> fromMessageIds(List<MessageId> messageIds, 
MailboxSession mailboxSession) throws MailboxException {
+        List<MessageResult> messages = 
messageIdManager.getMessages(messageIds, 
MessageProperties.ReadProfile.Header.getFetchGroup(), mailboxSession);
+        return Helpers.toMessageViews(messages, this::fromMessageResults);
+    }
+
+    private MessageHeaderView fromMessageResults(Collection<MessageResult> 
messageResults) throws MailboxException {
+        Helpers.assertOneMessageId(messageResults);
 
         MessageResult firstMessageResult = messageResults.iterator().next();
-        List<MailboxId> mailboxIds = getMailboxIds(messageResults);
+        List<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
 
         Message mimeMessage = parse(firstMessageResult);
 
@@ -62,16 +73,16 @@ public class MessageHeaderViewFactory implements 
MessageViewFactory<MessageHeade
             .mailboxIds(mailboxIds)
             
.blobId(BlobId.of(blobManager.toBlobId(firstMessageResult.getMessageId())))
             .threadId(firstMessageResult.getMessageId().serialize())
-            .keywords(getKeywords(messageResults))
+            .keywords(Helpers.getKeywords(messageResults))
             .size(firstMessageResult.getSize())
-            .inReplyToMessageId(getHeader(mimeMessage, "in-reply-to"))
+            .inReplyToMessageId(Helpers.getHeader(mimeMessage, "in-reply-to"))
             .subject(Strings.nullToEmpty(mimeMessage.getSubject()).trim())
-            .headers(toMap(mimeMessage.getHeader().getFields()))
-            .from(firstFromMailboxList(mimeMessage.getFrom()))
-            .to(fromAddressList(mimeMessage.getTo()))
-            .cc(fromAddressList(mimeMessage.getCc()))
-            .bcc(fromAddressList(mimeMessage.getBcc()))
-            .replyTo(fromAddressList(mimeMessage.getReplyTo()))
+            .headers(Helpers.toMap(mimeMessage.getHeader().getFields()))
+            .from(Helpers.firstFromMailboxList(mimeMessage.getFrom()))
+            .to(Helpers.fromAddressList(mimeMessage.getTo()))
+            .cc(Helpers.fromAddressList(mimeMessage.getCc()))
+            .bcc(Helpers.fromAddressList(mimeMessage.getBcc()))
+            .replyTo(Helpers.fromAddressList(mimeMessage.getReplyTo()))
             .date(getDateFromHeaderOrInternalDateOtherwise(mimeMessage, 
firstMessageResult))
             .build();
     }
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 e98f609..4b88288 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
@@ -25,36 +25,50 @@ import java.util.List;
 import javax.inject.Inject;
 
 import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.MessageProperties.ReadProfile;
 import org.apache.james.mailbox.BlobManager;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
 
 import com.google.common.annotations.VisibleForTesting;
 
 public class MessageMetadataViewFactory implements 
MessageViewFactory<MessageMetadataView> {
+
     private final BlobManager blobManager;
+    private final MessageIdManager messageIdManager;
 
     @Inject
     @VisibleForTesting
-    public MessageMetadataViewFactory(BlobManager blobManager) {
+    public MessageMetadataViewFactory(BlobManager blobManager, 
MessageIdManager messageIdManager) {
         this.blobManager = blobManager;
+        this.messageIdManager = messageIdManager;
     }
 
     @Override
-    public MessageMetadataView fromMessageResults(Collection<MessageResult> 
messageResults) throws MailboxException {
-        assertOneMessageId(messageResults);
+    public List<MessageMetadataView> fromMessageIds(List<MessageId> 
messageIds, MailboxSession session) throws MailboxException {
+        List<MessageResult> messages = 
messageIdManager.getMessages(messageIds, ReadProfile.Metadata.getFetchGroup(), 
session);
+        return Helpers.toMessageViews(messages, this::fromMessageResults);
+    }
+
+    @VisibleForTesting
+    public MessageMetadataView fromMessageResults(Collection<MessageResult> 
messageResults) {
+        Helpers.assertOneMessageId(messageResults);
 
         MessageResult firstMessageResult = messageResults.iterator().next();
-        List<MailboxId> mailboxIds = getMailboxIds(messageResults);
+        List<MailboxId> mailboxIds = Helpers.getMailboxIds(messageResults);
 
         return MessageMetadataView.messageMetadataBuilder()
             .id(firstMessageResult.getMessageId())
             .mailboxIds(mailboxIds)
             
.blobId(BlobId.of(blobManager.toBlobId(firstMessageResult.getMessageId())))
             .threadId(firstMessageResult.getMessageId().serialize())
-            .keywords(getKeywords(messageResults))
+            .keywords(Helpers.getKeywords(messageResults))
             .size(firstMessageResult.getSize())
             .build();
     }
+
 }
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 4afb117..1a08705 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
@@ -24,18 +24,23 @@ import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.apache.james.jmap.draft.model.Emailer;
 import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.utils.KeywordsCombiner;
+import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mime4j.dom.address.AddressList;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.address.MailboxList;
 import org.apache.james.mime4j.stream.Field;
 import org.apache.james.mime4j.util.MimeUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Preconditions;
@@ -44,96 +49,127 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Multimaps;
 
 public interface MessageViewFactory<T extends MessageView> {
+
+    Logger LOGGER = LoggerFactory.getLogger(MessageViewFactory.class);
+
     KeywordsCombiner KEYWORDS_COMBINER = new KeywordsCombiner();
     Keywords.KeywordsFactory KEYWORDS_FACTORY = Keywords.lenientFactory();
     String JMAP_MULTIVALUED_FIELD_DELIMITER = "\n";
 
-    T fromMessageResults(Collection<MessageResult> messageResults) throws 
MailboxException;
+    List<T> fromMessageIds(List<MessageId> messageIds, MailboxSession 
mailboxSession) throws MailboxException;
 
-    default void assertOneMessageId(Collection<MessageResult> messageResults) {
-        Preconditions.checkArgument(!messageResults.isEmpty(), "MessageResults 
cannot be empty");
-        Preconditions.checkArgument(hasOnlyOneMessageId(messageResults), 
"MessageResults need to share the same messageId");
-    }
+    class Helpers {
+        interface FromMessageResult<T extends MessageView> {
+            T fromMessageResults(Collection<MessageResult> messageResults) 
throws MailboxException;
+        }
 
-    default boolean hasOnlyOneMessageId(Collection<MessageResult> 
messageResults) {
-        return messageResults
-            .stream()
-            .map(MessageResult::getMessageId)
-            .distinct()
-            .count() == 1;
-    }
+        static void assertOneMessageId(Collection<MessageResult> 
messageResults) {
+            Preconditions.checkArgument(!messageResults.isEmpty(), 
"MessageResults cannot be empty");
+            Preconditions.checkArgument(hasOnlyOneMessageId(messageResults), 
"MessageResults need to share the same messageId");
+        }
 
-    default List<MailboxId> getMailboxIds(Collection<MessageResult> 
messageResults) {
-        return messageResults.stream()
+        static boolean hasOnlyOneMessageId(Collection<MessageResult> 
messageResults) {
+            return messageResults
+                .stream()
+                .map(MessageResult::getMessageId)
+                .distinct()
+                .count() == 1;
+        }
+
+        static List<MailboxId> getMailboxIds(Collection<MessageResult> 
messageResults) {
+            return messageResults.stream()
                 .map(MessageResult::getMailboxId)
                 .distinct()
                 .collect(Guavate.toImmutableList());
-    }
+        }
 
-    default Keywords getKeywords(Collection<MessageResult> messageResults) {
-        return messageResults.stream()
+        static Keywords getKeywords(Collection<MessageResult> messageResults) {
+            return messageResults.stream()
                 .map(MessageResult::getFlags)
                 .map(KEYWORDS_FACTORY::fromFlags)
                 .reduce(KEYWORDS_COMBINER)
                 .get();
-    }
+        }
 
-    default String getHeader(org.apache.james.mime4j.dom.Message message, 
String header) {
-        Field field = message.getHeader().getField(header);
-        if (field == null) {
-            return null;
+        static String getHeader(org.apache.james.mime4j.dom.Message message, 
String header) {
+            Field field = message.getHeader().getField(header);
+            if (field == null) {
+                return null;
+            }
+            return field.getBody();
         }
-        return field.getBody();
-    }
 
-    default ImmutableMap<String, String> toMap(List<Field> fields) {
-        Function<Map.Entry<String, Collection<Field>>, String> 
bodyConcatenator = fieldListEntry -> fieldListEntry.getValue()
-            .stream()
-            .map(Field::getBody)
-            .map(MimeUtil::unscrambleHeaderValue)
-            .collect(Collectors.toList())
-            .stream()
-            .collect(Collectors.joining(JMAP_MULTIVALUED_FIELD_DELIMITER));
-
-        return Multimaps.index(fields, Field::getName)
-            .asMap()
-            .entrySet()
-            .stream()
-            .collect(Guavate.toImmutableMap(Map.Entry::getKey, 
bodyConcatenator));
-    }
+        static ImmutableMap<String, String> toMap(List<Field> fields) {
+            Function<Map.Entry<String, Collection<Field>>, String> 
bodyConcatenator = fieldListEntry -> fieldListEntry.getValue()
+                .stream()
+                .map(Field::getBody)
+                .map(MimeUtil::unscrambleHeaderValue)
+                .collect(Collectors.toList())
+                .stream()
+                .collect(Collectors.joining(JMAP_MULTIVALUED_FIELD_DELIMITER));
+
+            return Multimaps.index(fields, Field::getName)
+                .asMap()
+                .entrySet()
+                .stream()
+                .collect(Guavate.toImmutableMap(Map.Entry::getKey, 
bodyConcatenator));
+        }
 
-    default Emailer firstFromMailboxList(MailboxList list) {
-        if (list == null) {
-            return null;
+        static Emailer firstFromMailboxList(MailboxList list) {
+            if (list == null) {
+                return null;
+            }
+            return list.stream()
+                .map(Helpers::fromMailbox)
+                .findFirst()
+                .orElse(null);
         }
-        return list.stream()
-            .map(this::fromMailbox)
-            .findFirst()
-            .orElse(null);
-    }
 
-    default Emailer fromMailbox(Mailbox mailbox) {
-        return Emailer.builder()
-            .name(getNameOrAddress(mailbox))
-            .email(mailbox.getAddress())
-            .allowInvalid()
-            .build();
-    }
+        static Emailer fromMailbox(Mailbox mailbox) {
+            return Emailer.builder()
+                .name(getNameOrAddress(mailbox))
+                .email(mailbox.getAddress())
+                .allowInvalid()
+                .build();
+        }
 
-    default String getNameOrAddress(Mailbox mailbox) {
-        if (mailbox.getName() != null) {
-            return mailbox.getName();
+        static String getNameOrAddress(Mailbox mailbox) {
+            if (mailbox.getName() != null) {
+                return mailbox.getName();
+            }
+            return mailbox.getAddress();
         }
-        return mailbox.getAddress();
-    }
 
-    default ImmutableList<Emailer> fromAddressList(AddressList list) {
-        if (list == null) {
-            return ImmutableList.of();
+        static ImmutableList<Emailer> fromAddressList(AddressList list) {
+            if (list == null) {
+                return ImmutableList.of();
+            }
+            return list.flatten()
+                .stream()
+                .map(Helpers::fromMailbox)
+                .collect(Guavate.toImmutableList());
+        }
+
+        static <T extends MessageView>  Function<Collection<MessageResult>, 
Stream<T>> toMessageViews(FromMessageResult<T> converter) {
+            return messageResults -> {
+                try {
+                    return 
Stream.of(converter.fromMessageResults(messageResults));
+                } catch (Exception e) {
+                    LOGGER.error("Can not convert MessageResults to Message 
for {}", messageResults.iterator().next().getMessageId().serialize(), e);
+                    return Stream.of();
+                }
+            };
+        }
+
+        static <T extends MessageView> List<T> 
toMessageViews(List<MessageResult> messageResults, FromMessageResult<T> 
converter) {
+            return messageResults.stream()
+                
.collect(Guavate.toImmutableListMultimap(MessageResult::getMessageId))
+                .asMap()
+                .values()
+                .stream()
+                .filter(collection -> !collection.isEmpty())
+                .flatMap(toMessageViews(converter))
+                .collect(Guavate.toImmutableList());
         }
-        return list.flatten()
-            .stream()
-            .map(this::fromMailbox)
-            .collect(Guavate.toImmutableList());
     }
 }
diff --git 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MetaMessageViewFactory.java
 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MetaMessageViewFactory.java
index f513613..149be58 100644
--- 
a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MetaMessageViewFactory.java
+++ 
b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MetaMessageViewFactory.java
@@ -35,7 +35,7 @@ public class MetaMessageViewFactory {
         this.messageMetadataViewFactory = messageMetadataViewFactory;
     }
 
-    public MessageViewFactory getFactory(MessageProperties.ReadProfile 
readProfile) {
+    public MessageViewFactory<? extends MessageView> 
getFactory(MessageProperties.ReadProfile readProfile) {
         switch (readProfile) {
             case Full:
                 return messageFullViewFactory;
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 833c8ac..e0fe458 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
@@ -109,12 +109,6 @@ public class GetMessagesMethodTest {
         MessageContentExtractor messageContentExtractor = new 
MessageContentExtractor();
         BlobManager blobManager = mock(BlobManager.class);
         
when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake"));
-        messageMetadataViewFactory = spy(new 
MessageMetadataViewFactory(blobManager));
-        MetaMessageViewFactory metaMessageViewFactory = new 
MetaMessageViewFactory(
-            new MessageFullViewFactory(blobManager, messageContentExtractor, 
htmlTextExtractor),
-            new MessageHeaderViewFactory(blobManager),
-            messageMetadataViewFactory);
-
         InMemoryIntegrationResources resources = 
InMemoryIntegrationResources.defaultResources();
         mailboxManager = resources.getMailboxManager();
 
@@ -124,6 +118,12 @@ public class GetMessagesMethodTest {
         mailboxManager.createMailbox(inboxPath, session);
         mailboxManager.createMailbox(customMailboxPath, session);
         messageIdManager = resources.getMessageIdManager();
+
+        messageMetadataViewFactory = spy(new 
MessageMetadataViewFactory(blobManager, messageIdManager));
+        MetaMessageViewFactory metaMessageViewFactory = new 
MetaMessageViewFactory(
+            new MessageFullViewFactory(blobManager, messageContentExtractor, 
htmlTextExtractor, messageIdManager),
+            new MessageHeaderViewFactory(blobManager, messageIdManager),
+            messageMetadataViewFactory);
         testee = new GetMessagesMethod(metaMessageViewFactory, 
messageIdManager, new DefaultMetricFactory());
 
         messageContent1 = org.apache.james.mime4j.dom.Message.Builder.of()
@@ -141,7 +141,7 @@ public class GetMessagesMethodTest {
             .setBody("my message", StandardCharsets.UTF_8)
             .build();
     }
-    
+
     @Test
     public void processShouldThrowWhenNullRequest() {
         GetMessagesRequest request = null;
@@ -163,9 +163,9 @@ public class GetMessagesMethodTest {
     @Test
     public void processShouldThrowWhenRequestHasAccountId() {
         assertThatThrownBy(() -> testee.process(
-                GetMessagesRequest.builder().accountId("abc").build(), 
mock(MethodCallId.class), 
mock(MailboxSession.class))).isInstanceOf(NotImplementedException.class);
+            GetMessagesRequest.builder().accountId("abc").build(), 
mock(MethodCallId.class), 
mock(MailboxSession.class))).isInstanceOf(NotImplementedException.class);
     }
-    
+
     @Test
     @SuppressWarnings("unchecked")
     public void processShouldFetchMessages() throws Exception {
@@ -173,15 +173,15 @@ public class GetMessagesMethodTest {
         ComposedMessageId message1 = 
inbox.appendMessage(AppendCommand.from(messageContent1), session);
         ComposedMessageId message2 = 
inbox.appendMessage(AppendCommand.from(messageContent2), session);
         ComposedMessageId message3 = 
inbox.appendMessage(AppendCommand.from(messageContent3), session);
-        
+
         GetMessagesRequest request = GetMessagesRequest.builder()
-                .ids(ImmutableList.of(message1.getMessageId(),
-                        message2.getMessageId(),
-                        message3.getMessageId()))
-                .build();
+            .ids(ImmutableList.of(message1.getMessageId(),
+                message2.getMessageId(),
+                message3.getMessageId()))
+            .build();
 
         List<JmapResponse> result = testee.process(request, methodCallId, 
session).collect(Collectors.toList());
-        
+
         assertThat(result).hasSize(1)
             .extracting(JmapResponse::getResponse)
             .hasOnlyElementsOfType(GetMessagesResponse.class)
@@ -195,24 +195,24 @@ public class GetMessagesMethodTest {
                 Tuple.tuple(message2.getMessageId(), "message 2 subject", 
Optional.of("my message")),
                 Tuple.tuple(message3.getMessageId(), "", Optional.of("my 
message")));
     }
-    
+
     @Test
     @SuppressWarnings("unchecked")
     public void processShouldFetchHtmlMessage() throws Exception {
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
         ComposedMessageId message = inbox.appendMessage(
             AppendCommand.from(
-                    org.apache.james.mime4j.dom.Message.Builder.of()
-                        .setSubject("message 1 subject")
-                        .setBody("my <b>HTML</b> message", "html", 
StandardCharsets.UTF_8)),
+                org.apache.james.mime4j.dom.Message.Builder.of()
+                    .setSubject("message 1 subject")
+                    .setBody("my <b>HTML</b> message", "html", 
StandardCharsets.UTF_8)),
             session);
-        
+
         GetMessagesRequest request = GetMessagesRequest.builder()
-                .ids(ImmutableList.of(message.getMessageId()))
-                .build();
+            .ids(ImmutableList.of(message.getMessageId()))
+            .build();
 
         List<JmapResponse> result = testee.process(request, methodCallId, 
session).collect(Collectors.toList());
-        
+
         assertThat(result).hasSize(1)
             .extracting(JmapResponse::getResponse)
             .hasOnlyElementsOfType(GetMessagesResponse.class)
@@ -228,11 +228,11 @@ public class GetMessagesMethodTest {
     public void 
processShouldReturnOnlyMandatoryPropertiesOnEmptyPropertyList() throws 
Exception {
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
         ComposedMessageId message1 = 
inbox.appendMessage(AppendCommand.from(this.messageContent1), session);
-        
+
         GetMessagesRequest request = GetMessagesRequest.builder()
-                .ids(ImmutableList.of(message1.getMessageId()))
-                .properties(ImmutableList.of())
-                .build();
+            .ids(ImmutableList.of(message1.getMessageId()))
+            .properties(ImmutableList.of())
+            .build();
 
         List<JmapResponse> result = testee.process(request, methodCallId, 
session).collect(Collectors.toList());
 
@@ -246,10 +246,10 @@ public class GetMessagesMethodTest {
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
 
         ComposedMessageId message1 = 
inbox.appendMessage(AppendCommand.from(messageContent1), session);
-        
+
         GetMessagesRequest request = GetMessagesRequest.builder()
-                .ids(ImmutableList.of(message1.getMessageId()))
-                .build();
+            .ids(ImmutableList.of(message1.getMessageId()))
+            .build();
 
         List<JmapResponse> result = testee.process(request, methodCallId, 
session).collect(Collectors.toList());
         assertThat(result).hasSize(1);
@@ -262,11 +262,11 @@ public class GetMessagesMethodTest {
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
 
         ComposedMessageId message1 = 
inbox.appendMessage(AppendCommand.from(messageContent1), session);
-        
+
         GetMessagesRequest request = GetMessagesRequest.builder()
-                .ids(ImmutableList.of(message1.getMessageId()))
-                
.properties(ImmutableList.of(MessageProperty.subject.asFieldName()))
-                .build();
+            .ids(ImmutableList.of(message1.getMessageId()))
+            
.properties(ImmutableList.of(MessageProperty.subject.asFieldName()))
+            .build();
 
         Set<MessageProperty> expected = Sets.newHashSet(MessageProperty.id, 
MessageProperty.subject);
 
@@ -275,17 +275,17 @@ public class GetMessagesMethodTest {
         assertThat(result.get(0).getProperties())
             .isEqualTo(Optional.of(expected));
     }
-    
+
     @Test
     public void 
processShouldReturnTextBodyWhenBodyInPropertyListAndEmptyHtmlBody() throws 
Exception {
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
 
         ComposedMessageId message1 = 
inbox.appendMessage(AppendCommand.from(messageContent1), session);
-        
+
         GetMessagesRequest request = GetMessagesRequest.builder()
-                .ids(ImmutableList.of(message1.getMessageId()))
-                
.properties(ImmutableList.of(MessageProperty.body.asFieldName()))
-                .build();
+            .ids(ImmutableList.of(message1.getMessageId()))
+            .properties(ImmutableList.of(MessageProperty.body.asFieldName()))
+            .build();
 
         Set<MessageProperty> expected = Sets.newHashSet(MessageProperty.id, 
MessageProperty.textBody);
 
@@ -332,8 +332,8 @@ public class GetMessagesMethodTest {
 
         ComposedMessageId message = inbox.appendMessage(
             AppendCommand.from(org.apache.james.mime4j.dom.Message.Builder.of()
-                    .setSubject("message 1 subject")
-                    .setBody("", "html", StandardCharsets.UTF_8)),
+                .setSubject("message 1 subject")
+                .setBody("", "html", StandardCharsets.UTF_8)),
             session);
 
         GetMessagesRequest request = GetMessagesRequest.builder()
@@ -360,14 +360,14 @@ public class GetMessagesMethodTest {
 
         ComposedMessageId message = inbox.appendMessage(
             AppendCommand.from(org.apache.james.mime4j.dom.Message.Builder.of()
-                    .setSubject("message subject")
-                    .setBody(MultipartBuilder.create()
-                        .setSubType("alternative")
-                        .addBodyPart(BodyPartBuilder.create()
-                            .setBody("My plain message", "plain", 
StandardCharsets.UTF_8))
-                        .addBodyPart(BodyPartBuilder.create()
-                            .setBody("<a>The </a> <strong>HTML</strong> 
message", "html", StandardCharsets.UTF_8))
-                        .build())),
+                .setSubject("message subject")
+                .setBody(MultipartBuilder.create()
+                    .setSubType("alternative")
+                    .addBodyPart(BodyPartBuilder.create()
+                        .setBody("My plain message", "plain", 
StandardCharsets.UTF_8))
+                    .addBodyPart(BodyPartBuilder.create()
+                        .setBody("<a>The </a> <strong>HTML</strong> message", 
"html", StandardCharsets.UTF_8))
+                    .build())),
             session);
 
         GetMessagesRequest request = GetMessagesRequest.builder()
@@ -400,11 +400,11 @@ public class GetMessagesMethodTest {
                     .setSubject("message 1 subject")
                     .setBody("my message", StandardCharsets.UTF_8)),
             session);
-        
+
         GetMessagesRequest request = GetMessagesRequest.builder()
-                .ids(ImmutableList.of(message1.getMessageId()))
-                .properties(ImmutableList.of("headers.from", 
"headers.heADER2"))
-                .build();
+            .ids(ImmutableList.of(message1.getMessageId()))
+            .properties(ImmutableList.of("headers.from", "headers.heADER2"))
+            .build();
 
         Set<MessageProperty> expected = Sets.newHashSet(MessageProperty.id, 
MessageProperty.headers);
 
@@ -414,7 +414,7 @@ public class GetMessagesMethodTest {
         assertThat(result.get(0).getProperties())
             .isEqualTo(Optional.of(expected));
     }
-    
+
     @Test
     public void 
processShouldReturnPropertyFilterWhenFilteringHeadersRequested() throws 
Exception {
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
@@ -428,11 +428,11 @@ public class GetMessagesMethodTest {
                     .setSubject("message 1 subject")
                     .setBody("my message", StandardCharsets.UTF_8)),
             session);
-        
+
         GetMessagesRequest request = GetMessagesRequest.builder()
-                .ids(ImmutableList.of(message1.getMessageId()))
-                .properties(ImmutableList.of("headers.from", 
"headers.heADER2"))
-                .build();
+            .ids(ImmutableList.of(message1.getMessageId()))
+            .properties(ImmutableList.of("headers.from", "headers.heADER2"))
+            .build();
 
         List<JmapResponse> result = testee.process(request, methodCallId, 
session).collect(Collectors.toList());
 
@@ -662,16 +662,16 @@ public class GetMessagesMethodTest {
             .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
-                    ImmutableList.of(
-                        ImmutableMap.of(
-                            "$Answered", true,
-                            "$Draft", true),
-                        ImmutableMap.of(
-                            "$Answered", true,
-                            "$Draft", true),
-                        ImmutableMap.of(
-                            "$Answered", true,
-                            "$Draft", true)));
+                ImmutableList.of(
+                    ImmutableMap.of(
+                        "$Answered", true,
+                        "$Draft", true),
+                    ImmutableMap.of(
+                        "$Answered", true,
+                        "$Draft", true),
+                    ImmutableMap.of(
+                        "$Answered", true,
+                        "$Draft", true)));
 
     }
 
@@ -721,16 +721,16 @@ public class GetMessagesMethodTest {
             .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
-                    ImmutableList.of(
-                        ImmutableMap.of(
-                            "$Answered", true,
-                            "$Draft", true),
-                        ImmutableMap.of(
-                            "$Answered", true,
-                            "$Draft", true),
-                        ImmutableMap.of(
-                            "$Answered", true,
-                            "$Draft", true)));
+                ImmutableList.of(
+                    ImmutableMap.of(
+                        "$Answered", true,
+                        "$Draft", true),
+                    ImmutableMap.of(
+                        "$Answered", true,
+                        "$Draft", true),
+                    ImmutableMap.of(
+                        "$Answered", true,
+                        "$Draft", true)));
 
     }
 
@@ -763,10 +763,10 @@ public class GetMessagesMethodTest {
             .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
-                    ImmutableList.of(
-                        ImmutableMap.of(
-                            "$Answered", true,
-                            FORWARDED, true)));
+                ImmutableList.of(
+                    ImmutableMap.of(
+                        "$Answered", true,
+                        FORWARDED, true)));
     }
 
 }
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 fe2615d..3791de6 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
@@ -41,6 +41,7 @@ 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.mailbox.BlobManager;
+import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
@@ -88,7 +89,8 @@ class MessageSenderTest {
         MessageContentExtractor messageContentExtractor = new 
MessageContentExtractor();
         BlobManager blobManager = mock(BlobManager.class);
         
when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake"));
-        MessageFullViewFactory messageFullViewFactory = new 
MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor);
+        MessageIdManager messageIdManager = mock(MessageIdManager.class);
+        MessageFullViewFactory messageFullViewFactory = new 
MessageFullViewFactory(blobManager, messageContentExtractor, htmlTextExtractor, 
messageIdManager);
         jmapMessage = messageFullViewFactory.fromMetaDataWithContent(message);
         envelope = EnvelopeUtils.fromMessage(jmapMessage);
     }
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 4bf45dc..92f0adb 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
@@ -124,7 +124,8 @@ public class SetMessagesCreationProcessorTest {
         MessageContentExtractor messageContentExtractor = new 
MessageContentExtractor();
         BlobManager blobManager = mock(BlobManager.class);
         
when(blobManager.toBlobId(any(MessageId.class))).thenReturn(org.apache.james.mailbox.model.BlobId.fromString("fake"));
-        messageFullViewFactory = new MessageFullViewFactory(blobManager, 
messageContentExtractor, htmlTextExtractor);
+        MessageIdManager messageIdManager = mock(MessageIdManager.class);
+        messageFullViewFactory = new MessageFullViewFactory(blobManager, 
messageContentExtractor, htmlTextExtractor, messageIdManager);
         mockedMailSpool = mock(MailSpool.class);
         mockedAttachmentManager = mock(AttachmentManager.class);
         mockedMailboxManager = mock(MailboxManager.class);
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 cc71703..c717a41 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
@@ -29,7 +29,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
 import java.time.Instant;
-import java.util.List;
 import java.util.Optional;
 
 import javax.mail.Flags;
@@ -56,12 +55,10 @@ import 
org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.util.ClassLoaderUtils;
 import org.apache.james.util.mime.MessageContentExtractor;
@@ -106,15 +103,12 @@ class MessageFullViewFactoryTest {
                 
.build(ClassLoaderUtils.getSystemResourceAsSharedStream("fullMessage.eml")),
             session);
 
-        messageFullViewFactory = new 
MessageFullViewFactory(resources.getBlobManager(), messageContentExtractor, 
htmlTextExtractor);
+        messageFullViewFactory = new 
MessageFullViewFactory(resources.getBlobManager(), messageContentExtractor, 
htmlTextExtractor, messageIdManager);
     }
 
     @Test
     void fromMessageResultsShouldReturnCorrectView() throws Exception {
-        List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), 
FetchGroup.FULL_CONTENT, session);
-
-        MessageFullView actual = 
messageFullViewFactory.fromMessageResults(messages);
+        MessageFullView actual = 
messageFullViewFactory.fromMessageIds(ImmutableList.of(message1.getMessageId()),
 session).get(0);
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
             
softly.assertThat(actual.getMailboxIds()).containsExactly(bobInbox.getId());
@@ -145,10 +139,7 @@ class MessageFullViewFactoryTest {
         messageIdManager.setInMailboxes(message1.getMessageId(), 
ImmutableList.of(bobInbox.getId(), bobMailbox.getId()), session);
         bobMailbox.setFlags(new Flags(Flags.Flag.FLAGGED), 
MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), session);
 
-        List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), 
FetchGroup.FULL_CONTENT, session);
-
-        MessageFullView actual = 
messageFullViewFactory.fromMessageResults(messages);
+        MessageFullView actual = 
messageFullViewFactory.fromMessageIds(ImmutableList.of(message1.getMessageId()),
 session).get(0);
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
             
softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN,
 Keyword.FLAGGED).asMap());
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
index 4973e1e..8ed0b63 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
@@ -26,7 +26,6 @@ import static 
org.apache.james.jmap.draft.model.message.view.MessageViewFixture.
 import static 
org.apache.james.jmap.draft.model.message.view.MessageViewFixture.JACK_EMAIL;
 import static 
org.apache.james.jmap.draft.model.message.view.MessageViewFixture.JACOB_EMAIL;
 
-import java.util.List;
 import java.util.Optional;
 
 import javax.mail.Flags;
@@ -41,11 +40,9 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.util.ClassLoaderUtils;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -79,15 +76,12 @@ class MessageHeaderViewFactoryTest {
                 
.build(ClassLoaderUtils.getSystemResourceAsSharedStream("fullMessage.eml")),
             session);
 
-        testee = new MessageHeaderViewFactory(resources.getBlobManager());
+        testee = new MessageHeaderViewFactory(resources.getBlobManager(), 
messageIdManager);
     }
 
     @Test
     void fromMessageResultsShouldReturnCorrectView() throws Exception {
-        List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), 
FetchGroup.HEADERS, session);
-
-        MessageHeaderView actual = testee.fromMessageResults(messages);
+        MessageHeaderView actual = 
testee.fromMessageIds(ImmutableList.of(message1.getMessageId()), 
session).get(0);
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
             
softly.assertThat(actual.getMailboxIds()).containsExactly(bobInbox.getId());
@@ -112,10 +106,7 @@ class MessageHeaderViewFactoryTest {
         messageIdManager.setInMailboxes(message1.getMessageId(), 
ImmutableList.of(bobInbox.getId(), bobMailbox.getId()), session);
         bobMailbox.setFlags(new Flags(Flags.Flag.FLAGGED), 
MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), session);
 
-        List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), 
FetchGroup.HEADERS, session);
-
-        MessageHeaderView actual = testee.fromMessageResults(messages);
+        MessageHeaderView actual = 
testee.fromMessageIds(ImmutableList.of(message1.getMessageId()), 
session).get(0);
         SoftAssertions.assertSoftly(softly -> {
             
softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
             
softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN,
 Keyword.FLAGGED).asMap());
diff --git 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
index d6626f4..348e1ef 100644
--- 
a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
+++ 
b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
@@ -21,8 +21,6 @@ package org.apache.james.jmap.draft.model.message.view;
 
 import static 
org.apache.james.jmap.draft.model.message.view.MessageViewFixture.BOB;
 
-import java.util.List;
-
 import javax.mail.Flags;
 
 import org.apache.james.jmap.draft.model.BlobId;
@@ -35,11 +33,9 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.model.MessageResult;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -72,15 +68,12 @@ class MessageMetadataViewFactoryTest {
                 .build("header: value\r\n\r\nbody"),
             session);
 
-        testee = new MessageMetadataViewFactory(resources.getBlobManager());
+        testee = new MessageMetadataViewFactory(resources.getBlobManager(), 
messageIdManager);
     }
 
     @Test
     void fromMessageResultsShouldReturnCorrectView() throws Exception {
-        List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), 
FetchGroup.MINIMAL, session);
-
-        MessageMetadataView actual = testee.fromMessageResults(messages);
+        MessageMetadataView actual = 
testee.fromMessageIds(ImmutableList.of(message1.getMessageId()), 
session).get(0);
         SoftAssertions.assertSoftly(softly -> {
            
softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
            
softly.assertThat(actual.getMailboxIds()).containsExactly(bobInbox.getId());
@@ -96,10 +89,7 @@ class MessageMetadataViewFactoryTest {
         messageIdManager.setInMailboxes(message1.getMessageId(), 
ImmutableList.of(bobInbox.getId(), bobMailbox.getId()), session);
         bobMailbox.setFlags(new Flags(Flags.Flag.FLAGGED), 
MessageManager.FlagsUpdateMode.REPLACE, MessageRange.all(), session);
 
-        List<MessageResult> messages = messageIdManager
-            .getMessages(ImmutableList.of(message1.getMessageId()), 
FetchGroup.MINIMAL, session);
-
-        MessageMetadataView actual = testee.fromMessageResults(messages);
+        MessageMetadataView actual = 
testee.fromMessageIds(ImmutableList.of(message1.getMessageId()), 
session).get(0);
         SoftAssertions.assertSoftly(softly -> {
            
softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
            
softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN,
 Keyword.FLAGGED).asMap());


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to