You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rc...@apache.org on 2019/11/25 09:06:43 UTC

[james-project] branch master updated (31fe9b0 -> 248b0b7)

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

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


    from 31fe9b0  JAMES-2988 Deduce read levels from MessageProperties
     new 14d1aaa  JAMES-2987 Rename Jmap Message to MessageFullView
     new eed6d6a  JAMES-2987 Move message view models to a dedicated package
     new 464854a  JAMES-2987 Rename SubMailboxMessageTest -> SubMessageTest
     new 3246bb4  JAMES-2987 MessageView interface
     new 969d281  JAMES-2987 Creating MessageHeaderView and MessageMetadataView
     new 95631b9  JAMES-2987 MessageViewFactory::fromMessageResults
     new 6284bd3  JAMES-2987 MessageViewFactory -> MessageFullViewFactory
     new 4cfab0f  JAMES-2987 Add MessageMetadataViewFactory
     new 6371777  JAMES-2987 Move MessageFullViewFactoryTest to JUnit 5
     new da9ad59  JAMES-2987 Get rid of mocks in MessageFullViewFactoryTest
     new d1a8c28  JAMES-2987 Add MessageHeaderViewFactory
     new 5e01be7  JAMES-2987 Add tests for fromMessageResults in MessageFullViewFactoryTest
     new ad63b64  JAMES-2987 Extract redundant constants to a MessageViewFixture interface
     new 855d091  JAMES-2987 Classes using MetaDataWithContent subclass should import its class directly
     new 9bdd121  JAMES-2987 Moving remaining test classes in message.view package to JUnit 5
     new 1d2ff49  [Refactoring] Strong typing for ModSeq
     new 39ced51  [Refactoring] ModSeqProvider do not need mailboxSession
     new 0beafd9  [Refactoring] Strong typing for ModSeq
     new 20eee48  [Refactoring] Add tests for ModSeq, fix equals verifier checks
     new 3ef4fb8  [Refactoring] UidProvider do not need mailboxSession
     new a34fd4e  [Refactoring] CassandraMailboxSessionMapperFactory::getSession is unused
     new 248b0b7  [Refactoring] ModSeq are never used in MetaDataWithContent

The 22 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:
 .../org/apache/james/mailbox/MessageManager.java   |   2 +-
 .../main/java/org/apache/james/mailbox/ModSeq.java |  66 ++--
 .../model/ComposedMessageIdWithMetaData.java       |  12 +-
 .../james/mailbox/model/MessageMetaData.java       |   7 +-
 .../apache/james/mailbox/model/MessageResult.java  |   3 +-
 .../apache/james/mailbox/model/UpdatedFlags.java   |  11 +-
 .../apache/james/mailbox/MailboxListenerTest.java  |   5 +-
 .../apache/james/mailbox/MailboxManagerTest.java   |   2 +-
 .../java/org/apache/james/mailbox/ModSeqTest.java  |  26 +-
 .../model/ComposedMessageIdWithMetaDataTest.java   |   7 +-
 .../james/mailbox/model/UpdatedFlagsTest.java      |   3 +-
 .../CassandraMailboxSessionMapperFactory.java      |   7 +-
 .../cassandra/mail/CassandraMessageIdDAO.java      |   7 +-
 .../cassandra/mail/CassandraMessageIdMapper.java   |   7 +-
 .../mail/CassandraMessageIdToImapUidDAO.java       |  12 +-
 .../cassandra/mail/CassandraMessageMapper.java     |  22 +-
 .../cassandra/mail/CassandraModSeqProvider.java    |  55 +--
 .../cassandra/mail/CassandraUidProvider.java       |  10 +-
 .../cassandra/mail/MessageWithoutAttachment.java   |   5 +-
 .../mail/CassandraIndexTableHandlerTest.java       |   3 +-
 .../cassandra/mail/CassandraMapperProvider.java    |  11 +-
 .../cassandra/mail/CassandraMessageDAOTest.java    |   3 +-
 .../cassandra/mail/CassandraMessageIdDAOTest.java  |  71 ++--
 .../mail/CassandraMessageIdToImapUidDAOTest.java   |  87 ++---
 .../mail/CassandraModSeqProviderTest.java          |  21 +-
 .../cassandra/mail/CassandraUidProviderTest.java   |  10 +-
 .../mail/utils/FlagsUpdateStageResultTest.java     |   5 +-
 .../elasticsearch/json/IndexableMessage.java       |   7 +-
 .../json/MessageToElasticSearchJson.java           |   3 +-
 .../elasticsearch/json/MessageUpdateJson.java      |   6 +-
 ...asticSearchListeningMessageSearchIndexTest.java |   3 +-
 .../elasticsearch/json/IndexableMessageTest.java   |  35 ++
 .../json/MessageToElasticSearchJsonTest.java       |   3 +-
 .../scala/org/apache/james/event/json/DTOs.scala   |   6 +-
 .../apache/james/event/json/EventSerializer.scala  |  17 +-
 .../james/event/json/AddedSerializationTest.java   |   3 +-
 .../event/json/ExpungedSerializationTest.java      |   3 +-
 .../event/json/FlagsUpdatedSerializationTest.java  |   5 +-
 .../james/event/json/dtos/MessageUidTest.java      |   6 +
 .../dtos/{MessageUidTest.java => ModSeqTest.java}  |  28 +-
 .../jpa/JPAMailboxSessionMapperFactory.java        |   2 +-
 .../james/mailbox/jpa/mail/JPAMessageMapper.java   |  10 +-
 .../james/mailbox/jpa/mail/JPAModSeqProvider.java  |  18 +-
 .../james/mailbox/jpa/mail/JPAUidProvider.java     |   7 +-
 .../model/openjpa/AbstractJPAMailboxMessage.java   |  15 +-
 .../model/openjpa/JPAEncryptedMailboxMessage.java  |   3 +-
 .../jpa/mail/model/openjpa/JPAMailboxMessage.java  |   3 +-
 .../model/openjpa/JPAStreamingMailboxMessage.java  |   3 +-
 .../james/mailbox/jpa/mail/JPAMapperProvider.java  |  10 +-
 .../jpa/mail/TransactionalMessageMapper.java       |   4 +-
 .../james/mailbox/maildir/MaildirFolder.java       |   7 +-
 .../apache/james/mailbox/maildir/MaildirStore.java |  19 +-
 .../mailbox/maildir/mail/MaildirMessageMapper.java |   9 +-
 .../maildir/mail/model/MaildirMailboxMessage.java  |   9 +-
 .../inmemory/mail/InMemoryMessageMapper.java       |   3 +-
 .../inmemory/mail/InMemoryModSeqProvider.java      |  31 +-
 .../mailbox/inmemory/mail/InMemoryUidProvider.java |   9 +-
 .../inmemory/mail/InMemoryMapperProvider.java      |   9 +-
 .../manager/InMemoryIntegrationResources.java      |  12 +
 .../james/mailbox/store/MailboxMetaData.java       |  10 +-
 .../james/mailbox/store/MessageResultImpl.java     |   3 +-
 .../james/mailbox/store/StoreMessageIdManager.java |   9 +-
 .../james/mailbox/store/StoreMessageManager.java   |   3 +-
 .../mailbox/store/StoreMessageResultIterator.java  |   3 +-
 .../mailbox/store/mail/AbstractMessageMapper.java  |  32 +-
 .../james/mailbox/store/mail/MessageMapper.java    |   3 +-
 .../james/mailbox/store/mail/MessageUtils.java     |  22 +-
 .../james/mailbox/store/mail/ModSeqProvider.java   |  14 +-
 .../james/mailbox/store/mail/UidProvider.java      |  11 +-
 .../mailbox/store/mail/model/MailboxMessage.java   |   5 +-
 .../mail/model/impl/SimpleMailboxMessage.java      |  12 +-
 .../mailbox/store/search/MessageSearches.java      |   9 +-
 .../store/AbstractCombinationManagerTest.java      |   2 +-
 .../AbstractMessageIdManagerSideEffectTest.java    |   4 +-
 .../store/AbstractMessageIdManagerStorageTest.java |  13 +-
 .../mailbox/store/MessageIdManagerTestSystem.java  |   3 +-
 .../james/mailbox/store/PreDeletionHooksTest.java  |   3 +-
 .../StoreMailboxMessageResultIteratorTest.java     |   4 +-
 .../james/mailbox/store/mail/MessageUtilsTest.java |  26 +-
 .../store/mail/model/ListMessageAssertTest.java    |   3 +-
 .../mailbox/store/mail/model/MapperProvider.java   |   6 +-
 .../store/mail/model/MessageIdMapperTest.java      |  25 +-
 .../store/mail/model/MessageMapperTest.java        |  25 +-
 .../store/mail/model/MetadataMapAssertTest.java    |   3 +-
 .../mail/model/impl/SimpleMailboxMessageTest.java  |  11 +-
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |   9 +-
 .../imap/api/message/response/StatusResponse.java  |   5 +-
 .../james/imap/encode/ESearchResponseEncoder.java  |   5 +-
 .../james/imap/encode/FetchResponseEncoder.java    |   5 +-
 .../imap/encode/MailboxStatusResponseEncoder.java  |   5 +-
 .../james/imap/encode/SearchResponseEncoder.java   |   5 +-
 .../imap/message/response/ESearchResponse.java     |   7 +-
 .../james/imap/message/response/FetchResponse.java |   7 +-
 .../message/response/MailboxStatusResponse.java    |   7 +-
 .../imap/message/response/SearchResponse.java      |   7 +-
 .../imap/processor/AbstractMailboxProcessor.java   |   8 +-
 .../imap/processor/AbstractSelectionProcessor.java |   3 +-
 .../james/imap/processor/SearchProcessor.java      |  11 +-
 .../james/imap/processor/StatusProcessor.java      |   5 +-
 .../james/imap/processor/StoreProcessor.java       |   5 +-
 .../james/imap/processor/fetch/FetchProcessor.java |   2 +-
 .../imap/processor/fetch/FetchResponseBuilder.java |   7 +-
 .../processor/base/MailboxEventAnalyserTest.java   |   9 +-
 .../processor/base/SelectedMailboxImplTest.java    |   3 +-
 .../apache/james/jmap/draft/JMAPCommonModule.java  |   4 +-
 .../jmap/draft/methods/GetMessagesMethod.java      |  53 +--
 .../jmap/draft/methods/MIMEMessageConverter.java   |   4 +-
 .../james/jmap/draft/methods/MessageAppender.java  |  28 +-
 .../james/jmap/draft/methods/MessageSender.java    |   6 +-
 .../james/jmap/draft/methods/SendMDNProcessor.java |   4 +-
 .../methods/SetMessagesCreationProcessor.java      |  16 +-
 .../james/jmap/draft/methods/ValueWithId.java      |   6 +-
 .../james/jmap/draft/model/CreationMessage.java    |   1 +
 .../james/jmap/draft/model/EnvelopeUtils.java      |   3 +-
 .../jmap/draft/model/GetMessagesResponse.java      |  15 +-
 .../org/apache/james/jmap/draft/model/Message.java | 402 ---------------------
 .../jmap/draft/model/SetMessagesResponse.java      |  13 +-
 .../draft/model/message/view/MessageFullView.java  | 189 ++++++++++
 .../view/MessageFullViewFactory.java}              | 139 ++-----
 .../model/message/view/MessageHeaderView.java      | 201 +++++++++++
 .../message/view/MessageHeaderViewFactory.java     |  94 +++++
 .../model/message/view/MessageMetadataView.java    | 169 +++++++++
 .../message/view/MessageMetadataViewFactory.java   |  60 ++-
 .../jmap/draft/model/message/view/MessageView.java |   7 +-
 .../model/message/view/MessageViewFactory.java     | 139 +++++++
 .../draft/model/{ => message/view}/SubMessage.java |   8 +-
 .../jmap/draft/json/ParsingWritingObjects.java     |   6 +-
 .../jmap/draft/json/ParsingWritingObjectsTest.java |   2 +-
 .../jmap/draft/methods/GetMessagesMethodTest.java  |  64 ++--
 .../jmap/draft/methods/MessageSenderTest.java      |  17 +-
 .../methods/SetMessagesCreationProcessorTest.java  |  12 +-
 .../jmap/draft/model/SetMessagesResponseTest.java  |   9 +-
 .../view/MessageFullViewFactoryTest.java}          | 247 +++++++++----
 .../view/MessageFullViewTest.java}                 | 275 +++++++++-----
 .../message/view/MessageHeaderViewFactoryTest.java | 124 +++++++
 .../view/MessageMetadataViewFactoryTest.java       | 109 ++++++
 .../model/message/view/MessageViewFixture.java     |  66 ++--
 .../view/SubMessageTest.java}                      |  85 +++--
 .../src/test/resources/fullMessage.eml}            |  20 +-
 139 files changed, 2290 insertions(+), 1474 deletions(-)
 copy server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/BlobId.java => mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java (57%)
 copy mailet/api/src/test/java/org/apache/mailet/AttributeNameTest.java => mailbox/api/src/test/java/org/apache/james/mailbox/ModSeqTest.java (72%)
 copy mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/{MessageUidTest.java => ModSeqTest.java} (68%)
 delete mode 100644 server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Message.java
 create mode 100644 server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullView.java
 rename server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/{MessageFactory.java => message/view/MessageFullViewFactory.java} (74%)
 create mode 100644 server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderView.java
 create mode 100644 server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactory.java
 create mode 100644 server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataView.java
 copy protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/HeaderBodyElement.java => server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactory.java (52%)
 copy mailbox/api/src/main/java/org/apache/james/mailbox/indexer/MessageIdReIndexer.java => server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageView.java (88%)
 create mode 100644 server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
 rename server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/{ => message/view}/SubMessage.java (95%)
 rename server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/{MessageFactoryTest.java => message/view/MessageFullViewFactoryTest.java} (72%)
 rename server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/{MessageTest.java => message/view/MessageFullViewTest.java} (57%)
 create mode 100644 server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
 create mode 100644 server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
 copy mailbox/api/src/main/java/org/apache/james/mailbox/extractor/ParsedContent.java => server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFixture.java (51%)
 rename server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/{SubMailboxMessageTest.java => message/view/SubMessageTest.java} (69%)
 copy server/protocols/{jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/eml/htmlAndTextMultipartWithOneAttachment.eml => jmap-draft/src/test/resources/fullMessage.eml} (81%)


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


[james-project] 21/22: [Refactoring] CassandraMailboxSessionMapperFactory::getSession is unused

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a34fd4e581c70c985697533f24ff9827a70c7b0b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 21 13:41:13 2019 +0700

    [Refactoring] CassandraMailboxSessionMapperFactory::getSession is unused
---
 .../james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index 55c5080..86824de 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -188,10 +188,6 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
         return uidProvider;
     }
 
-    Session getSession() {
-        return session;
-    }
-
     @Override
     public AnnotationMapper createAnnotationMapper(MailboxSession mailboxSession)
             throws MailboxException {


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


[james-project] 11/22: JAMES-2987 Add MessageHeaderViewFactory

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d1a8c287a7c6264afeeaa12c336d4d5e342b30b0
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Nov 21 17:45:56 2019 +0700

    JAMES-2987 Add MessageHeaderViewFactory
---
 .../jmap/draft/methods/MIMEMessageConverter.java   |   4 +-
 .../model/message/view/MessageFullViewFactory.java |  86 +------------
 .../model/message/view/MessageHeaderView.java      |   2 +-
 .../message/view/MessageHeaderViewFactory.java     |  94 ++++++++++++++
 .../model/message/view/MessageViewFactory.java     |  72 +++++++++++
 .../message/view/MessageHeaderViewFactoryTest.java | 141 +++++++++++++++++++++
 .../jmap-draft/src/test/resources/fullMessage.eml  |  60 +++++++++
 7 files changed, 376 insertions(+), 83 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
index c9e3dcd..eac8c13 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
 
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
-import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.codec.EncoderUtil;
@@ -176,7 +176,7 @@ public class MIMEMessageConverter {
     }
 
     private void addMultivaluedHeader(Message.Builder messageBuilder, String fieldName, String multipleValues) {
-        Splitter.on(MessageFullViewFactory.JMAP_MULTIVALUED_FIELD_DELIMITER).split(multipleValues)
+        Splitter.on(MessageViewFactory.JMAP_MULTIVALUED_FIELD_DELIMITER).split(multipleValues)
             .forEach(value -> addHeader(messageBuilder, fieldName, value));
     }
 
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 ebef606..dec75d8 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
@@ -24,19 +24,14 @@ import java.time.Instant;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.Set;
-import java.util.function.Function;
-import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 import javax.mail.internet.SharedInputStream;
 
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.BlobId;
-import org.apache.james.jmap.draft.model.Emailer;
 import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
@@ -48,31 +43,21 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mime4j.dom.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.dom.Message;
 import org.apache.james.mime4j.stream.MimeConfig;
-import org.apache.james.mime4j.util.MimeUtil;
 import org.apache.james.util.mime.MessageContentExtractor;
 import org.apache.james.util.mime.MessageContentExtractor.MessageContent;
 
 import com.github.steveash.guavate.Guavate;
 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.Multimaps;
 import com.google.common.collect.Sets;
 
 public class MessageFullViewFactory implements MessageViewFactory<MessageFullView> {
-    public static final String JMAP_MULTIVALUED_FIELD_DELIMITER = "\n";
-
     private final BlobManager blobManager;
     private final MessagePreviewGenerator messagePreview;
     private final MessageContentExtractor messageContentExtractor;
     private final HtmlTextExtractor htmlTextExtractor;
-    private final Keywords.KeywordsFactory keywordsFactory;
 
     @Inject
     public MessageFullViewFactory(BlobManager blobManager, MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor,
@@ -81,7 +66,6 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         this.messagePreview = messagePreview;
         this.messageContentExtractor = messageContentExtractor;
         this.htmlTextExtractor = htmlTextExtractor;
-        this.keywordsFactory = Keywords.lenientFactory();
     }
 
     @Override
@@ -90,7 +74,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
     }
 
     public MessageFullView fromMetaDataWithContent(MetaDataWithContent message) throws MailboxException {
-        org.apache.james.mime4j.dom.Message mimeMessage = parse(message);
+        Message mimeMessage = parse(message);
         MessageContent messageContent = extractContent(mimeMessage);
         Optional<String> htmlBody = messageContent.getHtmlBody();
         Optional<String> mainTextContent = mainTextContent(messageContent);
@@ -133,7 +117,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
             .build();
     }
 
-    private Instant getDateFromHeaderOrInternalDateOtherwise(org.apache.james.mime4j.dom.Message mimeMessage, MetaDataWithContent message) {
+    private Instant getDateFromHeaderOrInternalDateOtherwise(Message mimeMessage, MetaDataWithContent message) {
         return Optional.ofNullable(mimeMessage.getDate())
             .map(Date::toInstant)
             .orElse(message.getInternalDate());
@@ -153,9 +137,9 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
             .orElse(messageContent.getTextBody());
     }
 
-    private org.apache.james.mime4j.dom.Message parse(MetaDataWithContent message) throws MailboxException {
+    private Message parse(MetaDataWithContent message) throws MailboxException {
         try {
-            return org.apache.james.mime4j.dom.Message.Builder
+            return Message.Builder
                     .of()
                     .use(MimeConfig.PERMISSIVE)
                     .parse(message.getContent())
@@ -165,71 +149,13 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         }
     }
 
-    private MessageContent extractContent(org.apache.james.mime4j.dom.Message mimeMessage) throws MailboxException {
+    private MessageContent extractContent(Message mimeMessage) throws MailboxException {
         try {
             return messageContentExtractor.extract(mimeMessage);
         } catch (IOException e) {
             throw new MailboxException("Unable to extract content: " + e.getMessage(), e);
         }
     }
-
-    private Emailer firstFromMailboxList(MailboxList list) {
-        if (list == null) {
-            return null;
-        }
-        return list.stream()
-                .map(this::fromMailbox)
-                .findFirst()
-                .orElse(null);
-    }
-    
-    private ImmutableList<Emailer> fromAddressList(AddressList list) {
-        if (list == null) {
-            return ImmutableList.of();
-        }
-        return list.flatten()
-            .stream()
-            .map(this::fromMailbox)
-            .collect(Guavate.toImmutableList());
-    }
-    
-    private Emailer fromMailbox(Mailbox mailbox) {
-        return Emailer.builder()
-            .name(getNameOrAddress(mailbox))
-            .email(mailbox.getAddress())
-            .allowInvalid()
-            .build();
-    }
-
-    private String getNameOrAddress(Mailbox mailbox) {
-        if (mailbox.getName() != null) {
-            return mailbox.getName();
-        }
-        return mailbox.getAddress();
-    }
-
-    private ImmutableMap<String, String> toMap(List<Field> fields) {
-        Function<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));
-    }
-    
-    private 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();
-    }
     
     private List<Attachment> getAttachments(List<MessageAttachment> attachments) {
         return attachments.stream()
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderView.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderView.java
index abb3a31..9ad4610 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
@@ -39,7 +39,7 @@ import com.google.common.collect.ImmutableMap;
 
 public class MessageHeaderView extends MessageMetadataView {
 
-    public static Builder messageHeaderBuilder() {
+    public static MessageHeaderView.Builder<? extends MessageHeaderView.Builder> messageHeaderBuilder() {
         return new Builder();
     }
 
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
new file mode 100644
index 0000000..6995b44
--- /dev/null
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactory.java
@@ -0,0 +1,94 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+import javax.inject.Inject;
+
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.mailbox.BlobManager;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageResult;
+import org.apache.james.mime4j.dom.Message;
+import org.apache.james.mime4j.stream.MimeConfig;
+
+import com.google.common.base.Strings;
+
+public class MessageHeaderViewFactory implements MessageViewFactory<MessageHeaderView> {
+    private final BlobManager blobManager;
+
+    @Inject
+    MessageHeaderViewFactory(BlobManager blobManager) {
+        this.blobManager = blobManager;
+    }
+
+    @Override
+    public MessageHeaderView fromMessageResults(Collection<MessageResult> messageResults) throws MailboxException {
+        assertOneMessageId(messageResults);
+
+        MessageResult firstMessageResult = messageResults.iterator().next();
+        List<MailboxId> mailboxIds = getMailboxIds(messageResults);
+
+        Message mimeMessage = parse(firstMessageResult);
+
+        return MessageHeaderView.messageHeaderBuilder()
+            .id(firstMessageResult.getMessageId())
+            .mailboxIds(mailboxIds)
+            .blobId(BlobId.of(blobManager.toBlobId(firstMessageResult.getMessageId())))
+            .threadId(firstMessageResult.getMessageId().serialize())
+            .keywords(getKeywords(messageResults))
+            .size(firstMessageResult.getSize())
+            .inReplyToMessageId(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()))
+            .date(getDateFromHeaderOrInternalDateOtherwise(mimeMessage, firstMessageResult))
+            .build();
+    }
+
+    private Message parse(MessageResult message) throws MailboxException {
+        try {
+            return Message.Builder
+                .of()
+                .use(MimeConfig.PERMISSIVE)
+                .parse(message.getFullContent().getInputStream())
+                .build();
+        } catch (IOException e) {
+            throw new MailboxException("Unable to parse message: " + e.getMessage(), e);
+        }
+    }
+
+    private Instant getDateFromHeaderOrInternalDateOtherwise(Message mimeMessage, MessageResult message) {
+        return Optional.ofNullable(mimeMessage.getDate())
+            .map(Date::toInstant)
+            .orElse(message.getInternalDate().toInstant());
+    }
+}
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 5339c13..4afb117 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
@@ -21,19 +21,32 @@ package org.apache.james.jmap.draft.model.message.view;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
+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.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
 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 com.github.steveash.guavate.Guavate;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Multimaps;
 
 public interface MessageViewFactory<T extends MessageView> {
     KeywordsCombiner KEYWORDS_COMBINER = new KeywordsCombiner();
     Keywords.KeywordsFactory KEYWORDS_FACTORY = Keywords.lenientFactory();
+    String JMAP_MULTIVALUED_FIELD_DELIMITER = "\n";
 
     T fromMessageResults(Collection<MessageResult> messageResults) throws MailboxException;
 
@@ -64,4 +77,63 @@ public interface MessageViewFactory<T extends MessageView> {
                 .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;
+        }
+        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));
+    }
+
+    default Emailer firstFromMailboxList(MailboxList list) {
+        if (list == null) {
+            return 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();
+    }
+
+    default String getNameOrAddress(Mailbox mailbox) {
+        if (mailbox.getName() != null) {
+            return mailbox.getName();
+        }
+        return mailbox.getAddress();
+    }
+
+    default ImmutableList<Emailer> fromAddressList(AddressList list) {
+        if (list == null) {
+            return ImmutableList.of();
+        }
+        return list.flatten()
+            .stream()
+            .map(this::fromMailbox)
+            .collect(Guavate.toImmutableList());
+    }
 }
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
new file mode 100644
index 0000000..a60c17f
--- /dev/null
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderViewFactoryTest.java
@@ -0,0 +1,141 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import java.util.List;
+import java.util.Optional;
+
+import javax.mail.Flags;
+
+import org.apache.james.core.Username;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Emailer;
+import org.apache.james.jmap.draft.model.Keyword;
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.Number;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageIdManager;
+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.FetchGroupImpl;
+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;
+import org.junit.jupiter.api.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+class MessageHeaderViewFactoryTest {
+    private static final Username BOB = Username.of("bob@local");
+
+    private MessageIdManager messageIdManager;
+    private MessageHeaderViewFactory testee;
+    private MailboxSession session;
+    private MessageManager bobInbox;
+    private MessageManager bobMailbox;
+    private ComposedMessageId message1;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
+        messageIdManager = resources.getMessageIdManager();
+        InMemoryMailboxManager mailboxManager = resources.getMailboxManager();
+
+        session = mailboxManager.createSystemSession(BOB);
+        MailboxId bobInboxId = mailboxManager.createMailbox(MailboxPath.inbox(session), session).get();
+        MailboxId bobMailboxId = mailboxManager.createMailbox(MailboxPath.forUser(BOB, "anotherMailbox"), session).get();
+
+        bobInbox = mailboxManager.getMailbox(bobInboxId, session);
+        bobMailbox = mailboxManager.getMailbox(bobMailboxId, session);
+
+        message1 = bobInbox.appendMessage(MessageManager.AppendCommand.builder()
+                .withFlags(new Flags(Flags.Flag.SEEN))
+                .build(ClassLoaderUtils.getSystemResourceAsSharedStream("fullMessage.eml")),
+            session);
+
+        testee = new MessageHeaderViewFactory(resources.getBlobManager());
+    }
+
+    @Test
+    void fromMessageResultsShouldReturnCorrectView() throws Exception {
+        List<MessageResult> messages = messageIdManager
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+
+        Emailer bobEmail = Emailer.builder().name(BOB.getLocalPart()).email(BOB.asString()).build();
+        Emailer aliceEmail = Emailer.builder().name("alice").email("alice@local").build();
+        Emailer jackEmail = Emailer.builder().name("jack").email("jack@local").build();
+        Emailer jacobEmail = Emailer.builder().name("jacob").email("jacob@local").build();
+
+        ImmutableMap<String, String> headersMap = ImmutableMap.<String, String>builder()
+            .put("Content-Type", "multipart/mixed; boundary=\"------------7AF1D14DE1DFA16229726B54\"")
+            .put("Date", "Tue, 7 Jun 2016 16:23:37 +0200")
+            .put("From", "alice <al...@local>")
+            .put("To", "bob <bo...@local>")
+            .put("Subject", "Full message")
+            .put("Mime-Version", "1.0")
+            .put("Message-ID", "<1c...@open-paas.org>")
+            .put("Cc", "jack <ja...@local>, jacob <ja...@local>")
+            .put("Bcc", "alice <al...@local>")
+            .put("Reply-to", "alice <al...@local>")
+            .put("In-reply-to", "bob@local")
+            .build();
+
+        MessageHeaderView actual = testee.fromMessageResults(messages);
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
+            softly.assertThat(actual.getMailboxIds()).containsExactly(bobInbox.getId());
+            softly.assertThat(actual.getThreadId()).isEqualTo(message1.getMessageId().serialize());
+            softly.assertThat(actual.getSize()).isEqualTo(Number.fromLong(2255));
+            softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN).asMap());
+            softly.assertThat(actual.getBlobId()).isEqualTo(BlobId.of(message1.getMessageId().serialize()));
+            softly.assertThat(actual.getInReplyToMessageId()).isEqualTo(Optional.of(BOB.asString()));
+            softly.assertThat(actual.getHeaders()).isEqualTo(headersMap);
+            softly.assertThat(actual.getFrom()).isEqualTo(Optional.of(aliceEmail));
+            softly.assertThat(actual.getTo()).isEqualTo(ImmutableList.of(bobEmail));
+            softly.assertThat(actual.getCc()).isEqualTo(ImmutableList.of(jackEmail, jacobEmail));
+            softly.assertThat(actual.getBcc()).isEqualTo(ImmutableList.of(aliceEmail));
+            softly.assertThat(actual.getReplyTo()).isEqualTo(ImmutableList.of(aliceEmail));
+            softly.assertThat(actual.getSubject()).isEqualTo("Full message");
+            softly.assertThat(actual.getDate()).isEqualTo("2016-06-07T14:23:37Z");
+        });
+    }
+
+    @Test
+    void fromMessageResultsShouldCombineKeywords() throws Exception {
+        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()), FetchGroupImpl.MINIMAL, session);
+
+        MessageHeaderView actual = testee.fromMessageResults(messages);
+        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/resources/fullMessage.eml b/server/protocols/jmap-draft/src/test/resources/fullMessage.eml
new file mode 100644
index 0000000..daf28d3
--- /dev/null
+++ b/server/protocols/jmap-draft/src/test/resources/fullMessage.eml
@@ -0,0 +1,60 @@
+Reply-to: alice <al...@local>
+In-reply-to: bob@local
+Mime-Version: 1.0
+To: bob <bo...@local>
+From: alice <al...@local>
+Cc: jack <ja...@local>, jacob <ja...@local>
+Bcc: alice <al...@local>
+Subject: Full message
+Message-ID: <1c...@open-paas.org>
+Date: Tue, 7 Jun 2016 16:23:37 +0200
+Content-Type: multipart/mixed;
+ boundary="------------7AF1D14DE1DFA16229726B54"
+
+This is a multi-part message in MIME format.
+--------------7AF1D14DE1DFA16229726B54
+Content-Type: multipart/alternative;
+ boundary="------------172F9470CFA3BF3417835D92"
+
+
+--------------172F9470CFA3BF3417835D92
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 7bit
+
+/blabla/
+*bloblo*
+
+--------------172F9470CFA3BF3417835D92
+Content-Type: text/html; charset=utf-8
+Content-Transfer-Encoding: 7bit
+
+<i>blabla</i>
+<b>bloblo</b>
+
+--------------172F9470CFA3BF3417835D92--
+
+--------------7AF1D14DE1DFA16229726B54
+Content-Type: image/jpeg;
+ name="4037_014.jpg"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="4037_014.jpg"
+
+/9j/4X2cRXhpZgAASUkqAAgAAAANAA8BAgAKAAAAqgAAABABAgAJAAAAtAAAABIBAwABAAAA
+AQAAABoBBQABAAAAvgAAABsBBQABAAAAxgAAACgBAwABAAAAAgAAADEBAgAKAAAAzgAAADIB
+AgAUAAAA2AAAABMCAwABAAAAAgAAAGmHBAABAAAAfAIAAKXEBwDQAAAA7AAAANLGBwBAAAAA
+vAEAANPGBwCAAAAA/AEAAEwqAABQYW5hc29uaWMARE1DLUZaNDUAALQAAAABAAAAtAAAAAEA
+AABWZXIuMS4wICAAMjAxNDowMjoyNSAxMDozMjowOQBQcmludElNADAyNTAAAA4AAQAWABYA
+AgAAAAAAAwBkAAAABwAAAAAACAAAAAAACQAAAAAACgAAAAAACwCsAAAADAAAAAAADQAAAAAA
+DgDEAAAAAAEFAAAAAQEBAAAAEAGAAAAACREAABAnAAALDwAAECcAAJcFAAAQJwAAsAgAABAn
+AAABHAAAECcAAF4CAAAQJwAAiwAAABAnAADLAwAAECcAAOUbAAAQJwAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+
+--------------7AF1D14DE1DFA16229726B54--


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


[james-project] 17/22: [Refactoring] ModSeqProvider do not need mailboxSession

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 39ced51c7efebcfc09537c94784c4afc4bf023b0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 21 13:29:38 2019 +0700

    [Refactoring] ModSeqProvider do not need mailboxSession
---
 .../cassandra/CassandraMailboxSessionMapperFactory.java     |  2 +-
 .../mailbox/cassandra/mail/CassandraMessageIdMapper.java    |  7 ++-----
 .../mailbox/cassandra/mail/CassandraMessageMapper.java      |  2 +-
 .../mailbox/cassandra/mail/CassandraModSeqProvider.java     | 11 +++++------
 .../mailbox/cassandra/mail/CassandraMapperProvider.java     |  6 ++----
 .../mailbox/cassandra/mail/CassandraModSeqProviderTest.java | 12 ++++++------
 .../apache/james/mailbox/jpa/mail/JPAModSeqProvider.java    |  9 ++++-----
 .../java/org/apache/james/mailbox/maildir/MaildirStore.java |  8 ++++----
 .../james/mailbox/inmemory/mail/InMemoryModSeqProvider.java | 10 ++++------
 .../james/mailbox/inmemory/mail/InMemoryMapperProvider.java |  4 ++--
 .../apache/james/mailbox/store/StoreMessageIdManager.java   |  2 +-
 .../james/mailbox/store/mail/AbstractMessageMapper.java     |  8 ++++----
 .../org/apache/james/mailbox/store/mail/MessageUtils.java   |  4 ++--
 .../org/apache/james/mailbox/store/mail/ModSeqProvider.java | 13 ++++++-------
 .../apache/james/mailbox/store/mail/MessageUtilsTest.java   |  6 +++---
 15 files changed, 47 insertions(+), 57 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index 1015608..320f195 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -160,7 +160,7 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
     public MessageIdMapper createMessageIdMapper(MailboxSession mailboxSession) throws MailboxException {
         return new CassandraMessageIdMapper(getMailboxMapper(mailboxSession), mailboxDAO,
                 createAttachmentMapper(mailboxSession),
-                imapUidDAO, messageIdDAO, messageDAO, indexTableHandler, modSeqProvider, mailboxSession,
+                imapUidDAO, messageIdDAO, messageDAO, indexTableHandler, modSeqProvider,
                 cassandraConfiguration);
     }
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
index c69b4e5..f317f6b 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
@@ -28,7 +28,6 @@ import javax.mail.Flags;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
@@ -67,14 +66,13 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
     private final CassandraMessageDAO messageDAO;
     private final CassandraIndexTableHandler indexTableHandler;
     private final ModSeqProvider modSeqProvider;
-    private final MailboxSession mailboxSession;
     private final AttachmentLoader attachmentLoader;
     private final CassandraConfiguration cassandraConfiguration;
 
     public CassandraMessageIdMapper(MailboxMapper mailboxMapper, CassandraMailboxDAO mailboxDAO, CassandraAttachmentMapper attachmentMapper,
                                     CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMessageIdDAO messageIdDAO,
                                     CassandraMessageDAO messageDAO, CassandraIndexTableHandler indexTableHandler,
-                                    ModSeqProvider modSeqProvider, MailboxSession mailboxSession, CassandraConfiguration cassandraConfiguration) {
+                                    ModSeqProvider modSeqProvider, CassandraConfiguration cassandraConfiguration) {
 
         this.mailboxMapper = mailboxMapper;
         this.mailboxDAO = mailboxDAO;
@@ -83,7 +81,6 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
         this.messageDAO = messageDAO;
         this.indexTableHandler = indexTableHandler;
         this.modSeqProvider = modSeqProvider;
-        this.mailboxSession = mailboxSession;
         this.attachmentLoader = new AttachmentLoader(attachmentMapper);
         this.cassandraConfiguration = cassandraConfiguration;
     }
@@ -274,7 +271,7 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
         ComposedMessageIdWithMetaData newComposedId = new ComposedMessageIdWithMetaData(
             oldComposedId.getComposedMessageId(),
             newFlags,
-            modSeqProvider.nextModSeq(mailboxSession, cassandraId));
+            modSeqProvider.nextModSeq(cassandraId));
 
         return updateFlags(oldComposedId, newComposedId);
     }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 0d3b43c..b06ef42 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -263,7 +263,7 @@ public class CassandraMessageMapper implements MessageMapper {
 
     @Override
     public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
-        return modSeqProvider.highestModSeq(mailboxSession, mailbox);
+        return modSeqProvider.highestModSeq(mailbox);
     }
 
     @Override
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
index b2e7460..7aeb45e 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
@@ -38,7 +38,6 @@ import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -120,7 +119,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
 
 
     @Override
-    public ModSeq nextModSeq(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException {
+    public ModSeq nextModSeq(Mailbox mailbox) throws MailboxException {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
         return nextModSeq(mailboxId)
             .blockOptional()
@@ -128,19 +127,19 @@ public class CassandraModSeqProvider implements ModSeqProvider {
     }
 
     @Override
-    public ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq nextModSeq(MailboxId mailboxId) throws MailboxException {
         return nextModSeq((CassandraId) mailboxId)
             .blockOptional()
             .orElseThrow(() -> new MailboxException("Can not retrieve modseq for " + mailboxId));
     }
 
     @Override
-    public ModSeq highestModSeq(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException {
-        return highestModSeq(mailboxSession, mailbox.getMailboxId());
+    public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
+        return highestModSeq(mailbox.getMailboxId());
     }
 
     @Override
-    public ModSeq highestModSeq(MailboxSession mailboxSession, MailboxId mailboxId) throws MailboxException {
+    public ModSeq highestModSeq(MailboxId mailboxId) throws MailboxException {
         return unbox(() -> findHighestModSeq((CassandraId) mailboxId).block().orElse(ModSeq.first()));
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
index cc84fad..8510f27 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
@@ -114,14 +114,12 @@ public class CassandraMapperProvider implements MapperProvider {
 
     @Override
     public ModSeq generateModSeq(Mailbox mailbox) throws MailboxException {
-        MailboxSession mailboxSession = null;
-        return cassandraModSeqProvider.nextModSeq(mailboxSession, mailbox);
+        return cassandraModSeqProvider.nextModSeq(mailbox);
     }
 
     @Override
     public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
-        MailboxSession mailboxSession = null;
-        return cassandraModSeqProvider.highestModSeq(mailboxSession, mailbox);
+        return cassandraModSeqProvider.highestModSeq(mailbox);
     }
 
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
index b0f0af4..55a8088 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
@@ -65,12 +65,12 @@ class CassandraModSeqProviderTest {
     @Test
     void highestModSeqShouldRetrieveValueStoredNextModSeq() throws Exception {
         int nbEntries = 100;
-        ModSeq result = modSeqProvider.highestModSeq(null, mailbox);
+        ModSeq result = modSeqProvider.highestModSeq(mailbox);
         assertThat(result).isEqualTo(0);
         LongStream.range(0, nbEntries)
             .forEach(Throwing.longConsumer(value -> {
-                    ModSeq modSeq = modSeqProvider.nextModSeq(null, mailbox);
-                    assertThat(modSeq).isEqualTo(modSeqProvider.highestModSeq(null, mailbox));
+                    ModSeq modSeq = modSeqProvider.nextModSeq(mailbox);
+                    assertThat(modSeq).isEqualTo(modSeqProvider.highestModSeq(mailbox));
                 })
             );
     }
@@ -78,10 +78,10 @@ class CassandraModSeqProviderTest {
     @Test
     void nextModSeqShouldIncrementValueByOne() throws Exception {
         int nbEntries = 100;
-        ModSeq lastModSeq = modSeqProvider.highestModSeq(null, mailbox);
+        ModSeq lastModSeq = modSeqProvider.highestModSeq(mailbox);
         LongStream.range(lastModSeq.asLong() + 1, lastModSeq.asLong() + nbEntries)
             .forEach(Throwing.longConsumer(value -> {
-                ModSeq result = modSeqProvider.nextModSeq(null, mailbox);
+                ModSeq result = modSeqProvider.nextModSeq(mailbox);
                 assertThat(result.asLong()).isEqualTo(value);
             }));
     }
@@ -93,7 +93,7 @@ class CassandraModSeqProviderTest {
         ConcurrentSkipListSet<ModSeq> modSeqs = new ConcurrentSkipListSet<>();
         ConcurrentTestRunner.builder()
             .operation(
-                (threadNumber, step) -> modSeqs.add(modSeqProvider.nextModSeq(null, mailbox)))
+                (threadNumber, step) -> modSeqs.add(modSeqProvider.nextModSeq(mailbox)))
             .threadCount(10)
             .operationCount(nbEntries)
             .runSuccessfullyWithin(Duration.ofMinutes(1));
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
index ff1a5e2..da24f12 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
@@ -23,7 +23,6 @@ import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceException;
 
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
@@ -42,23 +41,23 @@ public class JPAModSeqProvider implements ModSeqProvider {
     }
 
     @Override
-    public ModSeq highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
         JPAId mailboxId = (JPAId) mailbox.getMailboxId();
         return highestModSeq(mailboxId);
     }
 
     @Override
-    public ModSeq nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq nextModSeq(Mailbox mailbox) throws MailboxException {
         return nextModSeq((JPAId) mailbox.getMailboxId());
     }
 
     @Override
-    public ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq nextModSeq(MailboxId mailboxId) throws MailboxException {
         return nextModSeq((JPAId) mailboxId);
     }
 
     @Override
-    public ModSeq highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq highestModSeq(MailboxId mailboxId) throws MailboxException {
         return highestModSeq((JPAId) mailboxId);
     }
 
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
index 63f2a96..f46efb6 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
@@ -261,12 +261,12 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public ModSeq nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq nextModSeq(Mailbox mailbox) {
         return ModSeq.of(System.currentTimeMillis());
     }
 
     @Override
-    public ModSeq highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
         try {
             return createMaildirFolder(mailbox).getHighestModSeq();
         } catch (IOException e) {
@@ -300,7 +300,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq nextModSeq(MailboxId mailboxId) {
         return ModSeq.of(System.currentTimeMillis());
     }
 
@@ -310,7 +310,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public ModSeq highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq highestModSeq(MailboxId mailboxId) {
         throw new NotImplementedException("Not implemented");
     }
 }
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java
index 08c1007..d4c80a1 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java
@@ -23,9 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.ModSeq;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
@@ -35,23 +33,23 @@ public class InMemoryModSeqProvider implements ModSeqProvider {
     private final ConcurrentMap<InMemoryId, AtomicLong> map = new ConcurrentHashMap<>();
 
     @Override
-    public ModSeq nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq nextModSeq(Mailbox mailbox) {
         return ModSeq.of(nextModSeq((InMemoryId) mailbox.getMailboxId()));
 
     }
 
     @Override
-    public ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq nextModSeq(MailboxId mailboxId) {
         return ModSeq.of(nextModSeq((InMemoryId) mailboxId));
     }
 
     @Override
-    public ModSeq highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(Mailbox mailbox) {
         return ModSeq.of(getHighest((InMemoryId) mailbox.getMailboxId()).get());
     }
 
     @Override
-    public ModSeq highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq highestModSeq(MailboxId mailboxId) {
         return ModSeq.of(getHighest((InMemoryId) mailboxId).get());
     }
 
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
index 99ccba0..8f60b26 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
@@ -115,13 +115,13 @@ public class InMemoryMapperProvider implements MapperProvider {
     @Override
     public ModSeq generateModSeq(Mailbox mailbox) throws MailboxException {
         return inMemoryMailboxSessionMapperFactory.getModSeqProvider()
-                .nextModSeq(MAILBOX_SESSION, mailbox);
+                .nextModSeq(mailbox);
     }
 
     @Override
     public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
         return inMemoryMailboxSessionMapperFactory.getModSeqProvider()
-            .highestModSeq(MAILBOX_SESSION, mailbox);
+            .highestModSeq(mailbox);
     }
 
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index c4a8bd1..a6c19f8 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -396,7 +396,7 @@ public class StoreMessageIdManager implements MessageIdManager {
     }
 
     private void save(MailboxSession mailboxSession, MessageIdMapper messageIdMapper, MailboxMessage mailboxMessage) throws MailboxException {
-        ModSeq modSeq = mailboxSessionMapperFactory.getModSeqProvider().nextModSeq(mailboxSession, mailboxMessage.getMailboxId());
+        ModSeq modSeq = mailboxSessionMapperFactory.getModSeqProvider().nextModSeq(mailboxMessage.getMailboxId());
         MessageUid uid = mailboxSessionMapperFactory.getUidProvider().nextUid(mailboxSession, mailboxMessage.getMailboxId());
         mailboxMessage.setModSeq(modSeq);
         mailboxMessage.setUid(uid);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
index 915be78..ecac854 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
@@ -62,7 +62,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     
     @Override
     public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
-        return modSeqProvider.highestModSeq(mailboxSession, mailbox);
+        return modSeqProvider.highestModSeq(mailbox);
     }
 
     @Override
@@ -87,7 +87,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
         if (!messages.hasNext()) {
             return ImmutableList.<UpdatedFlags>of().iterator();
         }
-        ModSeq modSeq = modSeqProvider.nextModSeq(mailboxSession, mailbox);
+        ModSeq modSeq = modSeqProvider.nextModSeq(mailbox);
         while (messages.hasNext()) {
             final MailboxMessage member = messages.next();
             Flags originalFlags = member.createFlags();
@@ -118,7 +118,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
         
         // if a mailbox does not support mod-sequences the provider may be null
         if (modSeqProvider != null) {
-            message.setModSeq(modSeqProvider.nextModSeq(mailboxSession, mailbox));
+            message.setModSeq(modSeqProvider.nextModSeq(mailbox));
         }
         MessageMetaData data = save(mailbox, message);
        
@@ -130,7 +130,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     @Override
     public MessageMetaData copy(Mailbox mailbox, MailboxMessage original) throws MailboxException {
         MessageUid uid = uidProvider.nextUid(mailboxSession, mailbox);
-        ModSeq modSeq = modSeqProvider.nextModSeq(mailboxSession, mailbox);
+        ModSeq modSeq = modSeqProvider.nextModSeq(mailbox);
         final MessageMetaData metaData = copy(mailbox, uid, modSeq, original);  
         
         return metaData;
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
index b72e314..6d7c0b7 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
@@ -51,7 +51,7 @@ public class MessageUtils {
     }
     
     public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
-        return modSeqProvider.highestModSeq(mailboxSession, mailbox);
+        return modSeqProvider.highestModSeq(mailbox);
     }
 
     public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
@@ -64,7 +64,7 @@ public class MessageUtils {
     }
 
     public ModSeq nextModSeq(Mailbox mailbox) throws MailboxException {
-        return modSeqProvider.nextModSeq(mailboxSession, mailbox);
+        return modSeqProvider.nextModSeq(mailbox);
     }
 
     public void enrichMessage(Mailbox mailbox, MailboxMessage message) throws MailboxException { 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java
index 716e7d1..7c96c74 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.mail;
 
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -37,7 +36,7 @@ public interface ModSeqProvider {
      * 
      * The first mod-seq must be >= 1
      */
-    ModSeq nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException;
+    ModSeq nextModSeq(Mailbox mailbox) throws MailboxException;
 
     /**
      * Return the next mod-sequence which can be used for the {@link Mailbox}.
@@ -46,15 +45,15 @@ public interface ModSeqProvider {
      * 
      * The first mod-seq must be >= 1
      */
-    ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException;
-    
+    ModSeq nextModSeq(MailboxId mailboxId) throws MailboxException;
+
     /**
      * Return the highest mod-sequence which were used for the {@link Mailbox}
      */
-    ModSeq highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException;
-    
+    ModSeq highestModSeq(Mailbox mailbox) throws MailboxException;
+
     /**
      * Return the highest mod-sequence which were used for the {@link Mailbox}
      */
-    ModSeq highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException;
+    ModSeq highestModSeq(MailboxId mailboxId) throws MailboxException;
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
index 0c8d05e..82bd23d 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
@@ -87,13 +87,13 @@ public class MessageUtilsTest {
     @Test
     public void getHighestModSeqShouldCallModSeqProvider() throws Exception {
         messageUtils.getHighestModSeq(mailbox);
-        verify(modSeqProvider).highestModSeq(eq(mailboxSession), eq(mailbox));
+        verify(modSeqProvider).highestModSeq(eq(mailbox));
     }
     
     @Test
     public void nextModSeqShouldCallModSeqProvider() throws Exception {
         messageUtils.nextModSeq(mailbox);
-        verify(modSeqProvider).nextModSeq(eq(mailboxSession), eq(mailbox));
+        verify(modSeqProvider).nextModSeq(eq(mailbox));
     }
     
     @Test
@@ -111,7 +111,7 @@ public class MessageUtilsTest {
     @Test
     public void enrichMesageShouldEnrichUidAndModSeq() throws Exception {
         when(uidProvider.nextUid(eq(mailboxSession), eq(mailbox))).thenReturn(MESSAGE_UID);
-        when(modSeqProvider.nextModSeq(eq(mailboxSession), eq(mailbox))).thenReturn(ModSeq.of(11));
+        when(modSeqProvider.nextModSeq(eq(mailbox))).thenReturn(ModSeq.of(11));
 
         messageUtils.enrichMessage(mailbox, message);
         


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


[james-project] 04/22: JAMES-2987 MessageView interface

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3246bb44993b61a4bc05b5b5a1b7b5faff83b3d4
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Nov 21 09:30:36 2019 +0700

    JAMES-2987 MessageView interface
---
 .../jmap/draft/model/GetMessagesResponse.java      | 16 ++++++-------
 .../draft/model/message/view/MessageFullView.java  |  2 +-
 .../jmap/draft/model/message/view/MessageView.java | 26 ++++++++++++++++++++++
 .../jmap/draft/methods/GetMessagesMethodTest.java  | 23 +++++++++++++++++--
 4 files changed, 56 insertions(+), 11 deletions(-)

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 8300582..14b813f 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
@@ -23,7 +23,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.james.jmap.draft.methods.Method;
-import org.apache.james.jmap.draft.model.message.view.MessageFullView;
+import org.apache.james.jmap.draft.model.message.view.MessageView;
 import org.apache.james.mailbox.model.MessageId;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -42,7 +42,7 @@ public class GetMessagesResponse implements Method.Response {
     
     @JsonPOJOBuilder(withPrefix = "")
     public static class Builder {
-        private ImmutableList<MessageFullView> messages;
+        private ImmutableList<MessageView> messages;
         private List<MessageId> expectedMessageIds;
 
         private Builder() {
@@ -50,12 +50,12 @@ public class GetMessagesResponse implements Method.Response {
         }
 
         @JsonIgnore
-        public Builder message(MessageFullView message) {
+        public Builder message(MessageView message) {
             this.messages = ImmutableList.of(message);
             return this;
         }
 
-        public Builder messages(List<MessageFullView> messages) {
+        public Builder messages(List<MessageView> messages) {
             this.messages = ImmutableList.copyOf(messages);
             return this;
         }
@@ -72,7 +72,7 @@ public class GetMessagesResponse implements Method.Response {
         
 
         private List<MessageId> messagesNotFound() {
-            Set<MessageId> foundMessageIds = messages.stream().map(MessageFullView::getId).collect(Collectors.toSet());
+            Set<MessageId> foundMessageIds = messages.stream().map(MessageView::getId).collect(Collectors.toSet());
             return ImmutableList.copyOf(expectedMessageIds.stream()
                 .filter(id -> !foundMessageIds.contains(id))
                 .collect(Collectors.toList()));
@@ -81,16 +81,16 @@ public class GetMessagesResponse implements Method.Response {
     
     
     
-    private final List<MessageFullView> messages;
+    private final List<MessageView> messages;
     private final List<MessageId> messagesNotFound;
 
-    private GetMessagesResponse(List<MessageFullView> messages, List<MessageId> messagesNotFound) {
+    private GetMessagesResponse(List<MessageView> messages, List<MessageId> messagesNotFound) {
         this.messages = messages;
         this.messagesNotFound = messagesNotFound;
     }
 
     @JsonSerialize
-    public List<MessageFullView> list() {
+    public List<MessageView> list() {
         return messages;
     }
     
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 4ba4386..a84a271 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
@@ -50,7 +50,7 @@ import com.google.common.collect.ImmutableMap;
 
 @JsonDeserialize(builder = MessageFullView.Builder.class)
 @JsonFilter(JmapResponseWriterImpl.PROPERTIES_FILTER)
-public class MessageFullView {
+public class MessageFullView implements MessageView {
 
     public static Builder builder() {
         return new Builder();
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageView.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageView.java
new file mode 100644
index 0000000..53670e4
--- /dev/null
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageView.java
@@ -0,0 +1,26 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import org.apache.james.mailbox.model.MessageId;
+
+public interface MessageView {
+    MessageId getId();
+}
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 90316f9..1f9f8db 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
@@ -176,6 +176,8 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getId, MessageFullView::getSubject, MessageFullView::getTextBody)
             .containsOnly(
                 Tuple.tuple(message1.getMessageId(), "message 1 subject", Optional.of("my message")),
@@ -205,6 +207,8 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getId, MessageFullView::getHtmlBody)
             .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("my <b>HTML</b> message")));
     }
@@ -304,6 +308,8 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getId, MessageFullView::getTextBody, MessageFullView::getHtmlBody)
             .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("my HTML message"), Optional.of("my <b>HTML</b> message")));
     }
@@ -330,6 +336,8 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getId, MessageFullView::getTextBody, MessageFullView::getHtmlBody)
             .containsOnly(Tuple.tuple(message.getMessageId(), Optional.empty(), Optional.of("")));
     }
@@ -362,6 +370,8 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getId, MessageFullView::getTextBody, MessageFullView::getHtmlBody)
             .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("My plain message"), Optional.of("<a>The </a> <strong>HTML</strong> message")));
     }
@@ -456,8 +466,11 @@ public class GetMessagesMethodTest {
         Method.Response response = result.get(0).getResponse();
         assertThat(response).isInstanceOf(GetMessagesResponse.class);
         GetMessagesResponse getMessagesResponse = (GetMessagesResponse) response;
-        assertThat(getMessagesResponse.list()).hasSize(1);
-        assertThat(getMessagesResponse.list().get(0).getMailboxIds()).containsOnly(customMailboxId, message1.getMailboxId());
+        assertThat(getMessagesResponse.list()).hasSize(1)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
+            .flatExtracting(MessageFullView::getMailboxIds)
+            .containsOnly(customMailboxId, message1.getMailboxId());
     }
 
     @Test
@@ -529,6 +542,8 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
                     ImmutableList.of(
@@ -586,6 +601,8 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
                     ImmutableList.of(
@@ -626,6 +643,8 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
+            .hasOnlyElementsOfType(MessageFullView.class)
+            .extracting(MessageFullView.class::cast)
             .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
                     ImmutableList.of(


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


[james-project] 07/22: JAMES-2987 MessageViewFactory -> MessageFullViewFactory

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6284bd374e32c7a4670ef398cc7ca4309dd6d6f9
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Nov 21 11:06:46 2019 +0700

    JAMES-2987 MessageViewFactory -> MessageFullViewFactory
---
 .../apache/james/jmap/draft/JMAPCommonModule.java  |  4 +-
 .../jmap/draft/methods/GetMessagesMethod.java      | 12 ++---
 .../jmap/draft/methods/MIMEMessageConverter.java   |  4 +-
 .../james/jmap/draft/methods/MessageAppender.java  | 28 +++++------
 .../james/jmap/draft/methods/MessageSender.java    |  6 +--
 .../james/jmap/draft/methods/SendMDNProcessor.java |  4 +-
 .../methods/SetMessagesCreationProcessor.java      | 14 +++---
 ...iewFactory.java => MessageFullViewFactory.java} |  6 +--
 .../jmap/draft/methods/GetMessagesMethodTest.java  | 10 ++--
 .../jmap/draft/methods/MessageSenderTest.java      | 12 ++---
 .../methods/SetMessagesCreationProcessorTest.java  | 12 ++---
 ...ryTest.java => MessageFullViewFactoryTest.java} | 58 +++++++++++-----------
 12 files changed, 85 insertions(+), 85 deletions(-)

diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
index 2e061e8..3bf46e5 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
@@ -35,7 +35,7 @@ import org.apache.james.jmap.draft.crypto.SignedTokenFactory;
 import org.apache.james.jmap.draft.crypto.SignedTokenManager;
 import org.apache.james.jmap.draft.model.MailboxFactory;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.jmap.draft.utils.HeadersAuthenticationExtractor;
 import org.apache.james.lifecycle.api.StartUpCheck;
@@ -68,7 +68,7 @@ public class JMAPCommonModule extends AbstractModule {
         bind(MailSpool.class).in(Scopes.SINGLETON);
         bind(AutomaticallySentMailDetectorImpl.class).in(Scopes.SINGLETON);
         bind(MailboxFactory.class).in(Scopes.SINGLETON);
-        bind(MessageViewFactory.class).in(Scopes.SINGLETON);
+        bind(MessageFullViewFactory.class).in(Scopes.SINGLETON);
         bind(MessagePreviewGenerator.class).in(Scopes.SINGLETON);
         bind(MessageContentExtractor.class).in(Scopes.SINGLETON);
         bind(HeadersAuthenticationExtractor.class).in(Scopes.SINGLETON);
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 6ac3f13..3790fae 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
@@ -34,7 +34,7 @@ import org.apache.james.jmap.draft.model.MessageProperties;
 import org.apache.james.jmap.draft.model.MessageProperties.HeaderProperty;
 import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.model.message.view.MessageFullView;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -59,16 +59,16 @@ public class GetMessagesMethod implements Method {
     private static final Logger LOGGER = LoggerFactory.getLogger(GetMessagesMethod.class);
     private static final Method.Request.Name METHOD_NAME = Method.Request.name("getMessages");
     private static final Method.Response.Name RESPONSE_NAME = Method.Response.name("messages");
-    private final MessageViewFactory messageViewFactory;
+    private final MessageFullViewFactory messageFullViewFactory;
     private final MessageIdManager messageIdManager;
     private final MetricFactory metricFactory;
 
     @Inject
     @VisibleForTesting GetMessagesMethod(
-            MessageViewFactory messageViewFactory,
+            MessageFullViewFactory messageFullViewFactory,
             MessageIdManager messageIdManager,
             MetricFactory metricFactory) {
-        this.messageViewFactory = messageViewFactory;
+        this.messageFullViewFactory = messageFullViewFactory;
         this.messageIdManager = messageIdManager;
         this.metricFactory = metricFactory;
     }
@@ -144,9 +144,9 @@ public class GetMessagesMethod implements Method {
     private Function<Collection<MessageResult>, Stream<MessageFullView>> toMessageViews() {
         return messageResults -> {
             try {
-                return Stream.of(messageViewFactory.fromMessageResults(messageResults));
+                return Stream.of(messageFullViewFactory.fromMessageResults(messageResults));
             } catch (Exception e) {
-                LOGGER.error("Can not convert metaData with content to Message for {}", messageResults.iterator().next().getMessageId().serialize(), e);
+                LOGGER.error("Can not convert MessageResults to Message for {}", messageResults.iterator().next().getMessageId().serialize(), e);
                 return Stream.of();
             }
         };
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
index eac8c13..c9e3dcd 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
 
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.codec.EncoderUtil;
@@ -176,7 +176,7 @@ public class MIMEMessageConverter {
     }
 
     private void addMultivaluedHeader(Message.Builder messageBuilder, String fieldName, String multipleValues) {
-        Splitter.on(MessageViewFactory.JMAP_MULTIVALUED_FIELD_DELIMITER).split(multipleValues)
+        Splitter.on(MessageFullViewFactory.JMAP_MULTIVALUED_FIELD_DELIMITER).split(multipleValues)
             .forEach(value -> addHeader(messageBuilder, fieldName, value));
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
index e662809..3da0fdf 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
@@ -32,7 +32,7 @@ import org.apache.james.jmap.draft.methods.ValueWithId.CreationMessageEntry;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -73,9 +73,9 @@ public class MessageAppender {
         this.mimeMessageConverter = mimeMessageConverter;
     }
 
-    public MessageViewFactory.MetaDataWithContent appendMessageInMailboxes(CreationMessageEntry createdEntry,
-                                                                           List<MailboxId> targetMailboxes,
-                                                                           MailboxSession session) throws MailboxException {
+    public MessageFullViewFactory.MetaDataWithContent appendMessageInMailboxes(CreationMessageEntry createdEntry,
+                                                                               List<MailboxId> targetMailboxes,
+                                                                               MailboxSession session) throws MailboxException {
         Preconditions.checkArgument(!targetMailboxes.isEmpty());
         ImmutableList<MessageAttachment> messageAttachments = getMessageAttachments(session, createdEntry.getValue().getAttachments());
         byte[] messageContent = mimeMessageConverter.convert(createdEntry, messageAttachments);
@@ -94,7 +94,7 @@ public class MessageAppender {
             messageIdManager.setInMailboxes(message.getMessageId(), targetMailboxes, session);
         }
 
-        return MessageViewFactory.MetaDataWithContent.builder()
+        return MessageFullViewFactory.MetaDataWithContent.builder()
             .uid(message.getUid())
             .keywords(createdEntry.getValue().getKeywords())
             .internalDate(internalDate.toInstant())
@@ -106,11 +106,11 @@ public class MessageAppender {
             .build();
     }
 
-    public MessageViewFactory.MetaDataWithContent appendMessageInMailbox(org.apache.james.mime4j.dom.Message message,
-                                                                         MessageManager messageManager,
-                                                                         List<MessageAttachment> attachments,
-                                                                         Flags flags,
-                                                                         MailboxSession session) throws MailboxException {
+    public MessageFullViewFactory.MetaDataWithContent appendMessageInMailbox(org.apache.james.mime4j.dom.Message message,
+                                                                             MessageManager messageManager,
+                                                                             List<MessageAttachment> attachments,
+                                                                             Flags flags,
+                                                                             MailboxSession session) throws MailboxException {
 
 
         byte[] messageContent = asBytes(message);
@@ -121,7 +121,7 @@ public class MessageAppender {
             .withFlags(flags)
             .build(content), session);
 
-        return MessageViewFactory.MetaDataWithContent.builder()
+        return MessageFullViewFactory.MetaDataWithContent.builder()
             .uid(appendedMessage.getUid())
             .keywords(Keywords.lenientFactory().fromFlags(flags))
             .internalDate(internalDate.toInstant())
@@ -141,9 +141,9 @@ public class MessageAppender {
         }
     }
 
-    public MessageViewFactory.MetaDataWithContent appendMessageInMailbox(CreationMessageEntry createdEntry,
-                                                                         MailboxId targetMailbox,
-                                                                         MailboxSession session) throws MailboxException {
+    public MessageFullViewFactory.MetaDataWithContent appendMessageInMailbox(CreationMessageEntry createdEntry,
+                                                                             MailboxId targetMailbox,
+                                                                             MailboxSession session) throws MailboxException {
         return appendMessageInMailboxes(createdEntry, ImmutableList.of(targetMailbox), session);
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
index a922ecb..9daa03c 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
@@ -25,7 +25,7 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.jmap.draft.send.MailMetadata;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.lifecycle.api.LifecycleUtil;
@@ -48,7 +48,7 @@ public class MessageSender {
         this.mailSpool = mailSpool;
     }
 
-    public void sendMessage(MessageViewFactory.MetaDataWithContent message,
+    public void sendMessage(MessageFullViewFactory.MetaDataWithContent message,
                             Envelope envelope,
                             MailboxSession session) throws MessagingException {
         Mail mail = buildMail(message, envelope);
@@ -60,7 +60,7 @@ public class MessageSender {
     }
 
     @VisibleForTesting
-    static Mail buildMail(MessageViewFactory.MetaDataWithContent message, Envelope envelope) throws MessagingException {
+    static Mail buildMail(MessageFullViewFactory.MetaDataWithContent message, Envelope envelope) throws MessagingException {
         String name = message.getMessageId().serialize();
         return MailImpl.builder()
             .name(name)
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
index 4f60780..45c2f1d 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
@@ -35,7 +35,7 @@ import org.apache.james.jmap.draft.model.JmapMDN;
 import org.apache.james.jmap.draft.model.SetError;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
@@ -151,7 +151,7 @@ public class SendMDNProcessor implements SetMessagesProcessor {
         Message mdnAnswer = mdn.generateMDNMessage(originalMessage, mailboxSession);
 
         Flags seen = new Flags(Flags.Flag.SEEN);
-        MessageViewFactory.MetaDataWithContent metaDataWithContent = messageAppender.appendMessageInMailbox(mdnAnswer,
+        MessageFullViewFactory.MetaDataWithContent metaDataWithContent = messageAppender.appendMessageInMailbox(mdnAnswer,
             getOutbox(mailboxSession), reportAsAttachment, seen, mailboxSession);
 
         messageSender.sendMessage(metaDataWithContent,
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
index c30df23..aa99deb 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
@@ -48,8 +48,8 @@ import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
 import org.apache.james.jmap.draft.model.SetMessagesResponse.Builder;
 import org.apache.james.jmap.draft.model.message.view.MessageFullView;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory.MetaDataWithContent;
+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.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -76,7 +76,7 @@ import com.google.common.collect.ImmutableList;
 public class SetMessagesCreationProcessor implements SetMessagesProcessor {
 
     private static final Logger LOG = LoggerFactory.getLogger(SetMailboxesCreationProcessor.class);
-    private final MessageViewFactory messageViewFactory;
+    private final MessageFullViewFactory messageFullViewFactory;
     private final SystemMailboxesProvider systemMailboxesProvider;
     private final AttachmentChecker attachmentChecker;
     private final MetricFactory metricFactory;
@@ -88,7 +88,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
     
     @VisibleForTesting
     @Inject
-    SetMessagesCreationProcessor(MessageViewFactory messageViewFactory,
+    SetMessagesCreationProcessor(MessageFullViewFactory messageFullViewFactory,
                                  SystemMailboxesProvider systemMailboxesProvider,
                                  AttachmentChecker attachmentChecker,
                                  MetricFactory metricFactory,
@@ -97,7 +97,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
                                  MessageAppender messageAppender,
                                  MessageSender messageSender,
                                  ReferenceUpdater referenceUpdater) {
-        this.messageViewFactory = messageViewFactory;
+        this.messageFullViewFactory = messageFullViewFactory;
         this.systemMailboxesProvider = systemMailboxesProvider;
         this.attachmentChecker = attachmentChecker;
         this.metricFactory = metricFactory;
@@ -276,7 +276,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
     private MessageWithId handleOutboxMessages(CreationMessageEntry entry, MailboxSession session) throws MailboxException, MessagingException {
         assertUserIsSender(session, entry.getValue().getFrom());
         MetaDataWithContent newMessage = messageAppender.appendMessageInMailboxes(entry, toMailboxIds(entry), session);
-        MessageFullView jmapMessage = messageViewFactory.fromMetaDataWithContent(newMessage);
+        MessageFullView jmapMessage = messageFullViewFactory.fromMetaDataWithContent(newMessage);
         Envelope envelope = EnvelopeUtils.fromMessage(jmapMessage);
         messageSender.sendMessage(newMessage, envelope, session);
         referenceUpdater.updateReferences(entry.getValue().getHeaders(), session);
@@ -294,7 +294,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
 
     private MessageWithId handleDraftMessages(CreationMessageEntry entry, MailboxSession session) throws MailboxException, MessagingException {
         MetaDataWithContent newMessage = messageAppender.appendMessageInMailboxes(entry, toMailboxIds(entry), session);
-        MessageFullView jmapMessage = messageViewFactory.fromMetaDataWithContent(newMessage);
+        MessageFullView jmapMessage = messageFullViewFactory.fromMetaDataWithContent(newMessage);
         return new ValueWithId.MessageWithId(entry.getCreationId(), jmapMessage);
     }
     
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/MessageFullViewFactory.java
similarity index 98%
rename from server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
rename to server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactory.java
index 90ca232..2f7d15b 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/MessageFullViewFactory.java
@@ -66,7 +66,7 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
 
-public class MessageViewFactory {
+public class MessageFullViewFactory {
     public static final String JMAP_MULTIVALUED_FIELD_DELIMITER = "\n";
 
     private static final KeywordsCombiner ACCUMULATOR = new KeywordsCombiner();
@@ -78,8 +78,8 @@ public class MessageViewFactory {
     private final Keywords.KeywordsFactory keywordsFactory;
 
     @Inject
-    public MessageViewFactory(BlobManager blobManager, MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor,
-                              HtmlTextExtractor htmlTextExtractor) {
+    public MessageFullViewFactory(BlobManager blobManager, MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor,
+                                  HtmlTextExtractor htmlTextExtractor) {
         this.blobManager = blobManager;
         this.messagePreview = messagePreview;
         this.messageContentExtractor = messageContentExtractor;
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 3cb8ec3..6fa5adb 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
@@ -44,7 +44,7 @@ import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.model.MessageProperties.MessageProperty;
 import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.model.message.view.MessageFullView;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
@@ -96,7 +96,7 @@ public class GetMessagesMethodTest {
     private MailboxPath inboxPath;
     private MailboxPath customMailboxPath;
     private MethodCallId methodCallId;
-    private MessageViewFactory messageViewFactory;
+    private MessageFullViewFactory messageFullViewFactory;
 
     @Before
     public void setup() throws Exception {
@@ -106,7 +106,7 @@ public class GetMessagesMethodTest {
         MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake"));
-        messageViewFactory = spy(new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor));
+        messageFullViewFactory = spy(new MessageFullViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor));
         InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
         mailboxManager = resources.getMailboxManager();
 
@@ -116,7 +116,7 @@ public class GetMessagesMethodTest {
         mailboxManager.createMailbox(inboxPath, session);
         mailboxManager.createMailbox(customMailboxPath, session);
         messageIdManager = resources.getMessageIdManager();
-        testee = new GetMessagesMethod(messageViewFactory, messageIdManager, new DefaultMetricFactory());
+        testee = new GetMessagesMethod(messageFullViewFactory, messageIdManager, new DefaultMetricFactory());
 
         messageContent1 = org.apache.james.mime4j.dom.Message.Builder.of()
             .setSubject("message 1 subject")
@@ -493,7 +493,7 @@ public class GetMessagesMethodTest {
 
         doCallRealMethod()
             .doThrow(new RuntimeException())
-            .when(messageViewFactory)
+            .when(messageFullViewFactory)
             .fromMessageResults(any());
 
         GetMessagesRequest request = GetMessagesRequest.builder()
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 388de80..0a03271 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
@@ -38,7 +38,7 @@ import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.model.message.view.MessageFullView;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
@@ -59,7 +59,7 @@ import com.google.common.collect.ImmutableSet;
 class MessageSenderTest {
 
     private Envelope envelope;
-    private MessageViewFactory.MetaDataWithContent message;
+    private MessageFullViewFactory.MetaDataWithContent message;
     private MessageFullView jmapMessage;
 
     @BeforeEach
@@ -72,7 +72,7 @@ class MessageSenderTest {
         String content = headers
             + "Hello! How are you?";
 
-        message = MessageViewFactory.MetaDataWithContent.builder()
+        message = MessageFullViewFactory.MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
             .keywords(Keywords.strictFactory().from(Keyword.SEEN))
             .size(content.length())
@@ -90,14 +90,14 @@ class MessageSenderTest {
         MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake"));
-        MessageViewFactory messageViewFactory = new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
-        jmapMessage = messageViewFactory.fromMetaDataWithContent(message);
+        MessageFullViewFactory messageFullViewFactory = new MessageFullViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        jmapMessage = messageFullViewFactory.fromMetaDataWithContent(message);
         envelope = EnvelopeUtils.fromMessage(jmapMessage);
     }
 
     @Test
     void buildMailShouldThrowWhenNullMailboxMessage() throws Exception {
-        MessageViewFactory.MetaDataWithContent message = null;
+        MessageFullViewFactory.MetaDataWithContent message = null;
         assertThatThrownBy(() -> MessageSender.buildMail(message, envelope)).isInstanceOf(NullPointerException.class);
     }
 
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java
index 624e118..7ffd423 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
@@ -40,7 +40,7 @@ import org.apache.james.jmap.draft.model.CreationMessageId;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
 import org.apache.james.jmap.draft.send.MailMetadata;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
@@ -100,7 +100,7 @@ public class SetMessagesCreationProcessorTest {
                         .build())
             .build();
 
-    private MessageViewFactory messageViewFactory;
+    private MessageFullViewFactory messageFullViewFactory;
     private MailSpool mockedMailSpool;
     private SystemMailboxesProvider fakeSystemMailboxesProvider;
     private MailboxSession session;
@@ -127,7 +127,7 @@ public class SetMessagesCreationProcessorTest {
         when(messagePreview.compute(any())).thenReturn("text preview");
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(org.apache.james.mailbox.model.BlobId.fromString("fake"));
-        messageViewFactory = new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        messageFullViewFactory = new MessageFullViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
         mockedMailSpool = mock(MailSpool.class);
         mockedAttachmentManager = mock(AttachmentManager.class);
         mockedMailboxManager = mock(MailboxManager.class);
@@ -140,7 +140,7 @@ public class SetMessagesCreationProcessorTest {
         messageAppender = new MessageAppender(mockedMailboxManager, mockMessageIdManager, mockedAttachmentManager, mimeMessageConverter);
         messageSender = new MessageSender(mockedMailSpool);
         referenceUpdater = new ReferenceUpdater(mockMessageIdManager, mockedMailboxManager);
-        sut = new SetMessagesCreationProcessor(messageViewFactory,
+        sut = new SetMessagesCreationProcessor(messageFullViewFactory,
             fakeSystemMailboxesProvider,
             new AttachmentChecker(mockedAttachmentManager),
             new NoopMetricFactory(),
@@ -232,7 +232,7 @@ public class SetMessagesCreationProcessorTest {
     @Test
     public void processShouldReturnNonEmptyCreatedWhenRequestHasNonEmptyCreate() throws MailboxException {
         // Given
-        sut = new SetMessagesCreationProcessor(messageViewFactory, fakeSystemMailboxesProvider, new AttachmentChecker(mockedAttachmentManager), new NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory, messageAppender, messageSender, referenceUpdater);
+        sut = new SetMessagesCreationProcessor(messageFullViewFactory, fakeSystemMailboxesProvider, new AttachmentChecker(mockedAttachmentManager), new NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory, messageAppender, messageSender, referenceUpdater);
 
         // When
         SetMessagesResponse result = sut.process(createMessageInOutbox, session);
@@ -247,7 +247,7 @@ public class SetMessagesCreationProcessorTest {
     public void processShouldReturnErrorWhenOutboxNotFound() {
         // Given
         TestSystemMailboxesProvider doNotProvideOutbox = new TestSystemMailboxesProvider(Optional::empty, () -> optionalDrafts);
-        SetMessagesCreationProcessor sut = new SetMessagesCreationProcessor(messageViewFactory, doNotProvideOutbox,
+        SetMessagesCreationProcessor sut = new SetMessagesCreationProcessor(messageFullViewFactory, doNotProvideOutbox,
             new AttachmentChecker(mockedAttachmentManager), new NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory,
             messageAppender,
             messageSender,
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
similarity index 92%
rename from server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactoryTest.java
rename to server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
index 7566276..97b4fa8 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
@@ -36,7 +36,7 @@ import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.model.Number;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory.MetaDataWithContent;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
@@ -54,12 +54,12 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class MessageViewFactoryTest {
+public class MessageFullViewFactoryTest {
     private static final String FORWARDED = "forwarded";
     private static final InMemoryId MAILBOX_ID = InMemoryId.of(18L);
     private static final Instant INTERNAL_DATE = Instant.parse("2012-02-03T14:30:42Z");
 
-    private MessageViewFactory messageViewFactory;
+    private MessageFullViewFactory messageFullViewFactory;
 
     @Before
     public void setUp() {
@@ -70,7 +70,7 @@ public class MessageViewFactoryTest {
 
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(org.apache.james.mailbox.model.BlobId.fromString("blobId"));
-        messageViewFactory = new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        messageFullViewFactory = new MessageFullViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
     }
 
     @Test
@@ -86,7 +86,7 @@ public class MessageViewFactoryTest {
                 .messageId(TestMessageId.of(2))
                 .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee)
             .extracting(MessageFullView::getPreview, MessageFullView::getSize, MessageFullView::getSubject, MessageFullView::getHeaders, MessageFullView::getDate)
             .containsExactly("(Empty)", Number.ZERO, "", ImmutableMap.of("MIME-Version", "1.0"), INTERNAL_DATE);
@@ -104,7 +104,7 @@ public class MessageViewFactoryTest {
                 .mailboxId(MAILBOX_ID)
                 .messageId(TestMessageId.of(2))
                 .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee)
             .extracting(MessageFullView::isIsUnread, MessageFullView::isIsFlagged, MessageFullView::isIsAnswered, MessageFullView::isIsDraft, MessageFullView::isIsForwarded)
             .containsExactly(true, true, true, true, true);
@@ -152,7 +152,7 @@ public class MessageViewFactoryTest {
                 .put("MIME-Version", "1.0")
                 .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         MessageFullView expected = MessageFullView.builder()
                 .id(TestMessageId.of(2))
                 .blobId(BlobId.of("blobId"))
@@ -206,7 +206,7 @@ public class MessageViewFactoryTest {
             .put("To", "user1 <us...@domain>, user2 <us...@domain>")
             .put("MIME-Version", "1.0")
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         MessageFullView expected = MessageFullView.builder()
             .id(TestMessageId.of(2))
             .blobId(BlobId.of("blobId"))
@@ -256,7 +256,7 @@ public class MessageViewFactoryTest {
             .put("To", "user1 <us...@domain>")
             .put("MIME-Version", "1.0")
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         MessageFullView expected = MessageFullView.builder()
             .id(TestMessageId.of(2))
             .blobId(BlobId.of("blobId"))
@@ -293,7 +293,7 @@ public class MessageViewFactoryTest {
                 .mailboxId(MAILBOX_ID)
                 .messageId(TestMessageId.of(2))
                 .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getTextBody()).hasValue("Mail body");
     }
 
@@ -326,7 +326,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getTextBody())
             .isPresent()
@@ -355,7 +355,7 @@ public class MessageViewFactoryTest {
                 .mailboxId(MAILBOX_ID)
                 .messageId(TestMessageId.of(2))
                 .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getPreview()).isEqualTo(expectedPreview);
     }
     
@@ -371,7 +371,7 @@ public class MessageViewFactoryTest {
                 .mailboxId(MAILBOX_ID)
                 .messageId(TestMessageId.of(2))
                 .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getAttachments()).isEmpty();
     }
     
@@ -406,7 +406,7 @@ public class MessageViewFactoryTest {
                 .messageId(TestMessageId.of(2))
                 .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getAttachments()).hasSize(1);
         assertThat(testee.getAttachments().get(0)).isEqualToComparingFieldByField(expectedAttachment);
@@ -430,7 +430,7 @@ public class MessageViewFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         Emailer user = Emailer.builder().name("user").email("userdomain").allowInvalid().build();
         Emailer user1 = Emailer.builder().name("user1").email("user1domain").allowInvalid().build();
@@ -459,7 +459,7 @@ public class MessageViewFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getFrom()).isEmpty();
     }
@@ -484,7 +484,7 @@ public class MessageViewFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getDate())
             .isEqualTo(Instant.parse("2017-05-17T11:18:52.000Z"));
@@ -510,7 +510,7 @@ public class MessageViewFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getDate())
             .isEqualTo(Instant.parse("2017-05-17T11:18:52.000Z"));
@@ -535,7 +535,7 @@ public class MessageViewFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getDate()).isEqualTo(INTERNAL_DATE);
     }
@@ -553,7 +553,7 @@ public class MessageViewFactoryTest {
                 .messageId(TestMessageId.of(2))
                 .build();
 
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee)
             .extracting(MessageFullView::getPreview, MessageFullView::getSize, MessageFullView::getSubject, MessageFullView::getHeaders, MessageFullView::getDate)
             .containsExactly("(Empty)", Number.fromLong(1010L), "", ImmutableMap.of("MIME-Version", "1.0"), INTERNAL_DATE);
@@ -575,7 +575,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getPreview()).isEqualTo("my HTML message");
         assertThat(testee.getTextBody()).hasValue("my HTML message");
@@ -596,7 +596,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getPreview()).isEqualTo(MessagePreviewGenerator.NO_BODY);
         assertThat(testee.getHtmlBody()).contains("");
@@ -628,7 +628,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getPreview()).isEqualTo(expected);
     }
@@ -650,7 +650,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getPreview()).isEqualTo("My plain text");
     }
@@ -669,7 +669,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee)
             .extracting(MessageFullView::getPreview, MessageFullView::getHtmlBody, MessageFullView::getTextBody)
@@ -693,7 +693,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee)
             .extracting(MessageFullView::getPreview, MessageFullView::getHtmlBody, MessageFullView::getTextBody)
@@ -729,7 +729,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee)
             .extracting(MessageFullView::getPreview, MessageFullView::getHtmlBody, MessageFullView::getTextBody)
@@ -750,7 +750,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getKeywords()).containsAllEntriesOf(keywords.asMap());
     }
 
@@ -768,7 +768,7 @@ public class MessageViewFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getKeywords()).containsAllEntriesOf(keywords.asMap());
     }
 }


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


[james-project] 02/22: JAMES-2987 Move message view models to a dedicated package

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit eed6d6a7c1b2d1ebfd0f497b6a809022e3dc8c49
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Nov 21 09:21:34 2019 +0700

    JAMES-2987 Move message view models to a dedicated package
---
 .../java/org/apache/james/jmap/draft/JMAPCommonModule.java    |  2 +-
 .../apache/james/jmap/draft/methods/GetMessagesMethod.java    |  6 +++---
 .../apache/james/jmap/draft/methods/MIMEMessageConverter.java |  2 +-
 .../org/apache/james/jmap/draft/methods/MessageAppender.java  |  2 +-
 .../org/apache/james/jmap/draft/methods/MessageSender.java    |  2 +-
 .../org/apache/james/jmap/draft/methods/SendMDNProcessor.java |  2 +-
 .../jmap/draft/methods/SetMessagesCreationProcessor.java      |  6 +++---
 .../java/org/apache/james/jmap/draft/methods/ValueWithId.java |  2 +-
 .../org/apache/james/jmap/draft/model/CreationMessage.java    |  1 +
 .../java/org/apache/james/jmap/draft/model/EnvelopeUtils.java |  1 +
 .../apache/james/jmap/draft/model/GetMessagesResponse.java    |  1 +
 .../apache/james/jmap/draft/model/SetMessagesResponse.java    |  1 +
 .../jmap/draft/model/{ => message/view}/MessageFullView.java  |  8 +++++++-
 .../draft/model/{ => message/view}/MessageViewFactory.java    |  7 ++++++-
 .../james/jmap/draft/model/{ => message/view}/SubMessage.java |  6 +++++-
 .../apache/james/jmap/draft/json/ParsingWritingObjects.java   |  4 ++--
 .../james/jmap/draft/json/ParsingWritingObjectsTest.java      |  2 +-
 .../james/jmap/draft/methods/GetMessagesMethodTest.java       |  4 ++--
 .../apache/james/jmap/draft/methods/MessageSenderTest.java    |  4 ++--
 .../jmap/draft/methods/SetMessagesCreationProcessorTest.java  |  2 +-
 .../james/jmap/draft/model/SetMessagesResponseTest.java       |  1 +
 .../draft/model/{ => message/view}/MessageFullViewTest.java   |  8 +++++++-
 .../model/{ => message/view}/MessageViewFactoryTest.java      | 11 +++++++++--
 .../draft/model/{ => message/view}/SubMailboxMessageTest.java |  5 ++++-
 24 files changed, 63 insertions(+), 27 deletions(-)

diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
index 275a17f..2e061e8 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
@@ -35,7 +35,7 @@ import org.apache.james.jmap.draft.crypto.SignedTokenFactory;
 import org.apache.james.jmap.draft.crypto.SignedTokenManager;
 import org.apache.james.jmap.draft.model.MailboxFactory;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.jmap.draft.utils.HeadersAuthenticationExtractor;
 import org.apache.james.lifecycle.api.StartUpCheck;
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 32ec8bb..cc0508a 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
@@ -32,12 +32,12 @@ import org.apache.james.jmap.draft.json.FieldNamePropertyFilter;
 import org.apache.james.jmap.draft.model.GetMessagesRequest;
 import org.apache.james.jmap.draft.model.GetMessagesResponse;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.MessageProperties;
 import org.apache.james.jmap.draft.model.MessageProperties.HeaderProperty;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
-import org.apache.james.jmap.draft.model.MessageViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.model.MethodCallId;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.utils.KeywordsCombiner;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
index 14f8a28..eac8c13 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
 
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.codec.EncoderUtil;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
index 164029d..e662809 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
@@ -32,7 +32,7 @@ import org.apache.james.jmap.draft.methods.ValueWithId.CreationMessageEntry;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
index 7ec6164..a922ecb 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
@@ -25,7 +25,7 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.jmap.draft.model.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.jmap.draft.send.MailMetadata;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.lifecycle.api.LifecycleUtil;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
index 241f8f9..4f60780 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
@@ -32,10 +32,10 @@ import javax.mail.MessagingException;
 import org.apache.james.jmap.draft.exceptions.InvalidOriginMessageForMDNException;
 import org.apache.james.jmap.draft.exceptions.MessageNotFoundException;
 import org.apache.james.jmap.draft.model.JmapMDN;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.jmap.draft.model.SetError;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
index 99da72f..c30df23 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
@@ -40,16 +40,16 @@ import org.apache.james.jmap.draft.methods.ValueWithId.MessageWithId;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.draft.model.EnvelopeUtils;
-import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.MessageProperties;
 import org.apache.james.jmap.draft.model.MessageProperties.MessageProperty;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
-import org.apache.james.jmap.draft.model.MessageViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.model.SetError;
 import org.apache.james.jmap.draft.model.SetMessagesError;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
 import org.apache.james.jmap.draft.model.SetMessagesResponse.Builder;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory.MetaDataWithContent;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ValueWithId.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ValueWithId.java
index cc89d1f..c5037a4 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ValueWithId.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ValueWithId.java
@@ -22,8 +22,8 @@ package org.apache.james.jmap.draft.methods;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessageId;
 import org.apache.james.jmap.draft.model.JmapMDN;
-import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.SetError;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
 
 import com.google.common.base.MoreObjects;
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/CreationMessage.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/CreationMessage.java
index aa1b410..d50b3a6 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/CreationMessage.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/CreationMessage.java
@@ -33,6 +33,7 @@ import javax.mail.internet.InternetAddress;
 
 import org.apache.james.jmap.draft.methods.ValidationResult;
 import org.apache.james.jmap.draft.model.MessageProperties.MessageProperty;
+import org.apache.james.jmap.draft.model.message.view.SubMessage;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.util.OptionalUtils;
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/EnvelopeUtils.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/EnvelopeUtils.java
index 69cb4f4..004cf39 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/EnvelopeUtils.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/EnvelopeUtils.java
@@ -24,6 +24,7 @@ import java.util.stream.Stream;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.MaybeSender;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
 import org.apache.james.server.core.Envelope;
 import org.apache.james.util.StreamUtils;
 
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 1af0eb8..8300582 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
@@ -23,6 +23,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 import org.apache.james.jmap.draft.methods.Method;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
 import org.apache.james.mailbox.model.MessageId;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SetMessagesResponse.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SetMessagesResponse.java
index d9682d5..58d2ab7 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SetMessagesResponse.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SetMessagesResponse.java
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.jmap.draft.methods.Method;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
 import org.apache.james.mailbox.model.MessageId;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFullView.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullView.java
similarity index 97%
rename from server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFullView.java
rename to server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullView.java
index f6576cf..4ba4386 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFullView.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFullView.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jmap.draft.model;
+package org.apache.james.jmap.draft.model.message.view;
 
 import java.time.Instant;
 import java.util.Arrays;
@@ -29,6 +29,12 @@ import java.util.function.Predicate;
 
 import org.apache.james.jmap.draft.methods.GetMessagesMethod;
 import org.apache.james.jmap.draft.methods.JmapResponseWriterImpl;
+import org.apache.james.jmap.draft.model.Attachment;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Emailer;
+import org.apache.james.jmap.draft.model.Keyword;
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
similarity index 97%
rename from server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageViewFactory.java
rename to server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
index 4428c9f..e250298 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.jmap.draft.model;
+package org.apache.james.jmap.draft.model.message.view;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -34,6 +34,11 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 import javax.mail.internet.SharedInputStream;
 
+import org.apache.james.jmap.draft.model.Attachment;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Emailer;
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SubMessage.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/SubMessage.java
similarity index 97%
rename from server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SubMessage.java
rename to server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/SubMessage.java
index 1394c82..6854a09 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SubMessage.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/SubMessage.java
@@ -17,13 +17,17 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.jmap.draft.model;
+package org.apache.james.jmap.draft.model.message.view;
 
 import java.time.Instant;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+import org.apache.james.jmap.draft.model.Attachment;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Emailer;
+
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjects.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjects.java
index d749817..5baa6b4 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjects.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjects.java
@@ -28,8 +28,8 @@ import org.apache.james.jmap.draft.model.BlobId;
 import org.apache.james.jmap.draft.model.Emailer;
 import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.MessageFullView;
-import org.apache.james.jmap.draft.model.SubMessage;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
+import org.apache.james.jmap.draft.model.message.view.SubMessage;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.MailboxId;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjectsTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjectsTest.java
index aa68c7b..549fd26 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjectsTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjectsTest.java
@@ -30,7 +30,7 @@ import java.nio.charset.StandardCharsets;
 import org.apache.commons.io.IOUtils;
 import org.apache.james.jmap.draft.methods.GetMessagesMethod;
 import org.apache.james.jmap.draft.methods.JmapResponseWriterImpl;
-import org.apache.james.jmap.draft.model.SubMessage;
+import org.apache.james.jmap.draft.model.message.view.SubMessage;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.junit.Before;
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 bedf3a1..90316f9 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
@@ -38,11 +38,11 @@ import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.model.GetMessagesRequest;
 import org.apache.james.jmap.draft.model.GetMessagesResponse;
-import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.model.MessageProperties.MessageProperty;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.jmap.draft.model.MethodCallId;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
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 ee34861..388de80 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
@@ -36,9 +36,9 @@ import org.apache.james.core.MaybeSender;
 import org.apache.james.jmap.draft.model.EnvelopeUtils;
 import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
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 dc9e738..624e118 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
@@ -38,9 +38,9 @@ import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.draft.model.CreationMessageId;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
-import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
 import org.apache.james.jmap.draft.send.MailMetadata;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SetMessagesResponseTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SetMessagesResponseTest.java
index aabc4ac..9b89f94 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SetMessagesResponseTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SetMessagesResponseTest.java
@@ -25,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import java.time.Instant;
 
 import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.jmap.draft.model.message.view.MessageFullView;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestMessageId;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFullViewTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewTest.java
similarity index 97%
rename from server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFullViewTest.java
rename to server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewTest.java
index 3998824..a69a8d8 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFullViewTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewTest.java
@@ -16,13 +16,19 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.jmap.draft.model;
+package org.apache.james.jmap.draft.model.message.view;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.time.Instant;
 import java.util.Optional;
 
+import org.apache.james.jmap.draft.model.Attachment;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Emailer;
+import org.apache.james.jmap.draft.model.Keyword;
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.junit.Test;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageViewFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactoryTest.java
similarity index 98%
rename from server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageViewFactoryTest.java
rename to server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactoryTest.java
index fb5d09c..7566276 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactoryTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.jmap.draft.model;
+package org.apache.james.jmap.draft.model.message.view;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
@@ -29,7 +29,14 @@ import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.james.jmap.draft.model.MessageViewFactory.MetaDataWithContent;
+import org.apache.james.jmap.draft.model.Attachment;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Emailer;
+import org.apache.james.jmap.draft.model.Keyword;
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
+import org.apache.james.jmap.draft.model.Number;
+import org.apache.james.jmap.draft.model.message.view.MessageViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SubMailboxMessageTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMailboxMessageTest.java
similarity index 96%
rename from server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SubMailboxMessageTest.java
rename to server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMailboxMessageTest.java
index 395dcc3..15cbc84 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SubMailboxMessageTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMailboxMessageTest.java
@@ -16,13 +16,16 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.jmap.draft.model;
+package org.apache.james.jmap.draft.model.message.view;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.time.Instant;
 import java.util.Optional;
 
+import org.apache.james.jmap.draft.model.Attachment;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Emailer;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;


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


[james-project] 05/22: JAMES-2987 Creating MessageHeaderView and MessageMetadataView

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 969d281d6c0d66e9c103cc45f629450fcae28e99
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Nov 21 10:16:18 2019 +0700

    JAMES-2987 Creating MessageHeaderView and MessageMetadataView
    
    Using `extends` and generics for both POJO and builder we got rid of
    code duplications
---
 .../draft/model/message/view/MessageFullView.java  | 242 +--------------------
 .../model/message/view/MessageHeaderView.java      | 201 +++++++++++++++++
 .../model/message/view/MessageMetadataView.java    | 169 ++++++++++++++
 3 files changed, 381 insertions(+), 231 deletions(-)

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 a84a271..01ab3a3 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
@@ -20,26 +20,21 @@
 package org.apache.james.jmap.draft.model.message.view;
 
 import java.time.Instant;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.function.Predicate;
 
-import org.apache.james.jmap.draft.methods.GetMessagesMethod;
 import org.apache.james.jmap.draft.methods.JmapResponseWriterImpl;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.BlobId;
 import org.apache.james.jmap.draft.model.Emailer;
-import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 
 import com.fasterxml.jackson.annotation.JsonFilter;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.annotations.VisibleForTesting;
@@ -50,129 +45,26 @@ import com.google.common.collect.ImmutableMap;
 
 @JsonDeserialize(builder = MessageFullView.Builder.class)
 @JsonFilter(JmapResponseWriterImpl.PROPERTIES_FILTER)
-public class MessageFullView implements MessageView {
+public class MessageFullView extends MessageHeaderView {
 
     public static Builder builder() {
         return new Builder();
     }
 
     @JsonPOJOBuilder(withPrefix = "")
-    public static class Builder {
-        private MessageId id;
-        private BlobId blobId;
-        private String threadId;
-        private ImmutableList<MailboxId> mailboxIds;
-        private String inReplyToMessageId;
-        private ImmutableMap<String, String> headers;
-        private Emailer from;
-        private final ImmutableList.Builder<Emailer> to;
-        private final ImmutableList.Builder<Emailer> cc;
-        private final ImmutableList.Builder<Emailer> bcc;
-        private final ImmutableList.Builder<Emailer> replyTo;
-        private String subject;
-        private Instant date;
-        private Number size;
+    public static class Builder extends MessageHeaderView.Builder<MessageFullView.Builder> {
         private String preview;
         private Optional<String> textBody = Optional.empty();
         private Optional<String> htmlBody = Optional.empty();
         private final ImmutableList.Builder<Attachment> attachments;
         private final ImmutableMap.Builder<BlobId, SubMessage> attachedMessages;
-        private Optional<Keywords> keywords = Optional.empty();
 
         private Builder() {
-            to = ImmutableList.builder();
-            cc = ImmutableList.builder();
-            bcc = ImmutableList.builder();
-            replyTo = ImmutableList.builder();
+            super();
             attachments = ImmutableList.builder();
             attachedMessages = ImmutableMap.builder();
         }
 
-        public Builder id(MessageId id) {
-            this.id = id;
-            return this;
-        }
-
-        public Builder blobId(BlobId blobId) {
-            this.blobId = blobId;
-            return this;
-        }
-
-        public Builder threadId(String threadId) {
-            this.threadId = threadId;
-            return this;
-        }
-
-        @JsonIgnore
-        public Builder mailboxId(MailboxId mailboxId) {
-            return this.fluentMailboxIds(mailboxId);
-        }
-
-        @JsonIgnore
-        public Builder fluentMailboxIds(MailboxId... mailboxIds) {
-            return this.mailboxIds(Arrays.asList((mailboxIds)));
-        }
-
-        public Builder mailboxIds(Collection<MailboxId> mailboxIds) {
-            this.mailboxIds = ImmutableList.copyOf(mailboxIds);
-            return this;
-        }
-
-        public Builder inReplyToMessageId(String inReplyToMessageId) {
-            this.inReplyToMessageId = inReplyToMessageId;
-            return this;
-        }
-
-        public Builder keywords(Keywords keywords) {
-            this.keywords = Optional.ofNullable(keywords);
-            return this;
-        }
-
-        public Builder headers(ImmutableMap<String, String> headers) {
-            this.headers = headers;
-            return this;
-        }
-
-        public Builder from(Emailer from) {
-            this.from = from;
-            return this;
-        }
-
-        public Builder to(List<Emailer> to) {
-            this.to.addAll(to);
-            return this;
-        }
-
-        public Builder cc(List<Emailer> cc) {
-            this.cc.addAll(cc);
-            return this;
-        }
-
-        public Builder bcc(List<Emailer> bcc) {
-            this.bcc.addAll(bcc);
-            return this;
-        }
-
-        public Builder replyTo(List<Emailer> replyTo) {
-            this.replyTo.addAll(replyTo);
-            return this;
-        }
-
-        public Builder subject(String subject) {
-            this.subject = subject;
-            return this;
-        }
-
-        public Builder date(Instant date) {
-            this.date = date;
-            return this;
-        }
-
-        public Builder size(long size) {
-            this.size = Number.BOUND_SANITIZING_FACTORY.from(size);
-            return this;
-        }
-
         public Builder preview(String preview) {
             this.preview = preview;
             return this;
@@ -199,17 +91,9 @@ public class MessageFullView implements MessageView {
         }
 
         public MessageFullView build() {
-            Preconditions.checkState(id != null, "'id' is mandatory");
-            Preconditions.checkState(blobId != null, "'blobId' is mandatory");
-            Preconditions.checkState(!Strings.isNullOrEmpty(threadId), "'threadId' is mandatory");
-            Preconditions.checkState(mailboxIds != null, "'mailboxIds' is mandatory");
-            Preconditions.checkState(headers != null, "'headers' is mandatory");
-            Preconditions.checkState(size != null, "'size' is mandatory");
-            Preconditions.checkState(date != null, "'date' is mandatory");
-            Preconditions.checkState(!Strings.isNullOrEmpty(preview), "'preview' is mandatory");
             ImmutableList<Attachment> attachments = this.attachments.build();
             ImmutableMap<BlobId, SubMessage> attachedMessages = this.attachedMessages.build();
-            Preconditions.checkState(areAttachedMessagesKeysInAttachments(attachments, attachedMessages), "'attachedMessages' keys must be in 'attachements'");
+            checkState(attachments, attachedMessages);
             boolean hasAttachment = hasAttachment(attachments);
 
             return new MessageFullView(id, blobId, threadId, mailboxIds, Optional.ofNullable(inReplyToMessageId),
@@ -217,6 +101,12 @@ public class MessageFullView implements MessageView {
                 to.build(), cc.build(), bcc.build(), replyTo.build(), subject, date, size, preview, textBody, htmlBody, attachments, attachedMessages,
                 keywords.orElse(Keywords.DEFAULT_VALUE));
         }
+
+        public void checkState(ImmutableList<Attachment> attachments, ImmutableMap<BlobId, SubMessage> attachedMessages) {
+            super.checkState();
+            Preconditions.checkState(!Strings.isNullOrEmpty(preview), "'preview' is mandatory");
+            Preconditions.checkState(areAttachedMessagesKeysInAttachments(attachments, attachedMessages), "'attachedMessages' keys must be in 'attachements'");
+        }
     }
 
     protected static boolean areAttachedMessagesKeysInAttachments(ImmutableList<Attachment> attachments, ImmutableMap<BlobId, SubMessage> attachedMessages) {
@@ -235,28 +125,12 @@ public class MessageFullView implements MessageView {
                 .anyMatch(attachment -> !attachment.isInlinedWithCid());
     }
 
-    private final MessageId id;
-    private final BlobId blobId;
-    private final String threadId;
-    private final ImmutableList<MailboxId> mailboxIds;
-    private final Optional<String> inReplyToMessageId;
     private final boolean hasAttachment;
-    @JsonFilter(GetMessagesMethod.HEADERS_FILTER)
-    private final ImmutableMap<String, String> headers;
-    private final Optional<Emailer> from;
-    private final ImmutableList<Emailer> to;
-    private final ImmutableList<Emailer> cc;
-    private final ImmutableList<Emailer> bcc;
-    private final ImmutableList<Emailer> replyTo;
-    private final String subject;
-    private final Instant date;
-    private final Number size;
     private final String preview;
     private final Optional<String> textBody;
     private final Optional<String> htmlBody;
     private final ImmutableList<Attachment> attachments;
     private final ImmutableMap<BlobId, SubMessage> attachedMessages;
-    private final Keywords keywords;
 
     @VisibleForTesting
     MessageFullView(MessageId id,
@@ -280,109 +154,19 @@ public class MessageFullView implements MessageView {
                     ImmutableList<Attachment> attachments,
                     ImmutableMap<BlobId, SubMessage> attachedMessages,
                     Keywords keywords) {
-        this.id = id;
-        this.blobId = blobId;
-        this.threadId = threadId;
-        this.mailboxIds = mailboxIds;
-        this.inReplyToMessageId = inReplyToMessageId;
+        super(id, blobId, threadId, mailboxIds, inReplyToMessageId, headers, from, to, cc, bcc, replyTo, subject, date, size, keywords);
         this.hasAttachment = hasAttachment;
-        this.headers = headers;
-        this.from = from;
-        this.to = to;
-        this.cc = cc;
-        this.bcc = bcc;
-        this.replyTo = replyTo;
-        this.subject = subject;
-        this.date = date;
-        this.size = size;
         this.preview = preview;
         this.textBody = textBody;
         this.htmlBody = htmlBody;
         this.attachments = attachments;
         this.attachedMessages = attachedMessages;
-        this.keywords = keywords;
-    }
-
-    public MessageId getId() {
-        return id;
-    }
-
-    public BlobId getBlobId() {
-        return blobId;
-    }
-
-    public String getThreadId() {
-        return threadId;
-    }
-
-    public ImmutableList<MailboxId> getMailboxIds() {
-        return mailboxIds;
-    }
-
-    public Optional<String> getInReplyToMessageId() {
-        return inReplyToMessageId;
-    }
-
-    public boolean isIsUnread() {
-        return !keywords.contains(Keyword.SEEN);
-    }
-
-    public boolean isIsFlagged() {
-        return keywords.contains(Keyword.FLAGGED);
-    }
-
-    public boolean isIsAnswered() {
-        return keywords.contains(Keyword.ANSWERED);
-    }
-
-    public boolean isIsDraft() {
-        return keywords.contains(Keyword.DRAFT);
-    }
-
-    public boolean isIsForwarded() {
-        return keywords.contains(Keyword.FORWARDED);
     }
 
     public boolean isHasAttachment() {
         return hasAttachment;
     }
 
-    public ImmutableMap<String, String> getHeaders() {
-        return headers;
-    }
-
-    public Optional<Emailer> getFrom() {
-        return from;
-    }
-
-    public ImmutableList<Emailer> getTo() {
-        return to;
-    }
-
-    public ImmutableList<Emailer> getCc() {
-        return cc;
-    }
-
-    public ImmutableList<Emailer> getBcc() {
-        return bcc;
-    }
-
-    public ImmutableList<Emailer> getReplyTo() {
-        return replyTo;
-    }
-
-    public String getSubject() {
-        return subject;
-    }
-
-    public Instant getDate() {
-        return date;
-    }
-
-    public Number getSize() {
-        return size;
-    }
-
     public String getPreview() {
         return preview;
     }
@@ -402,8 +186,4 @@ public class MessageFullView implements MessageView {
     public ImmutableMap<BlobId, SubMessage> getAttachedMessages() {
         return attachedMessages;
     }
-
-    public ImmutableMap<String, Boolean> getKeywords() {
-        return keywords.asMap();
-    }
 }
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
new file mode 100644
index 0000000..abb3a31
--- /dev/null
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageHeaderView.java
@@ -0,0 +1,201 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.Optional;
+
+import org.apache.james.jmap.draft.methods.GetMessagesMethod;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Emailer;
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.Number;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
+
+import com.fasterxml.jackson.annotation.JsonFilter;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+public class MessageHeaderView extends MessageMetadataView {
+
+    public static Builder messageHeaderBuilder() {
+        return new Builder();
+    }
+
+    public static class Builder<S extends MessageHeaderView.Builder<S>> extends MessageMetadataView.Builder<S> {
+        protected String inReplyToMessageId;
+        protected ImmutableMap<String, String> headers;
+        protected Emailer from;
+        protected final ImmutableList.Builder<Emailer> to;
+        protected final ImmutableList.Builder<Emailer> cc;
+        protected final ImmutableList.Builder<Emailer> bcc;
+        protected final ImmutableList.Builder<Emailer> replyTo;
+        protected String subject;
+        protected Instant date;
+
+        protected Builder() {
+            super();
+            to = ImmutableList.builder();
+            cc = ImmutableList.builder();
+            bcc = ImmutableList.builder();
+            replyTo = ImmutableList.builder();
+        }
+
+        public S inReplyToMessageId(String inReplyToMessageId) {
+            this.inReplyToMessageId = inReplyToMessageId;
+            return (S) this;
+        }
+
+        public S headers(ImmutableMap<String, String> headers) {
+            this.headers = headers;
+            return (S) this;
+        }
+
+        public S from(Emailer from) {
+            this.from = from;
+            return (S) this;
+        }
+
+        public S to(List<Emailer> to) {
+            this.to.addAll(to);
+            return (S) this;
+        }
+
+        public S cc(List<Emailer> cc) {
+            this.cc.addAll(cc);
+            return (S) this;
+        }
+
+        public S bcc(List<Emailer> bcc) {
+            this.bcc.addAll(bcc);
+            return (S) this;
+        }
+
+        public S replyTo(List<Emailer> replyTo) {
+            this.replyTo.addAll(replyTo);
+            return (S) this;
+        }
+
+        public S subject(String subject) {
+            this.subject = subject;
+            return (S) this;
+        }
+
+        public S date(Instant date) {
+            this.date = date;
+            return (S) this;
+        }
+
+        public MessageHeaderView build() {
+            checkState();
+
+            return new MessageHeaderView(id, blobId, threadId, mailboxIds, Optional.ofNullable(inReplyToMessageId),
+                headers, Optional.ofNullable(from),
+                to.build(), cc.build(), bcc.build(), replyTo.build(), subject, date, size,
+                keywords.orElse(Keywords.DEFAULT_VALUE));
+        }
+
+        @Override
+        protected void checkState() {
+            super.checkState();
+            Preconditions.checkState(headers != null, "'headers' is mandatory");
+            Preconditions.checkState(date != null, "'date' is mandatory");
+        }
+    }
+
+    private final Optional<String> inReplyToMessageId;
+    @JsonFilter(GetMessagesMethod.HEADERS_FILTER)
+    private final ImmutableMap<String, String> headers;
+    private final Optional<Emailer> from;
+    private final ImmutableList<Emailer> to;
+    private final ImmutableList<Emailer> cc;
+    private final ImmutableList<Emailer> bcc;
+    private final ImmutableList<Emailer> replyTo;
+    private final String subject;
+    private final Instant date;
+
+    @VisibleForTesting
+    MessageHeaderView(MessageId id,
+                      BlobId blobId,
+                      String threadId,
+                      ImmutableList<MailboxId> mailboxIds,
+                      Optional<String> inReplyToMessageId,
+                      ImmutableMap<String, String> headers,
+                      Optional<Emailer> from,
+                      ImmutableList<Emailer> to,
+                      ImmutableList<Emailer> cc,
+                      ImmutableList<Emailer> bcc,
+                      ImmutableList<Emailer> replyTo,
+                      String subject,
+                      Instant date,
+                      Number size,
+                      Keywords keywords) {
+        super(id, blobId, threadId, mailboxIds, size, keywords);
+        this.inReplyToMessageId = inReplyToMessageId;
+        this.headers = headers;
+        this.from = from;
+        this.to = to;
+        this.cc = cc;
+        this.bcc = bcc;
+        this.replyTo = replyTo;
+        this.subject = subject;
+        this.date = date;
+    }
+
+    public Optional<String> getInReplyToMessageId() {
+        return inReplyToMessageId;
+    }
+
+    public ImmutableMap<String, String> getHeaders() {
+        return headers;
+    }
+
+    public Optional<Emailer> getFrom() {
+        return from;
+    }
+
+    public ImmutableList<Emailer> getTo() {
+        return to;
+    }
+
+    public ImmutableList<Emailer> getCc() {
+        return cc;
+    }
+
+    public ImmutableList<Emailer> getBcc() {
+        return bcc;
+    }
+
+    public ImmutableList<Emailer> getReplyTo() {
+        return replyTo;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    public Instant getDate() {
+        return date;
+    }
+}
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
new file mode 100644
index 0000000..c7d599e
--- /dev/null
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataView.java
@@ -0,0 +1,169 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Optional;
+
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Keyword;
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.Number;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
+
+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;
+
+public class MessageMetadataView implements MessageView {
+
+    public static Builder messageMetadataBuilder() {
+        return new Builder();
+    }
+
+    public static class Builder<S extends Builder<S>> {
+        protected MessageId id;
+        protected BlobId blobId;
+        protected String threadId;
+        protected ImmutableList<MailboxId> mailboxIds;
+        protected Number size;
+        protected Optional<Keywords> keywords = Optional.empty();
+
+        public S id(MessageId id) {
+            this.id = id;
+            return (S) this;
+        }
+
+        public S blobId(BlobId blobId) {
+            this.blobId = blobId;
+            return (S) this;
+        }
+
+        public S threadId(String threadId) {
+            this.threadId = threadId;
+            return (S) this;
+        }
+
+        @JsonIgnore
+        public S mailboxId(MailboxId mailboxId) {
+            return this.fluentMailboxIds(mailboxId);
+        }
+
+        @JsonIgnore
+        public S fluentMailboxIds(MailboxId... mailboxIds) {
+            return this.mailboxIds(Arrays.asList((mailboxIds)));
+        }
+
+        public S mailboxIds(Collection<MailboxId> mailboxIds) {
+            this.mailboxIds = ImmutableList.copyOf(mailboxIds);
+            return (S) this;
+        }
+
+        public S keywords(Keywords keywords) {
+            this.keywords = Optional.ofNullable(keywords);
+            return (S) this;
+        }
+
+        public S size(long size) {
+            this.size = Number.BOUND_SANITIZING_FACTORY.from(size);
+            return (S) this;
+        }
+
+        public MessageMetadataView build() {
+            checkState();
+
+            return new MessageMetadataView(id, blobId, threadId, mailboxIds, size, keywords.orElse(Keywords.DEFAULT_VALUE));
+        }
+
+        protected void checkState() {
+            Preconditions.checkState(id != null, "'id' is mandatory");
+            Preconditions.checkState(blobId != null, "'blobId' is mandatory");
+            Preconditions.checkState(!Strings.isNullOrEmpty(threadId), "'threadId' is mandatory");
+            Preconditions.checkState(mailboxIds != null, "'mailboxIds' is mandatory");
+            Preconditions.checkState(size != null, "'size' is mandatory");
+        }
+    }
+
+    private final MessageId id;
+    private final BlobId blobId;
+    private final String threadId;
+    private final ImmutableList<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) {
+        this.id = id;
+        this.blobId = blobId;
+        this.threadId = threadId;
+        this.mailboxIds = mailboxIds;
+        this.size = size;
+        this.keywords = keywords;
+    }
+
+    public MessageId getId() {
+        return id;
+    }
+
+    public BlobId getBlobId() {
+        return blobId;
+    }
+
+    public String getThreadId() {
+        return threadId;
+    }
+
+    public ImmutableList<MailboxId> getMailboxIds() {
+        return mailboxIds;
+    }
+
+    public boolean isIsUnread() {
+        return !keywords.contains(Keyword.SEEN);
+    }
+
+    public boolean isIsFlagged() {
+        return keywords.contains(Keyword.FLAGGED);
+    }
+
+    public boolean isIsAnswered() {
+        return keywords.contains(Keyword.ANSWERED);
+    }
+
+    public boolean isIsDraft() {
+        return keywords.contains(Keyword.DRAFT);
+    }
+
+    public boolean isIsForwarded() {
+        return keywords.contains(Keyword.FORWARDED);
+    }
+
+    public Number getSize() {
+        return size;
+    }
+
+    public ImmutableMap<String, Boolean> getKeywords() {
+        return keywords.asMap();
+    }
+}


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


[james-project] 19/22: [Refactoring] Add tests for ModSeq, fix equals verifier checks

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 20eee480af272a003500248c74a58e187ad0557c
Author: Raphael Ouazana <ra...@linagora.com>
AuthorDate: Wed Nov 20 17:33:23 2019 +0100

    [Refactoring] Add tests for ModSeq, fix equals verifier checks
---
 .../main/java/org/apache/james/mailbox/ModSeq.java |  4 +-
 .../java/org/apache/james/mailbox/ModSeqTest.java  | 53 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java b/mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java
index c4be664..22cfb62 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java
@@ -59,12 +59,12 @@ public class ModSeq implements Comparable<ModSeq> {
     }
     
     @Override
-    public int hashCode() {
+    public final int hashCode() {
         return Objects.hashCode(modSeq);
     }
     
     @Override
-    public boolean equals(Object obj) {
+    public final boolean equals(Object obj) {
         if (obj instanceof ModSeq) {
             ModSeq other = (ModSeq) obj;
             return other.modSeq == this.modSeq;
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/ModSeqTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/ModSeqTest.java
new file mode 100644
index 0000000..2198df2
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/ModSeqTest.java
@@ -0,0 +1,53 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+package org.apache.james.mailbox;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.junit.jupiter.api.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+class ModSeqTest {
+
+    @Test
+    void shouldRespectBeanContract() {
+        EqualsVerifier.forClass(ModSeq.class)
+            .verify();
+    }
+
+    @Test
+    void nextShouldThrowWhenMaxLong() {
+        assertThatThrownBy(() -> ModSeq.of(Long.MAX_VALUE).next())
+            .isInstanceOf(RuntimeException.class);
+    }
+
+    @Test
+    void isFirstShouldReturnTrueWhenFirst() {
+        assertThat(ModSeq.first().isFirst())
+            .isTrue();
+    }
+
+    @Test
+    void isFirstShouldReturnFalseWhenNotFirst() {
+        assertThat(ModSeq.of(42).isFirst())
+            .isFalse();
+    }
+}


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


[james-project] 12/22: JAMES-2987 Add tests for fromMessageResults in MessageFullViewFactoryTest

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5e01be7154344eb1574f42228cb03c70344fc3c1
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Nov 21 17:59:00 2019 +0700

    JAMES-2987 Add tests for fromMessageResults in MessageFullViewFactoryTest
---
 .../message/view/MessageFullViewFactoryTest.java   | 103 ++++++++++++++++++++-
 1 file changed, 102 insertions(+), 1 deletion(-)

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 a19e46a..ad13156 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
@@ -23,9 +23,13 @@ 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;
+
 import org.apache.commons.lang3.StringUtils;
+import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.BlobId;
 import org.apache.james.jmap.draft.model.Emailer;
@@ -36,14 +40,26 @@ import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageIdManager;
+import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.inmemory.InMemoryId;
+import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 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.FetchGroupImpl;
+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;
+import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -54,22 +70,107 @@ class MessageFullViewFactoryTest {
     private static final String FORWARDED = "forwarded";
     private static final InMemoryId MAILBOX_ID = InMemoryId.of(18L);
     private static final Instant INTERNAL_DATE = Instant.parse("2012-02-03T14:30:42Z");
+    private static final Username BOB = Username.of("bob@local");
 
+    private MessageIdManager messageIdManager;
+    private MailboxSession session;
+    private MessageManager bobInbox;
+    private MessageManager bobMailbox;
+    private ComposedMessageId message1;
     private MessageFullViewFactory messageFullViewFactory;
 
     @BeforeEach
-    void setUp() {
+    void setUp() throws Exception {
         HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor();
 
         MessagePreviewGenerator messagePreview = new MessagePreviewGenerator();
         MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
 
         InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
+        messageIdManager = resources.getMessageIdManager();
+        InMemoryMailboxManager mailboxManager = resources.getMailboxManager();
+
+        session = mailboxManager.createSystemSession(BOB);
+        MailboxId bobInboxId = mailboxManager.createMailbox(MailboxPath.inbox(session), session).get();
+        MailboxId bobMailboxId = mailboxManager.createMailbox(MailboxPath.forUser(BOB, "anotherMailbox"), session).get();
+
+        bobInbox = mailboxManager.getMailbox(bobInboxId, session);
+        bobMailbox = mailboxManager.getMailbox(bobMailboxId, session);
+
+        message1 = bobInbox.appendMessage(MessageManager.AppendCommand.builder()
+                .withFlags(new Flags(Flags.Flag.SEEN))
+                .build(ClassLoaderUtils.getSystemResourceAsSharedStream("fullMessage.eml")),
+            session);
 
         messageFullViewFactory = new MessageFullViewFactory(resources.getBlobManager(), messagePreview, messageContentExtractor, htmlTextExtractor);
     }
 
     @Test
+    void fromMessageResultsShouldReturnCorrectView() throws Exception {
+        List<MessageResult> messages = messageIdManager
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+
+        Emailer bobEmail = Emailer.builder().name(BOB.getLocalPart()).email(BOB.asString()).build();
+        Emailer aliceEmail = Emailer.builder().name("alice").email("alice@local").build();
+        Emailer jackEmail = Emailer.builder().name("jack").email("jack@local").build();
+        Emailer jacobEmail = Emailer.builder().name("jacob").email("jacob@local").build();
+
+        ImmutableMap<String, String> headersMap = ImmutableMap.<String, String>builder()
+            .put("Content-Type", "multipart/mixed; boundary=\"------------7AF1D14DE1DFA16229726B54\"")
+            .put("Date", "Tue, 7 Jun 2016 16:23:37 +0200")
+            .put("From", "alice <al...@local>")
+            .put("To", "bob <bo...@local>")
+            .put("Subject", "Full message")
+            .put("Mime-Version", "1.0")
+            .put("Message-ID", "<1c...@open-paas.org>")
+            .put("Cc", "jack <ja...@local>, jacob <ja...@local>")
+            .put("Bcc", "alice <al...@local>")
+            .put("Reply-to", "alice <al...@local>")
+            .put("In-reply-to", "bob@local")
+            .build();
+
+        MessageFullView actual = messageFullViewFactory.fromMessageResults(messages);
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
+            softly.assertThat(actual.getMailboxIds()).containsExactly(bobInbox.getId());
+            softly.assertThat(actual.getThreadId()).isEqualTo(message1.getMessageId().serialize());
+            softly.assertThat(actual.getSize()).isEqualTo(Number.fromLong(2255));
+            softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN).asMap());
+            softly.assertThat(actual.getBlobId()).isEqualTo(BlobId.of(message1.getMessageId().serialize()));
+            softly.assertThat(actual.getInReplyToMessageId()).isEqualTo(Optional.of(BOB.asString()));
+            softly.assertThat(actual.getHeaders()).isEqualTo(headersMap);
+            softly.assertThat(actual.getFrom()).isEqualTo(Optional.of(aliceEmail));
+            softly.assertThat(actual.getTo()).isEqualTo(ImmutableList.of(bobEmail));
+            softly.assertThat(actual.getCc()).isEqualTo(ImmutableList.of(jackEmail, jacobEmail));
+            softly.assertThat(actual.getBcc()).isEqualTo(ImmutableList.of(aliceEmail));
+            softly.assertThat(actual.getReplyTo()).isEqualTo(ImmutableList.of(aliceEmail));
+            softly.assertThat(actual.getSubject()).isEqualTo("Full message");
+            softly.assertThat(actual.getDate()).isEqualTo("2016-06-07T14:23:37Z");
+            softly.assertThat(actual.isHasAttachment()).isEqualTo(true);
+            softly.assertThat(actual.getPreview()).isEqualTo("blabla bloblo");
+            softly.assertThat(actual.getTextBody()).isEqualTo(Optional.of("/blabla/\n*bloblo*\n"));
+            softly.assertThat(actual.getHtmlBody()).isEqualTo(Optional.of("<i>blabla</i>\n<b>bloblo</b>\n"));
+            softly.assertThat(actual.getAttachments()).hasSize(1);
+            softly.assertThat(actual.getAttachedMessages()).hasSize(0);
+        });
+    }
+
+    @Test
+    void fromMessageResultsShouldCombineKeywords() throws Exception {
+        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()), FetchGroupImpl.MINIMAL, session);
+
+        MessageFullView actual = messageFullViewFactory.fromMessageResults(messages);
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
+            softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN, Keyword.FLAGGED).asMap());
+        });
+    }
+
+    @Test
     void emptyMailShouldBeLoadedIntoMessage() throws Exception {
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))


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


[james-project] 13/22: JAMES-2987 Extract redundant constants to a MessageViewFixture interface

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit ad63b64927743c9a2e8217e97f4abd7e2d1e993e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 22 11:34:33 2019 +0700

    JAMES-2987 Extract redundant constants to a MessageViewFixture interface
---
 .../message/view/MessageFullViewFactoryTest.java   | 39 ++++++------------
 .../message/view/MessageHeaderViewFactoryTest.java | 43 ++++++-------------
 .../view/MessageMetadataViewFactoryTest.java       |  5 +--
 .../model/message/view/MessageViewFixture.java     | 48 ++++++++++++++++++++++
 4 files changed, 75 insertions(+), 60 deletions(-)

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 ad13156..da51cb7 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
@@ -18,6 +18,12 @@
  ****************************************************************/
 package org.apache.james.jmap.draft.model.message.view;
 
+import static org.apache.james.jmap.draft.model.message.view.MessageViewFixture.ALICE_EMAIL;
+import static org.apache.james.jmap.draft.model.message.view.MessageViewFixture.BOB;
+import static org.apache.james.jmap.draft.model.message.view.MessageViewFixture.BOB_EMAIL;
+import static org.apache.james.jmap.draft.model.message.view.MessageViewFixture.HEADERS_MAP;
+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 static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -29,7 +35,6 @@ import java.util.Optional;
 import javax.mail.Flags;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.BlobId;
 import org.apache.james.jmap.draft.model.Emailer;
@@ -70,7 +75,6 @@ class MessageFullViewFactoryTest {
     private static final String FORWARDED = "forwarded";
     private static final InMemoryId MAILBOX_ID = InMemoryId.of(18L);
     private static final Instant INTERNAL_DATE = Instant.parse("2012-02-03T14:30:42Z");
-    private static final Username BOB = Username.of("bob@local");
 
     private MessageIdManager messageIdManager;
     private MailboxSession session;
@@ -110,25 +114,6 @@ class MessageFullViewFactoryTest {
         List<MessageResult> messages = messageIdManager
             .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
 
-        Emailer bobEmail = Emailer.builder().name(BOB.getLocalPart()).email(BOB.asString()).build();
-        Emailer aliceEmail = Emailer.builder().name("alice").email("alice@local").build();
-        Emailer jackEmail = Emailer.builder().name("jack").email("jack@local").build();
-        Emailer jacobEmail = Emailer.builder().name("jacob").email("jacob@local").build();
-
-        ImmutableMap<String, String> headersMap = ImmutableMap.<String, String>builder()
-            .put("Content-Type", "multipart/mixed; boundary=\"------------7AF1D14DE1DFA16229726B54\"")
-            .put("Date", "Tue, 7 Jun 2016 16:23:37 +0200")
-            .put("From", "alice <al...@local>")
-            .put("To", "bob <bo...@local>")
-            .put("Subject", "Full message")
-            .put("Mime-Version", "1.0")
-            .put("Message-ID", "<1c...@open-paas.org>")
-            .put("Cc", "jack <ja...@local>, jacob <ja...@local>")
-            .put("Bcc", "alice <al...@local>")
-            .put("Reply-to", "alice <al...@local>")
-            .put("In-reply-to", "bob@local")
-            .build();
-
         MessageFullView actual = messageFullViewFactory.fromMessageResults(messages);
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
@@ -138,12 +123,12 @@ class MessageFullViewFactoryTest {
             softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN).asMap());
             softly.assertThat(actual.getBlobId()).isEqualTo(BlobId.of(message1.getMessageId().serialize()));
             softly.assertThat(actual.getInReplyToMessageId()).isEqualTo(Optional.of(BOB.asString()));
-            softly.assertThat(actual.getHeaders()).isEqualTo(headersMap);
-            softly.assertThat(actual.getFrom()).isEqualTo(Optional.of(aliceEmail));
-            softly.assertThat(actual.getTo()).isEqualTo(ImmutableList.of(bobEmail));
-            softly.assertThat(actual.getCc()).isEqualTo(ImmutableList.of(jackEmail, jacobEmail));
-            softly.assertThat(actual.getBcc()).isEqualTo(ImmutableList.of(aliceEmail));
-            softly.assertThat(actual.getReplyTo()).isEqualTo(ImmutableList.of(aliceEmail));
+            softly.assertThat(actual.getHeaders()).isEqualTo(HEADERS_MAP);
+            softly.assertThat(actual.getFrom()).isEqualTo(Optional.of(ALICE_EMAIL));
+            softly.assertThat(actual.getTo()).isEqualTo(ImmutableList.of(BOB_EMAIL));
+            softly.assertThat(actual.getCc()).isEqualTo(ImmutableList.of(JACK_EMAIL, JACOB_EMAIL));
+            softly.assertThat(actual.getBcc()).isEqualTo(ImmutableList.of(ALICE_EMAIL));
+            softly.assertThat(actual.getReplyTo()).isEqualTo(ImmutableList.of(ALICE_EMAIL));
             softly.assertThat(actual.getSubject()).isEqualTo("Full message");
             softly.assertThat(actual.getDate()).isEqualTo("2016-06-07T14:23:37Z");
             softly.assertThat(actual.isHasAttachment()).isEqualTo(true);
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 a60c17f..ec7711c 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
@@ -19,14 +19,19 @@
 
 package org.apache.james.jmap.draft.model.message.view;
 
+import static org.apache.james.jmap.draft.model.message.view.MessageViewFixture.ALICE_EMAIL;
+import static org.apache.james.jmap.draft.model.message.view.MessageViewFixture.BOB;
+import static org.apache.james.jmap.draft.model.message.view.MessageViewFixture.BOB_EMAIL;
+import static org.apache.james.jmap.draft.model.message.view.MessageViewFixture.HEADERS_MAP;
+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;
 
-import org.apache.james.core.Username;
 import org.apache.james.jmap.draft.model.BlobId;
-import org.apache.james.jmap.draft.model.Emailer;
 import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.Number;
@@ -47,11 +52,8 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 
 class MessageHeaderViewFactoryTest {
-    private static final Username BOB = Username.of("bob@local");
-
     private MessageIdManager messageIdManager;
     private MessageHeaderViewFactory testee;
     private MailboxSession session;
@@ -85,25 +87,6 @@ class MessageHeaderViewFactoryTest {
         List<MessageResult> messages = messageIdManager
             .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
 
-        Emailer bobEmail = Emailer.builder().name(BOB.getLocalPart()).email(BOB.asString()).build();
-        Emailer aliceEmail = Emailer.builder().name("alice").email("alice@local").build();
-        Emailer jackEmail = Emailer.builder().name("jack").email("jack@local").build();
-        Emailer jacobEmail = Emailer.builder().name("jacob").email("jacob@local").build();
-
-        ImmutableMap<String, String> headersMap = ImmutableMap.<String, String>builder()
-            .put("Content-Type", "multipart/mixed; boundary=\"------------7AF1D14DE1DFA16229726B54\"")
-            .put("Date", "Tue, 7 Jun 2016 16:23:37 +0200")
-            .put("From", "alice <al...@local>")
-            .put("To", "bob <bo...@local>")
-            .put("Subject", "Full message")
-            .put("Mime-Version", "1.0")
-            .put("Message-ID", "<1c...@open-paas.org>")
-            .put("Cc", "jack <ja...@local>, jacob <ja...@local>")
-            .put("Bcc", "alice <al...@local>")
-            .put("Reply-to", "alice <al...@local>")
-            .put("In-reply-to", "bob@local")
-            .build();
-
         MessageHeaderView actual = testee.fromMessageResults(messages);
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
@@ -113,12 +96,12 @@ class MessageHeaderViewFactoryTest {
             softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN).asMap());
             softly.assertThat(actual.getBlobId()).isEqualTo(BlobId.of(message1.getMessageId().serialize()));
             softly.assertThat(actual.getInReplyToMessageId()).isEqualTo(Optional.of(BOB.asString()));
-            softly.assertThat(actual.getHeaders()).isEqualTo(headersMap);
-            softly.assertThat(actual.getFrom()).isEqualTo(Optional.of(aliceEmail));
-            softly.assertThat(actual.getTo()).isEqualTo(ImmutableList.of(bobEmail));
-            softly.assertThat(actual.getCc()).isEqualTo(ImmutableList.of(jackEmail, jacobEmail));
-            softly.assertThat(actual.getBcc()).isEqualTo(ImmutableList.of(aliceEmail));
-            softly.assertThat(actual.getReplyTo()).isEqualTo(ImmutableList.of(aliceEmail));
+            softly.assertThat(actual.getHeaders()).isEqualTo(HEADERS_MAP);
+            softly.assertThat(actual.getFrom()).isEqualTo(Optional.of(ALICE_EMAIL));
+            softly.assertThat(actual.getTo()).isEqualTo(ImmutableList.of(BOB_EMAIL));
+            softly.assertThat(actual.getCc()).isEqualTo(ImmutableList.of(JACK_EMAIL, JACOB_EMAIL));
+            softly.assertThat(actual.getBcc()).isEqualTo(ImmutableList.of(ALICE_EMAIL));
+            softly.assertThat(actual.getReplyTo()).isEqualTo(ImmutableList.of(ALICE_EMAIL));
             softly.assertThat(actual.getSubject()).isEqualTo("Full message");
             softly.assertThat(actual.getDate()).isEqualTo("2016-06-07T14:23:37Z");
         });
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 36cac92..f4f82c0 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
@@ -19,11 +19,12 @@
 
 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.core.Username;
 import org.apache.james.jmap.draft.model.BlobId;
 import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
@@ -46,8 +47,6 @@ import org.junit.jupiter.api.Test;
 import com.google.common.collect.ImmutableList;
 
 class MessageMetadataViewFactoryTest {
-
-    public static final Username BOB = Username.of("bob");
     private MessageIdManager messageIdManager;
     private MessageMetadataViewFactory testee;
     private MailboxSession session;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFixture.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFixture.java
new file mode 100644
index 0000000..cee2a51
--- /dev/null
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageViewFixture.java
@@ -0,0 +1,48 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import org.apache.james.core.Username;
+import org.apache.james.jmap.draft.model.Emailer;
+
+import com.google.common.collect.ImmutableMap;
+
+public interface MessageViewFixture {
+    Username BOB = Username.of("bob@local");
+
+    Emailer BOB_EMAIL = Emailer.builder().name(BOB.getLocalPart()).email(BOB.asString()).build();
+    Emailer ALICE_EMAIL = Emailer.builder().name("alice").email("alice@local").build();
+    Emailer JACK_EMAIL = Emailer.builder().name("jack").email("jack@local").build();
+    Emailer JACOB_EMAIL = Emailer.builder().name("jacob").email("jacob@local").build();
+
+    ImmutableMap<String, String> HEADERS_MAP = ImmutableMap.<String, String>builder()
+        .put("Content-Type", "multipart/mixed; boundary=\"------------7AF1D14DE1DFA16229726B54\"")
+        .put("Date", "Tue, 7 Jun 2016 16:23:37 +0200")
+        .put("From", "alice <al...@local>")
+        .put("To", "bob <bo...@local>")
+        .put("Subject", "Full message")
+        .put("Mime-Version", "1.0")
+        .put("Message-ID", "<1c...@open-paas.org>")
+        .put("Cc", "jack <ja...@local>, jacob <ja...@local>")
+        .put("Bcc", "alice <al...@local>")
+        .put("Reply-to", "alice <al...@local>")
+        .put("In-reply-to", "bob@local")
+        .build();
+}


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


[james-project] 08/22: JAMES-2987 Add MessageMetadataViewFactory

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4cfab0f2b3db546c30911f749fcfedc4989dd269
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Nov 21 12:00:07 2019 +0700

    JAMES-2987 Add MessageMetadataViewFactory
    
    MessageViewFactory becomes the generic class converting MessageResults
    into MessageView.
    
    By avoiding the intermediate MessageContentWithMetadata, we can really
    simplify new MessageView factories.
---
 .../manager/InMemoryIntegrationResources.java      |  12 +++
 .../model/message/view/MessageFullViewFactory.java |  29 +-----
 .../message/view/MessageMetadataViewFactory.java   |  57 +++++++++++
 .../model/message/view/MessageViewFactory.java     |  67 +++++++++++++
 .../view/MessageMetadataViewFactoryTest.java       | 110 +++++++++++++++++++++
 5 files changed, 251 insertions(+), 24 deletions(-)

diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index 29c4ae3..59e1a88 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -50,6 +50,8 @@ import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.PreDeletionHooks;
 import org.apache.james.mailbox.store.SessionProvider;
+import org.apache.james.mailbox.store.StoreAttachmentManager;
+import org.apache.james.mailbox.store.StoreBlobManager;
 import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageIdManager;
@@ -384,6 +386,7 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
     private final StoreMessageIdManager storeMessageIdManager;
     private final MessageSearchIndex searchIndex;
     private final EventBus eventBus;
+    private final StoreBlobManager blobManager;
 
     InMemoryIntegrationResources(InMemoryMailboxManager mailboxManager, StoreRightManager storeRightManager, MessageId.Factory messageIdFactory, InMemoryCurrentQuotaManager currentQuotaManager, DefaultUserQuotaRootResolver defaultUserQuotaRootResolver, InMemoryPerUserMaxQuotaManager maxQuotaManager, QuotaManager quotaManager, MessageSearchIndex searchIndex, EventBus eventBus) {
         this.mailboxManager = mailboxManager;
@@ -404,6 +407,11 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
             quotaManager,
             defaultUserQuotaRootResolver,
             mailboxManager.getPreDeletionHooks());
+
+        this.blobManager = new StoreBlobManager(
+            new StoreAttachmentManager((InMemoryMailboxSessionMapperFactory) mailboxManager.getMapperFactory(), storeMessageIdManager),
+            storeMessageIdManager,
+            messageIdFactory);
     }
 
     public DefaultUserQuotaRootResolver getDefaultUserQuotaRootResolver() {
@@ -450,4 +458,8 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
     public EventBus getEventBus() {
         return eventBus;
     }
+
+    public StoreBlobManager getBlobManager() {
+        return blobManager;
+    }
 }
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 2f7d15b..ebef606 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
@@ -40,7 +40,6 @@ import org.apache.james.jmap.draft.model.Emailer;
 import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
-import org.apache.james.jmap.draft.utils.KeywordsCombiner;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -66,11 +65,9 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
 
-public class MessageFullViewFactory {
+public class MessageFullViewFactory implements MessageViewFactory<MessageFullView> {
     public static final String JMAP_MULTIVALUED_FIELD_DELIMITER = "\n";
 
-    private static final KeywordsCombiner ACCUMULATOR = new KeywordsCombiner();
-
     private final BlobManager blobManager;
     private final MessagePreviewGenerator messagePreview;
     private final MessageContentExtractor messageContentExtractor;
@@ -87,6 +84,7 @@ public class MessageFullViewFactory {
         this.keywordsFactory = Keywords.lenientFactory();
     }
 
+    @Override
     public MessageFullView fromMessageResults(Collection<MessageResult> messageResults) throws MailboxException {
         return fromMetaDataWithContent(toMetaDataWithContent(messageResults));
     }
@@ -122,20 +120,11 @@ public class MessageFullViewFactory {
     }
 
     private MetaDataWithContent toMetaDataWithContent(Collection<MessageResult> messageResults) throws MailboxException {
-        Preconditions.checkArgument(!messageResults.isEmpty(), "MessageResults cannot be empty");
-        Preconditions.checkArgument(hasOnlyOneMessageId(messageResults), "MessageResults need to share the same messageId");
+        assertOneMessageId(messageResults);
 
         MessageResult firstMessageResult = messageResults.iterator().next();
-        List<MailboxId> mailboxIds = messageResults.stream()
-            .map(MessageResult::getMailboxId)
-            .distinct()
-            .collect(Guavate.toImmutableList());
-
-        Keywords keywords = messageResults.stream()
-            .map(MessageResult::getFlags)
-            .map(keywordsFactory::fromFlags)
-            .reduce(ACCUMULATOR)
-            .get();
+        List<MailboxId> mailboxIds = getMailboxIds(messageResults);
+        Keywords keywords = getKeywords(messageResults);
 
         return MetaDataWithContent.builderFromMessageResult(firstMessageResult)
             .messageId(firstMessageResult.getMessageId())
@@ -144,14 +133,6 @@ public class MessageFullViewFactory {
             .build();
     }
 
-    private boolean hasOnlyOneMessageId(Collection<MessageResult> messageResults) {
-        return messageResults
-            .stream()
-            .map(MessageResult::getMessageId)
-            .distinct()
-            .count() == 1;
-    }
-
     private Instant getDateFromHeaderOrInternalDateOtherwise(org.apache.james.mime4j.dom.Message mimeMessage, MetaDataWithContent message) {
         return Optional.ofNullable(mimeMessage.getDate())
             .map(Date::toInstant)
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
new file mode 100644
index 0000000..95a382f
--- /dev/null
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactory.java
@@ -0,0 +1,57 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import java.util.Collection;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.mailbox.BlobManager;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageResult;
+
+public class MessageMetadataViewFactory implements MessageViewFactory<MessageMetadataView> {
+    private final BlobManager blobManager;
+
+    @Inject
+    MessageMetadataViewFactory(BlobManager blobManager) {
+        this.blobManager = blobManager;
+    }
+
+    @Override
+    public MessageMetadataView fromMessageResults(Collection<MessageResult> messageResults) throws MailboxException {
+        assertOneMessageId(messageResults);
+
+        MessageResult firstMessageResult = messageResults.iterator().next();
+        List<MailboxId> mailboxIds = getMailboxIds(messageResults);
+
+        return MessageMetadataView.messageMetadataBuilder()
+            .id(firstMessageResult.getMessageId())
+            .mailboxIds(mailboxIds)
+            .blobId(BlobId.of(blobManager.toBlobId(firstMessageResult.getMessageId())))
+            .threadId(firstMessageResult.getMessageId().serialize())
+            .keywords(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
new file mode 100644
index 0000000..5339c13
--- /dev/null
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageViewFactory.java
@@ -0,0 +1,67 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.utils.KeywordsCombiner;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageResult;
+
+import com.github.steveash.guavate.Guavate;
+import com.google.common.base.Preconditions;
+
+public interface MessageViewFactory<T extends MessageView> {
+    KeywordsCombiner KEYWORDS_COMBINER = new KeywordsCombiner();
+    Keywords.KeywordsFactory KEYWORDS_FACTORY = Keywords.lenientFactory();
+
+    T fromMessageResults(Collection<MessageResult> messageResults) 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");
+    }
+
+    default boolean hasOnlyOneMessageId(Collection<MessageResult> messageResults) {
+        return messageResults
+            .stream()
+            .map(MessageResult::getMessageId)
+            .distinct()
+            .count() == 1;
+    }
+
+    default 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()
+                .map(MessageResult::getFlags)
+                .map(KEYWORDS_FACTORY::fromFlags)
+                .reduce(KEYWORDS_COMBINER)
+                .get();
+    }
+}
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
new file mode 100644
index 0000000..36cac92
--- /dev/null
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageMetadataViewFactoryTest.java
@@ -0,0 +1,110 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.jmap.draft.model.message.view;
+
+import java.util.List;
+
+import javax.mail.Flags;
+
+import org.apache.james.core.Username;
+import org.apache.james.jmap.draft.model.BlobId;
+import org.apache.james.jmap.draft.model.Keyword;
+import org.apache.james.jmap.draft.model.Keywords;
+import org.apache.james.jmap.draft.model.Number;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageIdManager;
+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.FetchGroupImpl;
+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;
+
+import com.google.common.collect.ImmutableList;
+
+class MessageMetadataViewFactoryTest {
+
+    public static final Username BOB = Username.of("bob");
+    private MessageIdManager messageIdManager;
+    private MessageMetadataViewFactory testee;
+    private MailboxSession session;
+    private MessageManager bobInbox;
+    private MessageManager bobMailbox;
+    private ComposedMessageId message1;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
+        messageIdManager = resources.getMessageIdManager();
+        InMemoryMailboxManager mailboxManager = resources.getMailboxManager();
+
+        session = mailboxManager.createSystemSession(BOB);
+        MailboxId bobInboxId = mailboxManager.createMailbox(MailboxPath.inbox(session), session).get();
+        MailboxId bobMailboxId = mailboxManager.createMailbox(MailboxPath.forUser(BOB, "anotherMailbox"), session).get();
+
+        bobInbox = mailboxManager.getMailbox(bobInboxId, session);
+        bobMailbox = mailboxManager.getMailbox(bobMailboxId, session);
+
+        message1 = bobInbox.appendMessage(MessageManager.AppendCommand.builder()
+                .withFlags(new Flags(Flags.Flag.SEEN))
+                .build("header: value\r\n\r\nbody"),
+            session);
+
+        testee = new MessageMetadataViewFactory(resources.getBlobManager());
+    }
+
+    @Test
+    void fromMessageResultsShouldReturnCorrectView() throws Exception {
+        List<MessageResult> messages = messageIdManager
+            .getMessages(ImmutableList.of(message1.getMessageId()), FetchGroupImpl.MINIMAL, session);
+
+        MessageMetadataView actual = testee.fromMessageResults(messages);
+        SoftAssertions.assertSoftly(softly -> {
+           softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
+           softly.assertThat(actual.getMailboxIds()).containsExactly(bobInbox.getId());
+           softly.assertThat(actual.getThreadId()).isEqualTo(message1.getMessageId().serialize());
+           softly.assertThat(actual.getSize()).isEqualTo(Number.fromLong(21));
+           softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN).asMap());
+           softly.assertThat(actual.getBlobId()).isEqualTo(BlobId.of(message1.getMessageId().serialize()));
+        });
+    }
+
+    @Test
+    void fromMessageResultsShouldCombineKeywords() throws Exception {
+        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()), FetchGroupImpl.MINIMAL, session);
+
+        MessageMetadataView actual = testee.fromMessageResults(messages);
+        SoftAssertions.assertSoftly(softly -> {
+           softly.assertThat(actual.getId()).isEqualTo(message1.getMessageId());
+           softly.assertThat(actual.getKeywords()).isEqualTo(Keywords.strictFactory().from(Keyword.SEEN, Keyword.FLAGGED).asMap());
+        });
+    }
+
+}
\ No newline at end of file


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


[james-project] 16/22: [Refactoring] Strong typing for ModSeq

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 1d2ff49561b6a2612ef3c2faa069820540785f42
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 20 13:35:28 2019 +0700

    [Refactoring] Strong typing for ModSeq
---
 .../org/apache/james/mailbox/MessageManager.java   |  2 +-
 .../java/org/apache/james/mailbox/ModSeq.java}     | 80 ++++++++++----------
 .../model/ComposedMessageIdWithMetaData.java       | 12 +--
 .../james/mailbox/model/MessageMetaData.java       |  7 +-
 .../apache/james/mailbox/model/MessageResult.java  |  3 +-
 .../apache/james/mailbox/model/UpdatedFlags.java   | 11 +--
 .../apache/james/mailbox/MailboxListenerTest.java  |  5 +-
 .../apache/james/mailbox/MailboxManagerTest.java   |  2 +-
 .../model/ComposedMessageIdWithMetaDataTest.java   |  7 +-
 .../james/mailbox/model/UpdatedFlagsTest.java      |  3 +-
 .../cassandra/mail/CassandraMessageIdDAO.java      |  7 +-
 .../mail/CassandraMessageIdToImapUidDAO.java       | 12 +--
 .../cassandra/mail/CassandraMessageMapper.java     | 13 ++--
 .../cassandra/mail/CassandraModSeqProvider.java    | 52 ++++---------
 .../cassandra/mail/MessageWithoutAttachment.java   |  5 +-
 .../mail/CassandraIndexTableHandlerTest.java       |  3 +-
 .../cassandra/mail/CassandraMapperProvider.java    |  5 +-
 .../cassandra/mail/CassandraMessageDAOTest.java    |  3 +-
 .../cassandra/mail/CassandraMessageIdDAOTest.java  | 71 +++++++++---------
 .../mail/CassandraMessageIdToImapUidDAOTest.java   | 87 +++++++++++-----------
 .../mail/CassandraModSeqProviderTest.java          | 17 +++--
 .../mail/utils/FlagsUpdateStageResultTest.java     |  5 +-
 .../elasticsearch/json/IndexableMessage.java       |  7 +-
 .../json/MessageToElasticSearchJson.java           |  3 +-
 .../elasticsearch/json/MessageUpdateJson.java      |  6 +-
 ...asticSearchListeningMessageSearchIndexTest.java |  3 +-
 .../json/MessageToElasticSearchJsonTest.java       |  3 +-
 .../scala/org/apache/james/event/json/DTOs.scala   |  6 +-
 .../apache/james/event/json/EventSerializer.scala  |  7 +-
 .../james/event/json/AddedSerializationTest.java   |  3 +-
 .../event/json/ExpungedSerializationTest.java      |  3 +-
 .../event/json/FlagsUpdatedSerializationTest.java  |  5 +-
 .../apache/james/event/json/dtos/ModSeqTest.java   | 58 +++++++++++++++
 .../james/mailbox/jpa/mail/JPAMessageMapper.java   |  5 +-
 .../james/mailbox/jpa/mail/JPAModSeqProvider.java  | 17 +++--
 .../model/openjpa/AbstractJPAMailboxMessage.java   | 15 ++--
 .../model/openjpa/JPAEncryptedMailboxMessage.java  |  3 +-
 .../jpa/mail/model/openjpa/JPAMailboxMessage.java  |  3 +-
 .../model/openjpa/JPAStreamingMailboxMessage.java  |  3 +-
 .../james/mailbox/jpa/mail/JPAMapperProvider.java  |  5 +-
 .../jpa/mail/TransactionalMessageMapper.java       |  4 +-
 .../james/mailbox/maildir/MaildirFolder.java       |  5 +-
 .../apache/james/mailbox/maildir/MaildirStore.java | 13 ++--
 .../mailbox/maildir/mail/MaildirMessageMapper.java |  7 +-
 .../maildir/mail/model/MaildirMailboxMessage.java  |  9 ++-
 .../inmemory/mail/InMemoryMessageMapper.java       |  3 +-
 .../inmemory/mail/InMemoryModSeqProvider.java      | 29 ++++----
 .../inmemory/mail/InMemoryMapperProvider.java      |  5 +-
 .../james/mailbox/store/MailboxMetaData.java       | 10 +--
 .../james/mailbox/store/MessageResultImpl.java     |  3 +-
 .../james/mailbox/store/StoreMessageIdManager.java |  3 +-
 .../james/mailbox/store/StoreMessageManager.java   |  3 +-
 .../mailbox/store/StoreMessageResultIterator.java  |  3 +-
 .../mailbox/store/mail/AbstractMessageMapper.java  | 22 +++---
 .../james/mailbox/store/mail/MessageMapper.java    |  3 +-
 .../james/mailbox/store/mail/MessageUtils.java     |  8 +-
 .../james/mailbox/store/mail/ModSeqProvider.java   |  9 ++-
 .../mailbox/store/mail/model/MailboxMessage.java   |  5 +-
 .../mail/model/impl/SimpleMailboxMessage.java      | 12 +--
 .../mailbox/store/search/MessageSearches.java      |  9 ++-
 .../store/AbstractCombinationManagerTest.java      |  2 +-
 .../AbstractMessageIdManagerSideEffectTest.java    |  4 +-
 .../store/AbstractMessageIdManagerStorageTest.java | 13 ++--
 .../mailbox/store/MessageIdManagerTestSystem.java  |  3 +-
 .../james/mailbox/store/PreDeletionHooksTest.java  |  3 +-
 .../StoreMailboxMessageResultIteratorTest.java     |  4 +-
 .../james/mailbox/store/mail/MessageUtilsTest.java |  5 +-
 .../store/mail/model/ListMessageAssertTest.java    |  3 +-
 .../mailbox/store/mail/model/MapperProvider.java   |  6 +-
 .../store/mail/model/MessageIdMapperTest.java      | 25 ++++---
 .../store/mail/model/MessageMapperTest.java        | 25 ++++---
 .../store/mail/model/MetadataMapAssertTest.java    |  3 +-
 .../mail/model/impl/SimpleMailboxMessageTest.java  | 11 +--
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |  9 ++-
 .../imap/api/message/response/StatusResponse.java  |  5 +-
 .../james/imap/encode/ESearchResponseEncoder.java  |  5 +-
 .../james/imap/encode/FetchResponseEncoder.java    |  5 +-
 .../imap/encode/MailboxStatusResponseEncoder.java  |  5 +-
 .../james/imap/encode/SearchResponseEncoder.java   |  5 +-
 .../imap/message/response/ESearchResponse.java     |  7 +-
 .../james/imap/message/response/FetchResponse.java |  7 +-
 .../message/response/MailboxStatusResponse.java    |  7 +-
 .../imap/message/response/SearchResponse.java      |  7 +-
 .../imap/processor/AbstractMailboxProcessor.java   |  8 +-
 .../imap/processor/AbstractSelectionProcessor.java |  3 +-
 .../james/imap/processor/SearchProcessor.java      | 11 +--
 .../james/imap/processor/StatusProcessor.java      |  5 +-
 .../james/imap/processor/StoreProcessor.java       |  5 +-
 .../james/imap/processor/fetch/FetchProcessor.java |  2 +-
 .../imap/processor/fetch/FetchResponseBuilder.java |  7 +-
 .../processor/base/MailboxEventAnalyserTest.java   |  9 ++-
 .../processor/base/SelectedMailboxImplTest.java    |  3 +-
 .../model/message/view/MessageFullViewFactory.java | 15 ++--
 93 files changed, 536 insertions(+), 433 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 73b967d..58a887e 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -395,7 +395,7 @@ public interface MessageManager {
          * 
          * @return higestModSeq
          */
-        long getHighestModSeq();
+        ModSeq getHighestModSeq();
 
         /**
          * Gets the number of messages that this mailbox contains. This is an
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageUpdateJson.java b/mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java
similarity index 50%
copy from mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageUpdateJson.java
copy to mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java
index f059317..c4be664 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageUpdateJson.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/ModSeq.java
@@ -1,5 +1,3 @@
-
-
 /****************************************************************
  * Licensed to the Apache Software Foundation (ASF) under one   *
  * or more contributor license agreements.  See the NOTICE file *
@@ -19,61 +17,63 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.elasticsearch.json;
+package org.apache.james.mailbox;
 
-import javax.mail.Flags;
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
+public class ModSeq implements Comparable<ModSeq> {
+    public static ModSeq of(long modSeq) {
+        return new ModSeq(modSeq);
+    }
 
-public class MessageUpdateJson {
+    public static ModSeq first() {
+        return of(0L);
+    }
 
-    private final Flags flags;
     private final long modSeq;
 
-    public MessageUpdateJson(Flags flags, long modSeq) {
-        this.flags = flags;
+    private ModSeq(long modSeq) {
+        Preconditions.checkArgument(modSeq >= 0, "A modseq needs to be positive");
         this.modSeq = modSeq;
     }
 
-    @JsonProperty(JsonMessageConstants.IS_ANSWERED)
-    public boolean isAnswered() {
-        return flags.contains(Flags.Flag.ANSWERED);
+    public long asLong() {
+        return modSeq;
     }
 
-    @JsonProperty(JsonMessageConstants.IS_DELETED)
-    public boolean isDeleted() {
-        return flags.contains(Flags.Flag.DELETED);
+    public ModSeq next() {
+        if (modSeq == Long.MAX_VALUE) {
+            throw new RuntimeException("Long overflow upon modseq generation");
+        }
+        return new ModSeq(modSeq + 1);
     }
 
-    @JsonProperty(JsonMessageConstants.IS_DRAFT)
-    public boolean isDraft() {
-        return flags.contains(Flags.Flag.DRAFT);
+    public boolean isFirst() {
+        return this.equals(ModSeq.first());
     }
 
-    @JsonProperty(JsonMessageConstants.IS_FLAGGED)
-    public boolean isFlagged() {
-        return flags.contains(Flags.Flag.FLAGGED);
+    @Override
+    public int compareTo(ModSeq o) {
+        return Long.compare(modSeq, o.modSeq);
     }
-
-    @JsonProperty(JsonMessageConstants.IS_RECENT)
-    public boolean isRecent() {
-        return flags.contains(Flags.Flag.RECENT);
+    
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(modSeq);
     }
-
-    @JsonProperty(JsonMessageConstants.IS_UNREAD)
-    public boolean isUnRead() {
-        return !flags.contains(Flags.Flag.SEEN);
+    
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof ModSeq) {
+            ModSeq other = (ModSeq) obj;
+            return other.modSeq == this.modSeq;
+        }
+        return false;
     }
-
-
-    @JsonProperty(JsonMessageConstants.USER_FLAGS)
-    public String[] getUserFlags() {
-        return flags.getUserFlags();
-    }
-
-    @JsonProperty(JsonMessageConstants.MODSEQ)
-    public long getModSeq() {
-        return modSeq;
+    
+    @Override
+    public String toString() {
+        return "ModSeq{uid=" + modSeq + "}";
     }
-
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaData.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaData.java
index fc5923e..ad05c0d 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaData.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaData.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.model;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.ModSeq;
+
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
@@ -35,7 +37,7 @@ public class ComposedMessageIdWithMetaData {
 
         private ComposedMessageId composedMessageId;
         private Flags flags;
-        private Long modSeq;
+        private ModSeq modSeq;
 
         private Builder() {
         }
@@ -50,7 +52,7 @@ public class ComposedMessageIdWithMetaData {
             return this;
         }
 
-        public Builder modSeq(long modSeq) {
+        public Builder modSeq(ModSeq modSeq) {
             this.modSeq = modSeq;
             return this;
         }
@@ -65,9 +67,9 @@ public class ComposedMessageIdWithMetaData {
 
     private final ComposedMessageId composedMessageId;
     private final Flags flags;
-    private final long modSeq;
+    private final ModSeq modSeq;
 
-    public ComposedMessageIdWithMetaData(ComposedMessageId composedMessageId, Flags flags, long modSeq) {
+    public ComposedMessageIdWithMetaData(ComposedMessageId composedMessageId, Flags flags, ModSeq modSeq) {
         this.composedMessageId = composedMessageId;
         this.flags = flags;
         this.modSeq = modSeq;
@@ -81,7 +83,7 @@ public class ComposedMessageIdWithMetaData {
         return flags;
     }
 
-    public long getModSeq() {
+    public ModSeq getModSeq() {
         return modSeq;
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageMetaData.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageMetaData.java
index 03b26f3..1a6dfa2 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageMetaData.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageMetaData.java
@@ -23,6 +23,7 @@ import java.util.Date;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 
 import com.google.common.base.Objects;
 
@@ -31,10 +32,10 @@ public class MessageMetaData {
     private final Flags flags;
     private final long size;
     private final Date internalDate;
-    private final long modSeq;
+    private final ModSeq modSeq;
     private final MessageId messageId;
 
-    public MessageMetaData(MessageUid uid, long modSeq, Flags flags, long size, Date internalDate, MessageId messageId) {
+    public MessageMetaData(MessageUid uid, ModSeq modSeq, Flags flags, long size, Date internalDate, MessageId messageId) {
         this.uid = uid;
         this.flags = flags;
         this.size = size;
@@ -76,7 +77,7 @@ public class MessageMetaData {
      * Return the modify-sequence number of the message. This is kind of optional and the mailbox
      * implementation may not support this. If so it will return -1
      */
-    public long getModSeq() {
+    public ModSeq getModSeq() {
         return modSeq;
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java
index 40f75cf..2cb24c1 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MessageResult.java
@@ -28,6 +28,7 @@ import java.util.Set;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 
 
@@ -72,7 +73,7 @@ public interface MessageResult extends Comparable<MessageResult> {
 
     MessageUid getUid();
 
-    long getModSeq();
+    ModSeq getModSeq();
 
     /**
      * Indicates the results fetched.
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/UpdatedFlags.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/UpdatedFlags.java
index f1c0562..650a4b3 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/UpdatedFlags.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/UpdatedFlags.java
@@ -27,6 +27,7 @@ import java.util.Optional;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
@@ -44,7 +45,7 @@ public class UpdatedFlags {
         private MessageUid uid;
         private Flags oldFlags;
         private Flags newFlags;
-        private Optional<Long> modSeq = Optional.empty();
+        private Optional<ModSeq> modSeq = Optional.empty();
 
         private Builder() {
         }
@@ -64,7 +65,7 @@ public class UpdatedFlags {
             return this;
         }
 
-        public Builder modSeq(long modSeq) {
+        public Builder modSeq(ModSeq modSeq) {
             this.modSeq = Optional.of(modSeq);
             return this;
         }
@@ -82,9 +83,9 @@ public class UpdatedFlags {
     private final Flags oldFlags;
     private final Flags newFlags;
     private final Flags modifiedFlags;
-    private final long modSeq;
+    private final ModSeq modSeq;
 
-    private UpdatedFlags(MessageUid uid, long modSeq, Flags oldFlags, Flags newFlags) {
+    private UpdatedFlags(MessageUid uid, ModSeq modSeq, Flags oldFlags, Flags newFlags) {
        this.uid = uid;
        this.modSeq = modSeq;
        this.oldFlags = oldFlags;
@@ -197,7 +198,7 @@ public class UpdatedFlags {
     /**
      * Return the new mod-sequence for the message
      */
-    public long getModSeq() {
+    public ModSeq getModSeq() {
         return modSeq;
     }
     
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
index fdaaf67..0036592 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxListenerTest.java
@@ -48,6 +48,7 @@ import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSortedMap;
+
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 class MailboxListenerTest {
@@ -64,7 +65,7 @@ class MailboxListenerTest {
     private static final MailboxACL ACL_2 = new MailboxACL(
         Pair.of(MailboxACL.EntryKey.createUserEntryKey(Username.of("Bob")), new MailboxACL.Rfc4314Rights(MailboxACL.Right.Read)));
     private static final MessageUid UID = MessageUid.of(85);
-    private static final MessageMetaData META_DATA = new MessageMetaData(UID, 45, new Flags(), 45, new Date(), TestMessageId.of(75));
+    private static final MessageMetaData META_DATA = new MessageMetaData(UID, ModSeq.of(45), new Flags(), 45, new Date(), TestMessageId.of(75));
 
     @Test
     void mailboxAddedShouldMatchBeanContract() {
@@ -193,7 +194,7 @@ class MailboxListenerTest {
         MailboxListener.FlagsUpdated flagsUpdated = new MailboxListener.FlagsUpdated(SESSION_ID, BOB, PATH, MAILBOX_ID,
             ImmutableList.of(UpdatedFlags.builder()
                 .uid(UID)
-                .modSeq(45)
+                .modSeq(ModSeq.of(45))
                 .newFlags(new Flags())
                 .oldFlags(new Flags(Flags.Flag.ANSWERED))
                 .build()),
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index fac59ae..d3cb1a1 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -1387,7 +1387,7 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 softly -> {
                     softly.assertThat(metaData)
                         .extracting(MessageManager.MetaData::getHighestModSeq)
-                        .isEqualTo(0L);
+                        .isEqualTo(ModSeq.first());
                     softly.assertThat(metaData)
                         .extracting(MessageManager.MetaData::getUidNext)
                         .isEqualTo(MessageUid.MIN_VALUE);
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaDataTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaDataTest.java
index b120c87..77070ee 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaDataTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/ComposedMessageIdWithMetaDataTest.java
@@ -25,6 +25,7 @@ import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
@@ -62,7 +63,7 @@ class ComposedMessageIdWithMetaDataTest {
     @Test
     void buildShoudWork() {
         Flags flags = new Flags(Flag.RECENT);
-        long modSeq = 1;
+        ModSeq modSeq = ModSeq.of(1);
 
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
             .composedMessageId(COMPOSED_MESSAGE_ID)
@@ -80,7 +81,7 @@ class ComposedMessageIdWithMetaDataTest {
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(TEST_ID, TEST_MESSAGE_ID, MESSAGE_UID))
                 .flags(new Flags(Flag.RECENT))
-                .modSeq((long) 1)
+                .modSeq(ModSeq.of(1))
                 .build();
 
         assertThat(composedMessageIdWithMetaData.isMatching(TEST_MESSAGE_ID)).isTrue();
@@ -91,7 +92,7 @@ class ComposedMessageIdWithMetaDataTest {
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(COMPOSED_MESSAGE_ID)
                 .flags(new Flags(Flag.RECENT))
-                .modSeq((long) 1)
+                .modSeq(ModSeq.of(1))
                 .build();
 
         assertThat(composedMessageIdWithMetaData.isMatching(new TestMessageId("3"))).isFalse();
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/UpdatedFlagsTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/UpdatedFlagsTest.java
index 1c81a4d..aee926e 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/UpdatedFlagsTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/UpdatedFlagsTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
@@ -31,7 +32,7 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 class UpdatedFlagsTest {
 
     public static final MessageUid UID = MessageUid.of(45L);
-    public static final long MOD_SEQ = 47L;
+    public static final ModSeq MOD_SEQ = ModSeq.of(47L);
 
     @Test
     void shouldMatchBeanContract() {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
index e74a667..11b6045 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAO.java
@@ -50,6 +50,7 @@ import javax.mail.Flags.Flag;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId.Factory;
@@ -173,7 +174,7 @@ public class CassandraMessageIdDAO {
                 .setUUID(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid())
                 .setLong(IMAP_UID, composedMessageId.getUid().asLong())
                 .setUUID(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get())
-                .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq())
+                .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq().asLong())
                 .setBool(ANSWERED, flags.contains(Flag.ANSWERED))
                 .setBool(DELETED, flags.contains(Flag.DELETED))
                 .setBool(DRAFT, flags.contains(Flag.DRAFT))
@@ -188,7 +189,7 @@ public class CassandraMessageIdDAO {
         ComposedMessageId composedMessageId = composedMessageIdWithMetaData.getComposedMessageId();
         Flags flags = composedMessageIdWithMetaData.getFlags();
         return cassandraAsyncExecutor.executeVoid(update.bind()
-                .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq())
+                .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq().asLong())
                 .setBool(ANSWERED, flags.contains(Flag.ANSWERED))
                 .setBool(DELETED, flags.contains(Flag.DELETED))
                 .setBool(DRAFT, flags.contains(Flag.DRAFT))
@@ -262,7 +263,7 @@ public class CassandraMessageIdDAO {
                         messageIdFactory.of(row.getUUID(MESSAGE_ID)),
                         MessageUid.of(row.getLong(IMAP_UID))))
                 .flags(new FlagsExtractor(row).getFlags())
-                .modSeq(row.getLong(MOD_SEQ))
+                .modSeq(ModSeq.of(row.getLong(MOD_SEQ)))
                 .build();
     }
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
index 8c31e8d..bbd693d 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAO.java
@@ -49,6 +49,7 @@ import javax.mail.Flags.Flag;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId.Factory;
@@ -63,6 +64,7 @@ import com.datastax.driver.core.Statement;
 import com.datastax.driver.core.querybuilder.QueryBuilder;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
+
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
@@ -162,7 +164,7 @@ public class CassandraMessageIdToImapUidDAO {
                 .setUUID(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get())
                 .setUUID(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid())
                 .setLong(IMAP_UID, composedMessageId.getUid().asLong())
-                .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq())
+                .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq().asLong())
                 .setBool(ANSWERED, flags.contains(Flag.ANSWERED))
                 .setBool(DELETED, flags.contains(Flag.DELETED))
                 .setBool(DRAFT, flags.contains(Flag.DRAFT))
@@ -173,11 +175,11 @@ public class CassandraMessageIdToImapUidDAO {
                 .setSet(USER_FLAGS, ImmutableSet.copyOf(flags.getUserFlags())));
     }
 
-    public Mono<Boolean> updateMetadata(ComposedMessageIdWithMetaData composedMessageIdWithMetaData, long oldModSeq) {
+    public Mono<Boolean> updateMetadata(ComposedMessageIdWithMetaData composedMessageIdWithMetaData, ModSeq oldModSeq) {
         ComposedMessageId composedMessageId = composedMessageIdWithMetaData.getComposedMessageId();
         Flags flags = composedMessageIdWithMetaData.getFlags();
         return cassandraAsyncExecutor.executeReturnApplied(update.bind()
-                .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq())
+                .setLong(MOD_SEQ, composedMessageIdWithMetaData.getModSeq().asLong())
                 .setBool(ANSWERED, flags.contains(Flag.ANSWERED))
                 .setBool(DELETED, flags.contains(Flag.DELETED))
                 .setBool(DRAFT, flags.contains(Flag.DRAFT))
@@ -189,7 +191,7 @@ public class CassandraMessageIdToImapUidDAO {
                 .setUUID(MESSAGE_ID, ((CassandraMessageId) composedMessageId.getMessageId()).get())
                 .setUUID(MAILBOX_ID, ((CassandraId) composedMessageId.getMailboxId()).asUuid())
                 .setLong(IMAP_UID, composedMessageId.getUid().asLong())
-                .setLong(MOD_SEQ_CONDITION, oldModSeq));
+                .setLong(MOD_SEQ_CONDITION, oldModSeq.asLong()));
     }
 
     public Flux<ComposedMessageIdWithMetaData> retrieve(CassandraMessageId messageId, Optional<CassandraId> mailboxId) {
@@ -206,7 +208,7 @@ public class CassandraMessageIdToImapUidDAO {
                     messageIdFactory.of(row.getUUID(MESSAGE_ID)),
                     MessageUid.of(row.getLong(IMAP_UID))))
                 .flags(new FlagsExtractor(row).getFlags())
-                .modSeq(row.getLong(MOD_SEQ))
+                .modSeq(ModSeq.of(row.getLong(MOD_SEQ)))
                 .build();
     }
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index b11c836..0d3b43c 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.ApplicableFlagBuilder;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.utils.FlagsUpdateStageResult;
@@ -261,7 +262,7 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
     @Override
-    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
         return modSeqProvider.highestModSeq(mailboxSession, mailbox);
     }
 
@@ -277,7 +278,7 @@ public class CassandraMessageMapper implements MessageMapper {
 
     private MailboxMessage addUidAndModseq(MailboxMessage message, CassandraId mailboxId) throws MailboxException {
         final Mono<MessageUid> messageUidMono = uidProvider.nextUid(mailboxId).cache();
-        final Mono<Long> nextModSeqMono = modSeqProvider.nextModSeq(mailboxId).cache();
+        final Mono<ModSeq> nextModSeqMono = modSeqProvider.nextModSeq(mailboxId).cache();
         Flux.merge(messageUidMono, nextModSeqMono).then();
 
         message.setUid(messageUidMono.blockOptional()
@@ -326,14 +327,14 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
     private Mono<FlagsUpdateStageResult> runUpdateStage(CassandraId mailboxId, Flux<ComposedMessageIdWithMetaData> toBeUpdated, FlagsUpdateCalculator flagsUpdateCalculator) {
-        Mono<Long> newModSeq = computeNewModSeq(mailboxId);
+        Mono<ModSeq> newModSeq = computeNewModSeq(mailboxId);
         return toBeUpdated
             .concatMap(metadata -> newModSeq.flatMap(modSeq -> tryFlagsUpdate(flagsUpdateCalculator, modSeq, metadata)))
             .reduce(FlagsUpdateStageResult.none(), FlagsUpdateStageResult::merge)
             .flatMap(result -> updateIndexesForUpdatesResult(mailboxId, result));
     }
 
-    private Mono<Long> computeNewModSeq(CassandraId mailboxId) {
+    private Mono<ModSeq> computeNewModSeq(CassandraId mailboxId) {
         return modSeqProvider.nextModSeq(mailboxId)
             .switchIfEmpty(ReactorUtils.executeAndEmpty(() -> new RuntimeException("ModSeq generation failed for mailbox " + mailboxId.asUuid())));
     }
@@ -402,7 +403,7 @@ public class CassandraMessageMapper implements MessageMapper {
     }
 
 
-    private Mono<FlagsUpdateStageResult> tryFlagsUpdate(FlagsUpdateCalculator flagUpdateCalculator, long newModSeq, ComposedMessageIdWithMetaData oldMetaData) {
+    private Mono<FlagsUpdateStageResult> tryFlagsUpdate(FlagsUpdateCalculator flagUpdateCalculator, ModSeq newModSeq, ComposedMessageIdWithMetaData oldMetaData) {
         Flags oldFlags = oldMetaData.getFlags();
         Flags newFlags = flagUpdateCalculator.buildNewFlags(oldFlags);
 
@@ -434,7 +435,7 @@ public class CassandraMessageMapper implements MessageMapper {
         return oldFlags.equals(newFlags);
     }
 
-    private Mono<Boolean> updateFlags(ComposedMessageIdWithMetaData oldMetadata, Flags newFlags, long newModSeq) {
+    private Mono<Boolean> updateFlags(ComposedMessageIdWithMetaData oldMetadata, Flags newFlags, ModSeq newModSeq) {
         ComposedMessageIdWithMetaData newMetadata = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(oldMetadata.getComposedMessageId())
                 .modSeq(newModSeq)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
index 97fe21f..b2e7460 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProvider.java
@@ -39,6 +39,7 @@ import javax.inject.Inject;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -49,7 +50,6 @@ import org.apache.james.util.FunctionalUtils;
 import com.datastax.driver.core.ConsistencyLevel;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
-import com.google.common.base.MoreObjects;
 
 import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
@@ -83,8 +83,6 @@ public class CassandraModSeqProvider implements ModSeqProvider {
         }
     }
 
-    private static final ModSeq FIRST_MODSEQ = new ModSeq(0);
-
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final PreparedStatement select;
     private final PreparedStatement update;
@@ -122,7 +120,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
 
 
     @Override
-    public long nextModSeq(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException {
+    public ModSeq nextModSeq(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException {
         CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
         return nextModSeq(mailboxId)
             .blockOptional()
@@ -130,20 +128,20 @@ public class CassandraModSeqProvider implements ModSeqProvider {
     }
 
     @Override
-    public long nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
         return nextModSeq((CassandraId) mailboxId)
             .blockOptional()
             .orElseThrow(() -> new MailboxException("Can not retrieve modseq for " + mailboxId));
     }
 
     @Override
-    public long highestModSeq(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException {
         return highestModSeq(mailboxSession, mailbox.getMailboxId());
     }
 
     @Override
-    public long highestModSeq(MailboxSession mailboxSession, MailboxId mailboxId) throws MailboxException {
-        return unbox(() -> findHighestModSeq((CassandraId) mailboxId).block().orElse(FIRST_MODSEQ).getValue());
+    public ModSeq highestModSeq(MailboxSession mailboxSession, MailboxId mailboxId) throws MailboxException {
+        return unbox(() -> findHighestModSeq((CassandraId) mailboxId).block().orElse(ModSeq.first()));
     }
 
     private Mono<Optional<ModSeq>> findHighestModSeq(CassandraId mailboxId) {
@@ -151,7 +149,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
             select.bind()
                 .setUUID(MAILBOX_ID, mailboxId.asUuid())
                 .setConsistencyLevel(ConsistencyLevel.SERIAL))
-            .map(maybeRow -> maybeRow.map(row -> new ModSeq(row.getLong(NEXT_MODSEQ))));
+            .map(maybeRow -> maybeRow.map(row -> ModSeq.of(row.getLong(NEXT_MODSEQ))));
     }
 
     private Mono<ModSeq> tryInsertModSeq(CassandraId mailboxId, ModSeq modSeq) {
@@ -159,7 +157,7 @@ public class CassandraModSeqProvider implements ModSeqProvider {
         return cassandraAsyncExecutor.executeReturnApplied(
             insert.bind()
                 .setUUID(MAILBOX_ID, mailboxId.asUuid())
-                .setLong(NEXT_MODSEQ, nextModSeq.getValue()))
+                .setLong(NEXT_MODSEQ, nextModSeq.asLong()))
             .flatMap(success -> successToModSeq(nextModSeq, success));
     }
 
@@ -168,8 +166,8 @@ public class CassandraModSeqProvider implements ModSeqProvider {
         return cassandraAsyncExecutor.executeReturnApplied(
             update.bind()
                 .setUUID(MAILBOX_ID, mailboxId.asUuid())
-                .setLong(NEXT_MODSEQ, nextModSeq.getValue())
-                .setLong(MOD_SEQ_CONDITION, modSeq.getValue()))
+                .setLong(NEXT_MODSEQ, nextModSeq.asLong())
+                .setLong(MOD_SEQ_CONDITION, modSeq.asLong()))
             .flatMap(success -> successToModSeq(nextModSeq, success));
     }
 
@@ -179,13 +177,12 @@ public class CassandraModSeqProvider implements ModSeqProvider {
             .map(any -> modSeq);
     }
 
-    public Mono<Long> nextModSeq(CassandraId mailboxId) {
+    public Mono<ModSeq> nextModSeq(CassandraId mailboxId) {
         return findHighestModSeq(mailboxId)
             .flatMap(maybeHighestModSeq -> maybeHighestModSeq
                         .map(highestModSeq -> tryUpdateModSeq(mailboxId, highestModSeq))
-                        .orElseGet(() -> tryInsertModSeq(mailboxId, FIRST_MODSEQ)))
-            .switchIfEmpty(handleRetries(mailboxId))
-            .map(ModSeq::getValue);
+                        .orElseGet(() -> tryInsertModSeq(mailboxId, ModSeq.first())))
+            .switchIfEmpty(handleRetries(mailboxId));
     }
 
     private Mono<ModSeq> handleRetries(CassandraId mailboxId) {
@@ -201,27 +198,4 @@ public class CassandraModSeqProvider implements ModSeqProvider {
             .flatMap(highestModSeq -> tryUpdateModSeq(mailboxId, highestModSeq)));
     }
 
-    private static class ModSeq {
-        private final long value;
-        
-        public ModSeq(long value) {
-            this.value = value;
-        }
-        
-        public ModSeq next() {
-            return new ModSeq(value + 1);
-        }
-        
-        public long getValue() {
-            return value;
-        }
-
-        @Override
-        public String toString() {
-            return MoreObjects.toStringHelper(this)
-                    .add("value", value)
-                    .toString();
-        }
-    }
-
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java
index 226e8bc..618ebb5 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java
@@ -26,6 +26,7 @@ import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MailboxId;
@@ -44,11 +45,11 @@ public class MessageWithoutAttachment {
     private final PropertyBuilder propertyBuilder;
     private final MailboxId mailboxId;
     private final MessageUid messageUid;
-    private final long modSeq;
+    private final ModSeq modSeq;
     private final boolean hasAttachment;
 
     public MessageWithoutAttachment(MessageId messageId, Date internalDate, Long size, Integer bodySize, SharedByteArrayInputStream content,
-                                    Flags flags, PropertyBuilder propertyBuilder, MailboxId mailboxId, MessageUid messageUid, long modSeq,
+                                    Flags flags, PropertyBuilder propertyBuilder, MailboxId mailboxId, MessageUid messageUid, ModSeq modSeq,
                                     boolean hasAttachment) {
         this.messageId = messageId;
         this.internalDate = internalDate;
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
index d7ff535..33f0d05 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
@@ -32,6 +32,7 @@ import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
@@ -58,7 +59,7 @@ class CassandraIndexTableHandlerTest {
     private static final MessageUid MESSAGE_UID = MessageUid.of(18L);
     private static final CassandraMessageId CASSANDRA_MESSAGE_ID = new CassandraMessageId.Factory().generate();
     private static final int UID_VALIDITY = 15;
-    private static final long MODSEQ = 17;
+    private static final ModSeq MODSEQ = ModSeq.of(17);
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
index 0e3a48c..cc84fad 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMapperProvider.java
@@ -26,6 +26,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.TestCassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -112,13 +113,13 @@ public class CassandraMapperProvider implements MapperProvider {
     }
 
     @Override
-    public long generateModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq generateModSeq(Mailbox mailbox) throws MailboxException {
         MailboxSession mailboxSession = null;
         return cassandraModSeqProvider.nextModSeq(mailboxSession, mailbox);
     }
 
     @Override
-    public long highestModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
         MailboxSession mailboxSession = null;
         return cassandraModSeqProvider.highestModSeq(mailboxSession, mailbox);
     }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
index 1dbde73..90b136d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
@@ -42,6 +42,7 @@ import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStore;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.CassandraMessageDAO.MessageIdAttachmentIds;
@@ -103,7 +104,7 @@ class CassandraMessageDAOTest {
         messageIds = ImmutableList.of(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(MAILBOX_ID, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build());
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
index b42f6a2..f556a2e 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
@@ -31,6 +31,7 @@ import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
@@ -76,7 +77,7 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
@@ -97,12 +98,12 @@ class CassandraMessageIdDAOTest {
             ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build()),
             testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId2, messageUid2))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build()))
         .blockLast();
 
@@ -123,7 +124,7 @@ class CassandraMessageIdDAOTest {
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         testee.insert(composedMessageIdWithMetaData).block();
 
@@ -141,14 +142,14 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -166,14 +167,14 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.ANSWERED))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -191,14 +192,14 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.DELETED))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -216,14 +217,14 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.DRAFT))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -241,14 +242,14 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.FLAGGED))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -266,14 +267,14 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.RECENT))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -291,14 +292,14 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.SEEN))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -316,14 +317,14 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.USER))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -341,7 +342,7 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
@@ -350,7 +351,7 @@ class CassandraMessageIdDAOTest {
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(flags)
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
         testee.updateMetadata(expectedComposedMessageId).block();
 
@@ -366,7 +367,7 @@ class CassandraMessageIdDAOTest {
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         testee.insert(composedMessageIdWithMetaData).block();
 
@@ -386,12 +387,12 @@ class CassandraMessageIdDAOTest {
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData2 = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId2, messageUid2))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         Flux.merge(testee.insert(composedMessageIdWithMetaData),
                 testee.insert(composedMessageIdWithMetaData2))
@@ -414,18 +415,18 @@ class CassandraMessageIdDAOTest {
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId2, messageUid2))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData2 = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId3, messageUid3))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         Flux.merge(testee.insert(
                 ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build()),
                 testee.insert(composedMessageIdWithMetaData),
                 testee.insert(composedMessageIdWithMetaData2))
@@ -450,27 +451,27 @@ class CassandraMessageIdDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId2, messageUid2))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
 
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData2 = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId3, messageUid3))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         Flux.merge(testee.insert(composedMessageIdWithMetaData),
                 testee.insert(composedMessageIdWithMetaData2),
                 testee.insert(ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId, messageId4, messageUid4))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build()))
         .blockLast();
 
@@ -491,19 +492,19 @@ class CassandraMessageIdDAOTest {
         ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId2, messageUid2))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         Flux.merge(testee.insert(
                 ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build()),
                 testee.insert(composedMessageIdWithMetaData),
                 testee.insert(ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId, messageId3, messageUid3))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build()))
         .blockLast();
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
index 530addd..8d5d508 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
@@ -32,6 +32,7 @@ import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMessageModule;
@@ -79,7 +80,7 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build())
                 .block();
 
@@ -100,12 +101,12 @@ class CassandraMessageIdToImapUidDAOTest {
             testee.insert(ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build()),
             testee.insert(ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId2, messageId, messageUid2))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build()))
         .blockLast();
 
@@ -114,7 +115,7 @@ class CassandraMessageIdToImapUidDAOTest {
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId2, messageId, messageUid2))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.empty()).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -129,14 +130,14 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -151,11 +152,11 @@ class CassandraMessageIdToImapUidDAOTest {
         ComposedMessageIdWithMetaData composedMessageIdWithFlags = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         testee.insert(composedMessageIdWithFlags).block();
 
-        Boolean result = testee.updateMetadata(composedMessageIdWithFlags, 1).block();
+        Boolean result = testee.updateMetadata(composedMessageIdWithFlags, ModSeq.of(1)).block();
 
         assertThat(result).isTrue();
     }
@@ -169,11 +170,11 @@ class CassandraMessageIdToImapUidDAOTest {
         ComposedMessageIdWithMetaData composedMessageIdWithFlags = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         testee.insert(composedMessageIdWithFlags).block();
 
-        Boolean result = testee.updateMetadata(composedMessageIdWithFlags, 3).block();
+        Boolean result = testee.updateMetadata(composedMessageIdWithFlags, ModSeq.of(3)).block();
 
         assertThat(result).isFalse();
     }
@@ -188,16 +189,16 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        testee.updateMetadata(expectedComposedMessageId, 1).block();
+        testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -213,16 +214,16 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.ANSWERED))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        testee.updateMetadata(expectedComposedMessageId, 1).block();
+        testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -238,16 +239,16 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.DELETED))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        testee.updateMetadata(expectedComposedMessageId, 1).block();
+        testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -263,16 +264,16 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.DRAFT))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        testee.updateMetadata(expectedComposedMessageId, 1).block();
+        testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -288,16 +289,16 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.FLAGGED))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        testee.updateMetadata(expectedComposedMessageId, 1).block();
+        testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -313,16 +314,16 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.RECENT))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        testee.updateMetadata(expectedComposedMessageId, 1).block();
+        testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -338,16 +339,16 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.SEEN))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        assertThat(testee.updateMetadata(expectedComposedMessageId, 1).block())
+        assertThat(testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block())
             .isTrue();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
@@ -364,16 +365,16 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags(Flag.USER))
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        testee.updateMetadata(expectedComposedMessageId, 1).block();
+        testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -389,7 +390,7 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
@@ -398,9 +399,9 @@ class CassandraMessageIdToImapUidDAOTest {
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(composedMessageId)
                 .flags(flags)
-                .modSeq(2)
+                .modSeq(ModSeq.of(2))
                 .build();
-        testee.updateMetadata(expectedComposedMessageId, 1).block();
+        testee.updateMetadata(expectedComposedMessageId, ModSeq.of(1)).block();
 
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
         assertThat(messages).containsOnly(expectedComposedMessageId);
@@ -414,14 +415,14 @@ class CassandraMessageIdToImapUidDAOTest {
         testee.insert(ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build())
             .block();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.of(mailboxId)).collectList().block();
 
@@ -439,24 +440,24 @@ class CassandraMessageIdToImapUidDAOTest {
                 testee.insert(ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build()),
                 testee.insert(ComposedMessageIdWithMetaData.builder()
                     .composedMessageId(new ComposedMessageId(mailboxId2, messageId, messageUid2))
                     .flags(new Flags())
-                    .modSeq(1)
+                    .modSeq(ModSeq.of(1))
                     .build()))
         .blockLast();
 
         ComposedMessageIdWithMetaData expectedComposedMessageId = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId, messageId, messageUid))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         ComposedMessageIdWithMetaData expectedComposedMessageId2 = ComposedMessageIdWithMetaData.builder()
                 .composedMessageId(new ComposedMessageId(mailboxId2, messageId, messageUid2))
                 .flags(new Flags())
-                .modSeq(1)
+                .modSeq(ModSeq.of(1))
                 .build();
         List<ComposedMessageIdWithMetaData> messages = testee.retrieve(messageId, Optional.empty()).collectList().block();
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
index f956fd3..b0f0af4 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
@@ -30,6 +30,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.core.Username;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
 import org.apache.james.mailbox.model.Mailbox;
@@ -64,12 +65,12 @@ class CassandraModSeqProviderTest {
     @Test
     void highestModSeqShouldRetrieveValueStoredNextModSeq() throws Exception {
         int nbEntries = 100;
-        long result = modSeqProvider.highestModSeq(null, mailbox);
+        ModSeq result = modSeqProvider.highestModSeq(null, mailbox);
         assertThat(result).isEqualTo(0);
         LongStream.range(0, nbEntries)
             .forEach(Throwing.longConsumer(value -> {
-                        long uid = modSeqProvider.nextModSeq(null, mailbox);
-                        assertThat(uid).isEqualTo(modSeqProvider.highestModSeq(null, mailbox));
+                    ModSeq modSeq = modSeqProvider.nextModSeq(null, mailbox);
+                    assertThat(modSeq).isEqualTo(modSeqProvider.highestModSeq(null, mailbox));
                 })
             );
     }
@@ -77,11 +78,11 @@ class CassandraModSeqProviderTest {
     @Test
     void nextModSeqShouldIncrementValueByOne() throws Exception {
         int nbEntries = 100;
-        long lastUid = modSeqProvider.highestModSeq(null, mailbox);
-        LongStream.range(lastUid + 1, lastUid + nbEntries)
+        ModSeq lastModSeq = modSeqProvider.highestModSeq(null, mailbox);
+        LongStream.range(lastModSeq.asLong() + 1, lastModSeq.asLong() + nbEntries)
             .forEach(Throwing.longConsumer(value -> {
-                long result = modSeqProvider.nextModSeq(null, mailbox);
-                assertThat(value).isEqualTo(result);
+                ModSeq result = modSeqProvider.nextModSeq(null, mailbox);
+                assertThat(result.asLong()).isEqualTo(value);
             }));
     }
 
@@ -89,7 +90,7 @@ class CassandraModSeqProviderTest {
     void nextModSeqShouldGenerateUniqueValuesWhenParallelCalls() throws ExecutionException, InterruptedException {
         int nbEntries = 10;
 
-        ConcurrentSkipListSet<Long> modSeqs = new ConcurrentSkipListSet<>();
+        ConcurrentSkipListSet<ModSeq> modSeqs = new ConcurrentSkipListSet<>();
         ConcurrentTestRunner.builder()
             .operation(
                 (threadNumber, step) -> modSeqs.add(modSeqProvider.nextModSeq(null, mailbox)))
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java
index ee959c3..3317b6b 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/utils/FlagsUpdateStageResultTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.UpdatedFlags;
 import org.junit.jupiter.api.Test;
 
@@ -37,13 +38,13 @@ class FlagsUpdateStageResultTest {
     private static final MessageUid OTHER_UID = MessageUid.of(2L);
     private static final UpdatedFlags UPDATED_FLAGS = UpdatedFlags.builder()
         .uid(UID)
-        .modSeq(18L)
+        .modSeq(ModSeq.of(18))
         .oldFlags(new Flags())
         .newFlags(new Flags(Flags.Flag.SEEN))
         .build();
     private static final UpdatedFlags OTHER_UPDATED_FLAGS = UpdatedFlags.builder()
         .uid(OTHER_UID)
-        .modSeq(18L)
+        .modSeq(ModSeq.of(18))
         .oldFlags(new Flags())
         .newFlags(new Flags(Flags.Flag.SEEN))
         .build();
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
index 3409607..40d2b1c 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessage.java
@@ -28,6 +28,7 @@ import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
 import org.apache.james.mailbox.elasticsearch.query.DateResolutionFormater;
 import org.apache.james.mailbox.extractor.TextExtractor;
@@ -137,7 +138,7 @@ public class IndexableMessage {
 
             long uid = message.getUid().asLong();
             String mailboxId = message.getMailboxId().serialize();
-            long modSeq = message.getModSeq();
+            ModSeq modSeq = message.getModSeq();
             long size = message.getFullContentOctets();
             String date = DateResolutionFormater.DATE_TIME_FOMATTER.format(getSanitizedInternalDate(message, zoneId));
             String mediaType = message.getMediaType();
@@ -243,7 +244,7 @@ public class IndexableMessage {
                              boolean isUnRead,
                              String mailboxId,
                              String mediaType, String messageId,
-                             long modSeq,
+                             ModSeq modSeq,
                              String sentDate,
                              long size,
                              Subjects subjects,
@@ -270,7 +271,7 @@ public class IndexableMessage {
         this.mailboxId = mailboxId;
         this.mediaType = mediaType;
         this.messageId = messageId;
-        this.modSeq = modSeq;
+        this.modSeq = modSeq.asLong();
         this.sentDate = sentDate;
         this.size = size;
         this.subjects = subjects;
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
index 3494c49..3892cbe 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJson.java
@@ -26,6 +26,7 @@ import javax.inject.Inject;
 import javax.mail.Flags;
 
 import org.apache.james.core.Username;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -77,7 +78,7 @@ public class MessageToElasticSearchJson {
                 .build());
     }
 
-    public String getUpdatedJsonMessagePart(Flags flags, long modSeq) throws JsonProcessingException {
+    public String getUpdatedJsonMessagePart(Flags flags, ModSeq modSeq) throws JsonProcessingException {
         Preconditions.checkNotNull(flags);
         return mapper.writeValueAsString(new MessageUpdateJson(flags, modSeq));
     }
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageUpdateJson.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageUpdateJson.java
index f059317..e26b25d 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageUpdateJson.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/MessageUpdateJson.java
@@ -23,6 +23,8 @@ package org.apache.james.mailbox.elasticsearch.json;
 
 import javax.mail.Flags;
 
+import org.apache.james.mailbox.ModSeq;
+
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class MessageUpdateJson {
@@ -30,9 +32,9 @@ public class MessageUpdateJson {
     private final Flags flags;
     private final long modSeq;
 
-    public MessageUpdateJson(Flags flags, long modSeq) {
+    public MessageUpdateJson(Flags flags, ModSeq modSeq) {
         this.flags = flags;
-        this.modSeq = modSeq;
+        this.modSeq = modSeq.asLong();
     }
 
     @JsonProperty(JsonMessageConstants.IS_ANSWERED)
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
index 670177e..b7ec704 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndexTest.java
@@ -37,6 +37,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
 import org.apache.james.mailbox.elasticsearch.MailboxElasticSearchConstants;
 import org.apache.james.mailbox.elasticsearch.MailboxIdRoutingKeyFactory;
@@ -83,7 +84,7 @@ public class ElasticSearchListeningMessageSearchIndexTest {
     private static final int SIZE = 25;
     private static final int BODY_START_OCTET = 100;
     private static final TestId MAILBOX_ID = TestId.of(1L);
-    private static final long MOD_SEQ = 42L;
+    private static final ModSeq MOD_SEQ = ModSeq.of(42L);
     private static final Username USERNAME = Username.of("user");
     private static final MessageUid MESSAGE_UID_1 = MessageUid.of(25);
     private static final MessageUid MESSAGE_UID_2 = MessageUid.of(26);
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
index 30cddf8..81f3d20 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/MessageToElasticSearchJsonTest.java
@@ -34,6 +34,7 @@ import javax.mail.Flags;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
 import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.model.MessageId;
@@ -61,7 +62,7 @@ public class MessageToElasticSearchJsonTest {
     private static final int BODY_START_OCTET = 100;
     private static final TestId MAILBOX_ID = TestId.of(18L);
     private static final MessageId MESSAGE_ID = TestMessageId.of(184L);
-    private static final long MOD_SEQ = 42L;
+    private static final ModSeq MOD_SEQ = ModSeq.of(42L);
     private static final MessageUid UID = MessageUid.of(25);
     private static final Username USERNAME = Username.of("username");
 
diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala
index 880e676..f18690a 100644
--- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala
+++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/DTOs.scala
@@ -29,7 +29,7 @@ import org.apache.james.core.quota.{QuotaLimitValue, QuotaUsageValue}
 import org.apache.james.event.json.DTOs.SystemFlag.SystemFlag
 import org.apache.james.mailbox.acl.{ACLDiff => JavaACLDiff}
 import org.apache.james.mailbox.model.{MailboxACL, MessageId, MailboxPath => JavaMailboxPath, MessageMetaData => JavaMessageMetaData, Quota => JavaQuota, UpdatedFlags => JavaUpdatedFlags}
-import org.apache.james.mailbox.{FlagsBuilder, MessageUid}
+import org.apache.james.mailbox.{FlagsBuilder, MessageUid, ModSeq}
 
 import scala.collection.JavaConverters._
 
@@ -83,7 +83,7 @@ object DTOs {
       javaMessageMetaData.getMessageId)
   }
 
-  case class MessageMetaData(uid: MessageUid, modSeq: Long, flags: Flags, size: Long, internalDate: Instant, messageId: MessageId) {
+  case class MessageMetaData(uid: MessageUid, modSeq: ModSeq, flags: Flags, size: Long, internalDate: Instant, messageId: MessageId) {
     def toJava: JavaMessageMetaData = new JavaMessageMetaData(uid, modSeq, Flags.toJavaFlags(flags), size, Date.from(internalDate), messageId)
   }
 
@@ -138,7 +138,7 @@ object DTOs {
       Flags.fromJavaFlags(javaUpdatedFlags.getNewFlags))
   }
 
-  case class UpdatedFlags(uid: MessageUid, modSeq: Long, oldFlags: Flags, newFlags: Flags) {
+  case class UpdatedFlags(uid: MessageUid, modSeq: ModSeq, oldFlags: Flags, newFlags: Flags) {
     def toJava: JavaUpdatedFlags = JavaUpdatedFlags.builder()
       .uid(uid)
       .modSeq(modSeq)
diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
index 87b6e21..d7596e7 100644
--- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
+++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
@@ -29,12 +29,12 @@ import org.apache.james.core.quota.{QuotaCountLimit, QuotaCountUsage, QuotaLimit
 import org.apache.james.event.json.DTOs.SystemFlag.SystemFlag
 import org.apache.james.event.json.DTOs._
 import org.apache.james.mailbox.MailboxSession.SessionId
-import org.apache.james.mailbox.MessageUid
 import org.apache.james.mailbox.events.Event.EventId
 import org.apache.james.mailbox.events.MailboxListener.{Added => JavaAdded, Expunged => JavaExpunged, FlagsUpdated => JavaFlagsUpdated, MailboxACLUpdated => JavaMailboxACLUpdated, MailboxAdded => JavaMailboxAdded, MailboxDeletion => JavaMailboxDeletion, MailboxRenamed => JavaMailboxRenamed, QuotaUsageUpdatedEvent => JavaQuotaUsageUpdatedEvent}
 import org.apache.james.mailbox.events.{Event => JavaEvent, MessageMoveEvent => JavaMessageMoveEvent}
 import org.apache.james.mailbox.model.{MailboxId, MessageId, MessageMoves, QuotaRoot, MailboxACL => JavaMailboxACL, MessageMetaData => JavaMessageMetaData, Quota => JavaQuota}
 import org.apache.james.mailbox.quota.QuotaRootDeserializer
+import org.apache.james.mailbox.{MessageUid, ModSeq}
 import play.api.libs.json._
 
 import scala.collection.JavaConverters._
@@ -218,6 +218,7 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
   implicit val aclDiffWrites: Writes[ACLDiff] = Json.writes[ACLDiff]
   implicit val messageIdWrites: Writes[MessageId] = value => JsString(value.serialize())
   implicit val messageUidWrites: Writes[MessageUid] = value => JsNumber(value.asLong())
+  implicit val modSeqWrites: Writes[ModSeq] = value => JsNumber(value.asLong())
   implicit val userFlagWrites: Writes[UserFlag] = value => JsString(value.value)
   implicit val flagWrites: Writes[Flags] = Json.writes[Flags]
   implicit val eventIdWrites: Writes[EventId] = value => JsString(value.getId.toString)
@@ -281,6 +282,10 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
     case JsNumber(value) => JsSuccess(MessageUid.of(value.toLong))
     case _ => JsError()
   }
+  implicit val modSeqReads: Reads[ModSeq] = {
+    case JsNumber(value) => JsSuccess(ModSeq.of(value.toLong))
+    case _ => JsError()
+  }
   implicit val userFlagsReads: Reads[UserFlag] = {
     case JsString(x) => JsSuccess(UserFlag(x))
     case _ => JsError()
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
index 0bad42a..483123f 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/AddedSerializationTest.java
@@ -36,6 +36,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
@@ -58,7 +59,7 @@ class AddedSerializationTest {
     private static final MessageUid MESSAGE_UID = MessageUid.of(123456);
     private static final Instant INSTANT = Instant.parse("2018-12-14T09:41:51.541Z");
     private static final TestMessageId MESSAGE_ID = TestMessageId.of(42);
-    private static final int MOD_SEQ = 35;
+    private static final ModSeq MOD_SEQ = ModSeq.of(35);
     private static final int SIZE = 45;
     private static final Flags FLAGS = FlagsBuilder.builder()
         .add(Flags.Flag.ANSWERED, Flags.Flag.DRAFT)
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
index 921fd07..06066c3 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/ExpungedSerializationTest.java
@@ -36,6 +36,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
@@ -58,7 +59,7 @@ class ExpungedSerializationTest {
     private static final MessageUid MESSAGE_UID = MessageUid.of(123456);
     private static final Instant INSTANT = Instant.parse("2018-12-14T09:41:51.541Z");
     private static final TestMessageId MESSAGE_ID = TestMessageId.of(42);
-    private static final int MOD_SEQ = 35;
+    private static final ModSeq MOD_SEQ = ModSeq.of(35);
     private static final int SIZE = 45;
     private static final Flags FLAGS = FlagsBuilder.builder()
         .add(Flags.Flag.ANSWERED, Flags.Flag.DRAFT)
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
index 3140c62..8a2347e 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/FlagsUpdatedSerializationTest.java
@@ -34,6 +34,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
@@ -57,7 +58,7 @@ class FlagsUpdatedSerializationTest {
     private static final MessageUid MESSAGE_UID_1 = MessageUid.of(123456);
     private static final MessageUid MESSAGE_UID_2 = MessageUid.of(654321);
 
-    private static final int MOD_SEQ_1 = 35;
+    private static final ModSeq MOD_SEQ_1 = ModSeq.of(35);
     private static final Flags OLD_FLAGS_1 = FlagsBuilder.builder()
         .add(Flags.Flag.SEEN, Flags.Flag.DELETED)
         .add("Old Flag 1")
@@ -73,7 +74,7 @@ class FlagsUpdatedSerializationTest {
         .newFlags(NEW_FLAGS_1)
         .build();
 
-    private static final int MOD_SEQ_2 = 36;
+    private static final ModSeq MOD_SEQ_2 = ModSeq.of(36);
     private static final Flags OLD_FLAGS_2 = FlagsBuilder.builder()
         .add(Flags.Flag.RECENT, Flags.Flag.FLAGGED)
         .add("Old Flag 2")
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ModSeqTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ModSeqTest.java
new file mode 100644
index 0000000..f0044b1
--- /dev/null
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ModSeqTest.java
@@ -0,0 +1,58 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.event.json.dtos;
+
+import static org.apache.james.event.json.SerializerFixture.DTO_JSON_SERIALIZE;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.mailbox.ModSeq;
+import org.junit.jupiter.api.Test;
+
+import play.api.libs.json.JsError;
+import play.api.libs.json.JsNull$;
+import play.api.libs.json.JsNumber;
+import play.api.libs.json.JsString;
+import scala.math.BigDecimal;
+
+class ModSeqTest {
+    @Test
+    void messageUidShouldBeWellSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.modSeqWrites().writes(ModSeq.of(18)))
+            .isEqualTo(new JsNumber(BigDecimal.valueOf(18)));
+    }
+
+    @Test
+    void messageUidShouldBeWellDeSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.modSeqReads().reads(new JsNumber(BigDecimal.valueOf(18))).get())
+            .isEqualTo(ModSeq.of(18));
+    }
+
+    @Test
+    void messageUidShouldReturnErrorWhenString() {
+        assertThat(DTO_JSON_SERIALIZE.modSeqReads().reads(new JsString("18")))
+            .isInstanceOf(JsError.class);
+    }
+
+    @Test
+    void messageUidShouldReturnErrorWhenNull() {
+        assertThat(DTO_JSON_SERIALIZE.modSeqReads().reads(JsNull$.MODULE$))
+            .isInstanceOf(JsError.class);
+    }
+}
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
index a2475fe..c29f6d7 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
@@ -32,6 +32,7 @@ import javax.persistence.Query;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.JPATransactionalMapper;
@@ -324,7 +325,7 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
     }
 
     @Override
-    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
         return messageMetadataMapper.getHighestModSeq(mailbox);
     }
 
@@ -335,7 +336,7 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
             .computeApplicableFlags();
     }
 
-    private MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
+    private MessageMetaData copy(Mailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage original)
             throws MailboxException {
         MailboxMessage copy;
         JPAMailbox currentMailbox = JPAMailbox.from(mailbox);
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
index d1da257..ff1a5e2 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAModSeqProvider.java
@@ -24,6 +24,7 @@ import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceException;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
@@ -41,27 +42,27 @@ public class JPAModSeqProvider implements ModSeqProvider {
     }
 
     @Override
-    public long highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
         JPAId mailboxId = (JPAId) mailbox.getMailboxId();
         return highestModSeq(mailboxId);
     }
 
     @Override
-    public long nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
         return nextModSeq((JPAId) mailbox.getMailboxId());
     }
 
     @Override
-    public long nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
         return nextModSeq((JPAId) mailboxId);
     }
 
     @Override
-    public long highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
         return highestModSeq((JPAId) mailboxId);
     }
 
-    private long nextModSeq(JPAId mailboxId) throws MailboxException {
+    private ModSeq nextModSeq(JPAId mailboxId) throws MailboxException {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
@@ -70,7 +71,7 @@ public class JPAModSeqProvider implements ModSeqProvider {
             long modSeq = m.consumeModSeq();
             manager.persist(m);
             manager.getTransaction().commit();
-            return modSeq;
+            return ModSeq.of(modSeq);
         } catch (PersistenceException e) {
             if (manager != null && manager.getTransaction().isActive()) {
                 manager.getTransaction().rollback();
@@ -83,14 +84,14 @@ public class JPAModSeqProvider implements ModSeqProvider {
         }
     }
 
-    private long highestModSeq(JPAId mailboxId) throws MailboxException {
+    private ModSeq highestModSeq(JPAId mailboxId) throws MailboxException {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
             long highest = (Long) manager.createNamedQuery("findHighestModSeq")
                 .setParameter("idParam", mailboxId.getRawId())
                 .getSingleResult();
-            return highest;
+            return ModSeq.of(highest);
         } catch (PersistenceException e) {
             throw new MailboxException("Unable to get highest mod-sequence for mailbox " + mailboxId.serialize(), e);
         } finally {
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index 55986fc..18bcf7c 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -42,6 +42,7 @@ import javax.persistence.OneToMany;
 import javax.persistence.OrderBy;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
@@ -275,12 +276,12 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
      * @param original
      *            message to be copied, not null
      */
-    public AbstractJPAMailboxMessage(JPAMailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
+    public AbstractJPAMailboxMessage(JPAMailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage original)
             throws MailboxException {
         super();
         this.mailbox = mailbox;
         this.uid = uid.asLong();
-        this.modSeq = modSeq;
+        this.modSeq = modSeq.asLong();
         this.userFlags = new ArrayList<>();
         setFlags(original.createFlags());
 
@@ -322,20 +323,20 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
     @Override
     public ComposedMessageIdWithMetaData getComposedMessageIdWithMetaData() {
         return ComposedMessageIdWithMetaData.builder()
-            .modSeq(modSeq)
+            .modSeq(getModSeq())
             .flags(createFlags())
             .composedMessageId(new ComposedMessageId(mailbox.getMailboxId(), getMessageId(), MessageUid.of(uid)))
             .build();
     }
 
     @Override
-    public long getModSeq() {
-        return modSeq;
+    public ModSeq getModSeq() {
+        return ModSeq.of(modSeq);
     }
 
     @Override
-    public void setModSeq(long modSeq) {
-        this.modSeq = modSeq;
+    public void setModSeq(ModSeq modSeq) {
+        this.modSeq = modSeq.asLong();
     }
 
     @Override
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
index cb03b02..e67f52b 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMailboxMessage.java
@@ -34,6 +34,7 @@ import javax.persistence.Table;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -80,7 +81,7 @@ public class JPAEncryptedMailboxMessage extends AbstractJPAMailboxMessage {
         /**
          * Create a copy of the given message
          */
-        public JPAEncryptedMailboxMessage(JPAMailbox mailbox, MessageUid uid, long modSeq, MailboxMessage message) throws MailboxException {
+        public JPAEncryptedMailboxMessage(JPAMailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage message) throws MailboxException {
             super(mailbox, uid, modSeq, message);
             try {
                 this.body = IOUtils.toByteArray(message.getBodyContent());
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
index 816380d..90c8eee 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAMailboxMessage.java
@@ -34,6 +34,7 @@ import javax.persistence.Table;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -89,7 +90,7 @@ public class JPAMailboxMessage extends AbstractJPAMailboxMessage {
     /**
      * Create a copy of the given message
      */
-    public JPAMailboxMessage(JPAMailbox mailbox, MessageUid uid, long modSeq, MailboxMessage message) throws MailboxException {
+    public JPAMailboxMessage(JPAMailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage message) throws MailboxException {
         super(mailbox, uid, modSeq, message);
         try {
             this.body = IOUtils.toByteArray(message.getBodyContent());
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
index 3055303..9ba8999 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAStreamingMailboxMessage.java
@@ -32,6 +32,7 @@ import javax.persistence.Table;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
@@ -78,7 +79,7 @@ public class JPAStreamingMailboxMessage extends AbstractJPAMailboxMessage {
     /**
      * Create a copy of the given message
      */
-    public JPAStreamingMailboxMessage(JPAMailbox mailbox, MessageUid uid, long modSeq, MailboxMessage message) throws MailboxException {
+    public JPAStreamingMailboxMessage(JPAMailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage message) throws MailboxException {
         super(mailbox, uid, modSeq, message);
         try {
             this.content = new SharedByteArrayInputStream(IOUtils.toByteArray(message.getFullContent()));
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
index eb164f0..a8af899 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
@@ -29,6 +29,7 @@ import org.apache.james.backends.jpa.JpaTestCluster;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
 import org.apache.james.mailbox.model.Mailbox;
@@ -104,12 +105,12 @@ public class JPAMapperProvider implements MapperProvider {
     }
 
     @Override
-    public long generateModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq generateModSeq(Mailbox mailbox) throws MailboxException {
         throw new NotImplementedException("not implemented");
     }
 
     @Override
-    public long highestModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
         throw new NotImplementedException("not implemented");
     }
 
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
index 658547c..2242197 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMessageMapper.java
@@ -29,10 +29,10 @@ import javax.mail.Flags;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
-import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -146,7 +146,7 @@ public class TransactionalMessageMapper implements MessageMapper {
     }
 
     @Override
-    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
         return messageMapper.getHighestModSeq(mailbox);
     }
 
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
index 946f6f2..f744f94 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
@@ -47,6 +47,7 @@ import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.EntryKey;
@@ -206,13 +207,13 @@ public class MaildirFolder {
         return lastUid;
     }
     
-    public long getHighestModSeq() throws IOException {
+    public ModSeq getHighestModSeq() throws IOException {
         long newModified = getNewFolder().lastModified();
         long curModified = getCurFolder().lastModified();
         if (newModified  == 0L && curModified == 0L) {
             throw new IOException("Unable to read highest modSeq");
         }
-        return Math.max(newModified, curModified);
+        return ModSeq.of(Math.max(newModified, curModified));
     }
 
     /**
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
index a2384ec..63f2a96 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
@@ -28,6 +28,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -260,12 +261,12 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public long nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
-        return System.currentTimeMillis();
+    public ModSeq nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+        return ModSeq.of(System.currentTimeMillis());
     }
 
     @Override
-    public long highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
         try {
             return createMaildirFolder(mailbox).getHighestModSeq();
         } catch (IOException e) {
@@ -299,8 +300,8 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public long nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
-        return System.currentTimeMillis();
+    public ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+        return ModSeq.of(System.currentTimeMillis());
     }
 
     @Override
@@ -309,7 +310,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public long highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public ModSeq highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
         throw new NotImplementedException("Not implemented");
     }
 }
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
index 6fccddd..5d87d48 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
@@ -38,6 +38,7 @@ import javax.mail.Flags.Flag;
 import org.apache.commons.io.FileUtils;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.maildir.MaildirFolder;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
@@ -197,7 +198,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
                     } else {
                         modSeq = messageFile.lastModified();
                     }
-                    member.setModSeq(modSeq);
+                    member.setModSeq(ModSeq.of(modSeq));
 
                     updatedFlags.add(UpdatedFlags.builder()
                         .uid(member.getUid())
@@ -273,7 +274,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
     }
 
     @Override
-    protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
+    protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage original)
             throws MailboxException {
         SimpleMailboxMessage theCopy = SimpleMailboxMessage.copyWithoutAttachments(mailbox.getMailboxId(), original);
         Flags flags = theCopy.createFlags();
@@ -337,7 +338,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
         try {
             uid = folder.appendMessage(newMessageFile.getName());
             message.setUid(uid);
-            message.setModSeq(newMessageFile.lastModified());
+            message.setModSeq(ModSeq.of(newMessageFile.lastModified()));
             return message.metaData();
         } catch (MailboxException e) {
             throw new MailboxException("Failure while save MailboxMessage " + message + " in Mailbox " + mailbox, e);
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
index 03af11a..70ffdaa 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/model/MaildirMailboxMessage.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.maildir.MaildirFolder;
 import org.apache.james.mailbox.maildir.MaildirId;
 import org.apache.james.mailbox.maildir.MaildirMessageName;
@@ -44,14 +45,14 @@ public class MaildirMailboxMessage extends DelegatingMailboxMessage {
     private final Mailbox mailbox;
     private MessageUid uid;
     protected boolean newMessage;
-    private long modSeq;
+    private ModSeq modSeq;
     
     public MaildirMailboxMessage(Mailbox mailbox, MessageUid messageUid, MaildirMessageName messageName) throws IOException {
         super(new MaildirMessage(messageName));
 
         this.mailbox = mailbox;
         setUid(messageUid);
-        setModSeq(messageName.getFile().lastModified());
+        setModSeq(ModSeq.of(messageName.getFile().lastModified()));
         Flags flags = messageName.getFlags();
         
         // Set the flags for the message and respect if its RECENT
@@ -149,12 +150,12 @@ public class MaildirMailboxMessage extends DelegatingMailboxMessage {
     }
 
     @Override
-    public long getModSeq() {
+    public ModSeq getModSeq() {
         return modSeq;
     }
 
     @Override
-    public void setModSeq(long modSeq) {
+    public void setModSeq(ModSeq modSeq) {
         this.modSeq = modSeq;
     }
 
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
index f87f946..e2c991c 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageMapper.java
@@ -32,6 +32,7 @@ import javax.mail.Flags.Flag;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.Mailbox;
@@ -202,7 +203,7 @@ public class InMemoryMessageMapper extends AbstractMessageMapper {
     }
 
     @Override
-    protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original)
+    protected MessageMetaData copy(Mailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage original)
             throws MailboxException {
         SimpleMailboxMessage message = SimpleMailboxMessage.copy(mailbox.getMailboxId(), original);
         message.setUid(uid);
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java
index 34f7b6d..08c1007 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryModSeqProvider.java
@@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.Mailbox;
@@ -34,36 +35,36 @@ public class InMemoryModSeqProvider implements ModSeqProvider {
     private final ConcurrentMap<InMemoryId, AtomicLong> map = new ConcurrentHashMap<>();
 
     @Override
-    public long nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
-        return nextModSeq((InMemoryId) mailbox.getMailboxId());
+    public ModSeq nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+        return ModSeq.of(nextModSeq((InMemoryId) mailbox.getMailboxId()));
 
     }
 
     @Override
-    public long nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
-        return nextModSeq((InMemoryId) mailboxId);
+    public ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+        return ModSeq.of(nextModSeq((InMemoryId) mailboxId));
     }
 
     @Override
-    public long highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
-        return getHighest((InMemoryId) mailbox.getMailboxId()).get();
+    public ModSeq highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException {
+        return ModSeq.of(getHighest((InMemoryId) mailbox.getMailboxId()).get());
     }
 
     @Override
-    public long highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
-        return getHighest((InMemoryId) mailboxId).get();
+    public ModSeq highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+        return ModSeq.of(getHighest((InMemoryId) mailboxId).get());
     }
 
     private AtomicLong getHighest(InMemoryId id) {
-        AtomicLong uid = map.get(id);
-        if (uid == null) {
-            uid = new AtomicLong(0);
-            AtomicLong u = map.putIfAbsent(id, uid);
+        AtomicLong modSeq = map.get(id);
+        if (modSeq == null) {
+            modSeq = new AtomicLong(0);
+            AtomicLong u = map.putIfAbsent(id, modSeq);
             if (u != null) {
-                uid = u;
+                modSeq = u;
             }
         }
-        return uid;
+        return modSeq;
     }
 
     private long nextModSeq(InMemoryId mailboxId) {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
index a15ecd1..99ccba0 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMapperProvider.java
@@ -26,6 +26,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
@@ -112,13 +113,13 @@ public class InMemoryMapperProvider implements MapperProvider {
     }
 
     @Override
-    public long generateModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq generateModSeq(Mailbox mailbox) throws MailboxException {
         return inMemoryMailboxSessionMapperFactory.getModSeqProvider()
                 .nextModSeq(MAILBOX_SESSION, mailbox);
     }
 
     @Override
-    public long highestModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq highestModSeq(Mailbox mailbox) throws MailboxException {
         return inMemoryMailboxSessionMapperFactory.getModSeqProvider()
             .highestModSeq(MAILBOX_SESSION, mailbox);
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
index a9a4f26..479f598 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxMetaData.java
@@ -27,6 +27,7 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxACL;
 
@@ -40,7 +41,7 @@ public class MailboxMetaData implements MessageManager.MetaData {
     public static MailboxMetaData sensibleInformationFree(MailboxACL resolvedAcl, long uidValidity, boolean writeable, boolean modSeqPermanent) throws MailboxException {
         ImmutableList<MessageUid> recents = ImmutableList.of();
         MessageUid uidNext = MessageUid.MIN_VALUE;
-        long highestModSeq = 0L;
+        ModSeq highestModSeq = ModSeq.first();
         long messageCount = 0L;
         long unseenCount = 0L;
         MessageUid firstUnseen = null;
@@ -67,12 +68,11 @@ public class MailboxMetaData implements MessageManager.MetaData {
     private final long unseenCount;
     private final MessageUid firstUnseen;
     private final boolean writeable;
-    private final long highestModSeq;
+    private final ModSeq highestModSeq;
     private final boolean modSeqPermanent;
     private final MailboxACL acl;
 
-    public MailboxMetaData(List<MessageUid> recent, Flags permanentFlags, long uidValidity, MessageUid uidNext, long highestModSeq, long messageCount, long unseenCount, MessageUid firstUnseen, boolean writeable, boolean modSeqPermanent, MailboxACL acl) {
-        super();
+    public MailboxMetaData(List<MessageUid> recent, Flags permanentFlags, long uidValidity, MessageUid uidNext, ModSeq highestModSeq, long messageCount, long unseenCount, MessageUid firstUnseen, boolean writeable, boolean modSeqPermanent, MailboxACL acl) {
         this.recent = Optional.ofNullable(recent).orElseGet(ArrayList::new);
         this.highestModSeq = highestModSeq;
         this.recentCount = this.recent.size();
@@ -134,7 +134,7 @@ public class MailboxMetaData implements MessageManager.MetaData {
     }
 
     @Override
-    public long getHighestModSeq() {
+    public ModSeq getHighestModSeq() {
         return highestModSeq;
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
index a39e379..0e4e4a1 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MessageResultImpl.java
@@ -30,6 +30,7 @@ import java.util.Map;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Content;
 import org.apache.james.mailbox.model.Headers;
@@ -96,7 +97,7 @@ public class MessageResultImpl implements MessageResult {
     }
 
     @Override
-    public long getModSeq() {
+    public ModSeq getModSeq() {
         return messageMetaData().getModSeq();
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index c440924..c4a8bd1 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.MetadataWithMailboxId;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -395,7 +396,7 @@ public class StoreMessageIdManager implements MessageIdManager {
     }
 
     private void save(MailboxSession mailboxSession, MessageIdMapper messageIdMapper, MailboxMessage mailboxMessage) throws MailboxException {
-        long modSeq = mailboxSessionMapperFactory.getModSeqProvider().nextModSeq(mailboxSession, mailboxMessage.getMailboxId());
+        ModSeq modSeq = mailboxSessionMapperFactory.getModSeqProvider().nextModSeq(mailboxSession, mailboxMessage.getMailboxId());
         MessageUid uid = mailboxSessionMapperFactory.getUidProvider().nextUid(mailboxSession, mailboxMessage.getMailboxId());
         mailboxMessage.setModSeq(modSeq);
         mailboxMessage.setUid(uid);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
index 73954ff..b7e5df3 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageManager.java
@@ -51,6 +51,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.MetadataWithMailboxId;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -537,7 +538,7 @@ public class StoreMessageManager implements MessageManager {
         MessageUid uidNext = mapperFactory.getMessageMapper(mailboxSession).getLastUid(mailbox)
                 .map(MessageUid::next)
                 .orElse(MessageUid.MIN_VALUE);
-        long highestModSeq = mapperFactory.getMessageMapper(mailboxSession).getHighestModSeq(mailbox);
+        ModSeq highestModSeq = mapperFactory.getMessageMapper(mailboxSession).getHighestModSeq(mailbox);
         long messageCount;
         long unseenCount;
         MessageUid firstUnseen;
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
index 68ddee2..f2cb048 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageResultIterator.java
@@ -27,6 +27,7 @@ import java.util.Objects;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Content;
 import org.apache.james.mailbox.model.Headers;
@@ -242,7 +243,7 @@ public class StoreMessageResultIterator implements MessageResultIterator {
         }
 
         @Override
-        public long getModSeq() {
+        public ModSeq getModSeq() {
             return messageMetaData().getModSeq();
         }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
index f183728..915be78 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
@@ -27,6 +27,7 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
@@ -37,6 +38,7 @@ import org.apache.james.mailbox.store.FlagsUpdateCalculator;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.transaction.TransactionalMapper;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterators;
 
 /**
@@ -59,7 +61,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     }
     
     @Override
-    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
         return modSeqProvider.highestModSeq(mailboxSession, mailbox);
     }
 
@@ -81,14 +83,11 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     public Iterator<UpdatedFlags> updateFlags(Mailbox mailbox, FlagsUpdateCalculator flagsUpdateCalculator, MessageRange set) throws MailboxException {
         final List<UpdatedFlags> updatedFlags = new ArrayList<>();
         Iterator<MailboxMessage> messages = findInMailbox(mailbox, set, FetchType.Metadata, UNLIMITED);
-        
-        long modSeq = -1;
-        if (messages.hasNext()) {
-            // if a mailbox does not support mod-sequences the provider may be null
-            if (modSeqProvider != null) {
-                modSeq = modSeqProvider.nextModSeq(mailboxSession, mailbox);
-            }
+
+        if (!messages.hasNext()) {
+            return ImmutableList.<UpdatedFlags>of().iterator();
         }
+        ModSeq modSeq = modSeqProvider.nextModSeq(mailboxSession, mailbox);
         while (messages.hasNext()) {
             final MailboxMessage member = messages.next();
             Flags originalFlags = member.createFlags();
@@ -131,10 +130,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     @Override
     public MessageMetaData copy(Mailbox mailbox, MailboxMessage original) throws MailboxException {
         MessageUid uid = uidProvider.nextUid(mailboxSession, mailbox);
-        long modSeq = -1;
-        if (modSeqProvider != null) {
-            modSeq = modSeqProvider.nextModSeq(mailboxSession, mailbox);
-        }
+        ModSeq modSeq = modSeqProvider.nextModSeq(mailboxSession, mailbox);
         final MessageMetaData metaData = copy(mailbox, uid, modSeq, original);  
         
         return metaData;
@@ -149,7 +145,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     /**
      * Copy the MailboxMessage to the Mailbox, using the given uid and modSeq for the new MailboxMessage
      */
-    protected abstract MessageMetaData copy(Mailbox mailbox, MessageUid uid, long modSeq, MailboxMessage original) throws MailboxException;
+    protected abstract MessageMetaData copy(Mailbox mailbox, MessageUid uid, ModSeq modSeq, MailboxMessage original) throws MailboxException;
 
     @Override
     public Iterator<MessageUid> listAllMessageUids(Mailbox mailbox) throws MailboxException {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
index f01ddb0..a978a67 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageMapper.java
@@ -27,6 +27,7 @@ import java.util.Optional;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
@@ -142,7 +143,7 @@ public interface MessageMapper extends Mapper {
     /**
      * Return the higest mod-sequence which were used for storing a MailboxMessage in the {@link Mailbox}
      */
-    long getHighestModSeq(Mailbox mailbox) throws MailboxException;
+    ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException;
 
     Flags getApplicableFlag(Mailbox mailbox) throws MailboxException;
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
index a2d1c9c..b72e314 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
@@ -22,10 +22,12 @@ package org.apache.james.mailbox.store.mail;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
+
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.UpdatedFlags;
@@ -48,7 +50,7 @@ public class MessageUtils {
         this.modSeqProvider = modSeqProvider;
     }
     
-    public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
         return modSeqProvider.highestModSeq(mailboxSession, mailbox);
     }
 
@@ -61,7 +63,7 @@ public class MessageUtils {
         return uidProvider.nextUid(mailboxSession, mailbox);
     }
 
-    public long nextModSeq(Mailbox mailbox) throws MailboxException {
+    public ModSeq nextModSeq(Mailbox mailbox) throws MailboxException {
         return modSeqProvider.nextModSeq(mailboxSession, mailbox);
     }
 
@@ -75,7 +77,7 @@ public class MessageUtils {
         ImmutableList.Builder<UpdatedFlags> updatedFlags = ImmutableList.builder();
         ImmutableList.Builder<MailboxMessage> changedFlags = ImmutableList.builder();
 
-        long modSeq = nextModSeq(mailbox);
+        ModSeq modSeq = nextModSeq(mailbox);
 
         while (messages.hasNext()) {
             MailboxMessage member = messages.next();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java
index 22d08e6..716e7d1 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/ModSeqProvider.java
@@ -19,6 +19,7 @@
 package org.apache.james.mailbox.store.mail;
 
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
@@ -36,7 +37,7 @@ public interface ModSeqProvider {
      * 
      * The first mod-seq must be >= 1
      */
-    long nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException;
+    ModSeq nextModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException;
 
     /**
      * Return the next mod-sequence which can be used for the {@link Mailbox}.
@@ -45,15 +46,15 @@ public interface ModSeqProvider {
      * 
      * The first mod-seq must be >= 1
      */
-    long nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException;
+    ModSeq nextModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException;
     
     /**
      * Return the highest mod-sequence which were used for the {@link Mailbox}
      */
-    long highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException;
+    ModSeq highestModSeq(MailboxSession session, Mailbox mailbox) throws MailboxException;
     
     /**
      * Return the highest mod-sequence which were used for the {@link Mailbox}
      */
-    long highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException;
+    ModSeq highestModSeq(MailboxSession session, MailboxId mailboxId) throws MailboxException;
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
index 399fc10..2ecf5b0 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.store.mail.model;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageMetaData;
@@ -54,12 +55,12 @@ public interface MailboxMessage extends Message, Comparable<MailboxMessage> {
      * Set the mod-sequence for the message. This must be called before the message is added to the store
      * or any flags are changed. This must be unique / sequential.
      */
-    void setModSeq(long modSeq);
+    void setModSeq(ModSeq modSeq);
 
     /**
      * Return the mod-sequence for the message
      */
-    long getModSeq();
+    ModSeq getModSeq();
 
     /**
      * Return if it was marked as answered
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 c947f25..1a198d2 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
@@ -31,6 +31,7 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
@@ -62,7 +63,7 @@ public class SimpleMailboxMessage extends DelegatingMailboxMessage {
         private PropertyBuilder propertyBuilder;
         private MailboxId mailboxId;
         private Optional<MessageUid> uid = Optional.empty();
-        private Optional<Long> modseq = Optional.empty();
+        private Optional<ModSeq> modseq = Optional.empty();
         private ImmutableList.Builder<MessageAttachment> attachments = ImmutableList.builder();
         private Optional<Boolean> hasAttachment = Optional.empty();
 
@@ -76,8 +77,7 @@ public class SimpleMailboxMessage extends DelegatingMailboxMessage {
             return this;
         }
 
-        public Builder modseq(long modseq) {
-            Preconditions.checkArgument(modseq >= 0, "modseq can not be negative");
+        public Builder modseq(ModSeq modseq) {
             this.modseq = Optional.of(modseq);
             return this;
         }
@@ -201,7 +201,7 @@ public class SimpleMailboxMessage extends DelegatingMailboxMessage {
     private boolean recent;
     private boolean seen;
     private String[] userFlags;
-    private long modSeq;
+    private ModSeq modSeq;
 
     public SimpleMailboxMessage(MessageId messageId, Date internalDate, long size, int bodyStartOctet,
             SharedInputStream content, Flags flags,
@@ -293,12 +293,12 @@ public class SimpleMailboxMessage extends DelegatingMailboxMessage {
     }
 
     @Override
-    public long getModSeq() {
+    public ModSeq getModSeq() {
         return modSeq;
     }
 
     @Override
-    public void setModSeq(long modSeq) {
+    public void setModSeq(ModSeq modSeq) {
         this.modSeq = modSeq;
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index b02bbc4..ebbccbd 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -40,6 +40,7 @@ import java.util.stream.Stream;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedSearchException;
 import org.apache.james.mailbox.extractor.TextExtractor;
@@ -566,15 +567,15 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
     private boolean matches(SearchQuery.ModSeqCriterion criterion, MailboxMessage message)
             throws UnsupportedSearchException {
         SearchQuery.NumericOperator operator = criterion.getOperator();
-        long modSeq = message.getModSeq();
+        ModSeq modSeq = message.getModSeq();
         long value = operator.getValue();
         switch (operator.getType()) {
         case LESS_THAN:
-            return modSeq < value;
+            return modSeq.asLong() < value;
         case GREATER_THAN:
-            return modSeq > value;
+            return modSeq.asLong() > value;
         case EQUALS:
-            return modSeq == value;
+            return modSeq.asLong() == value;
         default:
             throw new UnsupportedSearchException();
         }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
index c817e8c..15e934b 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
@@ -329,7 +329,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        assertThat(messageManager2.getMetaData(true, session, FetchGroup.FIRST_UNSEEN).getHighestModSeq()).isNotNegative();
+        assertThat(messageManager2.getMetaData(true, session, FetchGroup.FIRST_UNSEEN).getHighestModSeq().asLong()).isNotNegative();
     }
 
     @Test
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
index b850249..de0169f 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.MetadataWithMailboxId;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -75,6 +76,7 @@ import org.mockito.ArgumentCaptor;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedMap;
+
 import reactor.core.publisher.Mono;
 
 public abstract class AbstractMessageIdManagerSideEffectTest {
@@ -461,7 +463,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         assertThat(messages).hasSize(1);
         MessageResult messageResult = messages.get(0);
         MessageUid messageUid = messageResult.getUid();
-        long modSeq = messageResult.getModSeq();
+        ModSeq modSeq = messageResult.getModSeq();
         UpdatedFlags updatedFlags = UpdatedFlags.builder()
             .uid(messageUid)
             .modSeq(modSeq)
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
index 9099406..2874746 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.fixture.MailboxFixture;
@@ -180,10 +181,10 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId2, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        long modSeqMessage1Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroupImpl.MINIMAL, aliceSession)
+        ModSeq modSeqMessage1Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroupImpl.MINIMAL, aliceSession)
             .get(0)
             .getModSeq();
-        long modSeqMessage2Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroupImpl.MINIMAL, aliceSession)
+        ModSeq modSeqMessage2Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroupImpl.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox1.getMailboxId()))
             .findFirst()
@@ -198,7 +199,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
         MessageUid messageUid1 = messageResult1.getUid();
-        long modSeq1 = messageResult1.getModSeq();
+        ModSeq modSeq1 = messageResult1.getModSeq();
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
@@ -208,7 +209,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             .findFirst()
             .get();
         MessageUid messageUid2 = messageResult2.getUid();
-        long modSeq2 = messageResult2.getModSeq();
+        ModSeq modSeq2 = messageResult2.getModSeq();
 
         assertThat(messageUid1).isEqualTo(messageUid2);
         assertThat(modSeq1).isEqualTo(modSeq2);
@@ -390,12 +391,12 @@ public abstract class AbstractMessageIdManagerStorageTest {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
-        long modSeq1 = messageResult1.getModSeq();
+        ModSeq modSeq1 = messageResult1.getModSeq();
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
         MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession).get(0);
-        long modSeq2 = messageResult2.getModSeq();
+        ModSeq modSeq2 = messageResult2.getModSeq();
 
         assertThat(modSeq2).isGreaterThan(modSeq1);
     }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java
index 30a4817..ecbcbd8 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageIdManagerTestSystem.java
@@ -28,6 +28,7 @@ import javax.mail.util.SharedByteArrayInputStream;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -42,7 +43,7 @@ import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 
 public class MessageIdManagerTestSystem {
     private static final byte[] MESSAGE_CONTENT = "subject: any\n\nbody".getBytes(StandardCharsets.UTF_8);
-    public static final int MOD_SEQ = 452;
+    public static final ModSeq MOD_SEQ = ModSeq.of(452);
 
     private final MessageIdManager messageIdManager;
     private final MessageId.Factory messageIdFactory;
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/PreDeletionHooksTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/PreDeletionHooksTest.java
index 4e86487..bcfc430 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/PreDeletionHooksTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/PreDeletionHooksTest.java
@@ -38,6 +38,7 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.MetadataWithMailboxId;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.extension.PreDeletionHook;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.TestId;
@@ -56,7 +57,7 @@ import reactor.core.publisher.Mono;
 class PreDeletionHooksTest {
 
     private static final TestId MAILBOX_ID = TestId.of(45);
-    private static final int MOD_SEQ = 18;
+    private static final ModSeq MOD_SEQ = ModSeq.of(18);
     private static final int SIZE = 12;
     private static final MessageMetaData MESSAGE_META_DATA = new MessageMetaData(MessageUid.of(1), MOD_SEQ, new Flags(), SIZE, new Date(), TestMessageId.of(42));
     private static final PreDeletionHook.DeleteOperation DELETE_OPERATION = PreDeletionHook.DeleteOperation.from(ImmutableList.of(MetadataWithMailboxId.from(
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
index b3f7528..1e4a787 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxMessageResultIteratorTest.java
@@ -35,10 +35,10 @@ import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
-import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MessageResult.FetchGroup;
@@ -183,7 +183,7 @@ public class StoreMailboxMessageResultIteratorTest {
         }
 
         @Override
-        public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
+        public ModSeq getHighestModSeq(Mailbox mailbox) throws MailboxException {
             throw new UnsupportedOperationException();
         }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
index 840890b..0c8d05e 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
@@ -33,6 +33,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
@@ -110,11 +111,11 @@ public class MessageUtilsTest {
     @Test
     public void enrichMesageShouldEnrichUidAndModSeq() throws Exception {
         when(uidProvider.nextUid(eq(mailboxSession), eq(mailbox))).thenReturn(MESSAGE_UID);
-        when(modSeqProvider.nextModSeq(eq(mailboxSession), eq(mailbox))).thenReturn(11L);
+        when(modSeqProvider.nextModSeq(eq(mailboxSession), eq(mailbox))).thenReturn(ModSeq.of(11));
 
         messageUtils.enrichMessage(mailbox, message);
         
         assertThat(message.getUid()).isEqualTo(MESSAGE_UID);
-        assertThat(message.getModSeq()).isEqualTo(11L);
+        assertThat(message.getModSeq()).isEqualTo(ModSeq.of(11));
     }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
index 95b4a39..23eb451 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/ListMessageAssertTest.java
@@ -31,6 +31,7 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -84,7 +85,7 @@ public class ListMessageAssertTest {
         SimpleMailboxMessage simpleMailboxMessage = new SimpleMailboxMessage(messageId, internalDate, content.length(),
             bodyStart, new SharedByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)), new Flags(), propertyBuilder, mailboxId);
         simpleMailboxMessage.setUid(uid);
-        simpleMailboxMessage.setModSeq(0);
+        simpleMailboxMessage.setModSeq(ModSeq.first());
         return simpleMailboxMessage;
     }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java
index 6e5c670..2db1faa 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MapperProvider.java
@@ -22,11 +22,11 @@ package org.apache.james.mailbox.store.mail.model;
 import java.util.List;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.mail.AnnotationMapper;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageIdMapper;
@@ -59,9 +59,9 @@ public interface MapperProvider {
 
     MessageUid generateMessageUid();
 
-    long generateModSeq(Mailbox mailbox) throws MailboxException;
+    ModSeq generateModSeq(Mailbox mailbox) throws MailboxException;
 
-    long highestModSeq(Mailbox mailbox) throws MailboxException;
+    ModSeq highestModSeq(Mailbox mailbox) throws MailboxException;
 
     boolean supportPartialAttachmentFetch();
     
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
index 349b39c..e286a5b 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageIdMapperTest.java
@@ -35,6 +35,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -368,7 +369,7 @@ public abstract class MessageIdMapperTest {
         Flags newFlags = new Flags(Flag.ANSWERED);
         Map<MailboxId, UpdatedFlags> flags = sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), newFlags, FlagsUpdateMode.ADD);
 
-        long modSeq = mapperProvider.highestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.highestModSeq(benwaInboxMailbox);
         UpdatedFlags expectedUpdatedFlags = UpdatedFlags.builder()
             .uid(message1.getUid())
             .modSeq(modSeq)
@@ -395,7 +396,7 @@ public abstract class MessageIdMapperTest {
 
         Map<MailboxId, UpdatedFlags> flags = sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), newFlags, FlagsUpdateMode.REPLACE);
 
-        long modSeq = mapperProvider.highestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.highestModSeq(benwaInboxMailbox);
         UpdatedFlags expectedUpdatedFlags = UpdatedFlags.builder()
             .uid(message1.getUid())
             .modSeq(modSeq)
@@ -423,7 +424,7 @@ public abstract class MessageIdMapperTest {
 
         Map<MailboxId, UpdatedFlags> flags = sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId()), newFlags, FlagsUpdateMode.REMOVE);
 
-        long modSeq = mapperProvider.highestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.highestModSeq(benwaInboxMailbox);
         UpdatedFlags expectedUpdatedFlags = UpdatedFlags.builder()
             .uid(message1.getUid())
             .modSeq(modSeq)
@@ -494,7 +495,7 @@ public abstract class MessageIdMapperTest {
             .add(Flag.RECENT)
             .add(Flag.ANSWERED)
             .build();
-        long modSeq = mapperProvider.highestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.highestModSeq(benwaInboxMailbox);
         UpdatedFlags expectedUpdatedFlags = UpdatedFlags.builder()
             .uid(message1.getUid())
             .modSeq(modSeq)
@@ -519,8 +520,8 @@ public abstract class MessageIdMapperTest {
         Flags newFlags = new Flags(Flag.ANSWERED);
         Map<MailboxId, UpdatedFlags> flags = sut.setFlags(messageId, ImmutableList.of(message1.getMailboxId(), message1InOtherMailbox.getMailboxId()), newFlags, FlagsUpdateMode.ADD);
 
-        long modSeqBenwaInboxMailbox = mapperProvider.highestModSeq(benwaInboxMailbox);
-        long modSeqBenwaWorkMailbox = mapperProvider.highestModSeq(benwaWorkMailbox);
+        ModSeq modSeqBenwaInboxMailbox = mapperProvider.highestModSeq(benwaInboxMailbox);
+        ModSeq modSeqBenwaWorkMailbox = mapperProvider.highestModSeq(benwaWorkMailbox);
         UpdatedFlags expectedUpdatedFlags = UpdatedFlags.builder()
             .uid(message1.getUid())
             .modSeq(modSeqBenwaInboxMailbox)
@@ -554,7 +555,7 @@ public abstract class MessageIdMapperTest {
     @Test
     void setFlagsShouldNotModifyModSeqWhenMailboxIdsIsEmpty() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
-        long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
         sut.save(message1);
 
@@ -570,7 +571,7 @@ public abstract class MessageIdMapperTest {
     @Test
     void setFlagsShouldUpdateModSeqWhenMessageIsInOneMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
-        long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
         sut.save(message1);
 
@@ -585,7 +586,7 @@ public abstract class MessageIdMapperTest {
     @Test
     void setFlagsShouldNotModifyFlagsWhenMailboxIdsIsEmpty() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
-        long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
         Flags initialFlags = new Flags(Flags.Flag.DRAFT);
         message1.setFlags(initialFlags);
@@ -813,7 +814,7 @@ public abstract class MessageIdMapperTest {
     @Test
     void setFlagsShouldNotUpdateModSeqWhenNoop() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
-        long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
         message1.setFlags(new Flags(Flag.SEEN));
         sut.save(message1);
@@ -831,7 +832,7 @@ public abstract class MessageIdMapperTest {
     @Test
     void addingFlagToAMessageThatAlreadyHasThisFlagShouldResultInNoChange() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
-        long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
         Flags flags = new Flags(Flag.SEEN);
         message1.setFlags(flags);
@@ -850,7 +851,7 @@ public abstract class MessageIdMapperTest {
     @Test
     void setFlagsShouldReturnUpdatedFlagsWhenNoop() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
-        long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
+        ModSeq modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
         Flags flags = new Flags(Flag.SEEN);
         message1.setFlags(flags);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
index 68083f8..bbe4b40 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMapperTest.java
@@ -40,6 +40,7 @@ import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageManager.FlagsUpdateMode;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxCounters;
@@ -526,14 +527,14 @@ public abstract class MessageMapperTest {
 
     @Test
     void getHighestMoseqShouldBeEqualToZeroOnEmptyMailbox() throws MailboxException {
-        assertThat(messageMapper.getHighestModSeq(benwaInboxMailbox)).isEqualTo(0);
+        assertThat(messageMapper.getHighestModSeq(benwaInboxMailbox)).isEqualTo(ModSeq.first());
     }
 
     @Test
     void insertingAMessageShouldIncrementModSeq() throws MailboxException {
         messageMapper.add(benwaInboxMailbox, message1);
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
-        assertThat(modSeq).isGreaterThan(0);
+        ModSeq modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
+        assertThat(modSeq).isGreaterThan(ModSeq.first());
         messageMapper.add(benwaInboxMailbox, message2);
         assertThat(messageMapper.getHighestModSeq(benwaInboxMailbox)).isGreaterThan(modSeq);
     }
@@ -577,7 +578,7 @@ public abstract class MessageMapperTest {
     @Test
     void copyShouldIncrementModSeq() throws MailboxException, IOException {
         saveMessages();
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         messageMapper.copy(benwaInboxMailbox, SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
         assertThat(messageMapper.getHighestModSeq(benwaInboxMailbox)).isGreaterThan(modSeq);
     }
@@ -663,13 +664,13 @@ public abstract class MessageMapperTest {
     @Test
     void flagsReplacementShouldReturnAnUpdatedFlagHighlightingTheReplacement() throws MailboxException {
         saveMessages();
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         Iterator<UpdatedFlags> updatedFlags = messageMapper.updateFlags(benwaInboxMailbox,
                 new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         assertThat(Lists.newArrayList(updatedFlags))
             .containsOnly(UpdatedFlags.builder()
                 .uid(message1.getUid())
-                .modSeq(modSeq + 1)
+                .modSeq(modSeq.next())
                 .oldFlags(new Flags())
                 .newFlags(new Flags(Flags.Flag.FLAGGED))
                 .build());
@@ -679,12 +680,12 @@ public abstract class MessageMapperTest {
     void flagsAdditionShouldReturnAnUpdatedFlagHighlightingTheAddition() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid())))
             .toIterable()
             .containsOnly(UpdatedFlags.builder()
                     .uid(message1.getUid())
-                    .modSeq(modSeq + 1)
+                    .modSeq(modSeq.next())
                     .oldFlags(new Flags(Flags.Flag.FLAGGED))
                     .newFlags(new FlagsBuilder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build())
                     .build());
@@ -712,13 +713,13 @@ public abstract class MessageMapperTest {
     void flagsRemovalShouldReturnAnUpdatedFlagHighlightingTheRemoval() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new FlagsBuilder().add(Flags.Flag.FLAGGED, Flags.Flag.SEEN).build(), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REMOVE), MessageRange.one(message1.getUid())))
             .toIterable()
             .containsOnly(
                 UpdatedFlags.builder()
                     .uid(message1.getUid())
-                    .modSeq(modSeq + 1)
+                    .modSeq(modSeq.next())
                     .oldFlags(new FlagsBuilder().add(Flags.Flag.SEEN, Flags.Flag.FLAGGED).build())
                     .newFlags(new Flags(Flags.Flag.FLAGGED))
                     .build());
@@ -839,13 +840,13 @@ public abstract class MessageMapperTest {
     @Test
     void userFlagsUpdateShouldReturnCorrectUpdatedFlags() throws Exception {
         saveMessages();
-        long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
+        ModSeq modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(USER_FLAG), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid())))
             .toIterable()
             .containsOnly(
                 UpdatedFlags.builder()
                     .uid(message1.getUid())
-                    .modSeq(modSeq + 1)
+                    .modSeq(modSeq.next())
                     .oldFlags(new Flags())
                     .newFlags(new Flags(USER_FLAG))
                     .build());
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java
index e8870b9..8cf829a 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MetadataMapAssertTest.java
@@ -27,6 +27,7 @@ import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.TestId;
@@ -39,7 +40,7 @@ public class MetadataMapAssertTest {
 
     private static final MessageUid UID = MessageUid.of(18);
     private static final MessageId MESSAGE_ID = new DefaultMessageId();
-    private static final Long MODSEQ = 24L;
+    private static final ModSeq MODSEQ = ModSeq.of(24L);
     private static final Date DATE = new Date();
     private static final String HEADER_STRING = "name: headerName\n\n";
     private static final String BODY_STRING = "body\\n.\\n";
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
index 15b8c88..9baff66 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java
@@ -33,6 +33,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
@@ -143,14 +144,6 @@ public class SimpleMailboxMessageTest {
     }
 
     @Test
-    public void modseqShouldThrowWhenNegative() {
-        expectedException.expect(IllegalArgumentException.class);
-
-        SimpleMailboxMessage.builder()
-            .modseq(-1);
-    }
-
-    @Test
     public void sizeShouldThrowWhenNegative() {
         expectedException.expect(IllegalArgumentException.class);
 
@@ -188,7 +181,7 @@ public class SimpleMailboxMessageTest {
         Date internalDate = new Date();
         Flags flags = new Flags();
         PropertyBuilder propertyBuilder = new PropertyBuilder();
-        int modseq = 145;
+        ModSeq modseq = ModSeq.of(145);
         MessageUid uid = MessageUid.of(45);
         MessageAttachment messageAttachment = MessageAttachment.builder()
             .attachment(Attachment.builder()
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
index c7f8820..3dff2d7 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
@@ -38,6 +38,7 @@ import org.apache.james.core.Username;
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.Group;
@@ -88,8 +89,8 @@ public class ListeningCurrentQuotaUpdaterTest {
     public void addedEventShouldIncreaseCurrentQuotaValues() throws Exception {
         MailboxListener.Added added = mock(MailboxListener.Added.class);
         when(added.getMailboxId()).thenReturn(MAILBOX_ID);
-        when(added.getMetaData(MessageUid.of(36))).thenReturn(new MessageMetaData(MessageUid.of(36),0,new Flags(), SIZE, new Date(), new DefaultMessageId()));
-        when(added.getMetaData(MessageUid.of(38))).thenReturn(new MessageMetaData(MessageUid.of(38),0,new Flags(), SIZE, new Date(), new DefaultMessageId()));
+        when(added.getMetaData(MessageUid.of(36))).thenReturn(new MessageMetaData(MessageUid.of(36), ModSeq.first(),new Flags(), SIZE, new Date(), new DefaultMessageId()));
+        when(added.getMetaData(MessageUid.of(38))).thenReturn(new MessageMetaData(MessageUid.of(38), ModSeq.first(),new Flags(), SIZE, new Date(), new DefaultMessageId()));
         when(added.getUids()).thenReturn(Lists.newArrayList(MessageUid.of(36), MessageUid.of(38)));
         when(added.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
@@ -102,8 +103,8 @@ public class ListeningCurrentQuotaUpdaterTest {
     @Test
     public void expungedEventShouldDecreaseCurrentQuotaValues() throws Exception {
         MailboxListener.Expunged expunged = mock(MailboxListener.Expunged.class);
-        when(expunged.getMetaData(MessageUid.of(36))).thenReturn(new MessageMetaData(MessageUid.of(36),0,new Flags(), SIZE, new Date(), new DefaultMessageId()));
-        when(expunged.getMetaData(MessageUid.of(38))).thenReturn(new MessageMetaData(MessageUid.of(38),0,new Flags(), SIZE, new Date(), new DefaultMessageId()));
+        when(expunged.getMetaData(MessageUid.of(36))).thenReturn(new MessageMetaData(MessageUid.of(36), ModSeq.first(), new Flags(), SIZE, new Date(), new DefaultMessageId()));
+        when(expunged.getMetaData(MessageUid.of(38))).thenReturn(new MessageMetaData(MessageUid.of(38), ModSeq.first(), new Flags(), SIZE, new Date(), new DefaultMessageId()));
         when(expunged.getUids()).thenReturn(Lists.newArrayList(MessageUid.of(36), MessageUid.of(38)));
         when(expunged.getMailboxId()).thenReturn(MAILBOX_ID);
         when(expunged.getUsername()).thenReturn(USERNAME_BENWA);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
index 3c700fe..4066bef 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
@@ -35,6 +35,7 @@ import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.MessageFlags;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 
 import com.github.steveash.guavate.Guavate;
 
@@ -319,8 +320,8 @@ public interface StatusResponse extends ImapResponseMessage {
          * @param modSeq positive non-zero long
          * @return <code>ResponseCode</code>
          */
-        public static ResponseCode highestModSeq(long modSeq) {
-            return new ResponseCode("HIGHESTMODSEQ", modSeq);
+        public static ResponseCode highestModSeq(ModSeq modSeq) {
+            return new ResponseCode("HIGHESTMODSEQ", modSeq.asLong());
         }
         
         /**
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
index 487ad07..8a4b65d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
@@ -29,6 +29,7 @@ import org.apache.james.imap.api.message.request.SearchResultOption;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.ESearchResponse;
+import org.apache.james.mailbox.ModSeq;
 
 /**
  * Encoders IMAP4rev1 <code>ESEARCH</code> responses.
@@ -49,7 +50,7 @@ public class ESearchResponseEncoder extends AbstractChainedImapEncoder {
         IdRange[] all = response.getAll();
         UidRange[] allUids = response.getAllUids();
         boolean useUid = response.getUseUid();
-        Long highestModSeq = response.getHighestModSeq();
+        ModSeq highestModSeq = response.getHighestModSeq();
         List<SearchResultOption> options = response.getSearchResultOptions();
         
         composer.untagged().message("ESEARCH").openParen().message("TAG").quote(tag.asString()).closeParen();
@@ -79,7 +80,7 @@ public class ESearchResponseEncoder extends AbstractChainedImapEncoder {
         // see RFC4731 3.2.  Interaction with CONDSTORE extension
         if (highestModSeq != null) {
             composer.message("MODSEQ");
-            composer.message(highestModSeq);
+            composer.message(highestModSeq.asLong());
         }
         composer.end();
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
index 1ae8171..344ebe1 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
@@ -37,6 +37,7 @@ import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.FetchResponse;
 import org.apache.james.imap.message.response.FetchResponse.Structure;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -91,12 +92,12 @@ public class FetchResponseEncoder extends AbstractChainedImapEncoder {
 
     // Handle the MODSEQ 
     private void encodeModSeq(ImapResponseComposer composer, FetchResponse response) throws IOException {
-        Long modSeq = response.getModSeq();
+        ModSeq modSeq = response.getModSeq();
         if (modSeq != null) {
             composer.message(ImapConstants.FETCH_MODSEQ);
             composer.openParen();
             composer.skipNextSpace();
-            composer.message(modSeq);
+            composer.message(modSeq.asLong());
             composer.closeParen();
         }
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
index 4deb1ee..20a961d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
@@ -27,6 +27,7 @@ import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.MailboxStatusResponse;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 
 /**
  * Encodes <code>STATUS</code> responses.
@@ -43,7 +44,7 @@ public class MailboxStatusResponseEncoder extends AbstractChainedImapEncoder imp
         Long messages = response.getMessages();
         Long recent = response.getRecent();
         MessageUid uidNext = response.getUidNext();
-        Long highestModSeq = response.getHighestModSeq();
+        ModSeq highestModSeq = response.getHighestModSeq();
         Long uidValidity = response.getUidValidity();
         Long unseen = response.getUnseen();
         String mailboxName = response.getMailbox();
@@ -73,7 +74,7 @@ public class MailboxStatusResponseEncoder extends AbstractChainedImapEncoder imp
         
         if (highestModSeq != null) {
             composer.message(STATUS_HIGHESTMODSEQ);
-            composer.message(highestModSeq);
+            composer.message(highestModSeq.asLong());
         }
 
         if (uidValidity != null) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
index f60030c..e5020f0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
@@ -25,6 +25,7 @@ import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.SearchResponse;
+import org.apache.james.mailbox.ModSeq;
 
 /**
  * Encoders IMAP4rev1 <code>SEARCH</code> responses.
@@ -39,7 +40,7 @@ public class SearchResponseEncoder extends AbstractChainedImapEncoder {
     protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
         SearchResponse response = (SearchResponse) acceptableMessage;
         final long[] ids = response.getIds();
-        Long highestModSeq = response.getHighestModSeq();
+        ModSeq highestModSeq = response.getHighestModSeq();
         composer.untagged();
         composer.message(ImapConstants.SEARCH_RESPONSE_NAME);
         if (ids != null) {
@@ -52,7 +53,7 @@ public class SearchResponseEncoder extends AbstractChainedImapEncoder {
         if (highestModSeq != null) {
             composer.openParen();
             composer.message("MODSEQ");
-            composer.message(highestModSeq);
+            composer.message(highestModSeq.asLong());
             composer.closeParen();
         }
         composer.end();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
index 414a5d9..b45ac89 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
@@ -26,6 +26,7 @@ import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.SearchResultOption;
 import org.apache.james.imap.api.message.response.ImapResponseMessage;
+import org.apache.james.mailbox.ModSeq;
 
 public class ESearchResponse implements ImapResponseMessage {
 
@@ -36,10 +37,10 @@ public class ESearchResponse implements ImapResponseMessage {
     private final Tag tag;
     private final boolean useUid;
     private final List<SearchResultOption> options;
-    private final Long highestModSeq;
+    private final ModSeq highestModSeq;
     private UidRange[] allUids;
 
-    public ESearchResponse(long minUid, long maxUid, long count, IdRange[] all, UidRange[] allUids, Long highestModSeq, Tag tag, boolean useUid, List<SearchResultOption> options) {
+    public ESearchResponse(long minUid, long maxUid, long count, IdRange[] all, UidRange[] allUids, ModSeq highestModSeq, Tag tag, boolean useUid, List<SearchResultOption> options) {
         super();
         this.options = options;
         this.minUid = minUid;
@@ -84,7 +85,7 @@ public class ESearchResponse implements ImapResponseMessage {
         return options;
     }
     
-    public final Long getHighestModSeq() {
+    public final ModSeq getHighestModSeq() {
         return highestModSeq;
     }
     
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/FetchResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/FetchResponse.java
index 35c6991..aaa5cc1 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/FetchResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/FetchResponse.java
@@ -27,6 +27,7 @@ import javax.mail.Flags;
 
 import org.apache.james.imap.api.message.response.ImapResponseMessage;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 
 public final class FetchResponse implements ImapResponseMessage {
 
@@ -48,9 +49,9 @@ public final class FetchResponse implements ImapResponseMessage {
 
     private final Structure bodystructure;
 
-    private final Long modSeq;
+    private final ModSeq modSeq;
 
-    public FetchResponse(int messageNumber, Flags flags, MessageUid uid, Long modSeq, Date internalDate, Long size, Envelope envelope, Structure body, Structure bodystructure, List<BodyElement> elements) {
+    public FetchResponse(int messageNumber, Flags flags, MessageUid uid, ModSeq modSeq, Date internalDate, Long size, Envelope envelope, Structure body, Structure bodystructure, List<BodyElement> elements) {
         super();
         this.messageNumber = messageNumber;
         this.flags = flags;
@@ -159,7 +160,7 @@ public final class FetchResponse implements ImapResponseMessage {
      * 
      * @return modSeq
      */
-    public Long getModSeq() {
+    public ModSeq getModSeq() {
         return modSeq;
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/MailboxStatusResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/MailboxStatusResponse.java
index 0773c88..9608625 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/MailboxStatusResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/MailboxStatusResponse.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.message.response;
 
 import org.apache.james.imap.api.message.response.ImapResponseMessage;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 
 /**
  * Represents a <code>STATUS</code> response. See <code>RFC3501 7.2.4</code>.
@@ -39,9 +40,9 @@ public class MailboxStatusResponse implements ImapResponseMessage {
 
     private final String mailbox;
 
-    private final Long highestModSeq;
+    private final ModSeq highestModSeq;
 
-    public MailboxStatusResponse(Long messages, Long recent, MessageUid uidNext, Long highestModSeq, Long uidValidity, Long unseen, String mailbox) {
+    public MailboxStatusResponse(Long messages, Long recent, MessageUid uidNext, ModSeq highestModSeq, Long uidValidity, Long unseen, String mailbox) {
         super();
         this.messages = messages;
         this.recent = recent;
@@ -112,7 +113,7 @@ public class MailboxStatusResponse implements ImapResponseMessage {
      * 
      * @return the mailbox highestModSeq (if requested) or null (if not)
      */
-    public final Long getHighestModSeq() {
+    public final ModSeq getHighestModSeq() {
         return highestModSeq;
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/SearchResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/SearchResponse.java
index 9557228..e11f8bb 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/SearchResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/SearchResponse.java
@@ -22,13 +22,14 @@ package org.apache.james.imap.message.response;
 import java.util.Arrays;
 
 import org.apache.james.imap.api.message.response.ImapResponseMessage;
+import org.apache.james.mailbox.ModSeq;
 
 /**
  * A <code>SEARCH</code> response.
  */
 public class SearchResponse implements ImapResponseMessage {
     private final long[] ids;
-    private final Long highestModSeq;
+    private final ModSeq highestModSeq;
 
     /**
      * Constructs a <code>SEARCH</code> response.
@@ -36,7 +37,7 @@ public class SearchResponse implements ImapResponseMessage {
      * @param ids ids, not null
      * @param highestModSeq
      */
-    public SearchResponse(long[] ids, Long highestModSeq) {
+    public SearchResponse(long[] ids, ModSeq highestModSeq) {
         super();
         this.ids = ids;
         this.highestModSeq = highestModSeq;
@@ -57,7 +58,7 @@ public class SearchResponse implements ImapResponseMessage {
      *  
      * @return highestMod
      */
-    public final Long getHighestModSeq() {
+    public final ModSeq getHighestModSeq() {
         return highestModSeq;
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index 712925e..b8930db 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -54,6 +54,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.MetaData;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
 import org.apache.james.mailbox.model.FetchGroupImpl;
@@ -282,16 +283,13 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
         if (!enabled.contains(ImapConstants.SUPPORTS_CONDSTORE)) {
             if (sendHighestModSeq) {
                 if (metaData.isModSeqPermanent()) {
-
-                    final long highestModSeq = metaData.getHighestModSeq();
+                    ModSeq highestModSeq = metaData.getHighestModSeq();
 
                     StatusResponse untaggedOk = getStatusResponseFactory().untaggedOk(HumanReadableText.HIGHEST_MOD_SEQ, ResponseCode.highestModSeq(highestModSeq));
                     responder.respond(untaggedOk);        
                 }
             }
             enabled.add(ImapConstants.SUPPORTS_CONDSTORE);
-
-
         }
     }
     
@@ -547,7 +545,7 @@ public abstract class AbstractMailboxProcessor<R extends ImapRequest> extends Ab
         //      A client providing message sequence match data can reduce the scope
         //      as above.  In the case where there have been no expunges, the server
         //      can ignore this data.
-        if (metaData.getHighestModSeq() > changedSince) {
+        if (metaData.getHighestModSeq().asLong() > changedSince) {
             SearchQuery searchQuery = new SearchQuery();
             SearchQuery.UidRange[] nRanges = new SearchQuery.UidRange[ranges.size()];
             Set<MessageUid> vanishedUids = new HashSet<>();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
index 2a03651..9ceb8a5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
@@ -47,6 +47,7 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.MetaData;
 import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
@@ -317,7 +318,7 @@ abstract class AbstractSelectionProcessor<R extends AbstractMailboxSelectionRequ
     private void highestModSeq(Responder responder, MetaData metaData, SelectedMailbox selected) {
         final StatusResponse untaggedOk;
         if (metaData.isModSeqPermanent()) {
-            final long highestModSeq = metaData.getHighestModSeq();
+            final ModSeq highestModSeq = metaData.getHighestModSeq();
             untaggedOk = statusResponseFactory.untaggedOk(HumanReadableText.HIGHEST_MOD_SEQ, ResponseCode.highestModSeq(highestModSeq));
         } else {
             untaggedOk = statusResponseFactory.untaggedOk(HumanReadableText.NO_MOD_SEQ, ResponseCode.noModSeq());
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
index 9750c6a..6185386 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
@@ -52,6 +52,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.MetaData;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
 import org.apache.james.mailbox.model.FetchGroupImpl;
@@ -100,7 +101,7 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
             // Check if the search did contain the MODSEQ searchkey. If so we need to include the highest mod in the response.
             //
             // See RFC4551: 3.4. MODSEQ Search Criterion in SEARCH
-            final Long highestModSeq;
+            final ModSeq highestModSeq;
             if (session.getAttribute(SEARCH_MODSEQ) != null) {
                 MetaData metaData = mailbox.getMetaData(false, msession, MessageManager.MetaData.FetchGroup.NO_COUNT);
                 highestModSeq = findHighestModSeq(msession, mailbox, MessageRange.toRanges(uids), metaData.getHighestModSeq());
@@ -237,16 +238,16 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
      * @return highestModSeq
      * @throws MailboxException
      */
-    private Long findHighestModSeq(MailboxSession session, MessageManager mailbox, List<MessageRange> ranges, long currentHighest) throws MailboxException {
-        Long highestModSeq = null;
+    private ModSeq findHighestModSeq(MailboxSession session, MessageManager mailbox, List<MessageRange> ranges, ModSeq currentHighest) throws MailboxException {
+        ModSeq highestModSeq = null;
         
         // Reverse loop over the ranges as its more likely that we find a match at the end
         int size = ranges.size();
         for (int i = size - 1; i > 0; i--) {
             MessageResultIterator results = mailbox.getMessages(ranges.get(i), FetchGroupImpl.MINIMAL, session);
             while (results.hasNext()) {
-                long modSeq = results.next().getModSeq();
-                if (highestModSeq == null || modSeq > highestModSeq) {
+                ModSeq modSeq = results.next().getModSeq();
+                if (highestModSeq == null || modSeq.asLong() > highestModSeq.asLong()) {
                     highestModSeq = modSeq;
                 }
                 if (highestModSeq == currentHighest) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index f067be9..4303e58 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.metrics.api.MetricFactory;
@@ -87,7 +88,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         MessageUid uidNext = uidNext(statusDataItems, metaData);
         Long uidValidity = uidValidity(statusDataItems, metaData);
         Long unseen = unseen(statusDataItems, metaData);
-        Long highestModSeq = highestModSeq(statusDataItems, metaData);
+        ModSeq highestModSeq = highestModSeq(statusDataItems, metaData);
         return new MailboxStatusResponse(messages, recent, uidNext, highestModSeq, uidValidity, unseen, request.getMailboxName());
     }
 
@@ -115,7 +116,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private Long highestModSeq(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+    private ModSeq highestModSeq(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isHighestModSeq()) {
             return metaData.getHighestModSeq();
         } else {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
index 05692ea..daed075 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.MetaData;
 import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
 import org.apache.james.mailbox.model.FetchGroupImpl;
@@ -151,7 +152,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
                             // Check if the mod-sequence of the message is <= the unchangedsince.
                             //
                             // See RFC4551 3.2. STORE and UID STORE Commands
-                            if (!fail && r.getModSeq() <= unchangedSince) {
+                            if (!fail && r.getModSeq().asLong() <= unchangedSince) {
                                 uids.add(uid);
                             } else {
                                 if (useUids) {
@@ -253,7 +254,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
         boolean condstoreEnabled = enabled.contains(ImapConstants.SUPPORTS_CONDSTORE);
         
         if (!silent || unchangedSince != -1 || qresyncEnabled || condstoreEnabled) {
-            final Map<MessageUid, Long> modSeqs = new HashMap<>();
+            final Map<MessageUid, ModSeq> modSeqs = new HashMap<>();
            
             // Check if we need to also send the the mod-sequences back to the client
             //
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
index dd7c52b..d35b7bd 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
@@ -157,7 +157,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
                 final MessageResult result = messages.next();
 
                 //skip unchanged messages - this should be filtered at the mailbox level to take advantage of indexes
-                if (fetch.isModSeq() && result.getModSeq() <= fetch.getChangedSince()) {
+                if (fetch.isModSeq() && result.getModSeq().asLong() <= fetch.getChangedSince()) {
                     continue;
                 }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
index fb1e78c..a56e0fc 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
@@ -40,6 +40,7 @@ import org.apache.james.imap.message.response.FetchResponse;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MessageRangeException;
 import org.apache.james.mailbox.model.Content;
@@ -60,7 +61,7 @@ public final class FetchResponseBuilder {
 
     private Long size;
     
-    private Long modSeq;
+    private ModSeq modSeq;
 
     private List<FetchResponse.BodyElement> elements;
 
@@ -91,7 +92,7 @@ public final class FetchResponseBuilder {
         this.uid = resultUid;
     }
 
-    private void setModSeq(long modSeq) {
+    private void setModSeq(ModSeq modSeq) {
         this.modSeq = modSeq;
     }
 
@@ -188,7 +189,7 @@ public final class FetchResponseBuilder {
             long changedSince = fetch.getChangedSince();
             if (changedSince != -1) {
                 // check if the modsequence if higher then the one specified by the CHANGEDSINCE option
-                if (changedSince < result.getModSeq()) {
+                if (changedSince < result.getModSeq().asLong()) {
                     setModSeq(result.getModSeq());
                 }
             } else {
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index b6e2419..bf70ce3 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -62,19 +63,19 @@ public class MailboxEventAnalyserTest {
     private static final MessageUid UID = MessageUid.of(900);
     private static final UpdatedFlags ADD_RECENT_UPDATED_FLAGS = UpdatedFlags.builder()
         .uid(UID)
-        .modSeq(-1)
+        .modSeq(ModSeq.first())
         .oldFlags(new Flags())
         .newFlags(new Flags(Flags.Flag.RECENT))
         .build();
     private static final UpdatedFlags ADD_ANSWERED_UPDATED_FLAGS = UpdatedFlags.builder()
         .uid(UID)
-        .modSeq(-1)
+        .modSeq(ModSeq.first())
         .oldFlags(new Flags())
         .newFlags(new Flags(Flags.Flag.ANSWERED))
         .build();
     private static final UpdatedFlags NOOP_UPDATED_FLAGS = UpdatedFlags.builder()
         .uid(UID)
-        .modSeq(-1)
+        .modSeq(ModSeq.first())
         .oldFlags(new Flags())
         .newFlags(new Flags())
         .build();
@@ -123,7 +124,7 @@ public class MailboxEventAnalyserTest {
         .randomEventId()
         .mailboxSession(MAILBOX_SESSION)
         .mailbox(DEFAULT_MAILBOX)
-        .addMetaData(new MessageMetaData(MessageUid.of(11), 0, new Flags(), 45, new Date(), new DefaultMessageId()))
+        .addMetaData(new MessageMetaData(MessageUid.of(11), ModSeq.first(), new Flags(), 45, new Date(), new DefaultMessageId()))
         .build();
 
     private SelectedMailboxImpl testee;
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
index 011d74e..95a25c1 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/SelectedMailboxImplTest.java
@@ -44,6 +44,7 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -67,7 +68,7 @@ public class SelectedMailboxImplTest {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(SelectedMailboxImplTest.class);
     private static final MessageUid EMITTED_EVENT_UID = MessageUid.of(5);
-    private static final int MOD_SEQ = 12;
+    private static final ModSeq MOD_SEQ = ModSeq.of(12);
     private static final int SIZE = 38;
 
     private ExecutorService executorService;
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 dec75d8..d233993 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
@@ -37,6 +37,7 @@ import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MailboxId;
@@ -196,7 +197,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         
         public static class Builder {
             private MessageUid uid;
-            private Long modSeq;
+            private ModSeq modSeq;
             private Keywords keywords;
             private Long size;
             private Instant internalDate;
@@ -211,7 +212,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
                 return this;
             }
             
-            public Builder modSeq(long modSeq) {
+            public Builder modSeq(ModSeq modSeq) {
                 this.modSeq = modSeq;
                 return this;
             }
@@ -263,9 +264,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
             
             public MetaDataWithContent build() {
                 Preconditions.checkArgument(uid != null);
-                if (modSeq == null) {
-                    modSeq = -1L;
-                }
+                Preconditions.checkArgument(modSeq != null);
                 Preconditions.checkArgument(keywords != null);
                 Preconditions.checkArgument(size != null);
                 Preconditions.checkArgument(internalDate != null);
@@ -278,7 +277,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         }
 
         private final MessageUid uid;
-        private final long modSeq;
+        private final ModSeq modSeq;
         private final Keywords keywords;
         private final long size;
         private final Instant internalDate;
@@ -289,7 +288,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         private final MessageId messageId;
 
         private MetaDataWithContent(MessageUid uid,
-                                    long modSeq,
+                                    ModSeq modSeq,
                                     Keywords keywords,
                                     long size,
                                     Instant internalDate,
@@ -314,7 +313,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
             return uid;
         }
 
-        public long getModSeq() {
+        public ModSeq getModSeq() {
             return modSeq;
         }
 


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


[james-project] 01/22: JAMES-2987 Rename Jmap Message to MessageFullView

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 14d1aaa2589d7b7c2cb388bcd11748f8ba1ddca6
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Nov 21 09:14:21 2019 +0700

    JAMES-2987 Rename Jmap Message to MessageFullView
    
    And the factory
---
 .../apache/james/jmap/draft/JMAPCommonModule.java  |  4 +-
 .../jmap/draft/methods/GetMessagesMethod.java      | 16 ++---
 .../jmap/draft/methods/MIMEMessageConverter.java   |  4 +-
 .../james/jmap/draft/methods/MessageAppender.java  | 28 ++++----
 .../james/jmap/draft/methods/MessageSender.java    |  6 +-
 .../james/jmap/draft/methods/SendMDNProcessor.java |  4 +-
 .../methods/SetMessagesCreationProcessor.java      | 16 ++---
 .../james/jmap/draft/methods/ValueWithId.java      |  6 +-
 .../james/jmap/draft/model/EnvelopeUtils.java      |  2 +-
 .../jmap/draft/model/GetMessagesResponse.java      | 14 ++--
 .../model/{Message.java => MessageFullView.java}   | 51 ++++++++-------
 ...MessageFactory.java => MessageViewFactory.java} |  8 +--
 .../jmap/draft/model/SetMessagesResponse.java      | 12 ++--
 .../apache/james/jmap/draft/model/SubMessage.java  |  2 +-
 .../jmap/draft/json/ParsingWritingObjects.java     |  4 +-
 .../jmap/draft/methods/GetMessagesMethodTest.java  | 34 +++++-----
 .../jmap/draft/methods/MessageSenderTest.java      | 16 ++---
 .../methods/SetMessagesCreationProcessorTest.java  | 12 ++--
 .../{MessageTest.java => MessageFullViewTest.java} | 48 +++++++-------
 ...actoryTest.java => MessageViewFactoryTest.java} | 76 +++++++++++-----------
 .../jmap/draft/model/SetMessagesResponseTest.java  |  8 +--
 21 files changed, 186 insertions(+), 185 deletions(-)

diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
index dce8120..275a17f 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
@@ -34,8 +34,8 @@ import org.apache.james.jmap.draft.crypto.SignatureHandler;
 import org.apache.james.jmap.draft.crypto.SignedTokenFactory;
 import org.apache.james.jmap.draft.crypto.SignedTokenManager;
 import org.apache.james.jmap.draft.model.MailboxFactory;
-import org.apache.james.jmap.draft.model.MessageFactory;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.jmap.draft.utils.HeadersAuthenticationExtractor;
 import org.apache.james.lifecycle.api.StartUpCheck;
@@ -68,7 +68,7 @@ public class JMAPCommonModule extends AbstractModule {
         bind(MailSpool.class).in(Scopes.SINGLETON);
         bind(AutomaticallySentMailDetectorImpl.class).in(Scopes.SINGLETON);
         bind(MailboxFactory.class).in(Scopes.SINGLETON);
-        bind(MessageFactory.class).in(Scopes.SINGLETON);
+        bind(MessageViewFactory.class).in(Scopes.SINGLETON);
         bind(MessagePreviewGenerator.class).in(Scopes.SINGLETON);
         bind(MessageContentExtractor.class).in(Scopes.SINGLETON);
         bind(HeadersAuthenticationExtractor.class).in(Scopes.SINGLETON);
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 1b414a0..32ec8bb 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
@@ -32,11 +32,11 @@ import org.apache.james.jmap.draft.json.FieldNamePropertyFilter;
 import org.apache.james.jmap.draft.model.GetMessagesRequest;
 import org.apache.james.jmap.draft.model.GetMessagesResponse;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.Message;
-import org.apache.james.jmap.draft.model.MessageFactory;
-import org.apache.james.jmap.draft.model.MessageFactory.MetaDataWithContent;
+import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.MessageProperties;
 import org.apache.james.jmap.draft.model.MessageProperties.HeaderProperty;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
+import org.apache.james.jmap.draft.model.MessageViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.utils.KeywordsCombiner;
 import org.apache.james.mailbox.MailboxSession;
@@ -65,17 +65,17 @@ public class GetMessagesMethod implements Method {
     private static final Method.Request.Name METHOD_NAME = Method.Request.name("getMessages");
     private static final Method.Response.Name RESPONSE_NAME = Method.Response.name("messages");
     private static final KeywordsCombiner ACCUMULATOR = new KeywordsCombiner();
-    private final MessageFactory messageFactory;
+    private final MessageViewFactory messageViewFactory;
     private final MessageIdManager messageIdManager;
     private final MetricFactory metricFactory;
     private final Keywords.KeywordsFactory keywordsFactory;
 
     @Inject
     @VisibleForTesting GetMessagesMethod(
-            MessageFactory messageFactory,
+            MessageViewFactory messageViewFactory,
             MessageIdManager messageIdManager,
             MetricFactory metricFactory) {
-        this.messageFactory = messageFactory;
+        this.messageViewFactory = messageViewFactory;
         this.messageIdManager = messageIdManager;
         this.metricFactory = metricFactory;
         this.keywordsFactory = Keywords.lenientFactory();
@@ -150,10 +150,10 @@ public class GetMessagesMethod implements Method {
         }
     }
 
-    private Function<MetaDataWithContent, Stream<Message>> toMessage() {
+    private Function<MetaDataWithContent, Stream<MessageFullView>> toMessage() {
         return metaDataWithContent -> {
             try {
-                return Stream.of(messageFactory.fromMetaDataWithContent(metaDataWithContent));
+                return Stream.of(messageViewFactory.fromMetaDataWithContent(metaDataWithContent));
             } catch (Exception e) {
                 LOGGER.error("Can not convert metaData with content to Message for {}", metaDataWithContent.getMessageId(), e);
                 return Stream.of();
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
index 6057e1f..14f8a28 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MIMEMessageConverter.java
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
 
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
-import org.apache.james.jmap.draft.model.MessageFactory;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mime4j.codec.DecodeMonitor;
 import org.apache.james.mime4j.codec.EncoderUtil;
@@ -176,7 +176,7 @@ public class MIMEMessageConverter {
     }
 
     private void addMultivaluedHeader(Message.Builder messageBuilder, String fieldName, String multipleValues) {
-        Splitter.on(MessageFactory.JMAP_MULTIVALUED_FIELD_DELIMITER).split(multipleValues)
+        Splitter.on(MessageViewFactory.JMAP_MULTIVALUED_FIELD_DELIMITER).split(multipleValues)
             .forEach(value -> addHeader(messageBuilder, fieldName, value));
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
index 79a802a..164029d 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
@@ -32,7 +32,7 @@ import org.apache.james.jmap.draft.methods.ValueWithId.CreationMessageEntry;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.MessageFactory;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -73,9 +73,9 @@ public class MessageAppender {
         this.mimeMessageConverter = mimeMessageConverter;
     }
 
-    public MessageFactory.MetaDataWithContent appendMessageInMailboxes(CreationMessageEntry createdEntry,
-                                                                       List<MailboxId> targetMailboxes,
-                                                                       MailboxSession session) throws MailboxException {
+    public MessageViewFactory.MetaDataWithContent appendMessageInMailboxes(CreationMessageEntry createdEntry,
+                                                                           List<MailboxId> targetMailboxes,
+                                                                           MailboxSession session) throws MailboxException {
         Preconditions.checkArgument(!targetMailboxes.isEmpty());
         ImmutableList<MessageAttachment> messageAttachments = getMessageAttachments(session, createdEntry.getValue().getAttachments());
         byte[] messageContent = mimeMessageConverter.convert(createdEntry, messageAttachments);
@@ -94,7 +94,7 @@ public class MessageAppender {
             messageIdManager.setInMailboxes(message.getMessageId(), targetMailboxes, session);
         }
 
-        return MessageFactory.MetaDataWithContent.builder()
+        return MessageViewFactory.MetaDataWithContent.builder()
             .uid(message.getUid())
             .keywords(createdEntry.getValue().getKeywords())
             .internalDate(internalDate.toInstant())
@@ -106,11 +106,11 @@ public class MessageAppender {
             .build();
     }
 
-    public MessageFactory.MetaDataWithContent appendMessageInMailbox(org.apache.james.mime4j.dom.Message message,
-                                                                     MessageManager messageManager,
-                                                                     List<MessageAttachment> attachments,
-                                                                     Flags flags,
-                                                                     MailboxSession session) throws MailboxException {
+    public MessageViewFactory.MetaDataWithContent appendMessageInMailbox(org.apache.james.mime4j.dom.Message message,
+                                                                         MessageManager messageManager,
+                                                                         List<MessageAttachment> attachments,
+                                                                         Flags flags,
+                                                                         MailboxSession session) throws MailboxException {
 
 
         byte[] messageContent = asBytes(message);
@@ -121,7 +121,7 @@ public class MessageAppender {
             .withFlags(flags)
             .build(content), session);
 
-        return MessageFactory.MetaDataWithContent.builder()
+        return MessageViewFactory.MetaDataWithContent.builder()
             .uid(appendedMessage.getUid())
             .keywords(Keywords.lenientFactory().fromFlags(flags))
             .internalDate(internalDate.toInstant())
@@ -141,9 +141,9 @@ public class MessageAppender {
         }
     }
 
-    public MessageFactory.MetaDataWithContent appendMessageInMailbox(CreationMessageEntry createdEntry,
-                                                                       MailboxId targetMailbox,
-                                                                       MailboxSession session) throws MailboxException {
+    public MessageViewFactory.MetaDataWithContent appendMessageInMailbox(CreationMessageEntry createdEntry,
+                                                                         MailboxId targetMailbox,
+                                                                         MailboxSession session) throws MailboxException {
         return appendMessageInMailboxes(createdEntry, ImmutableList.of(targetMailbox), session);
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
index 6c16258..7ec6164 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
@@ -25,7 +25,7 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-import org.apache.james.jmap.draft.model.MessageFactory;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.jmap.draft.send.MailMetadata;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.lifecycle.api.LifecycleUtil;
@@ -48,7 +48,7 @@ public class MessageSender {
         this.mailSpool = mailSpool;
     }
 
-    public void sendMessage(MessageFactory.MetaDataWithContent message,
+    public void sendMessage(MessageViewFactory.MetaDataWithContent message,
                             Envelope envelope,
                             MailboxSession session) throws MessagingException {
         Mail mail = buildMail(message, envelope);
@@ -60,7 +60,7 @@ public class MessageSender {
     }
 
     @VisibleForTesting
-    static Mail buildMail(MessageFactory.MetaDataWithContent message, Envelope envelope) throws MessagingException {
+    static Mail buildMail(MessageViewFactory.MetaDataWithContent message, Envelope envelope) throws MessagingException {
         String name = message.getMessageId().serialize();
         return MailImpl.builder()
             .name(name)
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
index a740235..241f8f9 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
@@ -32,7 +32,7 @@ import javax.mail.MessagingException;
 import org.apache.james.jmap.draft.exceptions.InvalidOriginMessageForMDNException;
 import org.apache.james.jmap.draft.exceptions.MessageNotFoundException;
 import org.apache.james.jmap.draft.model.JmapMDN;
-import org.apache.james.jmap.draft.model.MessageFactory;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.jmap.draft.model.SetError;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
@@ -151,7 +151,7 @@ public class SendMDNProcessor implements SetMessagesProcessor {
         Message mdnAnswer = mdn.generateMDNMessage(originalMessage, mailboxSession);
 
         Flags seen = new Flags(Flags.Flag.SEEN);
-        MessageFactory.MetaDataWithContent metaDataWithContent = messageAppender.appendMessageInMailbox(mdnAnswer,
+        MessageViewFactory.MetaDataWithContent metaDataWithContent = messageAppender.appendMessageInMailbox(mdnAnswer,
             getOutbox(mailboxSession), reportAsAttachment, seen, mailboxSession);
 
         messageSender.sendMessage(metaDataWithContent,
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
index 90e4dfb..99da72f 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessor.java
@@ -40,11 +40,11 @@ import org.apache.james.jmap.draft.methods.ValueWithId.MessageWithId;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.draft.model.EnvelopeUtils;
-import org.apache.james.jmap.draft.model.Message;
-import org.apache.james.jmap.draft.model.MessageFactory;
-import org.apache.james.jmap.draft.model.MessageFactory.MetaDataWithContent;
+import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.MessageProperties;
 import org.apache.james.jmap.draft.model.MessageProperties.MessageProperty;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
+import org.apache.james.jmap.draft.model.MessageViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.model.SetError;
 import org.apache.james.jmap.draft.model.SetMessagesError;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
@@ -76,7 +76,7 @@ import com.google.common.collect.ImmutableList;
 public class SetMessagesCreationProcessor implements SetMessagesProcessor {
 
     private static final Logger LOG = LoggerFactory.getLogger(SetMailboxesCreationProcessor.class);
-    private final MessageFactory messageFactory;
+    private final MessageViewFactory messageViewFactory;
     private final SystemMailboxesProvider systemMailboxesProvider;
     private final AttachmentChecker attachmentChecker;
     private final MetricFactory metricFactory;
@@ -88,7 +88,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
     
     @VisibleForTesting
     @Inject
-    SetMessagesCreationProcessor(MessageFactory messageFactory,
+    SetMessagesCreationProcessor(MessageViewFactory messageViewFactory,
                                  SystemMailboxesProvider systemMailboxesProvider,
                                  AttachmentChecker attachmentChecker,
                                  MetricFactory metricFactory,
@@ -97,7 +97,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
                                  MessageAppender messageAppender,
                                  MessageSender messageSender,
                                  ReferenceUpdater referenceUpdater) {
-        this.messageFactory = messageFactory;
+        this.messageViewFactory = messageViewFactory;
         this.systemMailboxesProvider = systemMailboxesProvider;
         this.attachmentChecker = attachmentChecker;
         this.metricFactory = metricFactory;
@@ -276,7 +276,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
     private MessageWithId handleOutboxMessages(CreationMessageEntry entry, MailboxSession session) throws MailboxException, MessagingException {
         assertUserIsSender(session, entry.getValue().getFrom());
         MetaDataWithContent newMessage = messageAppender.appendMessageInMailboxes(entry, toMailboxIds(entry), session);
-        Message jmapMessage = messageFactory.fromMetaDataWithContent(newMessage);
+        MessageFullView jmapMessage = messageViewFactory.fromMetaDataWithContent(newMessage);
         Envelope envelope = EnvelopeUtils.fromMessage(jmapMessage);
         messageSender.sendMessage(newMessage, envelope, session);
         referenceUpdater.updateReferences(entry.getValue().getHeaders(), session);
@@ -294,7 +294,7 @@ public class SetMessagesCreationProcessor implements SetMessagesProcessor {
 
     private MessageWithId handleDraftMessages(CreationMessageEntry entry, MailboxSession session) throws MailboxException, MessagingException {
         MetaDataWithContent newMessage = messageAppender.appendMessageInMailboxes(entry, toMailboxIds(entry), session);
-        Message jmapMessage = messageFactory.fromMetaDataWithContent(newMessage);
+        MessageFullView jmapMessage = messageViewFactory.fromMetaDataWithContent(newMessage);
         return new ValueWithId.MessageWithId(entry.getCreationId(), jmapMessage);
     }
     
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ValueWithId.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ValueWithId.java
index 059de71..cc89d1f 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ValueWithId.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ValueWithId.java
@@ -22,7 +22,7 @@ package org.apache.james.jmap.draft.methods;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessageId;
 import org.apache.james.jmap.draft.model.JmapMDN;
-import org.apache.james.jmap.draft.model.Message;
+import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.SetError;
 
 import com.google.common.base.MoreObjects;
@@ -63,8 +63,8 @@ public class ValueWithId<T> {
         }
     }
 
-    public static class MessageWithId extends ValueWithId<Message> {
-        public MessageWithId(CreationMessageId creationId, Message message) {
+    public static class MessageWithId extends ValueWithId<MessageFullView> {
+        public MessageWithId(CreationMessageId creationId, MessageFullView message) {
             super(creationId, message);
         }
     }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/EnvelopeUtils.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/EnvelopeUtils.java
index a1d96be..69cb4f4 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/EnvelopeUtils.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/EnvelopeUtils.java
@@ -30,7 +30,7 @@ import org.apache.james.util.StreamUtils;
 import com.github.steveash.guavate.Guavate;
 
 public class EnvelopeUtils {
-    public static Envelope fromMessage(Message jmapMessage) {
+    public static Envelope fromMessage(MessageFullView jmapMessage) {
         MaybeSender sender = MaybeSender.of(jmapMessage.getFrom()
             .map(Emailer::toMailAddress)
             .orElseThrow(() -> new RuntimeException("Sender is mandatory")));
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 13137a1..1af0eb8 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
@@ -41,7 +41,7 @@ public class GetMessagesResponse implements Method.Response {
     
     @JsonPOJOBuilder(withPrefix = "")
     public static class Builder {
-        private ImmutableList<Message> messages;
+        private ImmutableList<MessageFullView> messages;
         private List<MessageId> expectedMessageIds;
 
         private Builder() {
@@ -49,12 +49,12 @@ public class GetMessagesResponse implements Method.Response {
         }
 
         @JsonIgnore
-        public Builder message(Message message) {
+        public Builder message(MessageFullView message) {
             this.messages = ImmutableList.of(message);
             return this;
         }
 
-        public Builder messages(List<Message> messages) {
+        public Builder messages(List<MessageFullView> messages) {
             this.messages = ImmutableList.copyOf(messages);
             return this;
         }
@@ -71,7 +71,7 @@ public class GetMessagesResponse implements Method.Response {
         
 
         private List<MessageId> messagesNotFound() {
-            Set<MessageId> foundMessageIds = messages.stream().map(Message::getId).collect(Collectors.toSet());
+            Set<MessageId> foundMessageIds = messages.stream().map(MessageFullView::getId).collect(Collectors.toSet());
             return ImmutableList.copyOf(expectedMessageIds.stream()
                 .filter(id -> !foundMessageIds.contains(id))
                 .collect(Collectors.toList()));
@@ -80,16 +80,16 @@ public class GetMessagesResponse implements Method.Response {
     
     
     
-    private final List<Message> messages;
+    private final List<MessageFullView> messages;
     private final List<MessageId> messagesNotFound;
 
-    private GetMessagesResponse(List<Message> messages, List<MessageId> messagesNotFound) {
+    private GetMessagesResponse(List<MessageFullView> messages, List<MessageId> messagesNotFound) {
         this.messages = messages;
         this.messagesNotFound = messagesNotFound;
     }
 
     @JsonSerialize
-    public List<Message> list() {
+    public List<MessageFullView> list() {
         return messages;
     }
     
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Message.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFullView.java
similarity index 89%
rename from server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Message.java
rename to server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFullView.java
index a702c31..f6576cf 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/Message.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFullView.java
@@ -42,9 +42,9 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-@JsonDeserialize(builder = Message.Builder.class)
+@JsonDeserialize(builder = MessageFullView.Builder.class)
 @JsonFilter(JmapResponseWriterImpl.PROPERTIES_FILTER)
-public class Message {
+public class MessageFullView {
 
     public static Builder builder() {
         return new Builder();
@@ -192,7 +192,7 @@ public class Message {
             return this;
         }
 
-        public Message build() {
+        public MessageFullView build() {
             Preconditions.checkState(id != null, "'id' is mandatory");
             Preconditions.checkState(blobId != null, "'blobId' is mandatory");
             Preconditions.checkState(!Strings.isNullOrEmpty(threadId), "'threadId' is mandatory");
@@ -206,7 +206,7 @@ public class Message {
             Preconditions.checkState(areAttachedMessagesKeysInAttachments(attachments, attachedMessages), "'attachedMessages' keys must be in 'attachements'");
             boolean hasAttachment = hasAttachment(attachments);
 
-            return new Message(id, blobId, threadId, mailboxIds, Optional.ofNullable(inReplyToMessageId),
+            return new MessageFullView(id, blobId, threadId, mailboxIds, Optional.ofNullable(inReplyToMessageId),
                 hasAttachment, headers, Optional.ofNullable(from),
                 to.build(), cc.build(), bcc.build(), replyTo.build(), subject, date, size, preview, textBody, htmlBody, attachments, attachedMessages,
                 keywords.orElse(Keywords.DEFAULT_VALUE));
@@ -252,27 +252,28 @@ public class Message {
     private final ImmutableMap<BlobId, SubMessage> attachedMessages;
     private final Keywords keywords;
 
-    @VisibleForTesting Message(MessageId id,
-                               BlobId blobId,
-                               String threadId,
-                               ImmutableList<MailboxId> mailboxIds,
-                               Optional<String> inReplyToMessageId,
-                               boolean hasAttachment,
-                               ImmutableMap<String, String> headers,
-                               Optional<Emailer> from,
-                               ImmutableList<Emailer> to,
-                               ImmutableList<Emailer> cc,
-                               ImmutableList<Emailer> bcc,
-                               ImmutableList<Emailer> replyTo,
-                               String subject,
-                               Instant date,
-                               Number size,
-                               String preview,
-                               Optional<String> textBody,
-                               Optional<String> htmlBody,
-                               ImmutableList<Attachment> attachments,
-                               ImmutableMap<BlobId, SubMessage> attachedMessages,
-                               Keywords keywords) {
+    @VisibleForTesting
+    MessageFullView(MessageId id,
+                    BlobId blobId,
+                    String threadId,
+                    ImmutableList<MailboxId> mailboxIds,
+                    Optional<String> inReplyToMessageId,
+                    boolean hasAttachment,
+                    ImmutableMap<String, String> headers,
+                    Optional<Emailer> from,
+                    ImmutableList<Emailer> to,
+                    ImmutableList<Emailer> cc,
+                    ImmutableList<Emailer> bcc,
+                    ImmutableList<Emailer> replyTo,
+                    String subject,
+                    Instant date,
+                    Number size,
+                    String preview,
+                    Optional<String> textBody,
+                    Optional<String> htmlBody,
+                    ImmutableList<Attachment> attachments,
+                    ImmutableMap<BlobId, SubMessage> attachedMessages,
+                    Keywords keywords) {
         this.id = id;
         this.blobId = blobId;
         this.threadId = threadId;
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageViewFactory.java
similarity index 97%
rename from server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFactory.java
rename to server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageViewFactory.java
index a0e0359..4428c9f 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/MessageViewFactory.java
@@ -60,7 +60,7 @@ import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
 
-public class MessageFactory {
+public class MessageViewFactory {
 
     public static final String JMAP_MULTIVALUED_FIELD_DELIMITER = "\n";
 
@@ -70,21 +70,21 @@ public class MessageFactory {
     private final HtmlTextExtractor htmlTextExtractor;
 
     @Inject
-    public MessageFactory(BlobManager blobManager, MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor, HtmlTextExtractor htmlTextExtractor) {
+    public MessageViewFactory(BlobManager blobManager, MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor, HtmlTextExtractor htmlTextExtractor) {
         this.blobManager = blobManager;
         this.messagePreview = messagePreview;
         this.messageContentExtractor = messageContentExtractor;
         this.htmlTextExtractor = htmlTextExtractor;
     }
 
-    public Message fromMetaDataWithContent(MetaDataWithContent message) throws MailboxException {
+    public MessageFullView fromMetaDataWithContent(MetaDataWithContent message) throws MailboxException {
         org.apache.james.mime4j.dom.Message mimeMessage = parse(message);
         MessageContent messageContent = extractContent(mimeMessage);
         Optional<String> htmlBody = messageContent.getHtmlBody();
         Optional<String> mainTextContent = mainTextContent(messageContent);
         Optional<String> textBody = computeTextBodyIfNeeded(messageContent, mainTextContent);
         String preview = messagePreview.compute(mainTextContent);
-        return Message.builder()
+        return MessageFullView.builder()
                 .id(message.getMessageId())
                 .blobId(BlobId.of(blobManager.toBlobId(message.getMessageId())))
                 .threadId(message.getMessageId().serialize())
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SetMessagesResponse.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SetMessagesResponse.java
index 17d332a..d9682d5 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SetMessagesResponse.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SetMessagesResponse.java
@@ -50,7 +50,7 @@ public class SetMessagesResponse implements Method.Response {
         private String accountId;
         private String oldState;
         private String newState;
-        private final ImmutableMap.Builder<CreationMessageId, Message> created;
+        private final ImmutableMap.Builder<CreationMessageId, MessageFullView> created;
         private final ImmutableMap.Builder<CreationMessageId, MessageId> mdnSent;
         private final ImmutableList.Builder<MessageId> updated;
         private final ImmutableList.Builder<MessageId> destroyed;
@@ -82,12 +82,12 @@ public class SetMessagesResponse implements Method.Response {
             throw new NotImplementedException("not implemented");
         }
 
-        public Builder created(CreationMessageId creationMessageId, Message message) {
+        public Builder created(CreationMessageId creationMessageId, MessageFullView message) {
             this.created.put(creationMessageId, message);
             return this;
         }
 
-        public Builder created(Map<CreationMessageId, Message> created) {
+        public Builder created(Map<CreationMessageId, MessageFullView> created) {
             this.created.putAll(created);
             return this;
         }
@@ -171,7 +171,7 @@ public class SetMessagesResponse implements Method.Response {
     private final String accountId;
     private final String oldState;
     private final String newState;
-    private final ImmutableMap<CreationMessageId, Message> created;
+    private final ImmutableMap<CreationMessageId, MessageFullView> created;
     private final ImmutableMap<CreationMessageId, MessageId> mdnSent;
     private final ImmutableList<MessageId> updated;
     private final ImmutableList<MessageId> destroyed;
@@ -180,7 +180,7 @@ public class SetMessagesResponse implements Method.Response {
     private final ImmutableMap<MessageId, SetError> notUpdated;
     private final ImmutableMap<MessageId, SetError> notDestroyed;
 
-    @VisibleForTesting SetMessagesResponse(String accountId, String oldState, String newState, ImmutableMap<CreationMessageId, Message> created, ImmutableMap<CreationMessageId, MessageId> mdnSent, ImmutableList<MessageId> updated, ImmutableList<MessageId> destroyed,
+    @VisibleForTesting SetMessagesResponse(String accountId, String oldState, String newState, ImmutableMap<CreationMessageId, MessageFullView> created, ImmutableMap<CreationMessageId, MessageId> mdnSent, ImmutableList<MessageId> updated, ImmutableList<MessageId> destroyed,
                                            ImmutableMap<CreationMessageId, SetError> notCreated, ImmutableMap<CreationMessageId, SetError> mdnNotSent, ImmutableMap<MessageId, SetError> notUpdated, ImmutableMap<MessageId, SetError> notDestroyed) {
         this.accountId = accountId;
         this.oldState = oldState;
@@ -207,7 +207,7 @@ public class SetMessagesResponse implements Method.Response {
         return newState;
     }
 
-    public ImmutableMap<CreationMessageId, Message> getCreated() {
+    public ImmutableMap<CreationMessageId, MessageFullView> getCreated() {
         return created;
     }
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SubMessage.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SubMessage.java
index cc966b2..1394c82 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SubMessage.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/SubMessage.java
@@ -129,7 +129,7 @@ public class SubMessage {
             Preconditions.checkState(date != null, "'date' is mandatory");
             ImmutableList<Attachment> attachments = this.attachments.build();
             ImmutableMap<BlobId, SubMessage> attachedMessages = this.attachedMessages.build();
-            Preconditions.checkState(Message.areAttachedMessagesKeysInAttachments(attachments, attachedMessages), "'attachedMessages' keys must be in 'attachements'");
+            Preconditions.checkState(MessageFullView.areAttachedMessagesKeysInAttachments(attachments, attachedMessages), "'attachedMessages' keys must be in 'attachements'");
             return new SubMessage(headers, Optional.ofNullable(from), to.build(), cc.build(), bcc.build(),
                     replyTo.build(), subject, date, textBody, htmlBody,
                     attachments, attachedMessages
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjects.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjects.java
index 491a7e2..d749817 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjects.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/json/ParsingWritingObjects.java
@@ -28,7 +28,7 @@ import org.apache.james.jmap.draft.model.BlobId;
 import org.apache.james.jmap.draft.model.Emailer;
 import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.Message;
+import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.SubMessage;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.inmemory.InMemoryId;
@@ -71,7 +71,7 @@ public interface ParsingWritingObjects {
         Optional<String> HTML_BODY = Optional.of("<h1>myHtmlBody</h1>");
     }
 
-    Message MESSAGE = Message.builder()
+    MessageFullView MESSAGE = MessageFullView.builder()
             .id(Common.MESSAGE_ID)
             .blobId(Common.BLOB_ID)
             .threadId(Common.THREAD_ID)
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 1585cb1..bedf3a1 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
@@ -36,13 +36,13 @@ import javax.mail.Flags.Flag;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Username;
-import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.model.GetMessagesRequest;
 import org.apache.james.jmap.draft.model.GetMessagesResponse;
-import org.apache.james.jmap.draft.model.Message;
-import org.apache.james.jmap.draft.model.MessageFactory;
+import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.model.MessageProperties.MessageProperty;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
+import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
@@ -103,7 +103,7 @@ public class GetMessagesMethodTest {
         MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake"));
-        MessageFactory messageFactory = new MessageFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        MessageViewFactory messageViewFactory = new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
         InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
         mailboxManager = resources.getMailboxManager();
 
@@ -113,7 +113,7 @@ public class GetMessagesMethodTest {
         mailboxManager.createMailbox(inboxPath, session);
         mailboxManager.createMailbox(customMailboxPath, session);
         messageIdManager = resources.getMessageIdManager();
-        testee = new GetMessagesMethod(messageFactory, messageIdManager, new DefaultMetricFactory());
+        testee = new GetMessagesMethod(messageViewFactory, messageIdManager, new DefaultMetricFactory());
 
         messageContent1 = org.apache.james.mime4j.dom.Message.Builder.of()
             .setSubject("message 1 subject")
@@ -176,7 +176,7 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(Message::getId, Message::getSubject, Message::getTextBody)
+            .extracting(MessageFullView::getId, MessageFullView::getSubject, MessageFullView::getTextBody)
             .containsOnly(
                 Tuple.tuple(message1.getMessageId(), "message 1 subject", Optional.of("my message")),
                 Tuple.tuple(message2.getMessageId(), "message 2 subject", Optional.of("my message")),
@@ -205,7 +205,7 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(Message::getId, Message::getHtmlBody)
+            .extracting(MessageFullView::getId, MessageFullView::getHtmlBody)
             .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("my <b>HTML</b> message")));
     }
 
@@ -304,7 +304,7 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(Message::getId, Message::getTextBody, Message::getHtmlBody)
+            .extracting(MessageFullView::getId, MessageFullView::getTextBody, MessageFullView::getHtmlBody)
             .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("my HTML message"), Optional.of("my <b>HTML</b> message")));
     }
 
@@ -330,7 +330,7 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(Message::getId, Message::getTextBody, Message::getHtmlBody)
+            .extracting(MessageFullView::getId, MessageFullView::getTextBody, MessageFullView::getHtmlBody)
             .containsOnly(Tuple.tuple(message.getMessageId(), Optional.empty(), Optional.of("")));
     }
 
@@ -362,7 +362,7 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(Message::getId, Message::getTextBody, Message::getHtmlBody)
+            .extracting(MessageFullView::getId, MessageFullView::getTextBody, MessageFullView::getHtmlBody)
             .containsOnly(Tuple.tuple(message.getMessageId(), Optional.of("My plain message"), Optional.of("<a>The </a> <strong>HTML</strong> message")));
     }
 
@@ -462,8 +462,8 @@ public class GetMessagesMethodTest {
 
     @Test
     public void processShouldNotFailOnSingleMessageFailure() throws Exception {
-        MessageFactory messageFactory = mock(MessageFactory.class);
-        testee = new GetMessagesMethod(messageFactory, messageIdManager, new DefaultMetricFactory());
+        MessageViewFactory messageViewFactory = mock(MessageViewFactory.class);
+        testee = new GetMessagesMethod(messageViewFactory, messageIdManager, new DefaultMetricFactory());
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
 
         org.apache.james.mime4j.dom.Message messageContent = org.apache.james.mime4j.dom.Message.Builder.of()
@@ -476,8 +476,8 @@ public class GetMessagesMethodTest {
 
         ComposedMessageId message1 = inbox.appendMessage(AppendCommand.from(messageContent), session);
         ComposedMessageId message2 = inbox.appendMessage(AppendCommand.from(messageContent), session);
-        when(messageFactory.fromMetaDataWithContent(any()))
-            .thenReturn(mock(Message.class))
+        when(messageViewFactory.fromMetaDataWithContent(any()))
+            .thenReturn(mock(MessageFullView.class))
             .thenThrow(new RuntimeException());
 
         GetMessagesRequest request = GetMessagesRequest.builder()
@@ -529,7 +529,7 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(Message::getKeywords)
+            .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
                     ImmutableList.of(
                         ImmutableMap.of(
@@ -586,7 +586,7 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(Message::getKeywords)
+            .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
                     ImmutableList.of(
                         ImmutableMap.of(
@@ -626,7 +626,7 @@ public class GetMessagesMethodTest {
             .hasOnlyElementsOfType(GetMessagesResponse.class)
             .extracting(GetMessagesResponse.class::cast)
             .flatExtracting(GetMessagesResponse::list)
-            .extracting(Message::getKeywords)
+            .extracting(MessageFullView::getKeywords)
             .containsOnlyElementsOf(
                     ImmutableList.of(
                         ImmutableMap.of(
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 0c78db1..ee34861 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
@@ -36,9 +36,9 @@ import org.apache.james.core.MaybeSender;
 import org.apache.james.jmap.draft.model.EnvelopeUtils;
 import org.apache.james.jmap.draft.model.Keyword;
 import org.apache.james.jmap.draft.model.Keywords;
-import org.apache.james.jmap.draft.model.Message;
-import org.apache.james.jmap.draft.model.MessageFactory;
+import org.apache.james.jmap.draft.model.MessageFullView;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
@@ -59,8 +59,8 @@ import com.google.common.collect.ImmutableSet;
 class MessageSenderTest {
 
     private Envelope envelope;
-    private MessageFactory.MetaDataWithContent message;
-    private Message jmapMessage;
+    private MessageViewFactory.MetaDataWithContent message;
+    private MessageFullView jmapMessage;
 
     @BeforeEach
     void setup() throws MailboxException {
@@ -72,7 +72,7 @@ class MessageSenderTest {
         String content = headers
             + "Hello! How are you?";
 
-        message = MessageFactory.MetaDataWithContent.builder()
+        message = MessageViewFactory.MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
             .keywords(Keywords.strictFactory().from(Keyword.SEEN))
             .size(content.length())
@@ -90,14 +90,14 @@ class MessageSenderTest {
         MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake"));
-        MessageFactory messageFactory = new MessageFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
-        jmapMessage = messageFactory.fromMetaDataWithContent(message);
+        MessageViewFactory messageViewFactory = new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        jmapMessage = messageViewFactory.fromMetaDataWithContent(message);
         envelope = EnvelopeUtils.fromMessage(jmapMessage);
     }
 
     @Test
     void buildMailShouldThrowWhenNullMailboxMessage() throws Exception {
-        MessageFactory.MetaDataWithContent message = null;
+        MessageViewFactory.MetaDataWithContent message = null;
         assertThatThrownBy(() -> MessageSender.buildMail(message, envelope)).isInstanceOf(NullPointerException.class);
     }
 
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/SetMessagesCreationProcessorTest.java
index b13a0da..dc9e738 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
@@ -37,8 +37,8 @@ import org.apache.james.jmap.draft.exceptions.MailboxNotOwnedException;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.CreationMessage.DraftEmailer;
 import org.apache.james.jmap.draft.model.CreationMessageId;
-import org.apache.james.jmap.draft.model.MessageFactory;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
+import org.apache.james.jmap.draft.model.MessageViewFactory;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
 import org.apache.james.jmap.draft.send.MailMetadata;
@@ -100,7 +100,7 @@ public class SetMessagesCreationProcessorTest {
                         .build())
             .build();
 
-    private MessageFactory messageFactory;
+    private MessageViewFactory messageViewFactory;
     private MailSpool mockedMailSpool;
     private SystemMailboxesProvider fakeSystemMailboxesProvider;
     private MailboxSession session;
@@ -127,7 +127,7 @@ public class SetMessagesCreationProcessorTest {
         when(messagePreview.compute(any())).thenReturn("text preview");
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(org.apache.james.mailbox.model.BlobId.fromString("fake"));
-        messageFactory = new MessageFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        messageViewFactory = new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
         mockedMailSpool = mock(MailSpool.class);
         mockedAttachmentManager = mock(AttachmentManager.class);
         mockedMailboxManager = mock(MailboxManager.class);
@@ -140,7 +140,7 @@ public class SetMessagesCreationProcessorTest {
         messageAppender = new MessageAppender(mockedMailboxManager, mockMessageIdManager, mockedAttachmentManager, mimeMessageConverter);
         messageSender = new MessageSender(mockedMailSpool);
         referenceUpdater = new ReferenceUpdater(mockMessageIdManager, mockedMailboxManager);
-        sut = new SetMessagesCreationProcessor(messageFactory,
+        sut = new SetMessagesCreationProcessor(messageViewFactory,
             fakeSystemMailboxesProvider,
             new AttachmentChecker(mockedAttachmentManager),
             new NoopMetricFactory(),
@@ -232,7 +232,7 @@ public class SetMessagesCreationProcessorTest {
     @Test
     public void processShouldReturnNonEmptyCreatedWhenRequestHasNonEmptyCreate() throws MailboxException {
         // Given
-        sut = new SetMessagesCreationProcessor(messageFactory, fakeSystemMailboxesProvider, new AttachmentChecker(mockedAttachmentManager), new NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory, messageAppender, messageSender, referenceUpdater);
+        sut = new SetMessagesCreationProcessor(messageViewFactory, fakeSystemMailboxesProvider, new AttachmentChecker(mockedAttachmentManager), new NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory, messageAppender, messageSender, referenceUpdater);
 
         // When
         SetMessagesResponse result = sut.process(createMessageInOutbox, session);
@@ -247,7 +247,7 @@ public class SetMessagesCreationProcessorTest {
     public void processShouldReturnErrorWhenOutboxNotFound() {
         // Given
         TestSystemMailboxesProvider doNotProvideOutbox = new TestSystemMailboxesProvider(Optional::empty, () -> optionalDrafts);
-        SetMessagesCreationProcessor sut = new SetMessagesCreationProcessor(messageFactory, doNotProvideOutbox,
+        SetMessagesCreationProcessor sut = new SetMessagesCreationProcessor(messageViewFactory, doNotProvideOutbox,
             new AttachmentChecker(mockedAttachmentManager), new NoopMetricFactory(), mockedMailboxManager, mockedMailboxIdFactory,
             messageAppender,
             messageSender,
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFullViewTest.java
similarity index 86%
rename from server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageTest.java
rename to server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFullViewTest.java
index 23e2b21..3998824 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFullViewTest.java
@@ -30,71 +30,71 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class MessageTest {
+public class MessageFullViewTest {
 
     
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenIdIsNull() {
-        Message.builder().build();
+        MessageFullView.builder().build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenBlobIdIsNull() {
-        Message.builder().id(TestMessageId.of(1)).build();
+        MessageFullView.builder().id(TestMessageId.of(1)).build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenThreadIdIsNull() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).build();
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenThreadIdIsEmpty() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("").build();
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("").build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenMailboxIdsIsNull() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").build();
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenHeadersIsNull() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().build();
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenSubjectIsNull() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()).build();
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()).build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenSubjectIsEmpty() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
             .subject("").build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenSizeIsNull() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
             .subject("subject").build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenDateIsNull() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
             .subject("subject").size(123).build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenPreviewIsNull() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
             .subject("subject").size(123).date(Instant.now()).build();
     }
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenPreviewIsEmpty() {
-        Message.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
+        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
             .subject("subject").size(123).date(Instant.now()).preview("").build();
     }
 
@@ -102,10 +102,10 @@ public class MessageTest {
     public void buildShouldWorkWhenMandatoryFieldsArePresent() {
         Instant currentDate = Instant.now();
         Number messageSize = Number.fromLong(123);
-        Message expected = new Message(TestMessageId.of(1), BlobId.of("blobId"), "threadId", ImmutableList.of(InMemoryId.of(456)), Optional.empty(), false, ImmutableMap.of("key", "value"), Optional.empty(),
+        MessageFullView expected = new MessageFullView(TestMessageId.of(1), BlobId.of("blobId"), "threadId", ImmutableList.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", Optional.empty(), Optional.empty(),
                 ImmutableList.of(), ImmutableMap.of(), Keywords.DEFAULT_VALUE);
-        Message tested = Message.builder()
+        MessageFullView tested = MessageFullView.builder()
                 .id(TestMessageId.of(1))
                 .blobId(BlobId.of("blobId"))
                 .threadId("threadId")
@@ -129,7 +129,7 @@ public class MessageTest {
                 .date(Instant.now())
                 .build();
         ImmutableMap<BlobId, SubMessage> attachedMessages = ImmutableMap.of(BlobId.of("differentBlobId"), simpleMessage);
-        Message.builder()
+        MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
@@ -165,7 +165,7 @@ public class MessageTest {
             .from(Keyword.DRAFT, Keyword.ANSWERED, Keyword.FLAGGED);
 
         Number messageSize = Number.fromLong(123);
-        Message expected = new Message(
+        MessageFullView expected = new MessageFullView(
             TestMessageId.of(1),
             BlobId.of("blobId"),
             "threadId",
@@ -187,7 +187,7 @@ public class MessageTest {
             attachments,
             attachedMessages,
             keywords);
-        Message tested = Message.builder()
+        MessageFullView tested = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
@@ -214,7 +214,7 @@ public class MessageTest {
 
     @Test(expected = IllegalStateException.class)
     public void buildShouldThrowWhenOneAttachedMessageIsNotInAttachments() throws Exception {
-        Message.builder()
+        MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
@@ -234,7 +234,7 @@ public class MessageTest {
 
     @Test
     public void buildShouldNotThrowWhenOneAttachedMessageIsInAttachments() throws Exception {
-        Message.builder()
+        MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
@@ -259,7 +259,7 @@ public class MessageTest {
 
     @Test
     public void hasAttachmentShouldReturnFalseWhenNoAttachment() throws Exception {
-        Message message = Message.builder()
+        MessageFullView message = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
@@ -277,7 +277,7 @@ public class MessageTest {
 
     @Test
     public void hasAttachmentShouldReturnFalseWhenAllAttachmentsAreInline() throws Exception {
-        Message message = Message.builder()
+        MessageFullView message = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
@@ -309,7 +309,7 @@ public class MessageTest {
 
     @Test
     public void hasAttachmentShouldReturnTrueWhenOneAttachmentIsNotInline() throws Exception {
-        Message message = Message.builder()
+        MessageFullView message = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
@@ -347,7 +347,7 @@ public class MessageTest {
 
     @Test
     public void hasAttachmentShouldReturnTrueWhenAllAttachmentsAreNotInline() throws Exception {
-        Message message = Message.builder()
+        MessageFullView message = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
             .threadId("threadId")
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageViewFactoryTest.java
similarity index 90%
rename from server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFactoryTest.java
rename to server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageViewFactoryTest.java
index 2b1a7a1..fb5d09c 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MessageViewFactoryTest.java
@@ -29,7 +29,7 @@ import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.james.jmap.draft.model.MessageFactory.MetaDataWithContent;
+import org.apache.james.jmap.draft.model.MessageViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
@@ -47,12 +47,12 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class MessageFactoryTest {
+public class MessageViewFactoryTest {
     private static final String FORWARDED = "forwarded";
     private static final InMemoryId MAILBOX_ID = InMemoryId.of(18L);
     private static final Instant INTERNAL_DATE = Instant.parse("2012-02-03T14:30:42Z");
 
-    private MessageFactory messageFactory;
+    private MessageViewFactory messageViewFactory;
 
     @Before
     public void setUp() {
@@ -63,7 +63,7 @@ public class MessageFactoryTest {
 
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(org.apache.james.mailbox.model.BlobId.fromString("blobId"));
-        messageFactory = new MessageFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        messageViewFactory = new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
     }
 
     @Test
@@ -79,9 +79,9 @@ public class MessageFactoryTest {
                 .messageId(TestMessageId.of(2))
                 .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee)
-            .extracting(Message::getPreview, Message::getSize, Message::getSubject, Message::getHeaders, Message::getDate)
+            .extracting(MessageFullView::getPreview, MessageFullView::getSize, MessageFullView::getSubject, MessageFullView::getHeaders, MessageFullView::getDate)
             .containsExactly("(Empty)", Number.ZERO, "", ImmutableMap.of("MIME-Version", "1.0"), INTERNAL_DATE);
     }
 
@@ -97,9 +97,9 @@ public class MessageFactoryTest {
                 .mailboxId(MAILBOX_ID)
                 .messageId(TestMessageId.of(2))
                 .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee)
-            .extracting(Message::isIsUnread, Message::isIsFlagged, Message::isIsAnswered, Message::isIsDraft, Message::isIsForwarded)
+            .extracting(MessageFullView::isIsUnread, MessageFullView::isIsFlagged, MessageFullView::isIsAnswered, MessageFullView::isIsDraft, MessageFullView::isIsForwarded)
             .containsExactly(true, true, true, true, true);
     }
 
@@ -145,8 +145,8 @@ public class MessageFactoryTest {
                 .put("MIME-Version", "1.0")
                 .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
-        Message expected = Message.builder()
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView expected = MessageFullView.builder()
                 .id(TestMessageId.of(2))
                 .blobId(BlobId.of("blobId"))
                 .threadId("2")
@@ -199,8 +199,8 @@ public class MessageFactoryTest {
             .put("To", "user1 <us...@domain>, user2 <us...@domain>")
             .put("MIME-Version", "1.0")
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
-        Message expected = Message.builder()
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView expected = MessageFullView.builder()
             .id(TestMessageId.of(2))
             .blobId(BlobId.of("blobId"))
             .threadId("2")
@@ -249,8 +249,8 @@ public class MessageFactoryTest {
             .put("To", "user1 <us...@domain>")
             .put("MIME-Version", "1.0")
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
-        Message expected = Message.builder()
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
+        MessageFullView expected = MessageFullView.builder()
             .id(TestMessageId.of(2))
             .blobId(BlobId.of("blobId"))
             .threadId("2")
@@ -286,7 +286,7 @@ public class MessageFactoryTest {
                 .mailboxId(MAILBOX_ID)
                 .messageId(TestMessageId.of(2))
                 .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getTextBody()).hasValue("Mail body");
     }
 
@@ -319,7 +319,7 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getTextBody())
             .isPresent()
@@ -348,7 +348,7 @@ public class MessageFactoryTest {
                 .mailboxId(MAILBOX_ID)
                 .messageId(TestMessageId.of(2))
                 .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getPreview()).isEqualTo(expectedPreview);
     }
     
@@ -364,7 +364,7 @@ public class MessageFactoryTest {
                 .mailboxId(MAILBOX_ID)
                 .messageId(TestMessageId.of(2))
                 .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getAttachments()).isEmpty();
     }
     
@@ -399,7 +399,7 @@ public class MessageFactoryTest {
                 .messageId(TestMessageId.of(2))
                 .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getAttachments()).hasSize(1);
         assertThat(testee.getAttachments().get(0)).isEqualToComparingFieldByField(expectedAttachment);
@@ -423,7 +423,7 @@ public class MessageFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         Emailer user = Emailer.builder().name("user").email("userdomain").allowInvalid().build();
         Emailer user1 = Emailer.builder().name("user1").email("user1domain").allowInvalid().build();
@@ -452,7 +452,7 @@ public class MessageFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getFrom()).isEmpty();
     }
@@ -477,7 +477,7 @@ public class MessageFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getDate())
             .isEqualTo(Instant.parse("2017-05-17T11:18:52.000Z"));
@@ -503,7 +503,7 @@ public class MessageFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getDate())
             .isEqualTo(Instant.parse("2017-05-17T11:18:52.000Z"));
@@ -528,7 +528,7 @@ public class MessageFactoryTest {
             .messageId(new TestMessageId.Factory().generate())
             .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getDate()).isEqualTo(INTERNAL_DATE);
     }
@@ -546,9 +546,9 @@ public class MessageFactoryTest {
                 .messageId(TestMessageId.of(2))
                 .build();
 
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee)
-            .extracting(Message::getPreview, Message::getSize, Message::getSubject, Message::getHeaders, Message::getDate)
+            .extracting(MessageFullView::getPreview, MessageFullView::getSize, MessageFullView::getSubject, MessageFullView::getHeaders, MessageFullView::getDate)
             .containsExactly("(Empty)", Number.fromLong(1010L), "", ImmutableMap.of("MIME-Version", "1.0"), INTERNAL_DATE);
     }
 
@@ -568,7 +568,7 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getPreview()).isEqualTo("my HTML message");
         assertThat(testee.getTextBody()).hasValue("my HTML message");
@@ -589,7 +589,7 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getPreview()).isEqualTo(MessagePreviewGenerator.NO_BODY);
         assertThat(testee.getHtmlBody()).contains("");
@@ -621,7 +621,7 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getPreview()).isEqualTo(expected);
     }
@@ -643,7 +643,7 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee.getPreview()).isEqualTo("My plain text");
     }
@@ -662,10 +662,10 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee)
-            .extracting(Message::getPreview, Message::getHtmlBody, Message::getTextBody)
+            .extracting(MessageFullView::getPreview, MessageFullView::getHtmlBody, MessageFullView::getTextBody)
             .containsExactly(MessagePreviewGenerator.NO_BODY, Optional.empty(), Optional.of(""));
     }
 
@@ -686,10 +686,10 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee)
-            .extracting(Message::getPreview, Message::getHtmlBody, Message::getTextBody)
+            .extracting(MessageFullView::getPreview, MessageFullView::getHtmlBody, MessageFullView::getTextBody)
             .containsExactly(MessagePreviewGenerator.NO_BODY, Optional.of("<html><body></body></html>"), Optional.empty());
     }
 
@@ -722,10 +722,10 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
 
         assertThat(testee)
-            .extracting(Message::getPreview, Message::getHtmlBody, Message::getTextBody)
+            .extracting(MessageFullView::getPreview, MessageFullView::getHtmlBody, MessageFullView::getTextBody)
             .containsExactly("My plain message", Optional.of("<html></html>"), Optional.of("My plain message"));
     }
 
@@ -743,7 +743,7 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getKeywords()).containsAllEntriesOf(keywords.asMap());
     }
 
@@ -761,7 +761,7 @@ public class MessageFactoryTest {
             .mailboxId(MAILBOX_ID)
             .messageId(TestMessageId.of(2))
             .build();
-        Message testee = messageFactory.fromMetaDataWithContent(testMail);
+        MessageFullView testee = messageViewFactory.fromMetaDataWithContent(testMail);
         assertThat(testee.getKeywords()).containsAllEntriesOf(keywords.asMap());
     }
 }
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SetMessagesResponseTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SetMessagesResponseTest.java
index 4835ddd..aabc4ac 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SetMessagesResponseTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/SetMessagesResponseTest.java
@@ -56,8 +56,8 @@ public class SetMessagesResponseTest {
     @Test
     public void builderShouldWork() {
         Instant currentDate = Instant.now();
-        ImmutableMap<CreationMessageId, Message> created = ImmutableMap.of(CreationMessageId.of("user|created|1"),
-            Message.builder()
+        ImmutableMap<CreationMessageId, MessageFullView> created = ImmutableMap.of(CreationMessageId.of("user|created|1"),
+            MessageFullView.builder()
                 .id(TestMessageId.of(1))
                 .blobId(BlobId.of("blobId"))
                 .threadId("threadId")
@@ -110,8 +110,8 @@ public class SetMessagesResponseTest {
         assertThat(emptyBuilder.build()).isEqualToComparingFieldByField(testee);
     }
 
-    private ImmutableMap<CreationMessageId, Message> buildMessage(CreationMessageId creationMessageId, MessageId messageId) {
-        return ImmutableMap.of(creationMessageId, Message.builder()
+    private ImmutableMap<CreationMessageId, MessageFullView> buildMessage(CreationMessageId creationMessageId, MessageId messageId) {
+        return ImmutableMap.of(creationMessageId, MessageFullView.builder()
                 .id(messageId)
                 .blobId(BlobId.of("blobId"))
                 .threadId("threadId")


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


[james-project] 09/22: JAMES-2987 Move MessageFullViewFactoryTest to JUnit 5

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 63717776138e12feedee12e3fab2e9027a01caeb
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Nov 21 14:53:25 2019 +0700

    JAMES-2987 Move MessageFullViewFactoryTest to JUnit 5
---
 .../message/view/MessageFullViewFactoryTest.java   | 60 +++++++++++-----------
 1 file changed, 30 insertions(+), 30 deletions(-)

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 97b4fa8..40f375b 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/MessageFullViewFactoryTest.java
@@ -48,21 +48,21 @@ import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.util.mime.MessageContentExtractor;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class MessageFullViewFactoryTest {
+class MessageFullViewFactoryTest {
     private static final String FORWARDED = "forwarded";
     private static final InMemoryId MAILBOX_ID = InMemoryId.of(18L);
     private static final Instant INTERNAL_DATE = Instant.parse("2012-02-03T14:30:42Z");
 
     private MessageFullViewFactory messageFullViewFactory;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         HtmlTextExtractor htmlTextExtractor = new JsoupHtmlTextExtractor();
 
         MessagePreviewGenerator messagePreview = new MessagePreviewGenerator();
@@ -74,7 +74,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void emptyMailShouldBeLoadedIntoMessage() throws Exception {
+    void emptyMailShouldBeLoadedIntoMessage() throws Exception {
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
                 .keywords(Keywords.strictFactory().from(Keyword.SEEN))
@@ -93,7 +93,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void flagsShouldBeSetIntoMessage() throws Exception {
+    void flagsShouldBeSetIntoMessage() throws Exception {
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
                 .keywords(Keywords.strictFactory().from(Keyword.ANSWERED, Keyword.FLAGGED, Keyword.DRAFT, Keyword.FORWARDED))
@@ -111,7 +111,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void headersShouldBeSetIntoMessage() throws Exception {
+    void headersShouldBeSetIntoMessage() throws Exception {
         Keywords keywords = Keywords.strictFactory().from(Keyword.SEEN);
         String headers = "From: user <us...@domain>\n"
                 + "Subject: test subject\n"
@@ -177,7 +177,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void headersShouldBeUnfoldedAndDecoded() throws Exception {
+    void headersShouldBeUnfoldedAndDecoded() throws Exception {
         Keywords keywords = Keywords.strictFactory().from(Keyword.SEEN);
         String headers = "From: user <us...@domain>\n"
             + "Subject: test subject\n"
@@ -229,7 +229,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void multivaluedHeadersShouldBeSeparatedByLineFeed() throws Exception {
+    void multivaluedHeadersShouldBeSeparatedByLineFeed() throws Exception {
         Keywords keywords = Keywords.strictFactory().from(Keyword.SEEN);
         String headers = "From: user <us...@domain>\n"
             + "Subject: test subject\n"
@@ -278,7 +278,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void textBodyShouldBeSetIntoMessage() throws Exception {
+    void textBodyShouldBeSetIntoMessage() throws Exception {
         Keywords keywords = Keywords.strictFactory().from(Keyword.SEEN);
         String headers = "Subject: test subject\n";
         String body = "Mail body";
@@ -298,7 +298,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void textBodyShouldNotOverrideWhenItIsThere() throws Exception {
+    void textBodyShouldNotOverrideWhenItIsThere() throws Exception {
         ByteArrayInputStream messageContent = new ByteArrayInputStream(("Subject\n"
             + "MIME-Version: 1.0\n"
             + "Content-Type: multipart/alternative;\n"
@@ -334,7 +334,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void previewShouldBeLimitedTo256Length() throws Exception {
+    void previewShouldBeLimitedTo256Length() throws Exception {
         String headers = "Subject: test subject\n";
         String body300 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
                 + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
@@ -360,7 +360,7 @@ public class MessageFullViewFactoryTest {
     }
     
     @Test
-    public void attachmentsShouldBeEmptyWhenNone() throws Exception {
+    void attachmentsShouldBeEmptyWhenNone() throws Exception {
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
             .keywords(Keywords.strictFactory().from(Keyword.SEEN))
@@ -376,7 +376,7 @@ public class MessageFullViewFactoryTest {
     }
     
     @Test
-    public void attachmentsShouldBeRetrievedWhenSome() throws Exception {
+    void attachmentsShouldBeRetrievedWhenSome() throws Exception {
         String payload = "payload";
         BlobId blodId = BlobId.of("id1");
         String type = "content";
@@ -413,7 +413,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void invalidAddressesShouldBeAllowed() throws Exception {
+    void invalidAddressesShouldBeAllowed() throws Exception {
         String headers = "From: user <userdomain>\n"
             + "To: user1 <user1domain>, user2 <user2domain>\n"
             + "Cc: usercc <userccdomain>\n"
@@ -445,7 +445,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void messageWithoutFromShouldHaveEmptyFromField() throws Exception {
+    void messageWithoutFromShouldHaveEmptyFromField() throws Exception {
         String headers = "To: user <us...@domain>\n"
             + "Subject: test subject\n";
         MetaDataWithContent testMail = MetaDataWithContent.builder()
@@ -465,7 +465,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void dateFromHeaderShouldBeUsedIfPresent() throws Exception {
+    void dateFromHeaderShouldBeUsedIfPresent() throws Exception {
         String headers = "From: user <userdomain>\n"
             + "To: user1 <user1domain>, user2 <user2domain>\n"
             + "Cc: usercc <userccdomain>\n"
@@ -491,7 +491,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void dateFromHeaderShouldUseCurrentCenturyWhenNone() throws Exception {
+    void dateFromHeaderShouldUseCurrentCenturyWhenNone() throws Exception {
         String headers = "From: user <userdomain>\n"
             + "To: user1 <user1domain>, user2 <user2domain>\n"
             + "Cc: usercc <userccdomain>\n"
@@ -517,7 +517,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void internalDateShouldBeUsedIfNoDateInHeaders() throws Exception {
+    void internalDateShouldBeUsedIfNoDateInHeaders() throws Exception {
         String headers = "From: user <userdomain>\n"
             + "To: user1 <user1domain>, user2 <user2domain>\n"
             + "Cc: usercc <userccdomain>\n"
@@ -541,7 +541,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void mailWithBigLinesShouldBeLoadedIntoMessage() throws Exception {
+    void mailWithBigLinesShouldBeLoadedIntoMessage() throws Exception {
         MetaDataWithContent testMail = MetaDataWithContent.builder()
                 .uid(MessageUid.of(2))
             .keywords(Keywords.strictFactory().from(Keyword.SEEN))
@@ -560,7 +560,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void textBodyShouldBeSetIntoMessageInCaseOfHtmlBody() throws Exception {
+    void textBodyShouldBeSetIntoMessageInCaseOfHtmlBody() throws Exception {
         ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/html\r\n"
             + "Subject: message 1 subject\r\n"
             + "\r\n"
@@ -583,7 +583,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void textBodyShouldBeEmptyInCaseOfEmptyHtmlBodyAndEmptyTextBody() throws Exception {
+    void textBodyShouldBeEmptyInCaseOfEmptyHtmlBodyAndEmptyTextBody() throws Exception {
         ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/html\r\n"
             + "Subject: message 1 subject\r\n").getBytes(StandardCharsets.UTF_8));
         MetaDataWithContent testMail = MetaDataWithContent.builder()
@@ -604,7 +604,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void previewBodyShouldReturnTruncatedStringWithoutHtmlTagWhenHtmlBodyContainTags() throws Exception {
+    void previewBodyShouldReturnTruncatedStringWithoutHtmlTagWhenHtmlBodyContainTags() throws Exception {
         String body = "This is a <b>HTML</b> mail containing <u>underlined part</u>, <i>italic part</i> and <u><i>underlined AND italic part</i></u>9999999999"
             + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
             + "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999"
@@ -634,7 +634,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void previewBodyShouldReturnTextBodyWhenNoHtmlBody() throws Exception {
+    void previewBodyShouldReturnTextBodyWhenNoHtmlBody() throws Exception {
         ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/plain\r\n"
             + "Subject: message 1 subject\r\n"
             + "\r\n"
@@ -656,7 +656,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void previewBodyShouldReturnStringEmptyWhenNoHtmlBodyAndNoTextBody() throws Exception {
+    void previewBodyShouldReturnStringEmptyWhenNoHtmlBodyAndNoTextBody() throws Exception {
         ByteArrayInputStream messageContent = new ByteArrayInputStream(("Subject: message 1 subject\r\n").getBytes(StandardCharsets.UTF_8));
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
@@ -677,7 +677,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void previewBodyShouldReturnStringEmptyWhenNoMeaningHtmlBodyAndNoTextBody() throws Exception {
+    void previewBodyShouldReturnStringEmptyWhenNoMeaningHtmlBodyAndNoTextBody() throws Exception {
         ByteArrayInputStream messageContent = new ByteArrayInputStream(("CContent-Type: text/html\r\n"
             + "Subject: message 1 subject\r\n"
             + "\r\n"
@@ -701,7 +701,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void previewBodyShouldReturnTextBodyWhenNoMeaningHtmlBodyAndTextBody() throws Exception {
+    void previewBodyShouldReturnTextBodyWhenNoMeaningHtmlBodyAndTextBody() throws Exception {
         ByteArrayInputStream messageContent = new ByteArrayInputStream(("Subject\n"
             + "MIME-Version: 1.0\n"
             + "Content-Type: multipart/alternative;\n"
@@ -737,7 +737,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void keywordShouldBeSetIntoMessage() throws Exception {
+    void keywordShouldBeSetIntoMessage() throws Exception {
         Keywords keywords = Keywords.strictFactory().from(Keyword.SEEN, Keyword.DRAFT);
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()
@@ -755,7 +755,7 @@ public class MessageFullViewFactoryTest {
     }
 
     @Test
-    public void keywordWithUserFlagShouldBeSetIntoMessage() throws Exception {
+    void keywordWithUserFlagShouldBeSetIntoMessage() throws Exception {
         Keywords keywords = Keywords.strictFactory().from(Keyword.ANSWERED, Keyword.of(FORWARDED));
 
         MetaDataWithContent testMail = MetaDataWithContent.builder()


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


[james-project] 10/22: JAMES-2987 Get rid of mocks in MessageFullViewFactoryTest

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit da9ad591ed06a698d6457f530c81cebbd3d19a60
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Nov 21 15:02:21 2019 +0700

    JAMES-2987 Get rid of mocks in MessageFullViewFactoryTest
---
 .../model/message/view/MessageFullViewFactoryTest.java | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

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 40f375b..a19e46a 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
@@ -19,9 +19,6 @@
 package org.apache.james.jmap.draft.model.message.view;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
@@ -39,13 +36,12 @@ import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.jmap.draft.utils.JsoupHtmlTextExtractor;
-import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.inmemory.InMemoryId;
+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.MessageAttachment;
-import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.util.mime.MessageContentExtractor;
 import org.junit.jupiter.api.BeforeEach;
@@ -68,9 +64,9 @@ class MessageFullViewFactoryTest {
         MessagePreviewGenerator messagePreview = new MessagePreviewGenerator();
         MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
 
-        BlobManager blobManager = mock(BlobManager.class);
-        when(blobManager.toBlobId(any(MessageId.class))).thenReturn(org.apache.james.mailbox.model.BlobId.fromString("blobId"));
-        messageFullViewFactory = new MessageFullViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
+
+        messageFullViewFactory = new MessageFullViewFactory(resources.getBlobManager(), messagePreview, messageContentExtractor, htmlTextExtractor);
     }
 
     @Test
@@ -155,7 +151,7 @@ class MessageFullViewFactoryTest {
         MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         MessageFullView expected = MessageFullView.builder()
                 .id(TestMessageId.of(2))
-                .blobId(BlobId.of("blobId"))
+                .blobId(BlobId.of("2"))
                 .threadId("2")
                 .mailboxId(MAILBOX_ID)
                 .inReplyToMessageId("<SN...@phx.gbl>")
@@ -209,7 +205,7 @@ class MessageFullViewFactoryTest {
         MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         MessageFullView expected = MessageFullView.builder()
             .id(TestMessageId.of(2))
-            .blobId(BlobId.of("blobId"))
+            .blobId(BlobId.of("2"))
             .threadId("2")
             .mailboxId(MAILBOX_ID)
             .headers(headersMap)
@@ -259,7 +255,7 @@ class MessageFullViewFactoryTest {
         MessageFullView testee = messageFullViewFactory.fromMetaDataWithContent(testMail);
         MessageFullView expected = MessageFullView.builder()
             .id(TestMessageId.of(2))
-            .blobId(BlobId.of("blobId"))
+            .blobId(BlobId.of("2"))
             .threadId("2")
             .mailboxId(MAILBOX_ID)
             .headers(headersMap)


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


[james-project] 18/22: [Refactoring] Strong typing for ModSeq

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 0beafd9f474d513ff20bae1b6eb9b0c809261d68
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 21 13:43:39 2019 +0700

    [Refactoring] Strong typing for ModSeq
---
 .../mail/CassandraModSeqProviderTest.java          |  2 +-
 .../elasticsearch/json/IndexableMessageTest.java   | 35 ++++++++++++++++++++++
 .../apache/james/event/json/EventSerializer.scala  | 12 ++++++--
 .../james/event/json/dtos/MessageUidTest.java      |  6 ++++
 .../apache/james/event/json/dtos/ModSeqTest.java   | 14 ++++++---
 5 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
index 55a8088..e9996ff 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
@@ -66,7 +66,7 @@ class CassandraModSeqProviderTest {
     void highestModSeqShouldRetrieveValueStoredNextModSeq() throws Exception {
         int nbEntries = 100;
         ModSeq result = modSeqProvider.highestModSeq(mailbox);
-        assertThat(result).isEqualTo(0);
+        assertThat(result).isEqualTo(ModSeq.first());
         LongStream.range(0, nbEntries)
             .forEach(Throwing.longConsumer(value -> {
                     ModSeq modSeq = modSeqProvider.nextModSeq(mailbox);
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
index 1d658dd..bcfaaa48 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/json/IndexableMessageTest.java
@@ -32,6 +32,7 @@ import java.util.Optional;
 import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.elasticsearch.IndexAttachments;
 import org.apache.james.mailbox.extractor.ParsedContent;
 import org.apache.james.mailbox.extractor.TextExtractor;
@@ -80,6 +81,8 @@ public class IndexableMessageTest {
             .thenReturn(mailboxId);
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getFullContent())
             .thenReturn(new ByteArrayInputStream("".getBytes()));
         when(mailboxMessage.createFlags())
@@ -103,6 +106,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -130,6 +135,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -165,6 +172,8 @@ public class IndexableMessageTest {
             .thenReturn(new Flags());
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
 
         IndexableMessage indexableMessage = IndexableMessage.builder()
                 .message(mailboxMessage)
@@ -192,6 +201,8 @@ public class IndexableMessageTest {
             .thenReturn(new ByteArrayInputStream("Bcc: First bcc <us...@james.org>\nBcc: Second bcc <us...@james.org>".getBytes()));
         when(mailboxMessage.createFlags())
             .thenReturn(new Flags());
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
 
         IndexableMessage indexableMessage = IndexableMessage.builder()
                 .message(mailboxMessage)
@@ -211,6 +222,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -236,6 +249,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -263,6 +278,8 @@ public class IndexableMessageTest {
             .thenReturn(mailboxId);
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getFullContent())
             .thenReturn(ClassLoader.getSystemResourceAsStream("eml/mailWithHeaders.eml"));
         when(mailboxMessage.createFlags())
@@ -295,6 +312,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -332,6 +351,8 @@ public class IndexableMessageTest {
             .thenReturn(new Flags());
         when(mailboxMessage.getUid())
             .thenReturn(MESSAGE_UID);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getProperties())
             .thenReturn(ImmutableList.of(new Property(PropertyBuilder.JAMES_INTERNALS, PropertyBuilder.HAS_ATTACHMENT, "false")));
 
@@ -354,6 +375,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -384,6 +407,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -412,6 +437,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -440,6 +467,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -486,6 +515,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(InMemoryMessageId.of(42));
         when(mailboxMessage.getFullContent())
@@ -518,6 +549,8 @@ public class IndexableMessageTest {
         TestId mailboxId = TestId.of(1);
         when(mailboxMessage.getMailboxId())
             .thenReturn(mailboxId);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getMessageId())
             .thenReturn(invalidMessageIdThatReturnNull);
         when(mailboxMessage.getFullContent())
@@ -548,6 +581,8 @@ public class IndexableMessageTest {
             .thenReturn(mailboxId);
         when(mailboxMessage.getMessageId())
             .thenReturn(null);
+        when(mailboxMessage.getModSeq())
+            .thenReturn(ModSeq.first());
         when(mailboxMessage.getFullContent())
             .thenReturn(ClassLoader.getSystemResourceAsStream("eml/bodyMakeTikaToFail.eml"));
         when(mailboxMessage.createFlags())
diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
index d7596e7..4babdbb 100644
--- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
+++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
@@ -279,11 +279,19 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
     case _ => JsError()
   }
   implicit val messageUidReads: Reads[MessageUid] = {
-    case JsNumber(value) => JsSuccess(MessageUid.of(value.toLong))
+    case JsNumber(value) => if (value.isValidLong) {
+        JsSuccess(MessageUid.of(value.toLong))
+      } else {
+        JsError()
+      }
     case _ => JsError()
   }
   implicit val modSeqReads: Reads[ModSeq] = {
-    case JsNumber(value) => JsSuccess(ModSeq.of(value.toLong))
+    case JsNumber(value) => if (value.isValidLong) {
+      JsSuccess(ModSeq.of(value.toLong))
+    } else {
+      JsError()
+    }
     case _ => JsError()
   }
   implicit val userFlagsReads: Reads[UserFlag] = {
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MessageUidTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MessageUidTest.java
index 0d59839..b3b2d6c 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MessageUidTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MessageUidTest.java
@@ -45,6 +45,12 @@ class MessageUidTest {
     }
 
     @Test
+    void messageUidShouldReturnErrorWhenFloat() {
+        assertThat(DTO_JSON_SERIALIZE.messageUidReads().reads(new JsNumber(BigDecimal.valueOf(18.5))))
+            .isInstanceOf(JsError.class);
+    }
+
+    @Test
     void messageUidShouldReturnErrorWhenString() {
         assertThat(DTO_JSON_SERIALIZE.messageUidReads().reads(new JsString("18")))
             .isInstanceOf(JsError.class);
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ModSeqTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ModSeqTest.java
index f0044b1..d66dc8d 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ModSeqTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/ModSeqTest.java
@@ -33,25 +33,31 @@ import scala.math.BigDecimal;
 
 class ModSeqTest {
     @Test
-    void messageUidShouldBeWellSerialized() {
+    void modSeqShouldBeWellSerialized() {
         assertThat(DTO_JSON_SERIALIZE.modSeqWrites().writes(ModSeq.of(18)))
             .isEqualTo(new JsNumber(BigDecimal.valueOf(18)));
     }
 
     @Test
-    void messageUidShouldBeWellDeSerialized() {
+    void modSeqShouldBeWellDeSerialized() {
         assertThat(DTO_JSON_SERIALIZE.modSeqReads().reads(new JsNumber(BigDecimal.valueOf(18))).get())
             .isEqualTo(ModSeq.of(18));
     }
 
     @Test
-    void messageUidShouldReturnErrorWhenString() {
+    void modSeqShouldReturnErrorWhenFloat() {
+        assertThat(DTO_JSON_SERIALIZE.modSeqReads().reads(new JsNumber(BigDecimal.valueOf(18.5))))
+            .isInstanceOf(JsError.class);
+    }
+
+    @Test
+    void modSeqShouldReturnErrorWhenString() {
         assertThat(DTO_JSON_SERIALIZE.modSeqReads().reads(new JsString("18")))
             .isInstanceOf(JsError.class);
     }
 
     @Test
-    void messageUidShouldReturnErrorWhenNull() {
+    void modSeqShouldReturnErrorWhenNull() {
         assertThat(DTO_JSON_SERIALIZE.modSeqReads().reads(JsNull$.MODULE$))
             .isInstanceOf(JsError.class);
     }


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


[james-project] 20/22: [Refactoring] UidProvider do not need mailboxSession

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3ef4fb8f0af278093ae6098f8813201920741994
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 21 13:36:25 2019 +0700

    [Refactoring] UidProvider do not need mailboxSession
---
 .../cassandra/CassandraMailboxSessionMapperFactory.java |  1 -
 .../mailbox/cassandra/mail/CassandraMessageMapper.java  |  7 ++-----
 .../mailbox/cassandra/mail/CassandraUidProvider.java    | 10 +++++-----
 .../cassandra/mail/CassandraUidProviderTest.java        | 10 +++++-----
 .../mailbox/jpa/JPAMailboxSessionMapperFactory.java     |  2 +-
 .../apache/james/mailbox/jpa/mail/JPAMessageMapper.java |  5 ++---
 .../apache/james/mailbox/jpa/mail/JPAUidProvider.java   |  7 +++----
 .../james/mailbox/jpa/mail/JPAMapperProvider.java       |  5 +----
 .../org/apache/james/mailbox/maildir/MaildirFolder.java |  2 +-
 .../org/apache/james/mailbox/maildir/MaildirStore.java  |  6 +++---
 .../mailbox/maildir/mail/MaildirMessageMapper.java      |  2 +-
 .../mailbox/inmemory/mail/InMemoryUidProvider.java      |  9 ++++-----
 .../james/mailbox/store/StoreMessageIdManager.java      |  6 +++---
 .../james/mailbox/store/mail/AbstractMessageMapper.java |  6 +++---
 .../apache/james/mailbox/store/mail/MessageUtils.java   | 10 +++-------
 .../apache/james/mailbox/store/mail/UidProvider.java    | 11 +++++------
 .../james/mailbox/store/mail/MessageUtilsTest.java      | 17 ++++++-----------
 17 files changed, 48 insertions(+), 68 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
index 320f195..55c5080 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxSessionMapperFactory.java
@@ -142,7 +142,6 @@ public class CassandraMailboxSessionMapperFactory extends MailboxSessionMapperFa
         return new CassandraMessageMapper(
                                           uidProvider,
                                           modSeqProvider,
-                                          null,
                                           createAttachmentMapper(mailboxSession),
                                           messageDAO,
                                           messageIdDAO,
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index b06ef42..c43afe7 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -32,7 +32,6 @@ import javax.mail.Flags.Flag;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.mailbox.ApplicableFlagBuilder;
 import org.apache.james.mailbox.FlagsBuilder;
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -68,7 +67,6 @@ public class CassandraMessageMapper implements MessageMapper {
     public static final Logger LOGGER = LoggerFactory.getLogger(CassandraMessageMapper.class);
 
     private final CassandraModSeqProvider modSeqProvider;
-    private final MailboxSession mailboxSession;
     private final CassandraUidProvider uidProvider;
     private final CassandraMessageDAO messageDAO;
     private final CassandraMessageIdDAO messageIdDAO;
@@ -83,7 +81,7 @@ public class CassandraMessageMapper implements MessageMapper {
     private final CassandraConfiguration cassandraConfiguration;
 
     public CassandraMessageMapper(CassandraUidProvider uidProvider, CassandraModSeqProvider modSeqProvider,
-                                  MailboxSession mailboxSession, CassandraAttachmentMapper attachmentMapper,
+                                  CassandraAttachmentMapper attachmentMapper,
                                   CassandraMessageDAO messageDAO, CassandraMessageIdDAO messageIdDAO,
                                   CassandraMessageIdToImapUidDAO imapUidDAO, CassandraMailboxCounterDAO mailboxCounterDAO,
                                   CassandraMailboxRecentsDAO mailboxRecentDAO, CassandraApplicableFlagDAO applicableFlagDAO,
@@ -91,7 +89,6 @@ public class CassandraMessageMapper implements MessageMapper {
                                   CassandraDeletedMessageDAO deletedMessageDAO, CassandraConfiguration cassandraConfiguration) {
         this.uidProvider = uidProvider;
         this.modSeqProvider = modSeqProvider;
-        this.mailboxSession = mailboxSession;
         this.messageDAO = messageDAO;
         this.messageIdDAO = messageIdDAO;
         this.imapUidDAO = imapUidDAO;
@@ -363,7 +360,7 @@ public class CassandraMessageMapper implements MessageMapper {
 
     @Override
     public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
-        return uidProvider.lastUid(mailboxSession, mailbox);
+        return uidProvider.lastUid(mailbox);
     }
 
     @Override
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
index 73f628f..276ba2b 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProvider.java
@@ -35,7 +35,6 @@ import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -46,6 +45,7 @@ import org.apache.james.mailbox.store.mail.UidProvider;
 import com.datastax.driver.core.ConsistencyLevel;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
+
 import reactor.core.publisher.Mono;
 
 public class CassandraUidProvider implements UidProvider {
@@ -87,12 +87,12 @@ public class CassandraUidProvider implements UidProvider {
     }
 
     @Override
-    public MessageUid nextUid(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException {
-        return nextUid(mailboxSession, mailbox.getMailboxId());
+    public MessageUid nextUid(Mailbox mailbox) throws MailboxException {
+        return nextUid(mailbox.getMailboxId());
     }
 
     @Override
-    public MessageUid nextUid(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public MessageUid nextUid(MailboxId mailboxId) throws MailboxException {
         CassandraId cassandraId = (CassandraId) mailboxId;
         return nextUid(cassandraId)
             .blockOptional()
@@ -111,7 +111,7 @@ public class CassandraUidProvider implements UidProvider {
     }
 
     @Override
-    public Optional<MessageUid> lastUid(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException {
+    public Optional<MessageUid> lastUid(Mailbox mailbox) throws MailboxException {
         return findHighestUid((CassandraId) mailbox.getMailboxId())
                 .blockOptional();
     }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
index 8a3a6a5..e69373a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
@@ -65,12 +65,12 @@ class CassandraUidProviderTest {
     @Test
     void lastUidShouldRetrieveValueStoredByNextUid() throws Exception {
         int nbEntries = 100;
-        Optional<MessageUid> result = uidProvider.lastUid(null, mailbox);
+        Optional<MessageUid> result = uidProvider.lastUid(mailbox);
         assertThat(result).isEmpty();
         LongStream.range(0, nbEntries)
             .forEach(Throwing.longConsumer(value -> {
-                        MessageUid uid = uidProvider.nextUid(null, mailbox);
-                        assertThat(uid).isEqualTo(uidProvider.lastUid(null, mailbox).get());
+                        MessageUid uid = uidProvider.nextUid(mailbox);
+                        assertThat(uid).isEqualTo(uidProvider.lastUid(mailbox).get());
                 })
             );
     }
@@ -80,7 +80,7 @@ class CassandraUidProviderTest {
         int nbEntries = 100;
         LongStream.range(1, nbEntries)
             .forEach(Throwing.longConsumer(value -> {
-                MessageUid result = uidProvider.nextUid(null, mailbox);
+                MessageUid result = uidProvider.nextUid(mailbox);
                 assertThat(value).isEqualTo(result.asLong());
             }));
     }
@@ -92,7 +92,7 @@ class CassandraUidProviderTest {
 
         ConcurrentSkipListSet<MessageUid> messageUids = new ConcurrentSkipListSet<>();
         ConcurrentTestRunner.builder()
-                .operation((threadNumber, step) -> messageUids.add(uidProvider.nextUid(null, mailbox)))
+                .operation((threadNumber, step) -> messageUids.add(uidProvider.nextUid(mailbox)))
             .threadCount(threadCount)
             .operationCount(nbEntries / threadCount)
             .runSuccessfullyWithin(Duration.ofMinutes(1));
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java
index ade56a6..6f6c39e 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxSessionMapperFactory.java
@@ -63,7 +63,7 @@ public class JPAMailboxSessionMapperFactory extends MailboxSessionMapperFactory
 
     @Override
     public MessageMapper createMessageMapper(MailboxSession session) {
-        return new JPAMessageMapper(session, uidProvider, modSeqProvider, entityManagerFactory);
+        return new JPAMessageMapper(uidProvider, modSeqProvider, entityManagerFactory);
     }
 
     @Override
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
index c29f6d7..5ef053b 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMessageMapper.java
@@ -30,7 +30,6 @@ import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceException;
 import javax.persistence.Query;
 
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -71,9 +70,9 @@ public class JPAMessageMapper extends JPATransactionalMapper implements MessageM
 
     private final MessageUtils messageMetadataMapper;
 
-    public JPAMessageMapper(MailboxSession mailboxSession, UidProvider uidProvider, ModSeqProvider modSeqProvider, EntityManagerFactory entityManagerFactory) {
+    public JPAMessageMapper(UidProvider uidProvider, ModSeqProvider modSeqProvider, EntityManagerFactory entityManagerFactory) {
         super(entityManagerFactory);
-        this.messageMetadataMapper = new MessageUtils(mailboxSession, uidProvider, modSeqProvider);
+        this.messageMetadataMapper = new MessageUtils(uidProvider, modSeqProvider);
     }
 
     @Override
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
index 199d8f9..c4fd608 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAUidProvider.java
@@ -25,7 +25,6 @@ import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceException;
 
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.JPAId;
@@ -44,7 +43,7 @@ public class JPAUidProvider implements UidProvider {
     }
 
     @Override
-    public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public Optional<MessageUid> lastUid(Mailbox mailbox) throws MailboxException {
         EntityManager manager = null;
         try {
             manager = factory.createEntityManager();
@@ -64,12 +63,12 @@ public class JPAUidProvider implements UidProvider {
     }
 
     @Override
-    public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public MessageUid nextUid(Mailbox mailbox) throws MailboxException {
         return nextUid((JPAId) mailbox.getMailboxId());
     }
 
     @Override
-    public MessageUid nextUid(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public MessageUid nextUid(MailboxId mailboxId) throws MailboxException {
         return nextUid((JPAId) mailboxId);
     }
 
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
index a8af899..7fe350a 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JPAMapperProvider.java
@@ -26,8 +26,6 @@ import javax.persistence.EntityManagerFactory;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.backends.jpa.JpaTestCluster;
-import org.apache.james.core.Username;
-import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -61,8 +59,7 @@ public class JPAMapperProvider implements MapperProvider {
     public MessageMapper createMessageMapper() {
         EntityManagerFactory entityManagerFactory = jpaTestCluster.getEntityManagerFactory();
 
-        JPAMessageMapper messageMapper = new JPAMessageMapper(MailboxSessionUtil.create(Username.of("benwa")),
-            new JPAUidProvider(entityManagerFactory),
+        JPAMessageMapper messageMapper = new JPAMessageMapper(new JPAUidProvider(entityManagerFactory),
             new JPAModSeqProvider(entityManagerFactory),
             entityManagerFactory);
 
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
index f744f94..e716238 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirFolder.java
@@ -447,7 +447,7 @@ public class MaildirFolder {
      * @return A {@link Map} with all uids and associated {@link MaildirMessageName}s
      * @throws MailboxException if there is a problem with the uid list file
      */
-    public SortedMap<MessageUid, MaildirMessageName> getUidMap(MailboxSession session, FilenameFilter filter, int limit) throws MailboxException {
+    public SortedMap<MessageUid, MaildirMessageName> getUidMap(FilenameFilter filter, int limit) throws MailboxException {
         MessageUid to = null;
         SortedMap<MessageUid, MaildirMessageName> allUids = getUidMap(MessageUid.MIN_VALUE, to);
         SortedMap<MessageUid, MaildirMessageName> filteredUids = new TreeMap<>();
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
index f46efb6..8637da7 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/MaildirStore.java
@@ -250,7 +250,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public MessageUid nextUid(Mailbox mailbox) throws MailboxException {
         try {
             return createMaildirFolder(mailbox).getLastUid()
                 .map(MessageUid::next)
@@ -275,7 +275,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public Optional<MessageUid> lastUid(Mailbox mailbox) throws MailboxException {
        return createMaildirFolder(mailbox).getLastUid();
     }
 
@@ -305,7 +305,7 @@ public class MaildirStore implements UidProvider, ModSeqProvider {
     }
 
     @Override
-    public MessageUid nextUid(MailboxSession session, MailboxId mailboxId) throws MailboxException {
+    public MessageUid nextUid(MailboxId mailboxId) throws MailboxException {
         throw new NotImplementedException("Not implemented");
     }
 
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
index 5d87d48..6bbddaa 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMessageMapper.java
@@ -409,7 +409,7 @@ public class MaildirMessageMapper extends AbstractMessageMapper {
             throws MailboxException {
         MaildirFolder folder = maildirStore.createMaildirFolder(mailbox);
         try {
-            SortedMap<MessageUid, MaildirMessageName> uidMap = folder.getUidMap(mailboxSession, filter, limit);
+            SortedMap<MessageUid, MaildirMessageName> uidMap = folder.getUidMap(filter, limit);
 
             ArrayList<MailboxMessage> filtered = new ArrayList<>(uidMap.size());
             for (Entry<MessageUid, MaildirMessageName> entry : uidMap.entrySet()) {
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java
index f862588..862abde 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryUidProvider.java
@@ -24,7 +24,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicLong;
 
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
@@ -37,12 +36,12 @@ public class InMemoryUidProvider implements UidProvider {
     private final ConcurrentMap<InMemoryId, AtomicLong> map = new ConcurrentHashMap<>();
     
     @Override
-    public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
-        return nextUid(session, mailbox.getMailboxId());
+    public MessageUid nextUid(Mailbox mailbox) throws MailboxException {
+        return nextUid(mailbox.getMailboxId());
     }
 
     @Override
-    public MessageUid nextUid(MailboxSession session, MailboxId mailboxId) {
+    public MessageUid nextUid(MailboxId mailboxId) {
         InMemoryId memoryId = (InMemoryId) mailboxId;
         AtomicLong uid = getLast(memoryId);
         if (uid != null) {
@@ -58,7 +57,7 @@ public class InMemoryUidProvider implements UidProvider {
     }
 
     @Override
-    public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException {
+    public Optional<MessageUid> lastUid(Mailbox mailbox) throws MailboxException {
         AtomicLong last = getLast((InMemoryId) mailbox.getMailboxId());
         if (last == null) {
             return Optional.empty();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
index a6c19f8..bf3d810 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMessageIdManager.java
@@ -382,7 +382,7 @@ public class StoreMessageIdManager implements MessageIdManager {
                                     .build())
                             .build())
                     .build();
-            save(mailboxSession, messageIdMapper, copy);
+            save(messageIdMapper, copy);
 
             eventBus.dispatch(EventFactory.added()
                 .randomEventId()
@@ -395,9 +395,9 @@ public class StoreMessageIdManager implements MessageIdManager {
         }
     }
 
-    private void save(MailboxSession mailboxSession, MessageIdMapper messageIdMapper, MailboxMessage mailboxMessage) throws MailboxException {
+    private void save(MessageIdMapper messageIdMapper, MailboxMessage mailboxMessage) throws MailboxException {
         ModSeq modSeq = mailboxSessionMapperFactory.getModSeqProvider().nextModSeq(mailboxMessage.getMailboxId());
-        MessageUid uid = mailboxSessionMapperFactory.getUidProvider().nextUid(mailboxSession, mailboxMessage.getMailboxId());
+        MessageUid uid = mailboxSessionMapperFactory.getUidProvider().nextUid(mailboxMessage.getMailboxId());
         mailboxMessage.setModSeq(modSeq);
         mailboxMessage.setUid(uid);
         messageIdMapper.copyInMailbox(mailboxMessage);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
index ecac854..c4fe7ed 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AbstractMessageMapper.java
@@ -67,7 +67,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
 
     @Override
     public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
-        return uidProvider.lastUid(mailboxSession, mailbox);
+        return uidProvider.lastUid(mailbox);
     }
 
     @Override
@@ -114,7 +114,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
 
     @Override
     public MessageMetaData add(Mailbox mailbox, MailboxMessage message) throws MailboxException {
-        message.setUid(uidProvider.nextUid(mailboxSession, mailbox));
+        message.setUid(uidProvider.nextUid(mailbox));
         
         // if a mailbox does not support mod-sequences the provider may be null
         if (modSeqProvider != null) {
@@ -129,7 +129,7 @@ public abstract class AbstractMessageMapper extends TransactionalMapper implemen
     
     @Override
     public MessageMetaData copy(Mailbox mailbox, MailboxMessage original) throws MailboxException {
-        MessageUid uid = uidProvider.nextUid(mailboxSession, mailbox);
+        MessageUid uid = uidProvider.nextUid(mailbox);
         ModSeq modSeq = modSeqProvider.nextModSeq(mailbox);
         final MessageMetaData metaData = copy(mailbox, uid, modSeq, original);  
         
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
index 6d7c0b7..0840858 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MessageUtils.java
@@ -25,7 +25,6 @@ import java.util.Optional;
 
 import javax.mail.Flags;
 
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -38,14 +37,12 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 
 public class MessageUtils {
-    private final MailboxSession mailboxSession;
     private final UidProvider uidProvider;
     private final ModSeqProvider modSeqProvider;
 
-    public MessageUtils(MailboxSession mailboxSession, UidProvider uidProvider, ModSeqProvider modSeqProvider) {
+    public MessageUtils(UidProvider uidProvider, ModSeqProvider modSeqProvider) {
         Preconditions.checkNotNull(uidProvider);
         Preconditions.checkNotNull(modSeqProvider);
-        this.mailboxSession = mailboxSession;
         this.uidProvider = uidProvider;
         this.modSeqProvider = modSeqProvider;
     }
@@ -55,12 +52,11 @@ public class MessageUtils {
     }
 
     public Optional<MessageUid> getLastUid(Mailbox mailbox) throws MailboxException {
-        return uidProvider.lastUid(mailboxSession, mailbox);
+        return uidProvider.lastUid(mailbox);
     }
-    
 
     public MessageUid nextUid(Mailbox mailbox) throws MailboxException {
-        return uidProvider.nextUid(mailboxSession, mailbox);
+        return uidProvider.nextUid(mailbox);
     }
 
     public ModSeq nextModSeq(Mailbox mailbox) throws MailboxException {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java
index de9f84b..57c3f8c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/UidProvider.java
@@ -20,7 +20,6 @@ package org.apache.james.mailbox.store.mail;
 
 import java.util.Optional;
 
-import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -37,12 +36,12 @@ public interface UidProvider {
      * Its important that the returned uid is higher then the last used and that the next call of this method does return a higher
      * one
      */
-    MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException;
-    
+    MessageUid nextUid(Mailbox mailbox) throws MailboxException;
+
     /**
      * Return the last uid which were used for storing a MailboxMessage in the {@link Mailbox}
      */
-    Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException;
-    
-    MessageUid nextUid(MailboxSession session, MailboxId mailboxId) throws MailboxException;
+    Optional<MessageUid> lastUid(Mailbox mailbox) throws MailboxException;
+
+    MessageUid nextUid(MailboxId mailboxId) throws MailboxException;
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
index 82bd23d..c44cea1 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/MessageUtilsTest.java
@@ -29,9 +29,6 @@ import java.util.Date;
 import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
-import org.apache.james.core.Username;
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.model.Mailbox;
@@ -56,7 +53,6 @@ public class MessageUtilsTest {
     @Mock private ModSeqProvider modSeqProvider;
     @Mock private UidProvider uidProvider;
     @Mock private Mailbox mailbox;
-    private MailboxSession mailboxSession;
 
     @Rule
     public ExpectedException expectedException = ExpectedException.none();
@@ -67,21 +63,20 @@ public class MessageUtilsTest {
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mailboxSession = MailboxSessionUtil.create(Username.of("user"));
-        messageUtils = new MessageUtils(mailboxSession, uidProvider, modSeqProvider);
+        messageUtils = new MessageUtils(uidProvider, modSeqProvider);
         message = new SimpleMailboxMessage(MESSAGE_ID, new Date(), CONTENT.length(), BODY_START, new SharedByteArrayInputStream(CONTENT.getBytes()), new Flags(), new PropertyBuilder(), mailbox.getMailboxId());
     }
     
     @Test
     public void newInstanceShouldFailWhenNullUidProvider() {
         expectedException.expect(NullPointerException.class);
-        new MessageUtils(mailboxSession, null, modSeqProvider);
+        new MessageUtils(null, modSeqProvider);
     }
     
     @Test
     public void newInstanceShouldFailWhenNullModSeqProvider() {
         expectedException.expect(NullPointerException.class);
-        new MessageUtils(mailboxSession, uidProvider, null);
+        new MessageUtils(uidProvider, null);
     }
     
     @Test
@@ -99,18 +94,18 @@ public class MessageUtilsTest {
     @Test
     public void getLastUidShouldCallUidProvider() throws Exception {
         messageUtils.getLastUid(mailbox);
-        verify(uidProvider).lastUid(eq(mailboxSession), eq(mailbox));
+        verify(uidProvider).lastUid(eq(mailbox));
     }
     
     @Test
     public void nextUidShouldCallUidProvider() throws Exception {
         messageUtils.nextUid(mailbox);
-        verify(uidProvider).nextUid(eq(mailboxSession), eq(mailbox));
+        verify(uidProvider).nextUid(eq(mailbox));
     }
     
     @Test
     public void enrichMesageShouldEnrichUidAndModSeq() throws Exception {
-        when(uidProvider.nextUid(eq(mailboxSession), eq(mailbox))).thenReturn(MESSAGE_UID);
+        when(uidProvider.nextUid(eq(mailbox))).thenReturn(MESSAGE_UID);
         when(modSeqProvider.nextModSeq(eq(mailbox))).thenReturn(ModSeq.of(11));
 
         messageUtils.enrichMessage(mailbox, message);


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


[james-project] 03/22: JAMES-2987 Rename SubMailboxMessageTest -> SubMessageTest

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 464854a6c0bebacc194b682d16215b7b11553636
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Nov 21 09:22:12 2019 +0700

    JAMES-2987 Rename SubMailboxMessageTest -> SubMessageTest
---
 .../message/view/{SubMailboxMessageTest.java => SubMessageTest.java}    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMailboxMessageTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMessageTest.java
similarity index 99%
rename from server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMailboxMessageTest.java
rename to server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMessageTest.java
index 15cbc84..20f29dd 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMailboxMessageTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMessageTest.java
@@ -31,7 +31,7 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class SubMailboxMessageTest {
+public class SubMessageTest {
 
     private static final Optional<String> DEFAULT_TEXT_BODY = Optional.of("textBody");
     private static final Optional<String> DEFAULT_HTML_BODY = Optional.of("htmlBody");


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


[james-project] 15/22: JAMES-2987 Moving remaining test classes in message.view package to JUnit 5

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 9bdd121f6e0ab9a3506483c0f6ae09e28058e2b7
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 22 13:20:04 2019 +0700

    JAMES-2987 Moving remaining test classes in message.view package to JUnit 5
---
 .../model/message/view/MessageFullViewTest.java    | 251 ++++++++++++++-------
 .../draft/model/message/view/SubMessageTest.java   |  80 ++++---
 2 files changed, 217 insertions(+), 114 deletions(-)

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 a69a8d8..1b5b63b 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
@@ -19,6 +19,7 @@
 package org.apache.james.jmap.draft.model.message.view;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.time.Instant;
 import java.util.Optional;
@@ -31,86 +32,153 @@ import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.TestMessageId;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class MessageFullViewTest {
+class MessageFullViewTest {
 
-    
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenIdIsNull() {
-        MessageFullView.builder().build();
+    @Test
+    void buildShouldThrowWhenIdIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder().build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenBlobIdIsNull() {
-        MessageFullView.builder().id(TestMessageId.of(1)).build();
+    @Test
+    void buildShouldThrowWhenBlobIdIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenThreadIdIsNull() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).build();
+    @Test
+    void buildShouldThrowWhenThreadIdIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenThreadIdIsEmpty() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("").build();
+    @Test
+    void buildShouldThrowWhenThreadIdIsEmpty() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("")
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenMailboxIdsIsNull() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").build();
+    @Test
+    void buildShouldThrowWhenMailboxIdsIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenHeadersIsNull() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().build();
+    @Test
+    void buildShouldThrowWhenHeadersIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .fluentMailboxIds()
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenSubjectIsNull() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of()).build();
+    @Test
+    void buildShouldThrowWhenSubjectIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .fluentMailboxIds()
+                .headers(ImmutableMap.of())
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenSubjectIsEmpty() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
-            .subject("").build();
+    @Test
+    void buildShouldThrowWhenSubjectIsEmpty() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .fluentMailboxIds()
+                .headers(ImmutableMap.of())
+                .subject("")
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenSizeIsNull() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
-            .subject("subject").build();
+    @Test
+    void buildShouldThrowWhenSizeIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .fluentMailboxIds()
+                .headers(ImmutableMap.of())
+                .subject("subject")
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenDateIsNull() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
-            .subject("subject").size(123).build();
+    @Test
+    void buildShouldThrowWhenDateIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .fluentMailboxIds()
+                .headers(ImmutableMap.of())
+                .subject("subject")
+                .size(123)
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenPreviewIsNull() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
-            .subject("subject").size(123).date(Instant.now()).build();
+    @Test
+    void buildShouldThrowWhenPreviewIsNull() {
+        assertThatThrownBy(() -> MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
+            .subject("subject").size(123).date(Instant.now()).build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenPreviewIsEmpty() {
-        MessageFullView.builder().id(TestMessageId.of(1)).blobId(BlobId.of("blobId")).threadId("threadId").fluentMailboxIds().headers(ImmutableMap.of())
-            .subject("subject").size(123).date(Instant.now()).preview("").build();
+    @Test
+    void buildShouldThrowWhenPreviewIsEmpty() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .fluentMailboxIds()
+                .headers(ImmutableMap.of())
+                .subject("subject")
+                .size(123)
+                .date(Instant.now())
+                .preview("")
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
     @Test
-    public void buildShouldWorkWhenMandatoryFieldsArePresent() {
+    void buildShouldWorkWhenMandatoryFieldsArePresent() {
         Instant currentDate = Instant.now();
         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"), Optional.empty(),
-                ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), "subject", currentDate, messageSize, "preview", Optional.empty(), Optional.empty(),
-                ImmutableList.of(), ImmutableMap.of(), Keywords.DEFAULT_VALUE);
+
+        MessageFullView expected = new MessageFullView(TestMessageId.of(1), BlobId.of("blobId"), "threadId",
+            ImmutableList.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", Optional.empty(), Optional.empty(),
+            ImmutableList.of(), ImmutableMap.of(), Keywords.DEFAULT_VALUE);
+
         MessageFullView tested = MessageFullView.builder()
                 .id(TestMessageId.of(1))
                 .blobId(BlobId.of("blobId"))
@@ -125,33 +193,37 @@ public class MessageFullViewTest {
         assertThat(tested).isEqualToComparingFieldByField(expected);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenAttachedMessageIsNotMatchingAttachments() {
+    @Test
+    void buildShouldThrowWhenAttachedMessageIsNotMatchingAttachments() {
         Attachment simpleAttachment = Attachment.builder().blobId(BlobId.of("blobId")).type("type").name("name").size(123).build();
         ImmutableList<Attachment> attachments = ImmutableList.of(simpleAttachment);
+
         SubMessage simpleMessage = SubMessage.builder()
                 .headers(ImmutableMap.of("key", "value"))
                 .subject("subject")
                 .date(Instant.now())
                 .build();
+
         ImmutableMap<BlobId, SubMessage> attachedMessages = ImmutableMap.of(BlobId.of("differentBlobId"), simpleMessage);
-        MessageFullView.builder()
-            .id(TestMessageId.of(1))
-            .blobId(BlobId.of("blobId"))
-            .threadId("threadId")
-            .mailboxId(InMemoryId.of(456))
-            .headers(ImmutableMap.of("key", "value"))
-            .subject("subject")
-            .size(123)
-            .date(Instant.now())
-            .preview("preview")
-            .attachments(attachments)
-            .attachedMessages(attachedMessages)
-            .build();
+
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .mailboxId(InMemoryId.of(456))
+                .headers(ImmutableMap.of("key", "value"))
+                .subject("subject")
+                .size(123)
+                .date(Instant.now())
+                .preview("preview")
+                .attachments(attachments)
+                .attachedMessages(attachedMessages)
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
     @Test
-    public void buildShouldWorkWhenAllFieldsArePresent() {
+    void buildShouldWorkWhenAllFieldsArePresent() {
         Emailer from = Emailer.builder().name("from").email("from@domain").build();
         ImmutableList<Emailer> to = ImmutableList.of(Emailer.builder().name("to").email("to@domain").build());
         ImmutableList<Emailer> cc = ImmutableList.of(Emailer.builder().name("cc").email("cc@domain").build());
@@ -160,11 +232,13 @@ public class MessageFullViewTest {
         Instant currentDate = Instant.now();
         Attachment simpleAttachment = Attachment.builder().blobId(BlobId.of("blobId")).type("type").name("name").size(123).build();
         ImmutableList<Attachment> attachments = ImmutableList.of(simpleAttachment);
+
         SubMessage simpleMessage = SubMessage.builder()
                 .headers(ImmutableMap.of("key", "value"))
                 .subject("subject")
                 .date(currentDate)
                 .build();
+
         ImmutableMap<BlobId, SubMessage> attachedMessages = ImmutableMap.of(BlobId.of("blobId"), simpleMessage);
 
         Keywords keywords = Keywords.strictFactory()
@@ -193,6 +267,7 @@ public class MessageFullViewTest {
             attachments,
             attachedMessages,
             keywords);
+
         MessageFullView tested = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
@@ -215,31 +290,33 @@ public class MessageFullViewTest {
             .attachments(attachments)
             .attachedMessages(attachedMessages)
             .build();
+
         assertThat(tested).isEqualToComparingFieldByField(expected);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenOneAttachedMessageIsNotInAttachments() throws Exception {
-        MessageFullView.builder()
-            .id(TestMessageId.of(1))
-            .blobId(BlobId.of("blobId"))
-            .threadId("threadId")
-            .mailboxId(InMemoryId.of(456))
-            .headers(ImmutableMap.of("key", "value"))
-            .subject("subject")
-            .size(1)
-            .date(Instant.now())
-            .preview("preview")
-            .attachedMessages(ImmutableMap.of(BlobId.of("key"), SubMessage.builder()
-                    .headers(ImmutableMap.of("key", "value"))
-                    .subject("subject")
-                    .date(Instant.now())
-                    .build()))
-            .build();
+    @Test
+    void buildShouldThrowWhenOneAttachedMessageIsNotInAttachments() {
+        assertThatThrownBy(() -> MessageFullView.builder()
+                .id(TestMessageId.of(1))
+                .blobId(BlobId.of("blobId"))
+                .threadId("threadId")
+                .mailboxId(InMemoryId.of(456))
+                .headers(ImmutableMap.of("key", "value"))
+                .subject("subject")
+                .size(1)
+                .date(Instant.now())
+                .preview("preview")
+                .attachedMessages(ImmutableMap.of(BlobId.of("key"), SubMessage.builder()
+                        .headers(ImmutableMap.of("key", "value"))
+                        .subject("subject")
+                        .date(Instant.now())
+                        .build()))
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
     @Test
-    public void buildShouldNotThrowWhenOneAttachedMessageIsInAttachments() throws Exception {
+    void buildShouldNotThrowWhenOneAttachedMessageIsInAttachments() {
         MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
@@ -264,7 +341,7 @@ public class MessageFullViewTest {
     }
 
     @Test
-    public void hasAttachmentShouldReturnFalseWhenNoAttachment() throws Exception {
+    void hasAttachmentShouldReturnFalseWhenNoAttachment() {
         MessageFullView message = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
@@ -282,7 +359,7 @@ public class MessageFullViewTest {
     }
 
     @Test
-    public void hasAttachmentShouldReturnFalseWhenAllAttachmentsAreInline() throws Exception {
+    void hasAttachmentShouldReturnFalseWhenAllAttachmentsAreInline() {
         MessageFullView message = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
@@ -314,7 +391,7 @@ public class MessageFullViewTest {
     }
 
     @Test
-    public void hasAttachmentShouldReturnTrueWhenOneAttachmentIsNotInline() throws Exception {
+    void hasAttachmentShouldReturnTrueWhenOneAttachmentIsNotInline() {
         MessageFullView message = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
@@ -352,7 +429,7 @@ public class MessageFullViewTest {
     }
 
     @Test
-    public void hasAttachmentShouldReturnTrueWhenAllAttachmentsAreNotInline() throws Exception {
+    void hasAttachmentShouldReturnTrueWhenAllAttachmentsAreNotInline() {
         MessageFullView message = MessageFullView.builder()
             .id(TestMessageId.of(1))
             .blobId(BlobId.of("blobId"))
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMessageTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMessageTest.java
index 20f29dd..b372764 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMessageTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/message/view/SubMessageTest.java
@@ -19,6 +19,7 @@
 package org.apache.james.jmap.draft.model.message.view;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.time.Instant;
 import java.util.Optional;
@@ -26,70 +27,90 @@ import java.util.Optional;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.BlobId;
 import org.apache.james.jmap.draft.model.Emailer;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-public class SubMessageTest {
+class SubMessageTest {
 
     private static final Optional<String> DEFAULT_TEXT_BODY = Optional.of("textBody");
     private static final Optional<String> DEFAULT_HTML_BODY = Optional.of("htmlBody");
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenHeadersIsNull() {
-        SubMessage.builder().build();
+    @Test
+    void buildShouldThrowWhenHeadersIsNull() {
+        assertThatThrownBy(() -> SubMessage.builder().build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenSubjectIsNull() {
-        SubMessage.builder().headers(ImmutableMap.of()).build();
+    @Test
+    void buildShouldThrowWhenSubjectIsNull() {
+        assertThatThrownBy(() -> SubMessage.builder()
+                .headers(ImmutableMap.of())
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenSubjectIsEmpty() {
-        SubMessage.builder().headers(ImmutableMap.of()).subject("").build();
+    @Test
+    void buildShouldThrowWhenSubjectIsEmpty() {
+        assertThatThrownBy(() -> SubMessage.builder()
+                .headers(ImmutableMap.of())
+                .subject("")
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenDateIsNull() {
-        SubMessage.builder().headers(ImmutableMap.of()).subject("subject").build();
+    @Test
+    void buildShouldThrowWhenDateIsNull() {
+        assertThatThrownBy(() -> SubMessage.builder()
+                .headers(ImmutableMap.of())
+                .subject("subject")
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
     @Test
-    public void buildShouldWorkWhenMandatoryFieldsArePresent() {
+    void buildShouldWorkWhenMandatoryFieldsArePresent() {
         Instant currentDate = Instant.now();
-        SubMessage expected = new SubMessage(ImmutableMap.of("key", "value"), Optional.empty(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(),
-                "subject", currentDate, Optional.empty(), Optional.empty(), ImmutableList.of(), ImmutableMap.of());
+
+        SubMessage expected = new SubMessage(ImmutableMap.of("key", "value"), Optional.empty(),
+            ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), ImmutableList.of(), "subject",
+            currentDate, Optional.empty(), Optional.empty(), ImmutableList.of(), ImmutableMap.of());
+
         SubMessage tested = SubMessage.builder()
             .headers(ImmutableMap.of("key", "value"))
             .subject("subject")
             .date(currentDate)
             .build();
+
         assertThat(tested).isEqualToComparingFieldByField(expected);
     }
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenAttachedMessageIsNotMatchingAttachments() {
+    @Test
+    void buildShouldThrowWhenAttachedMessageIsNotMatchingAttachments() {
         Attachment simpleAttachment = Attachment.builder().blobId(BlobId.of("blobId")).type("type").name("name").size(123).build();
         ImmutableList<Attachment> attachments = ImmutableList.of(simpleAttachment);
+
         SubMessage simpleMessage = SubMessage.builder()
                 .headers(ImmutableMap.of("key", "value"))
                 .subject("subject")
                 .date(Instant.now())
                 .build();
+
         ImmutableMap<BlobId, SubMessage> attachedMessages = ImmutableMap.of(BlobId.of("differentBlobId"), simpleMessage);
-        SubMessage.builder()
-            .headers(ImmutableMap.of("key", "value"))
-            .subject("subject")
-            .date(Instant.now())
-            .attachments(attachments)
-            .attachedMessages(attachedMessages)
-            .build();
+
+        assertThatThrownBy(() -> SubMessage.builder()
+                .headers(ImmutableMap.of("key", "value"))
+                .subject("subject")
+                .date(Instant.now())
+                .attachments(attachments)
+                .attachedMessages(attachedMessages)
+                .build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
     @Test
-    public void buildShouldWorkWhenAllFieldsArePresent() {
+    void buildShouldWorkWhenAllFieldsArePresent() {
         Emailer from = Emailer.builder().name("from").email("from@domain").build();
         ImmutableList<Emailer> to = ImmutableList.of(Emailer.builder().name("to").email("to@domain").build());
         ImmutableList<Emailer> cc = ImmutableList.of(Emailer.builder().name("cc").email("cc@domain").build());
@@ -98,12 +119,15 @@ public class SubMessageTest {
         Instant currentDate = Instant.now();
         Attachment simpleAttachment = Attachment.builder().blobId(BlobId.of("blobId")).type("type").name("name").size(123).build();
         ImmutableList<Attachment> attachments = ImmutableList.of(simpleAttachment);
+
         SubMessage simpleMessage = SubMessage.builder()
                 .headers(ImmutableMap.of("key", "value"))
                 .subject("subject")
                 .date(currentDate)
                 .build();
+
         ImmutableMap<BlobId, SubMessage> attachedMessages = ImmutableMap.of(BlobId.of("blobId"), simpleMessage);
+
         SubMessage expected = new SubMessage(
                 ImmutableMap.of("key", "value"),
                 Optional.of(from),
@@ -117,6 +141,7 @@ public class SubMessageTest {
                 DEFAULT_HTML_BODY,
                 attachments,
                 attachedMessages);
+
         SubMessage tested = SubMessage.builder()
             .headers(ImmutableMap.of("key", "value"))
             .from(from)
@@ -131,6 +156,7 @@ public class SubMessageTest {
             .attachments(attachments)
             .attachedMessages(attachedMessages)
             .build();
+
         assertThat(tested).isEqualToComparingFieldByField(expected);
     }
 }


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


[james-project] 06/22: JAMES-2987 MessageViewFactory::fromMessageResults

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 95631b9571a1fd6fb09e7dd9c7c1fbbf275e807b
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Thu Nov 21 11:04:14 2019 +0700

    JAMES-2987 MessageViewFactory::fromMessageResults
---
 .../jmap/draft/methods/GetMessagesMethod.java      | 43 ++-------------------
 .../model/message/view/MessageViewFactory.java     | 44 +++++++++++++++++++++-
 .../jmap/draft/methods/GetMessagesMethodTest.java  | 17 +++++----
 3 files changed, 56 insertions(+), 48 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 cc0508a..6ac3f13 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
@@ -20,7 +20,6 @@
 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;
@@ -31,19 +30,15 @@ import org.apache.james.jmap.draft.JmapFieldNotSupportedException;
 import org.apache.james.jmap.draft.json.FieldNamePropertyFilter;
 import org.apache.james.jmap.draft.model.GetMessagesRequest;
 import org.apache.james.jmap.draft.model.GetMessagesResponse;
-import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.MessageProperties;
 import org.apache.james.jmap.draft.model.MessageProperties.HeaderProperty;
 import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.model.message.view.MessageFullView;
 import org.apache.james.jmap.draft.model.message.view.MessageViewFactory;
-import org.apache.james.jmap.draft.model.message.view.MessageViewFactory.MetaDataWithContent;
-import org.apache.james.jmap.draft.utils.KeywordsCombiner;
 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.FetchGroupImpl;
-import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.MDCBuilder;
@@ -64,11 +59,9 @@ public class GetMessagesMethod implements Method {
     private static final Logger LOGGER = LoggerFactory.getLogger(GetMessagesMethod.class);
     private static final Method.Request.Name METHOD_NAME = Method.Request.name("getMessages");
     private static final Method.Response.Name RESPONSE_NAME = Method.Response.name("messages");
-    private static final KeywordsCombiner ACCUMULATOR = new KeywordsCombiner();
     private final MessageViewFactory messageViewFactory;
     private final MessageIdManager messageIdManager;
     private final MetricFactory metricFactory;
-    private final Keywords.KeywordsFactory keywordsFactory;
 
     @Inject
     @VisibleForTesting GetMessagesMethod(
@@ -78,7 +71,6 @@ public class GetMessagesMethod implements Method {
         this.messageViewFactory = messageViewFactory;
         this.messageIdManager = messageIdManager;
         this.metricFactory = metricFactory;
-        this.keywordsFactory = Keywords.lenientFactory();
     }
     
     @Override
@@ -140,8 +132,7 @@ public class GetMessagesMethod implements Method {
                         .values()
                         .stream()
                         .filter(collection -> !collection.isEmpty())
-                        .flatMap(toMetaDataWithContent())
-                        .flatMap(toMessage())
+                        .flatMap(toMessageViews())
                         .collect(Guavate.toImmutableList()))
                 .expectedMessageIds(getMessagesRequest.getIds())
                 .build();
@@ -150,38 +141,12 @@ public class GetMessagesMethod implements Method {
         }
     }
 
-    private Function<MetaDataWithContent, Stream<MessageFullView>> toMessage() {
-        return metaDataWithContent -> {
-            try {
-                return Stream.of(messageViewFactory.fromMetaDataWithContent(metaDataWithContent));
-            } catch (Exception e) {
-                LOGGER.error("Can not convert metaData with content to Message for {}", metaDataWithContent.getMessageId(), e);
-                return Stream.of();
-            }
-        };
-    }
-
-    private Function<Collection<MessageResult>, Stream<MetaDataWithContent>> toMetaDataWithContent() {
+    private Function<Collection<MessageResult>, Stream<MessageFullView>> toMessageViews() {
         return messageResults -> {
-            MessageResult firstMessageResult = messageResults.iterator().next();
-            List<MailboxId> mailboxIds = messageResults.stream()
-                .map(MessageResult::getMailboxId)
-                .distinct()
-                .collect(Guavate.toImmutableList());
             try {
-                Keywords keywords = messageResults.stream()
-                    .map(MessageResult::getFlags)
-                    .map(keywordsFactory::fromFlags)
-                    .reduce(ACCUMULATOR)
-                    .get();
-                return Stream.of(
-                    MetaDataWithContent.builderFromMessageResult(firstMessageResult)
-                        .messageId(firstMessageResult.getMessageId())
-                        .mailboxIds(mailboxIds)
-                        .keywords(keywords)
-                        .build());
+                return Stream.of(messageViewFactory.fromMessageResults(messageResults));
             } catch (Exception e) {
-                LOGGER.error("Can not convert MessageResults to MetaData with content for messageId {} in {}", firstMessageResult.getMessageId(), mailboxIds, e);
+                LOGGER.error("Can not convert metaData with content to Message for {}", messageResults.iterator().next().getMessageId().serialize(), e);
                 return Stream.of();
             }
         };
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 e250298..90ca232 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
@@ -40,6 +40,7 @@ import org.apache.james.jmap.draft.model.Emailer;
 import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
+import org.apache.james.jmap.draft.utils.KeywordsCombiner;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -66,20 +67,28 @@ import com.google.common.collect.Multimaps;
 import com.google.common.collect.Sets;
 
 public class MessageViewFactory {
-
     public static final String JMAP_MULTIVALUED_FIELD_DELIMITER = "\n";
 
+    private static final KeywordsCombiner ACCUMULATOR = new KeywordsCombiner();
+
     private final BlobManager blobManager;
     private final MessagePreviewGenerator messagePreview;
     private final MessageContentExtractor messageContentExtractor;
     private final HtmlTextExtractor htmlTextExtractor;
+    private final Keywords.KeywordsFactory keywordsFactory;
 
     @Inject
-    public MessageViewFactory(BlobManager blobManager, MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor, HtmlTextExtractor htmlTextExtractor) {
+    public MessageViewFactory(BlobManager blobManager, MessagePreviewGenerator messagePreview, MessageContentExtractor messageContentExtractor,
+                              HtmlTextExtractor htmlTextExtractor) {
         this.blobManager = blobManager;
         this.messagePreview = messagePreview;
         this.messageContentExtractor = messageContentExtractor;
         this.htmlTextExtractor = htmlTextExtractor;
+        this.keywordsFactory = Keywords.lenientFactory();
+    }
+
+    public MessageFullView fromMessageResults(Collection<MessageResult> messageResults) throws MailboxException {
+        return fromMetaDataWithContent(toMetaDataWithContent(messageResults));
     }
 
     public MessageFullView fromMetaDataWithContent(MetaDataWithContent message) throws MailboxException {
@@ -112,6 +121,37 @@ public class MessageViewFactory {
                 .build();
     }
 
+    private MetaDataWithContent toMetaDataWithContent(Collection<MessageResult> messageResults) throws MailboxException {
+        Preconditions.checkArgument(!messageResults.isEmpty(), "MessageResults cannot be empty");
+        Preconditions.checkArgument(hasOnlyOneMessageId(messageResults), "MessageResults need to share the same messageId");
+
+        MessageResult firstMessageResult = messageResults.iterator().next();
+        List<MailboxId> mailboxIds = messageResults.stream()
+            .map(MessageResult::getMailboxId)
+            .distinct()
+            .collect(Guavate.toImmutableList());
+
+        Keywords keywords = messageResults.stream()
+            .map(MessageResult::getFlags)
+            .map(keywordsFactory::fromFlags)
+            .reduce(ACCUMULATOR)
+            .get();
+
+        return MetaDataWithContent.builderFromMessageResult(firstMessageResult)
+            .messageId(firstMessageResult.getMessageId())
+            .mailboxIds(mailboxIds)
+            .keywords(keywords)
+            .build();
+    }
+
+    private boolean hasOnlyOneMessageId(Collection<MessageResult> messageResults) {
+        return messageResults
+            .stream()
+            .map(MessageResult::getMessageId)
+            .distinct()
+            .count() == 1;
+    }
+
     private Instant getDateFromHeaderOrInternalDateOtherwise(org.apache.james.mime4j.dom.Message mimeMessage, MetaDataWithContent message) {
         return Optional.ofNullable(mimeMessage.getDate())
             .map(Date::toInstant)
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 1f9f8db..3cb8ec3 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
@@ -21,7 +21,9 @@ package org.apache.james.jmap.draft.methods;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
 import java.nio.charset.StandardCharsets;
@@ -94,7 +96,8 @@ public class GetMessagesMethodTest {
     private MailboxPath inboxPath;
     private MailboxPath customMailboxPath;
     private MethodCallId methodCallId;
-    
+    private MessageViewFactory messageViewFactory;
+
     @Before
     public void setup() throws Exception {
         methodCallId = MethodCallId.of("#0");
@@ -103,7 +106,7 @@ public class GetMessagesMethodTest {
         MessageContentExtractor messageContentExtractor = new MessageContentExtractor();
         BlobManager blobManager = mock(BlobManager.class);
         when(blobManager.toBlobId(any(MessageId.class))).thenReturn(BlobId.fromString("fake"));
-        MessageViewFactory messageViewFactory = new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor);
+        messageViewFactory = spy(new MessageViewFactory(blobManager, messagePreview, messageContentExtractor, htmlTextExtractor));
         InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
         mailboxManager = resources.getMailboxManager();
 
@@ -475,8 +478,6 @@ public class GetMessagesMethodTest {
 
     @Test
     public void processShouldNotFailOnSingleMessageFailure() throws Exception {
-        MessageViewFactory messageViewFactory = mock(MessageViewFactory.class);
-        testee = new GetMessagesMethod(messageViewFactory, messageIdManager, new DefaultMetricFactory());
         MessageManager inbox = mailboxManager.getMailbox(inboxPath, session);
 
         org.apache.james.mime4j.dom.Message messageContent = org.apache.james.mime4j.dom.Message.Builder.of()
@@ -489,9 +490,11 @@ public class GetMessagesMethodTest {
 
         ComposedMessageId message1 = inbox.appendMessage(AppendCommand.from(messageContent), session);
         ComposedMessageId message2 = inbox.appendMessage(AppendCommand.from(messageContent), session);
-        when(messageViewFactory.fromMetaDataWithContent(any()))
-            .thenReturn(mock(MessageFullView.class))
-            .thenThrow(new RuntimeException());
+
+        doCallRealMethod()
+            .doThrow(new RuntimeException())
+            .when(messageViewFactory)
+            .fromMessageResults(any());
 
         GetMessagesRequest request = GetMessagesRequest.builder()
             .ids(ImmutableList.of(message1.getMessageId(), message2.getMessageId()))


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


[james-project] 14/22: JAMES-2987 Classes using MetaDataWithContent subclass should import its class directly

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 855d0919859b9c7078dcd62367d06a885d5885f3
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 22 11:45:55 2019 +0700

    JAMES-2987 Classes using MetaDataWithContent subclass should import its class directly
---
 .../org/apache/james/jmap/draft/methods/MessageAppender.java | 12 ++++++------
 .../org/apache/james/jmap/draft/methods/MessageSender.java   |  6 +++---
 .../apache/james/jmap/draft/methods/SendMDNProcessor.java    |  4 ++--
 .../apache/james/jmap/draft/methods/MessageSenderTest.java   |  7 ++++---
 4 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
index 3da0fdf..6e04cfe 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageAppender.java
@@ -32,7 +32,7 @@ import org.apache.james.jmap.draft.methods.ValueWithId.CreationMessageEntry;
 import org.apache.james.jmap.draft.model.Attachment;
 import org.apache.james.jmap.draft.model.CreationMessage;
 import org.apache.james.jmap.draft.model.Keywords;
-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.mailbox.AttachmentManager;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -73,7 +73,7 @@ public class MessageAppender {
         this.mimeMessageConverter = mimeMessageConverter;
     }
 
-    public MessageFullViewFactory.MetaDataWithContent appendMessageInMailboxes(CreationMessageEntry createdEntry,
+    public MetaDataWithContent appendMessageInMailboxes(CreationMessageEntry createdEntry,
                                                                                List<MailboxId> targetMailboxes,
                                                                                MailboxSession session) throws MailboxException {
         Preconditions.checkArgument(!targetMailboxes.isEmpty());
@@ -94,7 +94,7 @@ public class MessageAppender {
             messageIdManager.setInMailboxes(message.getMessageId(), targetMailboxes, session);
         }
 
-        return MessageFullViewFactory.MetaDataWithContent.builder()
+        return MetaDataWithContent.builder()
             .uid(message.getUid())
             .keywords(createdEntry.getValue().getKeywords())
             .internalDate(internalDate.toInstant())
@@ -106,7 +106,7 @@ public class MessageAppender {
             .build();
     }
 
-    public MessageFullViewFactory.MetaDataWithContent appendMessageInMailbox(org.apache.james.mime4j.dom.Message message,
+    public MetaDataWithContent appendMessageInMailbox(org.apache.james.mime4j.dom.Message message,
                                                                              MessageManager messageManager,
                                                                              List<MessageAttachment> attachments,
                                                                              Flags flags,
@@ -121,7 +121,7 @@ public class MessageAppender {
             .withFlags(flags)
             .build(content), session);
 
-        return MessageFullViewFactory.MetaDataWithContent.builder()
+        return MetaDataWithContent.builder()
             .uid(appendedMessage.getUid())
             .keywords(Keywords.lenientFactory().fromFlags(flags))
             .internalDate(internalDate.toInstant())
@@ -141,7 +141,7 @@ public class MessageAppender {
         }
     }
 
-    public MessageFullViewFactory.MetaDataWithContent appendMessageInMailbox(CreationMessageEntry createdEntry,
+    public MetaDataWithContent appendMessageInMailbox(CreationMessageEntry createdEntry,
                                                                              MailboxId targetMailbox,
                                                                              MailboxSession session) throws MailboxException {
         return appendMessageInMailboxes(createdEntry, ImmutableList.of(targetMailbox), session);
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
index 9daa03c..2aced88 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/MessageSender.java
@@ -25,7 +25,7 @@ import javax.inject.Inject;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-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.send.MailMetadata;
 import org.apache.james.jmap.draft.send.MailSpool;
 import org.apache.james.lifecycle.api.LifecycleUtil;
@@ -48,7 +48,7 @@ public class MessageSender {
         this.mailSpool = mailSpool;
     }
 
-    public void sendMessage(MessageFullViewFactory.MetaDataWithContent message,
+    public void sendMessage(MetaDataWithContent message,
                             Envelope envelope,
                             MailboxSession session) throws MessagingException {
         Mail mail = buildMail(message, envelope);
@@ -60,7 +60,7 @@ public class MessageSender {
     }
 
     @VisibleForTesting
-    static Mail buildMail(MessageFullViewFactory.MetaDataWithContent message, Envelope envelope) throws MessagingException {
+    static Mail buildMail(MetaDataWithContent message, Envelope envelope) throws MessagingException {
         String name = message.getMessageId().serialize();
         return MailImpl.builder()
             .name(name)
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
index 45c2f1d..67db9a2 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
@@ -35,7 +35,7 @@ import org.apache.james.jmap.draft.model.JmapMDN;
 import org.apache.james.jmap.draft.model.SetError;
 import org.apache.james.jmap.draft.model.SetMessagesRequest;
 import org.apache.james.jmap.draft.model.SetMessagesResponse;
-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.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
@@ -151,7 +151,7 @@ public class SendMDNProcessor implements SetMessagesProcessor {
         Message mdnAnswer = mdn.generateMDNMessage(originalMessage, mailboxSession);
 
         Flags seen = new Flags(Flags.Flag.SEEN);
-        MessageFullViewFactory.MetaDataWithContent metaDataWithContent = messageAppender.appendMessageInMailbox(mdnAnswer,
+        MetaDataWithContent metaDataWithContent = messageAppender.appendMessageInMailbox(mdnAnswer,
             getOutbox(mailboxSession), reportAsAttachment, seen, mailboxSession);
 
         messageSender.sendMessage(metaDataWithContent,
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 0a03271..4316a7f 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/MessageSenderTest.java
@@ -39,6 +39,7 @@ import org.apache.james.jmap.draft.model.Keywords;
 import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.model.message.view.MessageFullView;
 import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory;
+import org.apache.james.jmap.draft.model.message.view.MessageFullViewFactory.MetaDataWithContent;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
@@ -59,7 +60,7 @@ import com.google.common.collect.ImmutableSet;
 class MessageSenderTest {
 
     private Envelope envelope;
-    private MessageFullViewFactory.MetaDataWithContent message;
+    private MetaDataWithContent message;
     private MessageFullView jmapMessage;
 
     @BeforeEach
@@ -72,7 +73,7 @@ class MessageSenderTest {
         String content = headers
             + "Hello! How are you?";
 
-        message = MessageFullViewFactory.MetaDataWithContent.builder()
+        message = MetaDataWithContent.builder()
             .uid(MessageUid.of(2))
             .keywords(Keywords.strictFactory().from(Keyword.SEEN))
             .size(content.length())
@@ -97,7 +98,7 @@ class MessageSenderTest {
 
     @Test
     void buildMailShouldThrowWhenNullMailboxMessage() throws Exception {
-        MessageFullViewFactory.MetaDataWithContent message = null;
+        MetaDataWithContent message = null;
         assertThatThrownBy(() -> MessageSender.buildMail(message, envelope)).isInstanceOf(NullPointerException.class);
     }
 


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


[james-project] 22/22: [Refactoring] ModSeq are never used in MetaDataWithContent

Posted by rc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 248b0b7a623ee57917be1eb07bc2500a5b547162
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 21 19:07:31 2019 +0700

    [Refactoring] ModSeq are never used in MetaDataWithContent
---
 .../model/message/view/MessageFullViewFactory.java   | 20 ++------------------
 1 file changed, 2 insertions(+), 18 deletions(-)

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 d233993..430910d 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
@@ -37,7 +37,6 @@ import org.apache.james.jmap.draft.model.MessagePreviewGenerator;
 import org.apache.james.jmap.draft.utils.HtmlTextExtractor;
 import org.apache.james.mailbox.BlobManager;
 import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.ModSeq;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MailboxId;
@@ -183,7 +182,6 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         public static Builder builderFromMessageResult(MessageResult messageResult) throws MailboxException {
             Builder builder = builder()
                 .uid(messageResult.getUid())
-                .modSeq(messageResult.getModSeq())
                 .size(messageResult.getSize())
                 .internalDate(messageResult.getInternalDate().toInstant())
                 .attachments(messageResult.getLoadedAttachments())
@@ -197,7 +195,6 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         
         public static class Builder {
             private MessageUid uid;
-            private ModSeq modSeq;
             private Keywords keywords;
             private Long size;
             private Instant internalDate;
@@ -211,12 +208,7 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
                 this.uid = uid;
                 return this;
             }
-            
-            public Builder modSeq(ModSeq modSeq) {
-                this.modSeq = modSeq;
-                return this;
-            }
-            
+
             public Builder keywords(Keywords keywords) {
                 this.keywords = keywords;
                 return this;
@@ -264,7 +256,6 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
             
             public MetaDataWithContent build() {
                 Preconditions.checkArgument(uid != null);
-                Preconditions.checkArgument(modSeq != null);
                 Preconditions.checkArgument(keywords != null);
                 Preconditions.checkArgument(size != null);
                 Preconditions.checkArgument(internalDate != null);
@@ -272,12 +263,11 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
                 Preconditions.checkArgument(attachments != null);
                 Preconditions.checkArgument(mailboxIds != null);
                 Preconditions.checkArgument(messageId != null);
-                return new MetaDataWithContent(uid, modSeq, keywords, size, internalDate, content, sharedContent, attachments, mailboxIds, messageId);
+                return new MetaDataWithContent(uid, keywords, size, internalDate, content, sharedContent, attachments, mailboxIds, messageId);
             }
         }
 
         private final MessageUid uid;
-        private final ModSeq modSeq;
         private final Keywords keywords;
         private final long size;
         private final Instant internalDate;
@@ -288,7 +278,6 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
         private final MessageId messageId;
 
         private MetaDataWithContent(MessageUid uid,
-                                    ModSeq modSeq,
                                     Keywords keywords,
                                     long size,
                                     Instant internalDate,
@@ -298,7 +287,6 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
                                     Set<MailboxId> mailboxIds,
                                     MessageId messageId) {
             this.uid = uid;
-            this.modSeq = modSeq;
             this.keywords = keywords;
             this.size = size;
             this.internalDate = internalDate;
@@ -313,10 +301,6 @@ public class MessageFullViewFactory implements MessageViewFactory<MessageFullVie
             return uid;
         }
 
-        public ModSeq getModSeq() {
-            return modSeq;
-        }
-
         public Keywords getKeywords() {
             return keywords;
         }


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