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 bt...@apache.org on 2019/11/19 02:43:02 UTC

[james-project] branch master updated (efc3749 -> e477ab5)

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

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


    from efc3749  JAMES-2632 Fix typo in MailboxFactory
     new f26059e  JAMES-2983 Add MailboxId as part of MailboxResponse
     new a8e6804  [Refactoring] Remove unused MailetUtil::normalizeSubject method
     new 3f77169  [Refactoring] MailetUtil::getInitParameterAsStrictlyPositiveInteger can be private
     new 0adcf29  [Refactoring] Switch RFC2822Headers to an interface
     new 82659ad  [Refactoring] mailet-base StringUtils: remove unused methods
     new 937532d  [Refactoring] Replace StringUtils::arrayToString by Arrays::toString
     new a4b1716  [Refactoring] mailet-base DataContentHandlers are not used
     new 5ff652a  [Refactoring] Remove unused method in FakeMailet context
     new 00916db  [Refactoring] CRLFOutputStream::checkCRLFTerminator in never called
     new 25fcfb5  [Refactoring] MessageBuilder should return SimpleMailboxMessage
     new 756dfec  [Refactoring] LuceneMailboxMessageSearchIndexTest use only messageBuilder
     new ae57f33  [Refactoring] Delete SimpleMailboxMembership
     new 2dc1562  [Refactoring] Review visibilities in MessageBuilder
     new 0862f25  [Refactoring] Avoid anonymous MailboxMessage in ListMessageAssertTest
     new d300dd4  [Refactoring] Fix some Java access modifiers with JUnit 5 in mailbox backup module
     new 687d9eb  [Refactoring] Move first batch of tests in mailbox cassandra to JUnit 5
     new 5be4ba8  [Refactoring] Move second batch of tests in mailbox cassandra with other dependant implementations to JUnit 5
     new 716c3cf  [Refactoring] Refactor some mailbox tests and implementations more efficiently
     new 41fe3fa  [Refactoring] Move last batch of tests in mailbox cassandra with other dependant implementations to JUnit 5
     new dfb7b23  [Refactoring] Extract method in MessageRangeProcessor
     new 5db6823  [Refactoring] MessageRangeProcessor: avoid propagating MailboxManager
     new 1ff0539  [Refactoring] MessageRangeProcessor: avoid final variables
     new 7af8631  [Refactoring] MessageRangeProcessor: adopt functional programming style
     new fe33b42  [Refactoring] MessageRangeProcessor: adopt functional programming style
     new 2bc3f64  [Refactoring] MessageRangeProcessor: avoid reading mailbox metadata
     new 26d1b33  [Refactoring] IdRange::includes is never used
     new 7690699  [Refactoring] IdRange: reorder methods
     new 7046007  [Refactoring] RangeIterator can be static
     new ab98d42  [Refactoring] IdRange visibility fixes
     new 62782cb  [Refactoring] UIDVALIDITY retrieval without Mailbox.MetaData call
     new 5aa886c  [Refactroing] IMAP mocked test fixes
     new 11b953b  JAMES-2949 Remove CassandraSubscriptionManager
     new 11ed270  JAMES-2949 Username strong typing for subscriptions
     new dedc438  JAMES-2982 dedicated exception of validating username in UserRepository
     new feb8ae3  JAMES-2982 more error messages in Username.of()
     new b22ceab  JAMES-2982 UserRoutes + UserService improve error messages and tests
     new 4f17b25  JAMES-2982 update webadmin markdown
     new 92750e2  JAMES-2964 forbid to create quotas with negative number
     new 68b6584  JAMES-2964 sanitize negative quota value when reading them from a DAO
     new 05078f9  JAMES-2964 differentiate domain objects for quota limits and quota usages
     new 67e2b38  JAMES-2964 simplify quota usage domain object to better represent the domain
     new 8f91b92  JAMES-2964 simplify quota limit domain object to better represent the domain
     new e477ab5  JAMES-2964 fix wrong unit test in DTOTest using json assertions on domain objects

The 43 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:
 .../main/java/org/apache/james/core/Username.java  |   5 +-
 .../{QuotaCount.java => QuotaCountLimit.java}      |  38 +-
 .../apache/james/core/quota/QuotaCountUsage.java   |  71 ++-
 .../{QuotaValue.java => QuotaLimitValue.java}      |  13 +-
 .../quota/{QuotaSize.java => QuotaSizeLimit.java}  |  38 +-
 .../apache/james/core/quota/QuotaSizeUsage.java    |  72 ++-
 .../{QuotaValue.java => QuotaUsageValue.java}      |  10 +-
 ...uotaCountTest.java => QuotaCountLimitTest.java} |  12 +-
 ...QuotaSizeTest.java => QuotaCountUsageTest.java} |  22 +-
 .../james/core/quota/QuotaLimitValueTest.java      |  14 +-
 ...{QuotaSizeTest.java => QuotaSizeLimitTest.java} |  12 +-
 ...{QuotaSizeTest.java => QuotaSizeUsageTest.java} |  22 +-
 .../james/core/quota/QuotaUsageValueTest.java      |  36 +-
 .../apache/james/core/quota/QuotaValueTest.java    |  75 ---
 .../james/mailbox/events/MailboxListener.java      |  26 +-
 .../mailbox/exception/OverQuotaException.java      |  15 +-
 .../java/org/apache/james/mailbox/model/Quota.java |  37 +-
 .../org/apache/james/mailbox/model/QuotaRatio.java |  18 +-
 .../james/mailbox/model/SerializableQuota.java     |  25 +-
 ...Value.java => SerializableQuotaLimitValue.java} |  60 +-
 ...Value.java => SerializableQuotaUsageValue.java} |  47 +-
 .../org/apache/james/mailbox/probe/QuotaProbe.java |  28 +-
 .../james/mailbox/quota/CurrentQuotaManager.java   |   8 +-
 .../james/mailbox/quota/MaxQuotaManager.java       |  44 +-
 .../apache/james/mailbox/quota/QuotaManager.java   |  10 +-
 .../mailbox/AbstractSubscriptionManagerTest.java   |  10 +-
 .../apache/james/mailbox/MailboxListenerTest.java  |  19 +-
 .../james/mailbox/MailboxManagerStressTest.java    |   6 +-
 .../apache/james/mailbox/MailboxManagerTest.java   |  23 +-
 .../mailbox/manager/ManagerTestProvisionner.java   |   8 +-
 .../mailbox/manager/QuotaMessageManagerTest.java   |  38 +-
 .../apache/james/mailbox/model/QuotaRatioTest.java |  18 +-
 .../org/apache/james/mailbox/model/QuotaTest.java  |  43 +-
 .../apache/james/mailbox/quota/QuotaFixture.java   | 102 ++--
 .../mailbox/backup/DefaultMailboxBackupTest.java   |   3 +-
 .../apache/james/mailbox/backup/DirectoryTest.java |   2 +-
 .../james/mailbox/backup/FlagExtraFieldTest.java   |   4 +-
 .../mailbox/backup/InternalDateExtraFieldTest.java |   5 +-
 .../mailbox/backup/MailboxIdExtraFieldTest.java    |   4 +-
 .../mailbox/backup/MessageIdExtraFieldTest.java    |   4 +-
 .../james/mailbox/backup/SizeExtraFieldTest.java   |   5 +-
 .../james/mailbox/backup/UidExtraFieldTest.java    |   5 +-
 .../mailbox/backup/UidValidityExtraFieldTest.java  |   5 +-
 .../mailbox/backup/ZipArchivesLoaderTest.java      |   2 +-
 .../apache/james/mailbox/backup/ZipAssertTest.java |  44 +-
 .../mailbox/backup/ZipEntryTypeExtraFieldTest.java |   3 +-
 .../cassandra/CassandraSubscriptionManager.java    |  44 --
 .../quota/CassandraCurrentQuotaManager.java        |  16 +-
 .../quota/CassandraGlobalMaxQuotaDao.java          |  12 +-
 .../quota/CassandraPerDomainMaxQuotaDao.java       |  12 +-
 .../quota/CassandraPerUserMaxQuotaDao.java         |  12 +-
 .../quota/CassandraPerUserMaxQuotaManager.java     |  32 +-
 .../james/mailbox/cassandra/quota/QuotaCodec.java  |  26 +-
 .../user/CassandraSubscriptionMapper.java          |  15 +-
 .../cassandra/CassandraCombinationManagerTest.java |  32 +-
 .../CassandraMailboxManagerStressTest.java         |   6 -
 .../CassandraMessageIdManagerQuotaTest.java        |  36 +-
 .../CassandraMessageIdManagerSideEffectTest.java   |  32 +-
 .../CassandraMessageIdManagerStorageTest.java      |  32 +-
 .../CassandraSubscriptionManagerTest.java          |  16 +-
 .../mailbox/cassandra/ids/CassandraIdTest.java     |  20 +-
 .../ids/CassandraMailboxIdDeserializerTest.java    |  20 +-
 .../cassandra/ids/CassandraMessageIdTest.java      |  14 +-
 .../cassandra/mail/AttachmentLoaderTest.java       |  19 +-
 .../mail/CassandraAnnotationMapperTest.java        |  32 +-
 .../mail/CassandraAttachmentMapperTest.java        |  33 +-
 .../mail/CassandraGenericMailboxMapperTest.java    |  32 +-
 .../CassandraMailboxManagerAttachmentTest.java     |  33 +-
 .../mail/CassandraMailboxMapperAclTest.java        |  32 +-
 .../cassandra/mail/CassandraMailboxMapperTest.java |  71 ++-
 .../mail/CassandraMailboxPathV2DAOTest.java        |   2 +-
 .../mail/CassandraMessageIdMapperTest.java         |  41 +-
 .../cassandra/mail/CassandraMessageMapperTest.java |  32 +-
 .../cassandra/mail/CassandraMessageMoveTest.java   |  32 +-
 .../CassandraMessageWithAttachmentMapperTest.java  |  32 +-
 .../MessageAttachmentRepresentationByIdTest.java   |  31 +-
 .../mail/utils/FlagsUpdateStageResultTest.java     |  42 +-
 .../quota/CassandraCurrentQuotaManagerTest.java    |  32 +-
 .../quota/CassandraPerUserMaxQuotaManagerTest.java |  38 +-
 .../user/CassandraSubscriptionMapperTest.java      |  32 +-
 .../scala/org/apache/james/event/json/DTOs.scala   |  10 +-
 .../apache/james/event/json/EventSerializer.scala  |  39 +-
 .../json/MailboxDeletionSerializationTest.java     |   8 +-
 .../QuotaUsageUpdatedEventSerializationTest.java   |  18 +-
 .../james/event/json/dtos/QuotaCountTest.java      |  77 ++-
 .../james/event/json/dtos/QuotaSizeTest.java       |  77 ++-
 .../james/mailbox/jpa/JPASubscriptionManager.java  |   2 +-
 .../mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java   |  54 +-
 .../jpa/quota/JPAPerUserMaxQuotaManager.java       |  32 +-
 .../mailbox/jpa/quota/JpaCurrentQuotaManager.java  |  12 +-
 .../mailbox/jpa/quota/model/JpaCurrentQuota.java   |  12 +-
 .../mailbox/jpa/user/JPASubscriptionMapper.java    |  13 +-
 .../mailbox/jpa/user/model/JPASubscription.java    |   9 +-
 .../mailbox/jpa/JPASubscriptionManagerTest.java    |   6 -
 .../mailbox/jpa/JpaMailboxManagerStressTest.java   |   6 -
 .../mailbox/jpa/mail/JpaAnnotationMapperTest.java  |  15 +-
 .../mailbox/jpa/mail/JpaMailboxMapperTest.java     |  15 +-
 .../mailbox/jpa/mail/JpaMessageMapperTest.java     |  15 +-
 .../james/mailbox/jpa/mail/JpaMessageMoveTest.java |  91 ++-
 .../jpa/quota/JPACurrentQuotaManagerTest.java      |   8 +-
 .../mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java  |   8 +-
 .../LuceneMailboxMessageSearchIndexTest.java       |  66 ++-
 .../maildir/user/MaildirSubscriptionMapper.java    |  14 +-
 .../DomainUserMaildirMailboxManagerStressTest.java |   6 -
 .../FullUserMaildirMailboxManagerStressTest.java   |   6 -
 .../maildir/MaildirSubscriptionManagerTest.java    |   6 -
 .../UserMaildirMailboxManagerStressTest.java       |   6 -
 .../quota/InMemoryCurrentQuotaManager.java         |  12 +-
 .../quota/InMemoryPerUserMaxQuotaManager.java      |  44 +-
 .../inmemory/user/InMemorySubscriptionMapper.java  |   7 +-
 .../inmemory/InMemoryCombinationManagerTest.java   |   9 +-
 .../InMemoryMessageIdManagerStorageTest.java       |   9 +-
 .../inmemory/MemoryMailboxManagerStressTest.java   |   6 -
 .../mail/InMemoryMailboxManagerAttachmentTest.java |  10 +-
 .../inmemory/mail/InMemoryMessageIdMapperTest.java |  10 +-
 .../inmemory/mail/MemoryAnnotationMapperTest.java  |   9 +-
 .../inmemory/mail/MemoryAttachmentMapperTest.java  |  10 +-
 .../inmemory/mail/MemoryMailboxMapperAclTest.java  |   9 +-
 .../inmemory/mail/MemoryMailboxMapperTest.java     |   9 +-
 .../inmemory/mail/MemoryMessageMapperTest.java     |   9 +-
 .../inmemory/mail/MemoryMessageMoveTest.java       |   9 +-
 .../MemoryMessageWithAttachmentMapperTest.java     |   9 +-
 .../InMemoryMessageIdManagerSideEffectTest.java    |   9 +-
 .../quota/InMemoryCurrentQuotaManagerTest.java     |  12 +-
 .../quota/InMemoryPerUserMaxQuotaManagerTest.java  |   2 +-
 .../user/InMemorySubscriptionMapperTest.java       |   2 +-
 .../james/vault/DeletedMessageConverterTest.java   |  47 +-
 .../mailbox/quota/cassandra/dto/QuotaDTO.java      |  24 +-
 .../james/mailbox/quota/cassandra/dto/DTOTest.java |  24 +-
 .../mailing/aggregates/UserQuotaThresholds.java    |  10 +-
 .../mailing/commands/DetectThresholdCrossing.java  |  16 +-
 .../mailing/events/QuotaThresholdChangedEvent.java |  16 +-
 .../mailing/subscribers/QuotaThresholdNotice.java  |  20 +-
 .../james/mailbox/quota/model/QuotaThreshold.java  |   2 +-
 .../james/mailbox/quota/model/QuotaThresholds.java |   2 +-
 .../subscribers/QuotaThresholdNoticeTest.java      |  30 +-
 .../mailbox/quota/model/QuotaThresholdTest.java    |   9 +-
 .../mailbox/quota/model/QuotaThresholdsTest.java   |  16 +-
 .../ElasticSearchQuotaSearcherTest.java            |   6 +-
 .../elasticsearch/json/QuotaRatioAsJsonTest.java   |  18 +-
 .../quota/search/scanning/ClauseConverter.java     |  10 +-
 .../james/quota/search/QuotaSearcherContract.java  |  22 +-
 .../james/mailbox/store/StoreMailboxManager.java   |   8 +-
 .../mailbox/store/StoreSubscriptionManager.java    |   8 +-
 .../james/mailbox/store/event/EventFactory.java    |  26 +-
 .../mailbox/store/quota/FixedMaxQuotaManager.java  |  36 +-
 .../mailbox/store/quota/NoMaxQuotaManager.java     |  32 +-
 .../james/mailbox/store/quota/NoQuotaManager.java  |  22 +-
 .../james/mailbox/store/quota/QuotaChecker.java    |  16 +-
 .../mailbox/store/quota/StoreQuotaManager.java     |  22 +-
 .../mailbox/store/user/SubscriptionMapper.java     |   6 +-
 .../mailbox/store/user/model/Subscription.java     |   4 +-
 .../store/user/model/impl/SimpleSubscription.java  |   7 +-
 .../store/AbstractCombinationManagerTest.java      |  68 +--
 .../AbstractMailboxManagerAttachmentTest.java      |  22 +-
 .../store/AbstractMessageIdManagerQuotaTest.java   |  56 +-
 .../AbstractMessageIdManagerSideEffectTest.java    |  85 ++-
 .../store/AbstractMessageIdManagerStorageTest.java | 185 +++---
 .../store/MailboxMessageResultImplTest.java        |   8 +-
 .../apache/james/mailbox/store/MessageBuilder.java |  84 ++-
 .../store/SearchUtilsMultipartMixedTest.java       |   2 +-
 .../james/mailbox/store/SearchUtilsRFC822Test.java |   2 +-
 .../james/mailbox/store/SearchUtilsTest.java       |  16 +-
 .../mailbox/store/SimpleMailboxMembership.java     | 309 ----------
 .../store/event/MailboxAnnotationListenerTest.java |   8 +-
 .../store/mail/model/AnnotationMapperTest.java     |  55 +-
 .../store/mail/model/AttachmentMapperTest.java     |  65 ++-
 .../mail/model/DelegatingMailboxMessageTest.java   |   6 +-
 .../store/mail/model/ListMessageAssertTest.java    | 154 +----
 .../store/mail/model/MailboxMapperACLTest.java     |  63 +--
 .../store/mail/model/MailboxMapperTest.java        |  35 +-
 .../store/mail/model/MessageIdMapperTest.java      | 134 +++--
 .../store/mail/model/MessageMapperTest.java        | 211 ++++---
 .../mailbox/store/mail/model/MessageMoveTest.java  |  25 +-
 .../model/MessageWithAttachmentMapperTest.java     |  39 +-
 .../store/quota/GenericMaxQuotaManagerTest.java    | 222 ++++----
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |  12 +-
 .../mailbox/store/quota/QuotaCheckerTest.java      |  26 +-
 .../store/quota/StoreCurrentQuotaManagerTest.java  |  91 +--
 .../mailbox/store/quota/StoreQuotaManagerTest.java |  30 +-
 .../mailbox/store/user/SubscriptionMapperTest.java |  29 +-
 .../java/org/apache/mailet/base/GenericMailet.java |   4 +-
 .../java/org/apache/mailet/base/MailetUtil.java    |  64 +--
 .../org/apache/mailet/base/RFC2822Headers.java     |  59 +-
 .../java/org/apache/mailet/base/StringUtils.java   |  74 +--
 .../base/mail/AbstractDataContentHandler.java      | 125 -----
 .../base/mail/MessageDispositionNotification.java  | 133 -----
 .../apache/mailet/base/mail/MultipartReport.java   |  72 ---
 .../java/org/apache/mailet/base/mail/package.html  |  56 --
 .../org/apache/mailet/base/StringUtilsTest.java    |  32 +-
 .../apache/mailet/base/test/FakeMailContext.java   |   4 -
 .../org/apache/james/mpt/api/ImapHostSystem.java   |   6 +-
 .../apache/james/mpt/host/ExternalHostSystem.java  |   6 +-
 .../cassandra/host/CassandraHostSystem.java        |   6 +-
 .../james/mpt/imapmailbox/suite/QuotaTest.java     |   8 +-
 .../imapmailbox/cyrus/host/CyrusHostSystem.java    |   6 +-
 .../host/ElasticSearchHostSystem.java              |   6 +-
 .../host/external/ExternalJamesImapHostSystem.java |   6 +-
 .../inmemory/host/InMemoryHostSystem.java          |   6 +-
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java    |   6 +-
 .../lucenesearch/host/LuceneSearchHostSystem.java  |   6 +-
 .../maildir/host/MaildirHostSystem.java            |   6 +-
 .../rabbitmq/host/RabbitMQEventBusHostSystem.java  |   6 +-
 .../james/mpt/host/JamesManageSieveHostSystem.java |   4 +-
 .../org/apache/james/imap/api/message/IdRange.java | 233 ++++----
 .../james/imap/encode/QuotaResponseEncoder.java    |   6 +-
 .../james/imap/message/response/QuotaResponse.java |   6 +-
 .../processor/AbstractMessageRangeProcessor.java   |  85 ++-
 .../james/imap/processor/AppendProcessor.java      |   5 +-
 .../apache/james/imap/processor/CopyProcessor.java |   4 +-
 .../james/imap/processor/GetQuotaProcessor.java    |  10 +-
 .../imap/processor/GetQuotaRootProcessor.java      |  10 +-
 .../apache/james/imap/processor/MoveProcessor.java |   5 +-
 .../imap/encode/QuotaResponseEncoderTest.java      |  10 +-
 .../imap/message/response/QuotaResponseTest.java   |  15 +-
 .../james/imap/processor/CopyProcessorTest.java    |  14 +-
 .../imap/processor/GetQuotaProcessorTest.java      |  14 +-
 .../imap/processor/GetQuotaRootProcessorTest.java  |  14 +-
 .../james/imap/processor/MoveProcessorTest.java    |  15 +-
 .../main/java/org/apache/james/cli/ServerCmd.java  |  36 +-
 .../apache/james/cli/probe/impl/JmxQuotaProbe.java |  28 +-
 .../java/org/apache/james/cli/ServerCmdTest.java   |  36 +-
 .../modules/mailbox/CassandraMailboxModule.java    |   8 +-
 .../java/org/apache/james/JPAJamesServerTest.java  |   6 +-
 .../org/apache/james/modules/QuotaProbesImpl.java  |  48 +-
 .../james/modules/protocols/SieveProbeImpl.java    |   6 +-
 .../james/adapter/mailbox/QuotaManagement.java     |  48 +-
 .../adapter/mailbox/QuotaManagementMBean.java      |  28 +-
 .../mailbox/MaxQuotaConfigurationReader.java       |  12 +-
 .../sieverepository/api/SieveQuotaRepository.java  |  10 +-
 ...xception.java => InvalidUsernameException.java} |   6 +-
 .../sieve/cassandra/CassandraSieveQuotaDAO.java    |  14 +-
 .../sieve/cassandra/CassandraSieveRepository.java  |  18 +-
 .../james/sieve/cassandra/model/SieveQuota.java    |  11 +-
 .../cassandra/CassandraSieveQuotaDAOTest.java      |   4 +-
 .../sieve/cassandra/model/SieveQuotaTest.java      |   8 +-
 .../sieverepository/file/SieveFileRepository.java  |  14 +-
 .../apache/james/sieve/jpa/JPASieveRepository.java |  29 +-
 .../james/sieve/jpa/model/JPASieveQuota.java       |   8 +-
 .../lib/SieveRepositoryManagement.java             |   6 +-
 .../james/user/lib/AbstractUsersRepository.java    |   7 +-
 .../lib/AbstractSieveRepositoryTest.java           |  16 +-
 .../memory/InMemorySieveQuotaRepository.java       |  16 +-
 .../james/jdkim/mailets/CRLFOutputStream.java      |  14 -
 .../transport/mailets/IsOverQuotaMatcherTest.java  |  12 +-
 .../james/transport/matchers/IsOverQuotaTest.java  |  16 +-
 .../integration/GetMailboxesMethodTest.java        |  14 +-
 .../methods/integration/QuotaMailingTest.java      |   8 +-
 .../methods/integration/SendMDNMethodTest.java     |   6 +-
 .../methods/integration/SetMessagesMethodTest.java |  10 +-
 .../james/jmap/draft/model/mailbox/Quotas.java     |  21 +-
 .../james/jmap/draft/utils/quotas/QuotaLoader.java |  17 +-
 .../james/pop3server/mailbox/MailboxAdapter.java   |   2 +-
 server/protocols/webadmin/webadmin-data/pom.xml    |   6 +
 .../james/webadmin/routes/SieveQuotaRoutes.java    |  16 +-
 .../apache/james/webadmin/routes/UserRoutes.java   |  59 +-
 .../apache/james/webadmin/service/UserService.java |  40 +-
 .../webadmin/routes/SieveQuotaRoutesTest.java      |  14 +-
 .../james/webadmin/routes/UserRoutesTest.java      | 620 +++++++++++++++++++++
 .../james/webadmin/routes/UsersRoutesTest.java     | 464 ---------------
 .../apache/james/webadmin/dto/MailboxResponse.java |  10 +-
 .../apache/james/webadmin/dto/OccupationDTO.java   |   8 +-
 .../james/webadmin/dto/OccupationRatioDTO.java     |   8 +-
 .../org/apache/james/webadmin/dto/QuotaDTO.java    |  21 +-
 .../apache/james/webadmin/dto/QuotaDetailsDTO.java |  44 +-
 .../apache/james/webadmin/dto/QuotaDomainDTO.java  |  26 +-
 .../james/webadmin/dto/QuotaValueDeserializer.java |   4 +-
 .../james/webadmin/dto/QuotaValueSerializer.java   |   4 +-
 .../dto/{QuotaDTO.java => ValidatedQuotaDTO.java}  |  35 +-
 .../apache/james/webadmin/jackson/QuotaModule.java |  12 +-
 .../james/webadmin/routes/DomainQuotaRoutes.java   |  56 +-
 .../james/webadmin/routes/GlobalQuotaRoutes.java   |  31 +-
 .../james/webadmin/routes/UserQuotaRoutes.java     |  34 +-
 .../james/webadmin/service/DomainQuotaService.java |  22 +-
 .../james/webadmin/service/GlobalQuotaService.java |  24 +-
 .../webadmin/service/UserMailboxesService.java     |   2 +-
 .../james/webadmin/service/UserQuotaService.java   |  24 +-
 .../webadmin/validation/QuotaDTOValidator.java}    |  60 +-
 .../apache/james/webadmin/validation/Quotas.java   |  16 +-
 ...t.java => QuotaLimitValueDeserializerTest.java} |  18 +-
 .../webadmin/dto/UsersQuotaDetailsDTOTest.java     |  10 +-
 .../webadmin/routes/DomainQuotaRoutesTest.java     | 119 +++-
 .../webadmin/routes/GlobalQuotaRoutesTest.java     | 124 ++++-
 .../webadmin/routes/UserMailboxesRoutesTest.java   |  19 +-
 .../james/webadmin/routes/UserQuotaRoutesTest.java | 181 ++++--
 ...uotaValueTest.java => QuotaLimitValueTest.java} |  10 +-
 src/site/markdown/server/manage-webadmin.md        |   4 +-
 287 files changed, 4138 insertions(+), 5079 deletions(-)
 rename core/src/main/java/org/apache/james/core/quota/{QuotaCount.java => QuotaCountLimit.java} (68%)
 copy event-sourcing/event-sourcing-pojo/src/main/java/org/apache/james/eventsourcing/EventId.java => core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java (60%)
 copy core/src/main/java/org/apache/james/core/quota/{QuotaValue.java => QuotaLimitValue.java} (85%)
 rename core/src/main/java/org/apache/james/core/quota/{QuotaSize.java => QuotaSizeLimit.java} (68%)
 copy event-sourcing/event-sourcing-pojo/src/main/java/org/apache/james/eventsourcing/EventId.java => core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java (60%)
 rename core/src/main/java/org/apache/james/core/quota/{QuotaValue.java => QuotaUsageValue.java} (87%)
 rename core/src/test/java/org/apache/james/core/quota/{QuotaCountTest.java => QuotaCountLimitTest.java} (81%)
 copy core/src/test/java/org/apache/james/core/quota/{QuotaSizeTest.java => QuotaCountUsageTest.java} (75%)
 copy backends-common/elasticsearch/src/test/java/org/apache/james/backends/es/ClientProviderTest.java => core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java (81%)
 copy core/src/test/java/org/apache/james/core/quota/{QuotaSizeTest.java => QuotaSizeLimitTest.java} (81%)
 rename core/src/test/java/org/apache/james/core/quota/{QuotaSizeTest.java => QuotaSizeUsageTest.java} (75%)
 copy server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/swift/DomainIdTest.java => core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java (58%)
 delete mode 100644 core/src/test/java/org/apache/james/core/quota/QuotaValueTest.java
 copy mailbox/api/src/main/java/org/apache/james/mailbox/model/{SerializableQuotaValue.java => SerializableQuotaLimitValue.java} (79%)
 rename mailbox/api/src/main/java/org/apache/james/mailbox/model/{SerializableQuotaValue.java => SerializableQuotaUsageValue.java} (63%)
 delete mode 100644 mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManager.java
 delete mode 100644 mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java
 delete mode 100644 mailet/base/src/main/java/org/apache/mailet/base/mail/AbstractDataContentHandler.java
 delete mode 100644 mailet/base/src/main/java/org/apache/mailet/base/mail/MessageDispositionNotification.java
 delete mode 100644 mailet/base/src/main/java/org/apache/mailet/base/mail/MultipartReport.java
 delete mode 100644 mailet/base/src/main/java/org/apache/mailet/base/mail/package.html
 copy server/data/data-api/src/main/java/org/apache/james/user/api/{AlreadyExistInUsersRepositoryException.java => InvalidUsernameException.java} (84%)
 create mode 100644 server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java
 delete mode 100644 server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
 copy server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/{QuotaDTO.java => ValidatedQuotaDTO.java} (73%)
 copy server/protocols/webadmin/{webadmin-data/src/main/java/org/apache/james/webadmin/routes/MailAddressParser.java => webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java} (52%)
 rename server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/{QuotaValueDeserializerTest.java => QuotaLimitValueDeserializerTest.java} (72%)
 rename server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/validation/{QuotaValueTest.java => QuotaLimitValueTest.java} (92%)


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


[james-project] 25/43: [Refactoring] MessageRangeProcessor: avoid reading mailbox metadata

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

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

commit 2bc3f6416053162f2a981c9ec9f063a508c75dab
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 14:06:42 2019 +0700

    [Refactoring] MessageRangeProcessor: avoid reading mailbox metadata
    
    We were reading:
     - Highest UID
     - Latest ModSeq
     - Recent UIDs
     - Message count
    
    These metadata are costly to compute and not used!
---
 .../org/apache/james/imap/processor/AbstractMessageRangeProcessor.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 314b2e6..ac31374 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -105,7 +105,7 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
             .toArray(new IdRange[0]);
 
         // get folder UIDVALIDITY
-        Long uidValidity = mailbox.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN).getUidValidity();
+        Long uidValidity = mailbox.getMailboxEntity().getUidValidity();
 
         return StatusResponse.ResponseCode.copyUid(uidValidity, request.getIdSet(), resultUids);
     }


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


[james-project] 29/43: [Refactoring] IdRange visibility fixes

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

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

commit ab98d4208159a4cbad518ff4dc464bf8ee4fe459
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 14:14:14 2019 +0700

    [Refactoring] IdRange visibility fixes
---
 .../imap/src/main/java/org/apache/james/imap/api/message/IdRange.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
index 74f531a..106f4f0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
@@ -42,7 +42,7 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
         private final long to;
         private long current;
 
-        public RangeIterator(long from, long to) {
+        RangeIterator(long from, long to) {
             this.to = to;
             this.current = from;
         }
@@ -143,7 +143,7 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
         return highVal;
     }
 
-    public void setHighVal(long highVal) {
+    private void setHighVal(long highVal) {
         if (lowVal > highVal) {
             throw new IllegalArgumentException("HighVal must be >= LowVal");
         }


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


[james-project] 19/43: [Refactoring] Move last batch of tests in mailbox cassandra with other dependant implementations to JUnit 5

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

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

commit 41fe3fa5167ddc419b29312f85c0d97a18528364
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 15 16:34:53 2019 +0700

    [Refactoring] Move last batch of tests in mailbox cassandra with other dependant implementations to JUnit 5
---
 .../mail/CassandraAnnotationMapperTest.java        |  32 +---
 .../mail/CassandraAttachmentMapperTest.java        |  33 +---
 .../mail/CassandraGenericMailboxMapperTest.java    |  32 +---
 .../CassandraMailboxManagerAttachmentTest.java     |  33 ++--
 .../mail/CassandraMailboxMapperAclTest.java        |  32 +---
 .../mail/CassandraMessageIdMapperTest.java         |  41 ++--
 .../cassandra/mail/CassandraMessageMapperTest.java |  32 +---
 .../cassandra/mail/CassandraMessageMoveTest.java   |  32 +---
 .../CassandraMessageWithAttachmentMapperTest.java  |  32 +---
 .../quota/CassandraCurrentQuotaManagerTest.java    |  32 +---
 .../quota/CassandraPerUserMaxQuotaManagerTest.java |  38 +---
 .../mailbox/jpa/mail/JpaAnnotationMapperTest.java  |  15 +-
 .../mailbox/jpa/mail/JpaMailboxMapperTest.java     |  15 +-
 .../mailbox/jpa/mail/JpaMessageMapperTest.java     |  15 +-
 .../james/mailbox/jpa/mail/JpaMessageMoveTest.java |  91 ++++-----
 .../jpa/quota/JPACurrentQuotaManagerTest.java      |   8 +-
 .../mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java  |   8 +-
 .../mail/InMemoryMailboxManagerAttachmentTest.java |  10 +-
 .../inmemory/mail/InMemoryMessageIdMapperTest.java |  10 +-
 .../inmemory/mail/MemoryAnnotationMapperTest.java  |   9 +-
 .../inmemory/mail/MemoryAttachmentMapperTest.java  |  10 +-
 .../inmemory/mail/MemoryMailboxMapperAclTest.java  |   9 +-
 .../inmemory/mail/MemoryMailboxMapperTest.java     |   9 +-
 .../inmemory/mail/MemoryMessageMapperTest.java     |   9 +-
 .../inmemory/mail/MemoryMessageMoveTest.java       |   9 +-
 .../MemoryMessageWithAttachmentMapperTest.java     |   9 +-
 .../quota/InMemoryPerUserMaxQuotaManagerTest.java  |   2 +-
 .../AbstractMailboxManagerAttachmentTest.java      |  22 +--
 .../store/mail/model/AnnotationMapperTest.java     |  55 +++---
 .../store/mail/model/AttachmentMapperTest.java     |  65 +++----
 .../store/mail/model/MailboxMapperACLTest.java     |  63 +++---
 .../store/mail/model/MailboxMapperTest.java        |  35 ++--
 .../store/mail/model/MessageIdMapperTest.java      | 134 +++++++------
 .../store/mail/model/MessageMapperTest.java        | 211 ++++++++++-----------
 .../mailbox/store/mail/model/MessageMoveTest.java  |  25 ++-
 .../model/MessageWithAttachmentMapperTest.java     |  39 ++--
 .../store/quota/GenericMaxQuotaManagerTest.java    |  86 ++++-----
 .../store/quota/StoreCurrentQuotaManagerTest.java  |  73 +++----
 38 files changed, 582 insertions(+), 833 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
index 66eba02..a2aa280 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
@@ -19,40 +19,26 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.AnnotationMapper;
 import org.apache.james.mailbox.store.mail.model.AnnotationMapperTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraAnnotationMapperTest extends AnnotationMapperTest {
-    
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraAnnotationMapperTest extends AnnotationMapperTest {
 
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(CassandraAnnotationModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraAnnotationModule.MODULE);
 
     @Override
     protected AnnotationMapper createAnnotationMapper() {
-        return GuiceUtils.testInjector(cassandra)
+        return GuiceUtils.testInjector(cassandraCluster.getCassandraCluster())
             .getInstance(CassandraAnnotationMapper.class);
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
index 8e6eebd..3c3d05d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
@@ -19,47 +19,32 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.model.AttachmentMapperTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraAttachmentMapperTest extends AttachmentMapperTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraAttachmentMapperTest extends AttachmentMapperTest {
 
     private static final CassandraModule MODULES = CassandraModule.aggregateModules(
         CassandraAttachmentModule.MODULE,
         CassandraBlobModule.MODULE);
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws MailboxException {
-        cassandra = CassandraCluster.create(MODULES, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MODULES);
 
     @Override
     protected AttachmentMapper createAttachmentMapper() {
-        return GuiceUtils.testInjector(cassandra)
+        return GuiceUtils.testInjector(cassandraCluster.getCassandraCluster())
             .getInstance(CassandraAttachmentMapper.class);
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
index c61a98a..bf84354 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+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.cassandra.ids.CassandraId;
@@ -32,11 +32,11 @@ import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMapperTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraGenericMailboxMapperTest extends MailboxMapperTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraGenericMailboxMapperTest extends MailboxMapperTest {
 
     private static final CassandraModule MODULES = CassandraModule.aggregateModules(
         CassandraSchemaVersionModule.MODULE,
@@ -45,26 +45,12 @@ public class CassandraGenericMailboxMapperTest extends MailboxMapperTest {
         CassandraModSeqModule.MODULE,
         CassandraUidModule.MODULE);
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MODULES, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MODULES);
 
     @Override
     protected MailboxMapper createMailboxMapper() {
-        return GuiceUtils.testInjector(cassandra)
+        return GuiceUtils.testInjector(cassandraCluster.getCassandraCluster())
             .getInstance(CassandraMailboxMapper.class);
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
index 3670730..dacea2b 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
@@ -22,8 +22,8 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
@@ -50,39 +50,32 @@ import org.apache.james.mailbox.store.quota.QuotaComponents;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex;
 import org.apache.james.metrics.api.NoopMetricFactory;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManagerAttachmentTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManagerAttachmentTest {
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
 
     private CassandraMailboxSessionMapperFactory mailboxSessionMapperFactory;
     private CassandraMailboxManager mailboxManager;
     private CassandraMailboxManager parseFailingMailboxManager;
 
-    @Before
-    public void init() throws Exception {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
+    @BeforeEach
+    void init() throws Exception {
         initSystemUnderTest();
         super.setUp();
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
-
     private void initSystemUnderTest() throws Exception {
         CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
 
         mailboxSessionMapperFactory = TestCassandraMailboxSessionMapperFactory.forTests(
-            cassandra.getConf(),
-            cassandra.getTypesProvider(),
+            cassandraCluster.getCassandraCluster().getConf(),
+            cassandraCluster.getCassandraCluster().getTypesProvider(),
             messageIdFactory);
         Authenticator noAuthenticator = null;
         Authorizator noAuthorizator = null;
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
index 3337e99..f0a8166 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+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.cassandra.ids.CassandraId;
@@ -30,37 +30,23 @@ import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMapperACLTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMailboxMapperAclTest extends MailboxMapperACLTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMailboxMapperAclTest extends MailboxMapperACLTest {
 
     private static final CassandraModule MODULES = CassandraModule.aggregateModules(
         CassandraSchemaVersionModule.MODULE,
         CassandraAclModule.MODULE,
         CassandraMailboxModule.MODULE);
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MODULES, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MODULES);
 
     @Override
     protected MailboxMapper createMailboxMapper() {
-        return GuiceUtils.testInjector(cassandra)
+        return GuiceUtils.testInjector(cassandraCluster.getCassandraCluster())
             .getInstance(CassandraMailboxMapper.class);
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
index 62ce79f..8980d92 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
@@ -23,8 +23,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.List;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+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.MailboxSession;
@@ -32,48 +32,35 @@ import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.TestCassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MessageIdMapperTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 
-public class CassandraMessageIdMapperTest extends MessageIdMapperTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMessageIdMapperTest extends MessageIdMapperTest {
 
     private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(Username.of("benwa"));
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws MailboxException {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
     @Override
     protected CassandraMapperProvider provideMapper() {
-        return new CassandraMapperProvider(cassandra);
+        return new CassandraMapperProvider(cassandraCluster.getCassandraCluster());
     }
 
     @Test
-    public void findShouldReturnCorrectElementsWhenChunking() throws Exception {
+    void findShouldReturnCorrectElementsWhenChunking() throws Exception {
         CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
         CassandraMailboxSessionMapperFactory mapperFactory = TestCassandraMailboxSessionMapperFactory.forTests(
-            cassandra.getConf(), cassandra.getTypesProvider(), messageIdFactory,
+            cassandraCluster.getCassandraCluster().getConf(),
+            cassandraCluster.getCassandraCluster().getTypesProvider(),
+            messageIdFactory,
             CassandraConfiguration.builder()
                 .messageReadChunkSize(3)
                 .build());
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
index 948078d..f4022aa 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
@@ -19,35 +19,21 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMapperTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMessageMapperTest extends MessageMapperTest {
-    
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMessageMapperTest extends MessageMapperTest {
 
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
     @Override
     protected MapperProvider createMapperProvider() {
-        return new CassandraMapperProvider(cassandra);
+        return new CassandraMapperProvider(cassandraCluster.getCassandraCluster());
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
index 1b54998..d89dc9c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
@@ -19,35 +19,21 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMoveTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMessageMoveTest extends MessageMoveTest {
-    
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMessageMoveTest extends MessageMoveTest {
 
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
     @Override
     protected MapperProvider createMapperProvider() {
-        return new CassandraMapperProvider(cassandra);
+        return new CassandraMapperProvider(cassandraCluster.getCassandraCluster());
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
index cc3b797..b39fd11 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
@@ -19,35 +19,21 @@
 
 package org.apache.james.mailbox.cassandra.mail;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageWithAttachmentMapperTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMessageWithAttachmentMapperTest extends MessageWithAttachmentMapperTest {
-    
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMessageWithAttachmentMapperTest extends MessageWithAttachmentMapperTest {
 
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
     @Override
     protected MapperProvider createMapperProvider() {
-        return new CassandraMapperProvider(cassandra);
+        return new CassandraMapperProvider(cassandraCluster.getCassandraCluster());
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
index f8e42c0..426da1e 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
@@ -19,36 +19,22 @@
 
 package org.apache.james.mailbox.cassandra.quota;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManagerTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraCurrentQuotaManagerTest extends StoreCurrentQuotaManagerTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraCurrentQuotaManagerTest extends StoreCurrentQuotaManagerTest {
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(CassandraQuotaModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraQuotaModule.MODULE);
 
     @Override
     protected StoreCurrentQuotaManager provideTestee() {
-        return new CassandraCurrentQuotaManager(cassandra.getConf());
-    }
-
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
+        return new CassandraCurrentQuotaManager(cassandraCluster.getCassandraCluster().getConf());
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
index 711b391..a7b5ac4 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
@@ -19,45 +19,25 @@
 
 package org.apache.james.mailbox.cassandra.quota;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.store.quota.GenericMaxQuotaManagerTest;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraPerUserMaxQuotaManagerTest extends GenericMaxQuotaManagerTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraPerUserMaxQuotaManagerTest extends GenericMaxQuotaManagerTest {
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() {
-        cassandra = CassandraCluster.create(CassandraQuotaModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraQuotaModule.MODULE);
 
     @Override
     protected MaxQuotaManager provideMaxQuotaManager() {
-        return GuiceUtils.testInjector(cassandra)
+        return GuiceUtils.testInjector(cassandraCluster.getCassandraCluster())
             .getInstance(CassandraPerUserMaxQuotaManager.class);
     }
 
-    @After
-    public void cleanUp() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-
-    }
-
 }
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaAnnotationMapperTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaAnnotationMapperTest.java
index c697b2e..641e298 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaAnnotationMapperTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaAnnotationMapperTest.java
@@ -27,23 +27,16 @@ import org.apache.james.mailbox.jpa.JPAMailboxFixture;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.AnnotationMapper;
 import org.apache.james.mailbox.store.mail.model.AnnotationMapperTest;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.jupiter.api.AfterEach;
 
-public class JpaAnnotationMapperTest extends AnnotationMapperTest {
+class JpaAnnotationMapperTest extends AnnotationMapperTest {
 
     public static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
 
     private final AtomicInteger counter = new AtomicInteger();
 
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @After
-    public void tearDown() {
+    @AfterEach
+    void tearDown() {
         JPA_TEST_CLUSTER.clear(JPAMailboxFixture.MAILBOX_TABLE_NAMES);
     }
 
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMailboxMapperTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMailboxMapperTest.java
index 36b0a84..c9fe5be 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMailboxMapperTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMailboxMapperTest.java
@@ -27,22 +27,15 @@ import org.apache.james.mailbox.jpa.JPAMailboxFixture;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMapperTest;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.jupiter.api.AfterEach;
 
-public class JpaMailboxMapperTest extends MailboxMapperTest {
+class JpaMailboxMapperTest extends MailboxMapperTest {
 
     public static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
 
     private final AtomicInteger counter = new AtomicInteger();
 
     @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
     protected MailboxMapper createMailboxMapper() {
         return new TransactionalMailboxMapper(new JPAMailboxMapper(JPA_TEST_CLUSTER.getEntityManagerFactory()));
     }
@@ -52,8 +45,8 @@ public class JpaMailboxMapperTest extends MailboxMapperTest {
         return JPAId.of(counter.incrementAndGet());
     }
 
-    @After
-    public void cleanUp() {
+    @AfterEach
+    void cleanUp() {
         JPA_TEST_CLUSTER.clear(JPAMailboxFixture.MAILBOX_TABLE_NAMES);
     }
 }
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMapperTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMapperTest.java
index dba6c5b..5ebe877 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMapperTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMapperTest.java
@@ -23,26 +23,19 @@ import org.apache.james.backends.jpa.JpaTestCluster;
 import org.apache.james.mailbox.jpa.JPAMailboxFixture;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMapperTest;
-import org.junit.After;
-import org.junit.Before;
+import org.junit.jupiter.api.AfterEach;
 
-public class JpaMessageMapperTest extends MessageMapperTest {
+class JpaMessageMapperTest extends MessageMapperTest {
 
     public static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
     
     @Override
     protected MapperProvider createMapperProvider() {
         return new JPAMapperProvider(JPA_TEST_CLUSTER);
     }
     
-    @After
-    public void cleanUp() {
+    @AfterEach
+    void cleanUp() {
         JPA_TEST_CLUSTER.clear(JPAMailboxFixture.MAILBOX_TABLE_NAMES);
     }
 }
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMoveTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMoveTest.java
index abc9a30..1940cb3 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMoveTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/JpaMessageMoveTest.java
@@ -1,49 +1,42 @@
-/****************************************************************
- * 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.jpa.mail;
-
-import org.apache.james.backends.jpa.JpaTestCluster;
-import org.apache.james.mailbox.jpa.JPAMailboxFixture;
-import org.apache.james.mailbox.store.mail.model.MapperProvider;
-import org.apache.james.mailbox.store.mail.model.MessageMoveTest;
-import org.junit.After;
-import org.junit.Before;
-
-public class JpaMessageMoveTest extends MessageMoveTest {
-    
-    public static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
-    protected MapperProvider createMapperProvider() {
-        return new JPAMapperProvider(JPA_TEST_CLUSTER);
-    }
-    
-    @After
-    public void cleanUp() {
-        JPA_TEST_CLUSTER.clear(JPAMailboxFixture.MAILBOX_TABLE_NAMES);
-    }
-
-}
+/****************************************************************
+ * 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.jpa.mail;
+
+import org.apache.james.backends.jpa.JpaTestCluster;
+import org.apache.james.mailbox.jpa.JPAMailboxFixture;
+import org.apache.james.mailbox.store.mail.model.MapperProvider;
+import org.apache.james.mailbox.store.mail.model.MessageMoveTest;
+import org.junit.jupiter.api.AfterEach;
+
+class JpaMessageMoveTest extends MessageMoveTest {
+    
+    public static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
+
+    @Override
+    protected MapperProvider createMapperProvider() {
+        return new JPAMapperProvider(JPA_TEST_CLUSTER);
+    }
+    
+    @AfterEach
+    void cleanUp() {
+        JPA_TEST_CLUSTER.clear(JPAMailboxFixture.MAILBOX_TABLE_NAMES);
+    }
+
+}
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
index 44f6c0e..885a63f 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
@@ -23,9 +23,9 @@ import org.apache.james.backends.jpa.JpaTestCluster;
 import org.apache.james.mailbox.jpa.JPAMailboxFixture;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManagerTest;
-import org.junit.After;
+import org.junit.jupiter.api.AfterEach;
 
-public class JPACurrentQuotaManagerTest extends StoreCurrentQuotaManagerTest {
+class JPACurrentQuotaManagerTest extends StoreCurrentQuotaManagerTest {
 
     private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.QUOTA_PERSISTANCE_CLASSES);
 
@@ -34,8 +34,8 @@ public class JPACurrentQuotaManagerTest extends StoreCurrentQuotaManagerTest {
         return new JpaCurrentQuotaManager(JPA_TEST_CLUSTER.getEntityManagerFactory());
     }
 
-    @After
-    public void tearDown() {
+    @AfterEach
+    void tearDown() {
         JPA_TEST_CLUSTER.clear(JPAMailboxFixture.QUOTA_TABLES_NAMES);
     }
 
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java
index aca05da..b557d95 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java
@@ -23,9 +23,9 @@ import org.apache.james.backends.jpa.JpaTestCluster;
 import org.apache.james.mailbox.jpa.JPAMailboxFixture;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.store.quota.GenericMaxQuotaManagerTest;
-import org.junit.After;
+import org.junit.jupiter.api.AfterEach;
 
-public class JPAPerUserMaxQuotaTest extends GenericMaxQuotaManagerTest {
+class JPAPerUserMaxQuotaTest extends GenericMaxQuotaManagerTest {
 
     private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.QUOTA_PERSISTANCE_CLASSES);
 
@@ -34,8 +34,8 @@ public class JPAPerUserMaxQuotaTest extends GenericMaxQuotaManagerTest {
         return new JPAPerUserMaxQuotaManager(new JPAPerUserMaxQuotaDAO(JPA_TEST_CLUSTER.getEntityManagerFactory()));
     }
 
-    @After
-    public void cleanUp() {
+    @AfterEach
+    void cleanUp() {
         JPA_TEST_CLUSTER.clear(JPAMailboxFixture.QUOTA_TABLES_NAMES);
     }
 }
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
index 7f21920..f913c8c 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
@@ -32,15 +32,15 @@ import org.apache.james.mailbox.store.AbstractMailboxManagerAttachmentTest;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.junit.Before;
+import org.junit.jupiter.api.BeforeEach;
 
-public class InMemoryMailboxManagerAttachmentTest extends AbstractMailboxManagerAttachmentTest {
+class InMemoryMailboxManagerAttachmentTest extends AbstractMailboxManagerAttachmentTest {
     private InMemoryMailboxManager mailboxManager;
     private InMemoryMailboxManager parseFailingMailboxManager;
 
-    @Override
-    @Before
-    public void setUp() throws Exception {
+
+    @BeforeEach
+    void setup() throws Exception {
         MessageParser failingMessageParser = mock(MessageParser.class);
         when(failingMessageParser.retrieveAttachments(any(InputStream.class)))
             .thenThrow(new RuntimeException("Message parser set to fail"));
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapperTest.java
index da85ccc..faf70ab 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMessageIdMapperTest.java
@@ -19,18 +19,10 @@
 
 package org.apache.james.mailbox.inmemory.mail;
 
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageIdMapperTest;
-import org.junit.Before;
 
-public class InMemoryMessageIdMapperTest extends MessageIdMapperTest {
-
-    @Override
-    @Before
-    public void setUp() throws MailboxException {
-        super.setUp();
-    }
+class InMemoryMessageIdMapperTest extends MessageIdMapperTest {
 
     @Override
     protected MapperProvider provideMapper() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java
index 6e736fb..321e461 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAnnotationMapperTest.java
@@ -25,19 +25,12 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.AnnotationMapper;
 import org.apache.james.mailbox.store.mail.model.AnnotationMapperTest;
-import org.junit.Before;
 
-public class MemoryAnnotationMapperTest extends AnnotationMapperTest {
+class MemoryAnnotationMapperTest extends AnnotationMapperTest {
 
     private final AtomicInteger counter = new AtomicInteger();
 
     @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
     protected AnnotationMapper createAnnotationMapper() {
         return new InMemoryAnnotationMapper();
     }
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAttachmentMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAttachmentMapperTest.java
index b379621..2045455 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAttachmentMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryAttachmentMapperTest.java
@@ -19,20 +19,12 @@
 
 package org.apache.james.mailbox.inmemory.mail;
 
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.model.AttachmentMapperTest;
-import org.junit.Before;
 
-public class MemoryAttachmentMapperTest extends AttachmentMapperTest {
-    
-    @Override
-    @Before
-    public void setUp() throws MailboxException {
-        super.setUp();
-    }
+class MemoryAttachmentMapperTest extends AttachmentMapperTest {
 
     @Override
     protected AttachmentMapper createAttachmentMapper() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java
index df6d73f..c9e7d77 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperAclTest.java
@@ -25,16 +25,9 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMapperACLTest;
-import org.junit.Before;
 
-public class MemoryMailboxMapperAclTest extends MailboxMapperACLTest {
+class MemoryMailboxMapperAclTest extends MailboxMapperACLTest {
     private final AtomicInteger counter = new AtomicInteger();
-    
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
 
     @Override
     protected MailboxMapper createMailboxMapper() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java
index 3f29233..d7c1d34 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMailboxMapperTest.java
@@ -25,19 +25,12 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMapperTest;
-import org.junit.Before;
 
-public class MemoryMailboxMapperTest extends MailboxMapperTest {
+class MemoryMailboxMapperTest extends MailboxMapperTest {
 
     private final AtomicInteger counter = new AtomicInteger();
 
     @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
-
-    @Override
     protected MailboxMapper createMailboxMapper() {
         return new InMemoryMailboxMapper();
     }
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMapperTest.java
index b259fd3..77b3696 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMapperTest.java
@@ -21,15 +21,8 @@ package org.apache.james.mailbox.inmemory.mail;
 
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMapperTest;
-import org.junit.Before;
 
-public class MemoryMessageMapperTest extends MessageMapperTest {
-    
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
+class MemoryMessageMapperTest extends MessageMapperTest {
     
     @Override
     protected MapperProvider createMapperProvider() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMoveTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMoveTest.java
index a906c22..5d308dd 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMoveTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageMoveTest.java
@@ -21,15 +21,8 @@ package org.apache.james.mailbox.inmemory.mail;
 
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMoveTest;
-import org.junit.Before;
 
-public class MemoryMessageMoveTest extends MessageMoveTest {
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
+class MemoryMessageMoveTest extends MessageMoveTest {
     
     @Override
     protected MapperProvider createMapperProvider() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageWithAttachmentMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageWithAttachmentMapperTest.java
index 32f77f3..fbc7a1a 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageWithAttachmentMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/MemoryMessageWithAttachmentMapperTest.java
@@ -21,15 +21,8 @@ package org.apache.james.mailbox.inmemory.mail;
 
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageWithAttachmentMapperTest;
-import org.junit.Before;
 
-public class MemoryMessageWithAttachmentMapperTest extends MessageWithAttachmentMapperTest {
-    
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
+class MemoryMessageWithAttachmentMapperTest extends MessageWithAttachmentMapperTest {
     
     @Override
     protected MapperProvider createMapperProvider() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManagerTest.java
index 51edc31..1864f2a 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManagerTest.java
@@ -22,7 +22,7 @@ package org.apache.james.mailbox.inmemory.quota;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.store.quota.GenericMaxQuotaManagerTest;
 
-public class InMemoryPerUserMaxQuotaManagerTest extends GenericMaxQuotaManagerTest {
+class InMemoryPerUserMaxQuotaManagerTest extends GenericMaxQuotaManagerTest {
 
     @Override
     protected MaxQuotaManager provideMaxQuotaManager() {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java
index 8727d45..a2a09d8 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMailboxManagerAttachmentTest.java
@@ -45,7 +45,7 @@ import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.ImmutableList;
@@ -69,8 +69,8 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     protected abstract MailboxSessionMapperFactory getMailboxSessionMapperFactory();
     
     protected abstract AttachmentMapperFactory getAttachmentMapperFactory();
-    
-    public void setUp() throws Exception {
+
+    protected void setUp() throws Exception {
         mailboxSession = MailboxSessionUtil.create(USERNAME);
         messageMapper = getMailboxSessionMapperFactory().getMessageMapper(mailboxSession);
         mailboxMapper = getMailboxSessionMapperFactory().getMailboxMapper(mailboxSession);
@@ -83,7 +83,7 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     }
 
     @Test
-    public void appendMessageShouldStoreWithoutAttachmentWhenMailWithoutAttachment() throws Exception {
+    void appendMessageShouldStoreWithoutAttachmentWhenMailWithoutAttachment() throws Exception {
         String mail = "Subject: Test\n\nBody";
         InputStream mailInputStream = new ByteArrayInputStream(mail.getBytes());
         inboxMessageManager.appendMessage(MessageManager.AppendCommand.builder()
@@ -95,7 +95,7 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     }
 
     @Test
-    public void appendMessageShouldStoreAttachmentWhenMailWithOneAttachment() throws Exception {
+    void appendMessageShouldStoreAttachmentWhenMailWithOneAttachment() throws Exception {
         InputStream mailInputStream = ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml");
         inboxMessageManager.appendMessage(MessageManager.AppendCommand.builder()
             .build(mailInputStream), mailboxSession);
@@ -106,7 +106,7 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     }
 
     @Test
-    public void appendMessageShouldStoreAttachmentNameWhenMailWithOneAttachment() throws Exception {
+    void appendMessageShouldStoreAttachmentNameWhenMailWithOneAttachment() throws Exception {
         InputStream mailInputStream = ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml");
         inboxMessageManager.appendMessage(MessageManager.AppendCommand.builder()
             .build(mailInputStream), mailboxSession);
@@ -119,7 +119,7 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     }
 
     @Test
-    public void appendMessageShouldStoreARetrievableAttachmentWhenMailWithOneAttachment() throws Exception {
+    void appendMessageShouldStoreARetrievableAttachmentWhenMailWithOneAttachment() throws Exception {
         InputStream mailInputStream = ClassLoader.getSystemResourceAsStream("eml/oneAttachmentAndSomeTextInlined.eml");
 
         inboxMessageManager.appendMessage(MessageManager.AppendCommand.builder()
@@ -134,7 +134,7 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     }
 
     @Test
-    public void appendMessageShouldStoreAttachmentsWhenMailWithTwoAttachment() throws Exception {
+    void appendMessageShouldStoreAttachmentsWhenMailWithTwoAttachment() throws Exception {
         InputStream mailInputStream = ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml");
 
         inboxMessageManager.appendMessage(MessageManager.AppendCommand.builder()
@@ -146,7 +146,7 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     }
 
     @Test
-    public void appendMessageShouldStoreTwoRetrievableAttachmentsWhenMailWithTwoAttachment() throws Exception {
+    void appendMessageShouldStoreTwoRetrievableAttachmentsWhenMailWithTwoAttachment() throws Exception {
         InputStream mailInputStream = ClassLoader.getSystemResourceAsStream("eml/twoAttachments.eml");
 
         inboxMessageManager.appendMessage(MessageManager.AppendCommand.builder()
@@ -173,7 +173,7 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     }
 
     @Test
-    public void appendMessageShouldStoreEmbeddedMailAsAttachmentWhenMailWithEmbeddedAttachment() throws Exception {
+    void appendMessageShouldStoreEmbeddedMailAsAttachmentWhenMailWithEmbeddedAttachment() throws Exception {
         InputStream mailInputStream = ClassLoader.getSystemResourceAsStream("eml/embeddedAttachmentWithAttachment.eml");
 
         inboxMessageManager.appendMessage(MessageManager.AppendCommand.builder()
@@ -185,7 +185,7 @@ public abstract class AbstractMailboxManagerAttachmentTest {
     }
 
     @Test
-    public void appendMessageShouldNotStoreAnyAttachmentWhenUnparsableMail() throws Exception {
+    void appendMessageShouldNotStoreAnyAttachmentWhenUnparsableMail() throws Exception {
         MailboxManager parseFailingMailboxManager = getParseFailingMailboxManager();
         MessageManager parseFailingInboxMessageManager = parseFailingMailboxManager.getMailbox(inboxPath, mailboxSession);
         InputStream mailInputStream = new ByteArrayInputStream("content".getBytes());
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
index e1552fb..c00d6b2 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AnnotationMapperTest.java
@@ -20,15 +20,14 @@
 package org.apache.james.mailbox.store.mail.model;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.AnnotationMapper;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableSet;
 
@@ -52,33 +51,31 @@ public abstract class AnnotationMapperTest {
     private AnnotationMapper annotationMapper;
     private MailboxId mailboxId;
 
-    @Rule
-    public ExpectedException expected = ExpectedException.none();
-
     protected abstract AnnotationMapper createAnnotationMapper();
 
     protected abstract MailboxId generateMailboxId();
 
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() {
         this.annotationMapper = createAnnotationMapper();
         this.mailboxId = generateMailboxId();
     }
 
     @Test
-    public void insertAnnotationShouldThrowExceptionWithNilData() {
-        expected.expect(IllegalArgumentException.class);
-        annotationMapper.insertAnnotation(mailboxId, MailboxAnnotation.nil(PRIVATE_KEY));
+    void insertAnnotationShouldThrowExceptionWithNilData() {
+        assertThatThrownBy(() -> annotationMapper.insertAnnotation(mailboxId, MailboxAnnotation.nil(PRIVATE_KEY)))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void insertAnnotationShouldCreateNewAnnotation() throws MailboxException {
+    void insertAnnotationShouldCreateNewAnnotation() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
 
         assertThat(annotationMapper.getAllAnnotations(mailboxId)).containsExactly(PRIVATE_ANNOTATION);
     }
 
     @Test
-    public void insertAnnotationShouldUpdateExistedAnnotation() throws MailboxException {
+    void insertAnnotationShouldUpdateExistedAnnotation() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION_UPDATE);
 
@@ -86,7 +83,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void deleteAnnotationShouldDeleteStoredAnnotation() throws MailboxException {
+    void deleteAnnotationShouldDeleteStoredAnnotation() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
         annotationMapper.deleteAnnotation(mailboxId, PRIVATE_KEY);
 
@@ -94,12 +91,12 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getEmptyAnnotationsWithNonStoredAnnotations() throws MailboxException {
+    void getEmptyAnnotationsWithNonStoredAnnotations() {
         assertThat(annotationMapper.getAllAnnotations(mailboxId)).isEmpty();
     }
 
     @Test
-    public void getAllAnnotationsShouldRetrieveStoredAnnotations() throws MailboxException {
+    void getAllAnnotationsShouldRetrieveStoredAnnotations() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, SHARED_ANNOTATION);
 
@@ -107,7 +104,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getAnnotationsByKeysShouldReturnStoredAnnotationWithFilter() throws MailboxException {
+    void getAnnotationsByKeysShouldReturnStoredAnnotationWithFilter() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_CHILD_ANNOTATION);
 
@@ -116,7 +113,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getAnnotationsByKeysWithOneDepthShouldReturnThatEntryAndItsChildren() throws MailboxException {
+    void getAnnotationsByKeysWithOneDepthShouldReturnThatEntryAndItsChildren() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_CHILD_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_GRANDCHILD_ANNOTATION);
@@ -128,7 +125,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getAnnotationsByKeysWithAllDepthShouldReturnThatEntryAndAllBelowEntries() throws MailboxException {
+    void getAnnotationsByKeysWithAllDepthShouldReturnThatEntryAndAllBelowEntries() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_CHILD_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_GRANDCHILD_ANNOTATION);
@@ -140,7 +137,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getAnnotationsByKeysWithOneDepthShouldReturnTheChildrenEntriesEvenItDoesNotExist() throws Exception {
+    void getAnnotationsByKeysWithOneDepthShouldReturnTheChildrenEntriesEvenItDoesNotExist() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_CHILD_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_GRANDCHILD_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, SHARED_ANNOTATION);
@@ -151,7 +148,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getAnnotationsByKeysWithAllDepthShouldReturnTheChildrenEntriesEvenItDoesNotExist() throws Exception {
+    void getAnnotationsByKeysWithAllDepthShouldReturnTheChildrenEntriesEvenItDoesNotExist() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_CHILD_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_GRANDCHILD_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, SHARED_ANNOTATION);
@@ -162,7 +159,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getAnnotationsByKeysWithOneDepthShouldReturnEmptyWithEmptyInputKeys() throws Exception {
+    void getAnnotationsByKeysWithOneDepthShouldReturnEmptyWithEmptyInputKeys() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_CHILD_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_GRANDCHILD_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, SHARED_ANNOTATION);
@@ -172,7 +169,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getAnnotationsByKeysWithOneDepthShouldReturnEmptyIfDoNotFind() throws Exception {
+    void getAnnotationsByKeysWithOneDepthShouldReturnEmptyIfDoNotFind() {
         annotationMapper.insertAnnotation(mailboxId, SHARED_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_USER_ANNOTATION);
 
@@ -180,7 +177,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void getAnnotationsByKeysWithAllDepthShouldReturnEmptyIfDoNotFind() throws Exception {
+    void getAnnotationsByKeysWithAllDepthShouldReturnEmptyIfDoNotFind() {
         annotationMapper.insertAnnotation(mailboxId, SHARED_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_USER_ANNOTATION);
 
@@ -188,7 +185,7 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void annotationShouldBeCaseInsentive() throws Exception {
+    void annotationShouldBeCaseInsentive() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION_WITH_KEY_UPPER);
 
@@ -196,24 +193,24 @@ public abstract class AnnotationMapperTest {
     }
 
     @Test
-    public void isExistedShouldReturnTrueIfAnnotationIsStored() throws Exception {
+    void isExistedShouldReturnTrueIfAnnotationIsStored() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
 
         assertThat(annotationMapper.exist(mailboxId, PRIVATE_ANNOTATION)).isTrue();
     }
 
     @Test
-    public void isExistedShouldReturnFalseIfAnnotationIsNotStored() throws Exception {
+    void isExistedShouldReturnFalseIfAnnotationIsNotStored() {
         assertThat(annotationMapper.exist(mailboxId, PRIVATE_ANNOTATION)).isFalse();
     }
 
     @Test
-    public void countAnnotationShouldReturnZeroIfNoMoreAnnotationBelongToMailbox() throws Exception {
+    void countAnnotationShouldReturnZeroIfNoMoreAnnotationBelongToMailbox() {
         assertThat(annotationMapper.countAnnotations(mailboxId)).isEqualTo(0);
     }
 
     @Test
-    public void countAnnotationShouldReturnNumberOfAnnotationBelongToMailbox() throws Exception {
+    void countAnnotationShouldReturnNumberOfAnnotationBelongToMailbox() {
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION);
         annotationMapper.insertAnnotation(mailboxId, PRIVATE_ANNOTATION_UPDATE);
         annotationMapper.insertAnnotation(mailboxId, SHARED_ANNOTATION);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
index 7312bc7..97469eb 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.store.mail.model;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
@@ -27,49 +28,45 @@ import java.util.List;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 
 public abstract class AttachmentMapperTest {
     private static final AttachmentId UNKNOWN_ATTACHMENT_ID = AttachmentId.from("unknown");
-    public static final Username OWNER = Username.of("owner");
-    public static final Username ADDITIONAL_OWNER = Username.of("additionalOwner");
+    private static final Username OWNER = Username.of("owner");
+    private static final Username ADDITIONAL_OWNER = Username.of("additionalOwner");
 
     private AttachmentMapper attachmentMapper;
 
-    @Rule
-    public ExpectedException expected = ExpectedException.none();
-
     protected abstract AttachmentMapper createAttachmentMapper();
 
     protected abstract MessageId generateMessageId();
 
-    public void setUp() throws MailboxException {
+    @BeforeEach
+    void setUp() {
         this.attachmentMapper = createAttachmentMapper();
     }
 
     @Test
-    public void getAttachmentShouldThrowWhenNullAttachmentId() throws Exception {
-        expected.expect(IllegalArgumentException.class);
-        attachmentMapper.getAttachment(null);
+    void getAttachmentShouldThrowWhenNullAttachmentId() {
+        assertThatThrownBy(() -> attachmentMapper.getAttachment(null))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void getAttachmentShouldThrowWhenNonReferencedAttachmentId() throws Exception {
-        expected.expect(AttachmentNotFoundException.class);
-        attachmentMapper.getAttachment(UNKNOWN_ATTACHMENT_ID);
+    void getAttachmentShouldThrowWhenNonReferencedAttachmentId() {
+        assertThatThrownBy(() -> attachmentMapper.getAttachment(UNKNOWN_ATTACHMENT_ID))
+            .isInstanceOf(AttachmentNotFoundException.class);
     }
 
     @Test
-    public void getAttachmentShouldReturnTheAttachmentWhenReferenced() throws Exception {
+    void getAttachmentShouldReturnTheAttachmentWhenReferenced() throws Exception {
         //Given
         Attachment expected = Attachment.builder()
                 .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -84,7 +81,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getAttachmentShouldReturnTheAttachmentsWhenMultipleStored() throws Exception {
+    void getAttachmentShouldReturnTheAttachmentsWhenMultipleStored() throws Exception {
         //Given
         Attachment expected1 = Attachment.builder()
                 .bytes("payload1".getBytes(StandardCharsets.UTF_8))
@@ -106,20 +103,20 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getAttachmentsShouldThrowWhenNullAttachmentId() {
-        expected.expect(IllegalArgumentException.class);
-        attachmentMapper.getAttachments(null);
+    void getAttachmentsShouldThrowWhenNullAttachmentId() {
+        assertThatThrownBy(() -> attachmentMapper.getAttachments(null))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void getAttachmentsShouldReturnEmptyListWhenNonReferencedAttachmentId() {
+    void getAttachmentsShouldReturnEmptyListWhenNonReferencedAttachmentId() {
         List<Attachment> attachments = attachmentMapper.getAttachments(ImmutableList.of(UNKNOWN_ATTACHMENT_ID));
 
         assertThat(attachments).isEmpty();
     }
 
     @Test
-    public void getAttachmentsShouldReturnTheAttachmentsWhenSome() throws Exception {
+    void getAttachmentsShouldReturnTheAttachmentsWhenSome() throws Exception {
         //Given
         Attachment expected = Attachment.builder()
                 .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -142,14 +139,14 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnerMessageIdsShouldReturnEmptyWhenNone() throws Exception {
+    void getOwnerMessageIdsShouldReturnEmptyWhenNone() throws Exception {
         Collection<MessageId> messageIds = attachmentMapper.getRelatedMessageIds(UNKNOWN_ATTACHMENT_ID);
 
         assertThat(messageIds).isEmpty();
     }
 
     @Test
-    public void getOwnerMessageIdsShouldReturnEmptyWhenStoredWithoutMessageId() throws Exception {
+    void getOwnerMessageIdsShouldReturnEmptyWhenStoredWithoutMessageId() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
                 .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -165,7 +162,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnerMessageIdsShouldReturnMessageIdWhenStoredWithMessageId() throws Exception {
+    void getOwnerMessageIdsShouldReturnMessageIdWhenStoredWithMessageId() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
                 .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -182,7 +179,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnerMessageIdsShouldReturnTwoMessageIdsWhenStoredTwice() throws Exception {
+    void getOwnerMessageIdsShouldReturnTwoMessageIdsWhenStoredTwice() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
                 .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -201,7 +198,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnerMessageIdsShouldReturnOnlyMatchingMessageId() throws Exception {
+    void getOwnerMessageIdsShouldReturnOnlyMatchingMessageId() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
                 .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -224,7 +221,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnerMessageIdsShouldReturnOnlyOneMessageIdWhenStoredTwice() throws Exception {
+    void getOwnerMessageIdsShouldReturnOnlyOneMessageIdWhenStoredTwice() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
                 .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -242,7 +239,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnerMessageIdsShouldReturnMessageIdForTwoAttachmentsWhenBothStoredAtTheSameTime() throws Exception {
+    void getOwnerMessageIdsShouldReturnMessageIdForTwoAttachmentsWhenBothStoredAtTheSameTime() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
                 .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -265,7 +262,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnersShouldBeRetrievedWhenExplicitlySpecified() throws Exception {
+    void getOwnersShouldBeRetrievedWhenExplicitlySpecified() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
             .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -283,7 +280,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnersShouldReturnEmptyWhenMessageIdReferenced() throws Exception {
+    void getOwnersShouldReturnEmptyWhenMessageIdReferenced() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
             .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -300,7 +297,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnersShouldReturnAllOwners() throws Exception {
+    void getOwnersShouldReturnAllOwners() throws Exception {
         //Given
         Attachment attachment = Attachment.builder()
             .bytes("payload".getBytes(StandardCharsets.UTF_8))
@@ -319,7 +316,7 @@ public abstract class AttachmentMapperTest {
     }
 
     @Test
-    public void getOwnersShouldReturnEmptyWhenUnknownAttachmentId() throws Exception {
+    void getOwnersShouldReturnEmptyWhenUnknownAttachmentId() throws Exception {
         Collection<Username> actualOwners = attachmentMapper.getOwners(AttachmentId.from("any"));
 
         assertThat(actualOwners).isEmpty();
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
index 9e9d07a..1815659 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
@@ -32,32 +32,29 @@ import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableMap;
 
 public abstract class MailboxMapperACLTest {
     private static final long UID_VALIDITY = 42;
-    public static final boolean POSITIVE = true;
-    public static final boolean NEGATIVE = !POSITIVE;
+    private static final boolean POSITIVE = true;
+    private static final boolean NEGATIVE = !POSITIVE;
     private static final Username USER = Username.of("user");
     private static final Username USER_1 = Username.of("user1");
     private static final Username USER_2 = Username.of("user2");
 
     private Mailbox benwaInboxMailbox;
 
-    @Rule
-    public ExpectedException expected = ExpectedException.none();
-
     private MailboxMapper mailboxMapper;
 
     protected abstract MailboxMapper createMailboxMapper();
 
     protected abstract MailboxId generateId();
 
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         mailboxMapper = createMailboxMapper();
         MailboxPath benwaInboxPath = MailboxPath.forUser(Username.of("benwa"), "INBOX");
         benwaInboxMailbox = createMailbox(benwaInboxPath);
@@ -65,7 +62,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void storedAclShouldBeEmptyByDefault() throws MailboxException {
+    void storedAclShouldBeEmptyByDefault() throws MailboxException {
         assertThat(
             mailboxMapper.findMailboxById(benwaInboxMailbox.getMailboxId())
                 .getACL()
@@ -74,7 +71,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateAclShouldSaveAclWhenReplace() throws MailboxException {
+    void updateAclShouldSaveAclWhenReplace() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         mailboxMapper.updateACL(benwaInboxMailbox, MailboxACL.command().key(key).rights(rights).asReplacement());
@@ -88,7 +85,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateAclShouldOverwriteStoredAclWhenReplace() throws MailboxException {
+    void updateAclShouldOverwriteStoredAclWhenReplace() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
@@ -105,7 +102,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateAclShouldTreatNegativeAndPositiveRightSeparately() throws MailboxException {
+    void updateAclShouldTreatNegativeAndPositiveRightSeparately() throws MailboxException {
         EntryKey key1 = EntryKey.createUserEntryKey(USER, NEGATIVE);
         EntryKey key2 = EntryKey.createUserEntryKey(USER, POSITIVE);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
@@ -123,7 +120,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateAclShouldTreatNameTypesRightSeparately() throws MailboxException {
+    void updateAclShouldTreatNameTypesRightSeparately() throws MailboxException {
         EntryKey key1 = EntryKey.createUserEntryKey(USER);
         EntryKey key2 = EntryKey.createGroupEntryKey(USER.asString());
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
@@ -141,7 +138,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateAclShouldCleanAclEntryWhenEmptyReplace() throws MailboxException {
+    void updateAclShouldCleanAclEntryWhenEmptyReplace() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights();
@@ -156,7 +153,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateAclShouldCombineStoredAclWhenAdd() throws MailboxException {
+    void updateAclShouldCombineStoredAclWhenAdd() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
@@ -173,7 +170,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void removeAclShouldRemoveSomeStoredAclWhenAdd() throws MailboxException {
+    void removeAclShouldRemoveSomeStoredAclWhenAdd() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights removedRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.PerformExpunge);
@@ -190,7 +187,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void removeAclShouldNotFailWhenRemovingNonExistingRight() throws MailboxException {
+    void removeAclShouldNotFailWhenRemovingNonExistingRight() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights removedRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.PerformExpunge, Right.Lookup);
@@ -207,7 +204,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void resetAclShouldReplaceStoredAcl() throws MailboxException {
+    void resetAclShouldReplaceStoredAcl() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
@@ -223,7 +220,7 @@ public abstract class MailboxMapperACLTest {
     }
     
     @Test
-    public void resetAclShouldInitializeStoredAcl() throws MailboxException {
+    void resetAclShouldInitializeStoredAcl() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
         mailboxMapper.setACL(benwaInboxMailbox,
@@ -244,12 +241,12 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void findMailboxesShouldReturnEmptyWhenNone() throws MailboxException {
+    void findMailboxesShouldReturnEmptyWhenNone() throws MailboxException {
         assertThat(mailboxMapper.findNonPersonalMailboxes(USER, Right.Administer)).isEmpty();
     }
 
     @Test
-    public void findMailboxesShouldReturnEmptyWhenRightDoesntMatch() throws MailboxException {
+    void findMailboxesShouldReturnEmptyWhenRightDoesntMatch() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
@@ -262,7 +259,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateACLShouldInsertUsersRights() throws MailboxException {
+    void updateACLShouldInsertUsersRights() throws MailboxException {
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, Right.PerformExpunge);
         mailboxMapper.updateACL(benwaInboxMailbox,
             MailboxACL.command()
@@ -275,7 +272,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateACLShouldOverwriteUsersRights() throws MailboxException {
+    void updateACLShouldOverwriteUsersRights() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights initialRights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
@@ -298,7 +295,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void findMailboxesShouldNotReportDeletedACLViaReplace() throws MailboxException {
+    void findMailboxesShouldNotReportDeletedACLViaReplace() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights initialRights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
@@ -319,7 +316,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void findMailboxesShouldNotReportDeletedACLViaRemove() throws MailboxException {
+    void findMailboxesShouldNotReportDeletedACLViaRemove() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights initialRights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
@@ -338,7 +335,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void findMailboxesShouldNotReportDeletedMailboxes() throws MailboxException {
+    void findMailboxesShouldNotReportDeletedMailboxes() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights initialRights = new Rfc4314Rights(Right.Administer);
         mailboxMapper.updateACL(benwaInboxMailbox,
@@ -353,7 +350,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void setACLShouldStoreMultipleUsersRights() throws MailboxException {
+    void setACLShouldStoreMultipleUsersRights() throws MailboxException {
         EntryKey user1 = EntryKey.createUserEntryKey(USER_1);
         EntryKey user2 = EntryKey.createUserEntryKey(USER_2);
 
@@ -368,7 +365,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void findMailboxesShouldNotReportRightsRemovedViaSetAcl() throws MailboxException {
+    void findMailboxesShouldNotReportRightsRemovedViaSetAcl() throws MailboxException {
         EntryKey user1 = EntryKey.createUserEntryKey(USER_1);
         EntryKey user2 = EntryKey.createUserEntryKey(USER_2);
 
@@ -384,7 +381,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void findMailboxesShouldReportRightsUpdatedViaSetAcl() throws MailboxException {
+    void findMailboxesShouldReportRightsUpdatedViaSetAcl() throws MailboxException {
         EntryKey user1 = EntryKey.createUserEntryKey(USER_1);
         EntryKey user2 = EntryKey.createUserEntryKey(USER_2);
 
@@ -400,7 +397,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void findMailboxByPathShouldReturnMailboxWithACL() throws MailboxException {
+    void findMailboxByPathShouldReturnMailboxWithACL() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
         mailboxMapper.setACL(benwaInboxMailbox,
@@ -415,7 +412,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void setACLShouldReturnACLDiff() throws MailboxException {
+    void setACLShouldReturnACLDiff() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
 
@@ -430,7 +427,7 @@ public abstract class MailboxMapperACLTest {
     }
 
     @Test
-    public void updateACLShouldReturnACLDiff() throws MailboxException {
+    void updateACLShouldReturnACLDiff() throws MailboxException {
         EntryKey key = EntryKey.createUserEntryKey(USER);
         Rfc4314Rights rights = new Rfc4314Rights(Right.WriteSeenFlag, Right.CreateMailbox, Right.Administer, Right.PerformExpunge, Right.DeleteMessages);
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
index 2c4efef..00be365 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperTest.java
@@ -37,7 +37,8 @@ import org.apache.james.mailbox.model.search.ExactName;
 import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.model.search.PrefixedWildcard;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Generic purpose tests for your implementation MailboxMapper.
@@ -47,7 +48,6 @@ import org.junit.Test;
 public abstract class MailboxMapperTest {
 
     private static final char DELIMITER = '.';
-    private static final char WILDCARD = '%';
     private static final long UID_VALIDITY = 42;
     private static final Username BENWA = Username.of("benwa");
 
@@ -74,26 +74,27 @@ public abstract class MailboxMapperTest {
 
     protected abstract MailboxId generateId();
 
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() {
         this.mailboxMapper = createMailboxMapper();
         
         initData();
     }
 
     @Test
-    public void findMailboxByPathWhenAbsentShouldFail() throws MailboxException {
+    void findMailboxByPathWhenAbsentShouldFail() throws MailboxException {
         assertThatThrownBy(() -> mailboxMapper.findMailboxByPath(MailboxPath.forUser(BENWA, "INBOX")))
             .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void saveShouldPersistTheMailbox() throws MailboxException {
+    void saveShouldPersistTheMailbox() throws MailboxException {
         mailboxMapper.save(benwaInboxMailbox);
         MailboxAssert.assertThat(mailboxMapper.findMailboxByPath(benwaInboxPath)).isEqualTo(benwaInboxMailbox);
     }
 
     @Test
-    public void saveShouldThrowWhenMailboxAlreadyExist() throws MailboxException {
+    void saveShouldThrowWhenMailboxAlreadyExist() throws MailboxException {
         mailboxMapper.save(benwaInboxMailbox);
 
         Mailbox mailbox = new Mailbox(benwaInboxMailbox);
@@ -104,7 +105,7 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void listShouldRetrieveAllMailbox() throws MailboxException {
+    void listShouldRetrieveAllMailbox() throws MailboxException {
         saveAll();
         List<Mailbox> mailboxes = mailboxMapper.list();
 
@@ -114,25 +115,25 @@ public abstract class MailboxMapperTest {
     }
     
     @Test
-    public void hasChildrenShouldReturnFalseWhenNoChildrenExists() throws MailboxException {
+    void hasChildrenShouldReturnFalseWhenNoChildrenExists() throws MailboxException {
         saveAll();
         assertThat(mailboxMapper.hasChildren(benwaWorkTodoMailbox, DELIMITER)).isFalse();
     }
 
     @Test
-    public void hasChildrenShouldReturnTrueWhenChildrenExists() throws MailboxException {
+    void hasChildrenShouldReturnTrueWhenChildrenExists() throws MailboxException {
         saveAll();
         assertThat(mailboxMapper.hasChildren(benwaInboxMailbox, DELIMITER)).isTrue();
     }
 
     @Test
-    public void hasChildrenShouldNotBeAcrossUsersAndNamespace() throws MailboxException {
+    void hasChildrenShouldNotBeAcrossUsersAndNamespace() throws MailboxException {
         saveAll();
         assertThat(mailboxMapper.hasChildren(bobInboxMailbox, '.')).isFalse();
     }
 
     @Test
-    public void findMailboxWithPathLikeShouldBeLimitedToUserAndNamespace() throws MailboxException {
+    void findMailboxWithPathLikeShouldBeLimitedToUserAndNamespace() throws MailboxException {
         saveAll();
         MailboxQuery.UserBound mailboxQuery = MailboxQuery.builder()
             .userAndNamespaceFrom(bobInboxPath)
@@ -146,7 +147,7 @@ public abstract class MailboxMapperTest {
     }
     
     @Test
-    public void deleteShouldEraseTheGivenMailbox() throws MailboxException {
+    void deleteShouldEraseTheGivenMailbox() throws MailboxException {
         saveAll();
         mailboxMapper.delete(benwaInboxMailbox);
 
@@ -155,7 +156,7 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void findMailboxWithPathLikeWithChildRegexShouldRetrieveChildren() throws MailboxException {
+    void findMailboxWithPathLikeWithChildRegexShouldRetrieveChildren() throws MailboxException {
         saveAll();
         MailboxQuery.UserBound mailboxQuery = MailboxQuery.builder()
             .userAndNamespaceFrom(benwaWorkPath)
@@ -169,7 +170,7 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void findMailboxWithPathLikeWithRegexShouldRetrieveCorrespondingMailbox() throws MailboxException {
+    void findMailboxWithPathLikeWithRegexShouldRetrieveCorrespondingMailbox() throws MailboxException {
         saveAll();
         MailboxQuery.UserBound mailboxQuery = MailboxQuery.builder()
             .userAndNamespaceFrom(benwaWorkPath)
@@ -183,7 +184,7 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void findMailboxWithPathLikeShouldEscapeMailboxName() throws MailboxException {
+    void findMailboxWithPathLikeShouldEscapeMailboxName() throws MailboxException {
         saveAll();
         MailboxQuery.UserBound mailboxQuery = MailboxQuery.builder()
             .userAndNamespaceFrom(benwaInboxPath)
@@ -195,14 +196,14 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void findMailboxByIdShouldReturnExistingMailbox() throws MailboxException {
+    void findMailboxByIdShouldReturnExistingMailbox() throws MailboxException {
         saveAll();
         Mailbox actual = mailboxMapper.findMailboxById(benwaInboxMailbox.getMailboxId());
         MailboxAssert.assertThat(actual).isEqualTo(benwaInboxMailbox);
     }
     
     @Test
-    public void findMailboxByIdShouldFailWhenAbsent() throws MailboxException {
+    void findMailboxByIdShouldFailWhenAbsent() throws MailboxException {
         saveAll();
         MailboxId removed = benwaInboxMailbox.getMailboxId();
         mailboxMapper.delete(benwaInboxMailbox);
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 264f2bc..349b39c 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
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.store.mail.model;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.time.Duration;
 import java.util.Date;
@@ -50,9 +51,8 @@ import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.assertj.core.data.MapEntry;
 import org.junit.Assume;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
@@ -61,9 +61,6 @@ import com.google.common.collect.ImmutableMultimap;
 public abstract class MessageIdMapperTest {
     private static final Username BENWA = Username.of("benwa");
 
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-
     private static final char DELIMITER = '.';
     private static final int BODY_START = 16;
     protected static final long UID_VALIDITY = 42;
@@ -72,21 +69,20 @@ public abstract class MessageIdMapperTest {
     private MailboxMapper mailboxMapper;
     private MessageIdMapper sut;
 
-    protected Mailbox benwaInboxMailbox;
-    protected Mailbox benwaWorkMailbox;
+    private Mailbox benwaInboxMailbox;
+    private Mailbox benwaWorkMailbox;
     
     protected SimpleMailboxMessage message1;
     protected SimpleMailboxMessage message2;
     protected SimpleMailboxMessage message3;
     protected SimpleMailboxMessage message4;
 
-    @Rule
-    public ExpectedException expected = ExpectedException.none();
     private MapperProvider mapperProvider;
 
     protected abstract MapperProvider provideMapper();
 
-    public void setUp() throws MailboxException {
+    @BeforeEach
+    void setUp() throws MailboxException {
         this.mapperProvider = provideMapper();
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.UNIQUE_MESSAGE_ID));
 
@@ -104,45 +100,45 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void findShouldReturnEmptyWhenIdListIsEmpty() {
+    void findShouldReturnEmptyWhenIdListIsEmpty() {
         assertThat(sut.find(ImmutableList.of(), FetchType.Full)).isEmpty();
     }
 
     @Test
-    public void findShouldReturnOneMessageWhenIdListContainsOne() throws MailboxException {
+    void findShouldReturnOneMessageWhenIdListContainsOne() throws MailboxException {
         saveMessages();
         List<MailboxMessage> messages = sut.find(ImmutableList.of(message1.getMessageId()), FetchType.Full);
         assertThat(messages).containsOnly(message1);
     }
 
     @Test
-    public void findShouldReturnMultipleMessagesWhenIdContainsMultiple() throws MailboxException {
+    void findShouldReturnMultipleMessagesWhenIdContainsMultiple() throws MailboxException {
         saveMessages();
         List<MailboxMessage> messages = sut.find(ImmutableList.of(message1.getMessageId(), message2.getMessageId(), message3.getMessageId()), FetchType.Full);
         assertThat(messages).containsOnly(message1, message2, message3);
     }
 
     @Test
-    public void findShouldReturnMultipleMessagesWhenIdContainsMultipleInDifferentMailboxes() throws MailboxException {
+    void findShouldReturnMultipleMessagesWhenIdContainsMultipleInDifferentMailboxes() throws MailboxException {
         saveMessages();
         List<MailboxMessage> messages = sut.find(ImmutableList.of(message1.getMessageId(), message4.getMessageId(), message3.getMessageId()), FetchType.Full);
         assertThat(messages).containsOnly(message1, message4, message3);
     }
 
     @Test
-    public void findMailboxesShouldReturnEmptyWhenMessageDoesntExist() {
+    void findMailboxesShouldReturnEmptyWhenMessageDoesntExist() {
         assertThat(sut.findMailboxes(mapperProvider.generateMessageId())).isEmpty();
     }
 
     @Test
-    public void findMailboxesShouldReturnOneMailboxWhenMessageExistsInOneMailbox() throws MailboxException {
+    void findMailboxesShouldReturnOneMailboxWhenMessageExistsInOneMailbox() throws MailboxException {
         saveMessages();
         List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
         assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId());
     }
 
     @Test
-    public void findMailboxesShouldReturnTwoMailboxesWhenMessageExistsInTwoMailboxes() throws MailboxException {
+    void findMailboxesShouldReturnTwoMailboxesWhenMessageExistsInTwoMailboxes() throws MailboxException {
         saveMessages();
 
         SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
@@ -155,7 +151,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void saveShouldSaveAMessage() throws Exception {
+    void saveShouldSaveAMessage() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -164,19 +160,19 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void saveShouldThrowWhenMailboxDoesntExist() throws Exception {
+    void saveShouldThrowWhenMailboxDoesntExist() throws Exception {
         Mailbox notPersistedMailbox = new Mailbox(MailboxPath.forUser(BENWA, "mybox"), UID_VALIDITY);
         notPersistedMailbox.setMailboxId(mapperProvider.generateId());
         SimpleMailboxMessage message = createMessage(notPersistedMailbox, "Subject: Test \n\nBody\n.\n", BODY_START, new PropertyBuilder());
         message.setUid(mapperProvider.generateMessageUid());
         message.setModSeq(mapperProvider.generateModSeq(notPersistedMailbox));
 
-        expectedException.expect(MailboxNotFoundException.class);
-        sut.save(message);
+        assertThatThrownBy(() -> sut.save(message))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void saveShouldSaveMessageInAnotherMailboxWhenMessageAlreadyInOneMailbox() throws Exception {
+    void saveShouldSaveMessageInAnotherMailboxWhenMessageAlreadyInOneMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -191,7 +187,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void saveShouldWorkWhenSavingTwoTimesWithSameMessageIdAndSameMailboxId() throws Exception {
+    void saveShouldWorkWhenSavingTwoTimesWithSameMessageIdAndSameMailboxId() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -205,7 +201,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void copyInMailboxShouldThrowWhenMailboxDoesntExist() throws Exception {
+    void copyInMailboxShouldThrowWhenMailboxDoesntExist() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -217,12 +213,12 @@ public abstract class MessageIdMapperTest {
         message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
         message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
 
-        expectedException.expect(MailboxNotFoundException.class);
-        sut.copyInMailbox(message1InOtherMailbox);
+        assertThatThrownBy(() -> sut.copyInMailbox(message1InOtherMailbox))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void copyInMailboxShouldSaveMessageInAnotherMailbox() throws Exception {
+    void copyInMailboxShouldSaveMessageInAnotherMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -237,7 +233,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void copyInMailboxShouldWorkWhenSavingTwoTimesWithSameMessageIdAndSameMailboxId() throws Exception {
+    void copyInMailboxShouldWorkWhenSavingTwoTimesWithSameMessageIdAndSameMailboxId() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -256,12 +252,12 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deleteShouldNotThrowWhenUnknownMessage() {
+    void deleteShouldNotThrowWhenUnknownMessage() {
         sut.delete(message1.getMessageId());
     }
 
     @Test
-    public void deleteShouldDeleteAMessage() throws Exception {
+    void deleteShouldDeleteAMessage() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -274,7 +270,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deleteShouldDeleteMessageIndicesWhenStoredInTwoMailboxes() throws Exception {
+    void deleteShouldDeleteMessageIndicesWhenStoredInTwoMailboxes() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -292,7 +288,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deleteShouldDeleteMessageIndicesWhenStoredTwoTimesInTheSameMailbox() throws Exception {
+    void deleteShouldDeleteMessageIndicesWhenStoredTwoTimesInTheSameMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -309,7 +305,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deleteWithMailboxIdsShouldNotDeleteIndicesWhenMailboxIdsIsEmpty() throws Exception {
+    void deleteWithMailboxIdsShouldNotDeleteIndicesWhenMailboxIdsIsEmpty() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -327,7 +323,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deleteWithMailboxIdsShouldDeleteOneIndexWhenMailboxIdsContainsOneElement() throws Exception {
+    void deleteWithMailboxIdsShouldDeleteOneIndexWhenMailboxIdsContainsOneElement() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -345,7 +341,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deleteWithMailboxIdsShouldDeleteIndicesWhenMailboxIdsContainsMultipleElements() throws Exception {
+    void deleteWithMailboxIdsShouldDeleteIndicesWhenMailboxIdsContainsMultipleElements() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -363,7 +359,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldReturnUpdatedFlagsWhenMessageIsInOneMailbox() throws Exception {
+    void setFlagsShouldReturnUpdatedFlagsWhenMessageIsInOneMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -383,7 +379,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldReturnUpdatedFlagsWhenReplaceMode() throws Exception {
+    void setFlagsShouldReturnUpdatedFlagsWhenReplaceMode() throws Exception {
         Flags messageFlags = new FlagsBuilder().add(Flags.Flag.RECENT, Flags.Flag.FLAGGED)
             .build();
 
@@ -411,7 +407,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldReturnUpdatedFlagsWhenRemoveMode() throws Exception {
+    void setFlagsShouldReturnUpdatedFlagsWhenRemoveMode() throws Exception {
         Flags messageFlags = new FlagsBuilder().add(Flags.Flag.RECENT, Flags.Flag.FLAGGED)
             .build();
 
@@ -439,7 +435,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldUpdateMessageFlagsWhenRemoveMode() throws Exception {
+    void setFlagsShouldUpdateMessageFlagsWhenRemoveMode() throws Exception {
         Flags messageFlags = new FlagsBuilder().add(Flags.Flag.RECENT, Flags.Flag.FLAGGED)
             .build();
 
@@ -462,7 +458,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldReturnEmptyWhenMailboxIdsIsEmpty() throws Exception {
+    void setFlagsShouldReturnEmptyWhenMailboxIdsIsEmpty() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -475,7 +471,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldReturnEmptyWhenMessageIdDoesntExist() throws Exception {
+    void setFlagsShouldReturnEmptyWhenMessageIdDoesntExist() throws Exception {
         MessageId unknownMessageId = mapperProvider.generateMessageId();
         Map<MailboxId, UpdatedFlags> flags = sut.setFlags(unknownMessageId, ImmutableList.of(message1.getMailboxId()), new Flags(Flag.RECENT), FlagsUpdateMode.REMOVE);
 
@@ -483,7 +479,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldAddFlagsWhenAddUpdateMode() throws Exception {
+    void setFlagsShouldAddFlagsWhenAddUpdateMode() throws Exception {
         Flags initialFlags = new Flags(Flag.RECENT);
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
@@ -509,7 +505,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldReturnUpdatedFlagsWhenMessageIsInTwoMailboxes() throws Exception {
+    void setFlagsShouldReturnUpdatedFlagsWhenMessageIsInTwoMailboxes() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -542,7 +538,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldUpdateFlagsWhenMessageIsInOneMailbox() throws Exception {
+    void setFlagsShouldUpdateFlagsWhenMessageIsInOneMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -556,7 +552,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldNotModifyModSeqWhenMailboxIdsIsEmpty() throws Exception {
+    void setFlagsShouldNotModifyModSeqWhenMailboxIdsIsEmpty() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
@@ -572,7 +568,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldUpdateModSeqWhenMessageIsInOneMailbox() throws Exception {
+    void setFlagsShouldUpdateModSeqWhenMessageIsInOneMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
@@ -587,7 +583,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldNotModifyFlagsWhenMailboxIdsIsEmpty() throws Exception {
+    void setFlagsShouldNotModifyFlagsWhenMailboxIdsIsEmpty() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
@@ -605,7 +601,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldUpdateFlagsWhenMessageIsInTwoMailboxes() throws Exception {
+    void setFlagsShouldUpdateFlagsWhenMessageIsInTwoMailboxes() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -625,7 +621,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldWorkWhenCalledOnFirstMessage() throws Exception {
+    void setFlagsShouldWorkWhenCalledOnFirstMessage() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -648,7 +644,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldWorkWhenCalledOnDuplicatedMailbox() throws Exception {
+    void setFlagsShouldWorkWhenCalledOnDuplicatedMailbox() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -671,7 +667,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldWorkWithConcurrencyWithAdd() throws Exception {
+    void setFlagsShouldWorkWithConcurrencyWithAdd() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.THREAD_SAFE_FLAGS_UPDATE));
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
@@ -694,7 +690,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldWorkWithConcurrencyWithRemove() throws Exception {
+    void setFlagsShouldWorkWithConcurrencyWithRemove() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.THREAD_SAFE_FLAGS_UPDATE));
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
@@ -726,7 +722,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countMessageShouldReturnWhenCreateNewMessage() throws Exception {
+    void countMessageShouldReturnWhenCreateNewMessage() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -735,7 +731,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countUnseenMessageShouldBeEmptyWhenMessageIsSeen() throws Exception {
+    void countUnseenMessageShouldBeEmptyWhenMessageIsSeen() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         message1.setFlags(new Flags(Flag.SEEN));
@@ -745,7 +741,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countUnseenMessageShouldReturnWhenMessageIsNotSeen() throws Exception {
+    void countUnseenMessageShouldReturnWhenMessageIsNotSeen() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -754,7 +750,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countMessageShouldBeEmptyWhenDeleteMessage() throws Exception {
+    void countMessageShouldBeEmptyWhenDeleteMessage() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -765,7 +761,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countUnseenMessageShouldBeEmptyWhenDeleteMessage() throws Exception {
+    void countUnseenMessageShouldBeEmptyWhenDeleteMessage() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -776,7 +772,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countUnseenMessageShouldReturnWhenDeleteMessage() throws Exception {
+    void countUnseenMessageShouldReturnWhenDeleteMessage() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         message1.setFlags(new Flags(Flag.SEEN));
@@ -792,7 +788,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countUnseenMessageShouldTakeCareOfMessagesMarkedAsRead() throws Exception {
+    void countUnseenMessageShouldTakeCareOfMessagesMarkedAsRead() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         sut.save(message1);
@@ -803,7 +799,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countUnseenMessageShouldTakeCareOfMessagesMarkedAsUnread() throws Exception {
+    void countUnseenMessageShouldTakeCareOfMessagesMarkedAsUnread() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         message1.setFlags(new Flags(Flag.SEEN));
@@ -815,7 +811,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldNotUpdateModSeqWhenNoop() throws Exception {
+    void setFlagsShouldNotUpdateModSeqWhenNoop() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
@@ -833,7 +829,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void addingFlagToAMessageThatAlreadyHasThisFlagShouldResultInNoChange() throws Exception {
+    void addingFlagToAMessageThatAlreadyHasThisFlagShouldResultInNoChange() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
@@ -852,7 +848,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void setFlagsShouldReturnUpdatedFlagsWhenNoop() throws Exception {
+    void setFlagsShouldReturnUpdatedFlagsWhenNoop() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         long modSeq = mapperProvider.generateModSeq(benwaInboxMailbox);
         message1.setModSeq(modSeq);
@@ -876,7 +872,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void countUnseenMessageShouldNotTakeCareOfOtherFlagsUpdates() throws Exception {
+    void countUnseenMessageShouldNotTakeCareOfOtherFlagsUpdates() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         message1.setFlags(new Flags(Flag.RECENT));
@@ -888,7 +884,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deletesShouldOnlyRemoveConcernedMessages() throws Exception {
+    void deletesShouldOnlyRemoveConcernedMessages() throws Exception {
         saveMessages();
 
         SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
@@ -913,7 +909,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deletesShouldUpdateMessageCount() throws Exception {
+    void deletesShouldUpdateMessageCount() throws Exception {
         saveMessages();
 
         SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
@@ -932,7 +928,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deletesShouldUpdateUnreadCount() throws Exception {
+    void deletesShouldUpdateUnreadCount() throws Exception {
         message1.setUid(mapperProvider.generateMessageUid());
         message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
         message1.setFlags(new Flags(Flag.SEEN));
@@ -953,7 +949,7 @@ public abstract class MessageIdMapperTest {
     }
 
     @Test
-    public void deletesShouldNotFailUponMissingMessage() {
+    void deletesShouldNotFailUponMissingMessage() {
         sut.delete(
             ImmutableMultimap.<MessageId, MailboxId>builder()
                 .put(message1.getMessageId(), benwaWorkMailbox.getMailboxId())
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 09323b8..68083f8 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
@@ -57,9 +57,8 @@ import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.Assume;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -69,7 +68,7 @@ public abstract class MessageMapperTest {
     private static final char DELIMITER = '.';
     private static final int LIMIT = 10;
     private static final int BODY_START = 16;
-    public static final int UID_VALIDITY = 42;
+    private static final int UID_VALIDITY = 42;
     private static final String USER_FLAG = "userFlag";
 
     private static final String CUSTOMS_USER_FLAGS_VALUE = "CustomsFlags";
@@ -89,12 +88,10 @@ public abstract class MessageMapperTest {
     private MailboxMessage message5;
     private MailboxMessage message6;
 
-    @Rule
-    public ExpectedException expected = ExpectedException.none();
-
     protected abstract MapperProvider createMapperProvider();
 
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         this.mapperProvider = createMapperProvider();
 
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.MESSAGE));
@@ -118,18 +115,18 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void emptyMailboxShouldHaveZeroMessageCount() throws MailboxException {
+    void emptyMailboxShouldHaveZeroMessageCount() throws MailboxException {
         assertThat(messageMapper.countMessagesInMailbox(benwaInboxMailbox)).isEqualTo(0);
     }
 
     @Test
-    public void mailboxContainingMessagesShouldHaveTheGoodMessageCount() throws MailboxException {
+    void mailboxContainingMessagesShouldHaveTheGoodMessageCount() throws MailboxException {
         saveMessages();
         assertThat(messageMapper.countMessagesInMailbox(benwaInboxMailbox)).isEqualTo(5);
     }
 
     @Test
-    public void getMailboxCountersShouldReturnStoredValue() throws MailboxException {
+    void getMailboxCountersShouldReturnStoredValue() throws MailboxException {
         saveMessages();
         assertThat(messageMapper.getMailboxCounters(ImmutableList.of(benwaInboxMailbox, benwaWorkMailbox)))
             .containsExactlyInAnyOrder(
@@ -146,25 +143,25 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void mailboxCountShouldBeDecrementedAfterAMessageDelete() throws MailboxException {
+    void mailboxCountShouldBeDecrementedAfterAMessageDelete() throws MailboxException {
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message1);
         assertThat(messageMapper.countMessagesInMailbox(benwaInboxMailbox)).isEqualTo(4);
     }
 
     @Test
-    public void emptyMailboxShouldNotHaveUnseenMessages() throws MailboxException {
+    void emptyMailboxShouldNotHaveUnseenMessages() throws MailboxException {
         assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(0);
     }
 
     @Test
-    public void mailboxContainingMessagesShouldHaveTheGoodUnseenMessageCount() throws MailboxException {
+    void mailboxContainingMessagesShouldHaveTheGoodUnseenMessageCount() throws MailboxException {
         saveMessages();
         assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(5);
     }
 
     @Test
-    public void mailboxUnSeenCountShouldBeDecrementedAfterAMessageIsMarkedSeen() throws MailboxException {
+    void mailboxUnSeenCountShouldBeDecrementedAfterAMessageIsMarkedSeen() throws MailboxException {
         saveMessages();
         FlagsUpdateCalculator newFlags = new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE);
 
@@ -174,7 +171,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void mailboxUnSeenCountShouldBeDecrementedAfterAMessageIsMarkedUnSeen() throws MailboxException {
+    void mailboxUnSeenCountShouldBeDecrementedAfterAMessageIsMarkedUnSeen() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
@@ -182,14 +179,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void mailboxUnSeenCountShouldBeDecrementedAfterAMessageDelete() throws MailboxException {
+    void mailboxUnSeenCountShouldBeDecrementedAfterAMessageDelete() throws MailboxException {
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message1);
         assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(4);
     }
 
     @Test
-    public void deletedMessagesShouldBeRemovedFromStorage() throws MailboxException {
+    void deletedMessagesShouldBeRemovedFromStorage() throws MailboxException {
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message1);
         assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), MessageMapper.FetchType.Metadata, LIMIT))
@@ -198,7 +195,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void deletingUnExistingMessageShouldHaveNoSideEffect() throws MailboxException, IOException {
+    void deletingUnExistingMessageShouldHaveNoSideEffect() throws MailboxException, IOException {
         saveMessages();
         message6.setUid(messageMapper.getLastUid(benwaInboxMailbox).get().next());
         messageMapper.delete(benwaInboxMailbox, message6);
@@ -208,14 +205,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void noMessageShouldBeRetrievedInEmptyMailbox() throws MailboxException {
+    void noMessageShouldBeRetrievedInEmptyMailbox() throws MailboxException {
         assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(MessageUid.MIN_VALUE), MessageMapper.FetchType.Metadata, LIMIT))
             .toIterable()
             .isEmpty();
     }
 
     @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeOne() throws MailboxException, IOException {
+    void messagesCanBeRetrievedInMailboxWithRangeTypeOne() throws MailboxException, IOException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
         int limit = 10;
@@ -224,7 +221,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeRange() throws MailboxException, IOException {
+    void messagesCanBeRetrievedInMailboxWithRangeTypeRange() throws MailboxException, IOException {
         saveMessages();
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
                 .findInMailbox(benwaInboxMailbox, MessageRange.range(message1.getUid(), message4.getUid()), MessageMapper.FetchType.Full, LIMIT);
@@ -233,7 +230,7 @@ public abstract class MessageMapperTest {
     }
     
     @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeRangeContainingAHole() throws MailboxException, IOException {
+    void messagesCanBeRetrievedInMailboxWithRangeTypeRangeContainingAHole() throws MailboxException, IOException {
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message3);
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
@@ -242,7 +239,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeFrom() throws MailboxException, IOException {
+    void messagesCanBeRetrievedInMailboxWithRangeTypeFrom() throws MailboxException, IOException {
         saveMessages();
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
                 .findInMailbox(benwaInboxMailbox, MessageRange.from(message3.getUid()), MessageMapper.FetchType.Full, LIMIT);
@@ -250,7 +247,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeFromContainingAHole() throws MailboxException, IOException {
+    void messagesCanBeRetrievedInMailboxWithRangeTypeFromContainingAHole() throws MailboxException, IOException {
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message4);
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
@@ -259,14 +256,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeAll() throws MailboxException, IOException {
+    void messagesCanBeRetrievedInMailboxWithRangeTypeAll() throws MailboxException, IOException {
         saveMessages();
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
         assertMessages(Lists.newArrayList(retrievedMessageIterator)).containOnly(message1, message2, message3, message4, message5);
     }
 
     @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeAllContainingHole() throws MailboxException, IOException {
+    void messagesCanBeRetrievedInMailboxWithRangeTypeAllContainingHole() throws MailboxException, IOException {
         saveMessages();
         messageMapper.delete(benwaInboxMailbox, message1);
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper
@@ -275,7 +272,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeMetadataShouldHaveAtLastMetadataDataLoaded() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeMetadataShouldHaveAtLastMetadataDataLoaded() throws MailboxException, IOException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Metadata;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, LIMIT);
@@ -286,7 +283,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeHeaderShouldHaveHeaderDataLoaded() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeHeaderShouldHaveHeaderDataLoaded() throws MailboxException, IOException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Headers;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, LIMIT);
@@ -297,7 +294,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeBodyShouldHaveBodyDataLoaded() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeBodyShouldHaveBodyDataLoaded() throws MailboxException, IOException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Body;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, LIMIT);
@@ -308,7 +305,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeFullShouldHaveBodyDataLoaded() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeFullShouldHaveBodyDataLoaded() throws MailboxException, IOException {
         saveMessages();
         MessageMapper.FetchType fetchType = FetchType.Full;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(message1.getUid()), fetchType, LIMIT);
@@ -319,7 +316,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void retrievingMessagesWithALimitShouldLimitTheNumberOfMessages() throws MailboxException {
+    void retrievingMessagesWithALimitShouldLimitTheNumberOfMessages() throws MailboxException {
         int limit = 2;
         saveMessages();
         assertThat(messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, limit))
@@ -328,12 +325,12 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void findRecentUidsInMailboxShouldReturnEmptyListWhenNoMessagesMarkedAsRecentArePresentInMailbox() throws MailboxException {
+    void findRecentUidsInMailboxShouldReturnEmptyListWhenNoMessagesMarkedAsRecentArePresentInMailbox() throws MailboxException {
         assertThat(messageMapper.findRecentMessageUidsInMailbox(benwaInboxMailbox)).isEmpty();
     }
 
     @Test
-    public void findRecentUidsInMailboxShouldReturnListOfMessagesHoldingFlagsRecent() throws MailboxException {
+    void findRecentUidsInMailboxShouldReturnListOfMessagesHoldingFlagsRecent() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), MessageRange.one(message2.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), MessageRange.one(message4.getUid()));
@@ -342,7 +339,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void deleteShouldUpdateRecentWhenNeeded() throws MailboxException {
+    void deleteShouldUpdateRecentWhenNeeded() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), MessageRange.one(message2.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), MessageRange.one(message4.getUid()));
@@ -354,7 +351,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void deleteShouldNotUpdateRecentWhenNotNeeded() throws MailboxException {
+    void deleteShouldNotUpdateRecentWhenNotNeeded() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), MessageRange.one(message2.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.RECENT), FlagsUpdateMode.REPLACE), MessageRange.one(message4.getUid()));
@@ -366,7 +363,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void addShouldUpdateRecentWhenNeeded() throws MailboxException {
+    void addShouldUpdateRecentWhenNeeded() throws MailboxException {
         message1.setFlags(new Flags(Flags.Flag.RECENT));
         messageMapper.add(benwaInboxMailbox, message1);
         message1.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
@@ -375,7 +372,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void addShouldNotUpdateRecentWhenNotNeeded() throws MailboxException {
+    void addShouldNotUpdateRecentWhenNotNeeded() throws MailboxException {
         messageMapper.add(benwaInboxMailbox, message1);
         message1.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
 
@@ -383,18 +380,18 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void findFirstUnseenMessageUidShouldReturnNullWhenNoUnseenMessagesCanBeFound() throws MailboxException {
+    void findFirstUnseenMessageUidShouldReturnNullWhenNoUnseenMessagesCanBeFound() throws MailboxException {
         assertThat(messageMapper.findFirstUnseenMessageUid(benwaInboxMailbox)).isNull();
     }
 
     @Test
-    public void findFirstUnseenMessageUidShouldReturnUid1WhenUid1isNotSeen() throws MailboxException {
+    void findFirstUnseenMessageUidShouldReturnUid1WhenUid1isNotSeen() throws MailboxException {
         saveMessages();
         assertThat(messageMapper.findFirstUnseenMessageUid(benwaInboxMailbox)).isEqualTo(message1.getUid());
     }
 
     @Test
-    public void findFirstUnseenMessageUidShouldReturnUid2WhenUid2isSeen() throws MailboxException {
+    void findFirstUnseenMessageUidShouldReturnUid2WhenUid2isSeen() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), MessageRange.one(message3.getUid()));
@@ -403,23 +400,23 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void retrieveMessagesMarkedForDeletionInMailboxShouldReturnEmptyResultOnEmptyMailbox() throws MailboxException {
+    void retrieveMessagesMarkedForDeletionInMailboxShouldReturnEmptyResultOnEmptyMailbox() throws MailboxException {
         assertThat(messageMapper.retrieveMessagesMarkedForDeletion(benwaInboxMailbox, MessageRange.all())).isEmpty();
     }
 
     @Test
-    public void deleteMessagesInMailboxShouldReturnEmptyResultOnEmptyMailbox() throws MailboxException {
+    void deleteMessagesInMailboxShouldReturnEmptyResultOnEmptyMailbox() throws MailboxException {
         assertThat(messageMapper.deleteMessages(benwaInboxMailbox, ImmutableList.of())).isEmpty();
     }
 
     @Test
-    public void retrieveMessagesMarkedForDeletionInMailboxShouldReturnEmptyResultWhenNoMessageInMailboxIsMarkedAsDeleted() throws MailboxException, IOException {
+    void retrieveMessagesMarkedForDeletionInMailboxShouldReturnEmptyResultWhenNoMessageInMailboxIsMarkedAsDeleted() throws MailboxException, IOException {
         saveMessages();
         assertThat(messageMapper.retrieveMessagesMarkedForDeletion(benwaInboxMailbox, MessageRange.all())).isEmpty();
     }
 
     @Test
-    public void deleteMessagesInMailboxShouldReturnEmptyResultWhenNoMessageInMailboxIsDeleted() throws MailboxException, IOException {
+    void deleteMessagesInMailboxShouldReturnEmptyResultWhenNoMessageInMailboxIsDeleted() throws MailboxException, IOException {
         saveMessages();
         assertThat(messageMapper.deleteMessages(benwaInboxMailbox, ImmutableList.of())).isEmpty();
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
@@ -428,14 +425,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void retrieveMessagesMarkedForDeletionShouldReturnCorrectUidsWithRangeAll() throws MailboxException {
+    void retrieveMessagesMarkedForDeletionShouldReturnCorrectUidsWithRangeAll() throws MailboxException {
         saveMessages();
         assertThat(markThenPerformRetrieveMessagesMarkedForDeletion(MessageRange.all()))
             .containsOnly(message1.getUid(), message4.getUid());
     }
 
     @Test
-    public void deleteMessagesShouldReturnCorrectMetadataWithRangeAll() throws MailboxException {
+    void deleteMessagesShouldReturnCorrectMetadataWithRangeAll() throws MailboxException {
         saveMessages();
         MetadataMapAssert.assertThat(markThenPerformDeleteMessages(MessageRange.all()))
             .hasSize(2)
@@ -443,7 +440,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void deleteMessagesShouldModifyUnderlyingStorageWithRangeAll() throws MailboxException, IOException {
+    void deleteMessagesShouldModifyUnderlyingStorageWithRangeAll() throws MailboxException, IOException {
         saveMessages();
         markThenPerformDeleteMessages(MessageRange.all());
 
@@ -453,14 +450,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void retrieveMessagesMarkedForDeletionShouldReturnCorrectMetadataWithRangeOne() throws MailboxException {
+    void retrieveMessagesMarkedForDeletionShouldReturnCorrectMetadataWithRangeOne() throws MailboxException {
         saveMessages();
         assertThat(markThenPerformRetrieveMessagesMarkedForDeletion(MessageRange.one(message1.getUid())))
             .containsOnly(message1.getUid());
     }
 
     @Test
-    public void deleteMessagesShouldReturnCorrectMetadataWithRangeOne() throws MailboxException {
+    void deleteMessagesShouldReturnCorrectMetadataWithRangeOne() throws MailboxException {
         saveMessages();
         MetadataMapAssert.assertThat(markThenPerformDeleteMessages(MessageRange.one(message1.getUid())))
             .hasSize(1)
@@ -468,7 +465,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void deleteMessagesShouldModifyUnderlyingStorageWithRangeOne() throws MailboxException, IOException {
+    void deleteMessagesShouldModifyUnderlyingStorageWithRangeOne() throws MailboxException, IOException {
         saveMessages();
         markThenPerformDeleteMessages(MessageRange.one(message1.getUid()));
 
@@ -478,14 +475,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void retrieveMessagesMarkedForDeletionShouldReturnCorrectMetadataWithRangeFrom() throws MailboxException {
+    void retrieveMessagesMarkedForDeletionShouldReturnCorrectMetadataWithRangeFrom() throws MailboxException {
         saveMessages();
         assertThat(markThenPerformRetrieveMessagesMarkedForDeletion(MessageRange.from(message3.getUid())))
             .containsOnly(message4.getUid());
     }
 
     @Test
-    public void deleteMessagesShouldReturnCorrectMetadataWithRangeFrom() throws MailboxException {
+    void deleteMessagesShouldReturnCorrectMetadataWithRangeFrom() throws MailboxException {
         saveMessages();
         MetadataMapAssert.assertThat(markThenPerformDeleteMessages(MessageRange.from(message3.getUid())))
             .hasSize(1)
@@ -493,7 +490,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void deleteMessagesShouldModifyUnderlyingStorageWithRangeFrom() throws MailboxException, IOException {
+    void deleteMessagesShouldModifyUnderlyingStorageWithRangeFrom() throws MailboxException, IOException {
         saveMessages();
         markThenPerformDeleteMessages(MessageRange.from(message3.getUid()));
 
@@ -503,14 +500,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void retrieveMessagesMarkedForDeletionShouldReturnCorrectMetadataWithRange() throws MailboxException {
+    void retrieveMessagesMarkedForDeletionShouldReturnCorrectMetadataWithRange() throws MailboxException {
         saveMessages();
         assertThat(markThenPerformRetrieveMessagesMarkedForDeletion(MessageRange.range(message3.getUid(), message5.getUid())))
             .containsOnly(message4.getUid());
     }
 
     @Test
-    public void deleteMessagesShouldReturnCorrectMetadataWithRange() throws MailboxException {
+    void deleteMessagesShouldReturnCorrectMetadataWithRange() throws MailboxException {
         saveMessages();
         MetadataMapAssert.assertThat(markThenPerformDeleteMessages(MessageRange.range(message3.getUid(), message5.getUid())))
             .hasSize(1)
@@ -518,7 +515,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void deleteMessagesShouldModifyUnderlyingStorageWithRange() throws MailboxException, IOException {
+    void deleteMessagesShouldModifyUnderlyingStorageWithRange() throws MailboxException, IOException {
         saveMessages();
         markThenPerformDeleteMessages(MessageRange.range(message3.getUid(), message5.getUid()));
 
@@ -528,12 +525,12 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getHighestMoseqShouldBeEqualToZeroOnEmptyMailbox() throws MailboxException {
+    void getHighestMoseqShouldBeEqualToZeroOnEmptyMailbox() throws MailboxException {
         assertThat(messageMapper.getHighestModSeq(benwaInboxMailbox)).isEqualTo(0);
     }
 
     @Test
-    public void insertingAMessageShouldIncrementModSeq() throws MailboxException {
+    void insertingAMessageShouldIncrementModSeq() throws MailboxException {
         messageMapper.add(benwaInboxMailbox, message1);
         long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         assertThat(modSeq).isGreaterThan(0);
@@ -542,12 +539,12 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getLastUidShouldReturnEmptyOnEmptyMailbox() throws MailboxException {
+    void getLastUidShouldReturnEmptyOnEmptyMailbox() throws MailboxException {
         assertThat(messageMapper.getLastUid(benwaInboxMailbox)).isEqualTo(Optional.empty());
     }
 
     @Test
-    public void insertingAMessageShouldIncrementLastUid() throws MailboxException {
+    void insertingAMessageShouldIncrementLastUid() throws MailboxException {
         messageMapper.add(benwaInboxMailbox, message1);
         Optional<MessageUid> uid = messageMapper.getLastUid(benwaInboxMailbox);
         assertThat(uid).isNotEqualTo(Optional.empty());
@@ -556,7 +553,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void copyShouldIncrementUid() throws MailboxException {
+    void copyShouldIncrementUid() throws MailboxException {
         saveMessages();
         MessageUid uid = messageMapper.getLastUid(benwaInboxMailbox).get();
         messageMapper.copy(benwaInboxMailbox, SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
@@ -564,21 +561,21 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void copyShouldIncrementMessageCount() throws MailboxException {
+    void copyShouldIncrementMessageCount() throws MailboxException {
         saveMessages();
         messageMapper.copy(benwaInboxMailbox, SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
         assertThat(messageMapper.countMessagesInMailbox(benwaInboxMailbox)).isEqualTo(6);
     }
 
     @Test
-    public void copyOfUnSeenMessageShouldIncrementUnSeenMessageCount() throws MailboxException {
+    void copyOfUnSeenMessageShouldIncrementUnSeenMessageCount() throws MailboxException {
         saveMessages();
         messageMapper.copy(benwaInboxMailbox, SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
         assertThat(messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox)).isEqualTo(6);
     }
 
     @Test
-    public void copyShouldIncrementModSeq() throws MailboxException, IOException {
+    void copyShouldIncrementModSeq() throws MailboxException, IOException {
         saveMessages();
         long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         messageMapper.copy(benwaInboxMailbox, SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
@@ -586,7 +583,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void copyShouldCreateAMessageInDestination() throws MailboxException, IOException {
+    void copyShouldCreateAMessageInDestination() throws MailboxException, IOException {
         saveMessages();
         MailboxMessage message7 = SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6);
         messageMapper.copy(benwaInboxMailbox, message7);
@@ -604,7 +601,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void copyOfSeenMessageShouldNotIncrementUnSeenMessageCount() throws MailboxException {
+    void copyOfSeenMessageShouldNotIncrementUnSeenMessageCount() throws MailboxException {
         message6.setFlags(new Flags(Flags.Flag.SEEN));
         saveMessages();
         long expectedUnseenMessages = messageMapper.countUnseenMessagesInMailbox(benwaInboxMailbox);
@@ -614,7 +611,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void copiedMessageShouldBeMarkedAsRecent() throws MailboxException {
+    void copiedMessageShouldBeMarkedAsRecent() throws MailboxException {
         saveMessages();
         MessageMetaData metaData = messageMapper.copy(benwaInboxMailbox, SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
         assertThat(
@@ -628,7 +625,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void copiedRecentMessageShouldBeMarkedAsRecent() throws MailboxException {
+    void copiedRecentMessageShouldBeMarkedAsRecent() throws MailboxException {
         saveMessages();
         message6.setFlags(new Flags(Flags.Flag.RECENT));
         MessageMetaData metaData = messageMapper.copy(benwaInboxMailbox, SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
@@ -643,7 +640,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void copiedMessageShouldNotChangeTheFlagsOnOriginalMessage() throws MailboxException {
+    void copiedMessageShouldNotChangeTheFlagsOnOriginalMessage() throws MailboxException {
         saveMessages();
         messageMapper.copy(benwaInboxMailbox, SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message6));
         assertThat(
@@ -657,14 +654,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void flagsReplacementShouldReplaceStoredMessageFlags() throws MailboxException {
+    void flagsReplacementShouldReplaceStoredMessageFlags() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(Flags.Flag.FLAGGED));
     }
 
     @Test
-    public void flagsReplacementShouldReturnAnUpdatedFlagHighlightingTheReplacement() throws MailboxException {
+    void flagsReplacementShouldReturnAnUpdatedFlagHighlightingTheReplacement() throws MailboxException {
         saveMessages();
         long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         Iterator<UpdatedFlags> updatedFlags = messageMapper.updateFlags(benwaInboxMailbox,
@@ -679,7 +676,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void flagsAdditionShouldReturnAnUpdatedFlagHighlightingTheAddition() throws MailboxException {
+    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);
@@ -694,7 +691,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void flagsAdditionShouldUpdateStoredMessageFlags() throws MailboxException {
+    void flagsAdditionShouldUpdateStoredMessageFlags() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid()));
@@ -702,7 +699,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void flagsAdditionShouldHaveNoEffectOnStoredFlagsWhenNoop() throws MailboxException {
+    void flagsAdditionShouldHaveNoEffectOnStoredFlagsWhenNoop() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.FLAGGED), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
 
@@ -712,7 +709,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void flagsRemovalShouldReturnAnUpdatedFlagHighlightingTheRemoval() throws MailboxException {
+    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);
@@ -728,7 +725,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void flagsRemovalShouldUpdateStoredMessageFlags() throws MailboxException {
+    void flagsRemovalShouldUpdateStoredMessageFlags() throws MailboxException {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new FlagsBuilder().add(Flags.Flag.FLAGGED, Flags.Flag.SEEN).build(), FlagsUpdateMode.REPLACE), MessageRange.one(message1.getUid()));
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REMOVE), MessageRange.one(message1.getUid()));
@@ -736,7 +733,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void updateFlagsOnRangeShouldAffectMessagesContainedInThisRange() throws MailboxException {
+    void updateFlagsOnRangeShouldAffectMessagesContainedInThisRange() throws MailboxException {
         saveMessages();
         assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), MessageRange.range(message1.getUid(), message3.getUid())))
             .toIterable()
@@ -744,7 +741,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void updateFlagsWithRangeFromShouldAffectMessagesContainedInThisRange() throws MailboxException {
+    void updateFlagsWithRangeFromShouldAffectMessagesContainedInThisRange() throws MailboxException {
         saveMessages();
         assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), MessageRange.from(message3.getUid())))
             .toIterable()
@@ -752,7 +749,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void updateFlagsWithRangeAllRangeShouldAffectAllMessages() throws MailboxException {
+    void updateFlagsWithRangeAllRangeShouldAffectAllMessages() throws MailboxException {
         saveMessages();
         assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(Flags.Flag.SEEN), FlagsUpdateMode.REPLACE), MessageRange.all()))
             .toIterable()
@@ -760,7 +757,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagePropertiesShouldBeStored() throws Exception {
+    void messagePropertiesShouldBeStored() throws Exception {
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setMediaType("text");
         propBuilder.setSubType("html");
@@ -776,7 +773,7 @@ public abstract class MessageMapperTest {
     }
     
     @Test
-    public void messagePropertiesShouldBeStoredWhenDuplicateEntries() throws Exception {
+    void messagePropertiesShouldBeStoredWhenDuplicateEntries() throws Exception {
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setProperty(StandardNames.MIME_CONTENT_LANGUAGE_SPACE, StandardNames.MIME_CONTENT_LANGUAGE_NAME, "us");
         propBuilder.setProperty(StandardNames.MIME_CONTENT_LANGUAGE_SPACE, StandardNames.MIME_CONTENT_LANGUAGE_NAME, "fr");
@@ -789,7 +786,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagePropertiesShouldBeStoredWhenNoProperty() throws Exception {
+    void messagePropertiesShouldBeStoredWhenNoProperty() throws Exception {
         MailboxMessage messageWithProperties = createMessage(benwaWorkMailbox, mapperProvider.generateMessageId(), "Subject: messagePropertiesShouldBeStoredWhenNoProperty \n\nBody\n.\n", BODY_START, new PropertyBuilder());
         MessageMetaData messageMetaData = messageMapper.add(benwaInboxMailbox, messageWithProperties);
         MailboxMessage message = messageMapper.findInMailbox(benwaInboxMailbox, MessageRange.one(messageMetaData.getUid()), FetchType.Body, 1).next();
@@ -797,7 +794,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void textualLineCountShouldBeWellStored() throws Exception {
+    void textualLineCountShouldBeWellStored() throws Exception {
         long textualLineCount = 48L;
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setTextualLineCount(textualLineCount);
@@ -809,7 +806,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void mediaTypeShouldBeWellStored() throws Exception {
+    void mediaTypeShouldBeWellStored() throws Exception {
         String mediaType = "plain";
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setMediaType(mediaType);
@@ -821,7 +818,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void subTypeShouldBeWellStored() throws Exception {
+    void subTypeShouldBeWellStored() throws Exception {
         String subType = "text";
         PropertyBuilder propBuilder = new PropertyBuilder();
         propBuilder.setSubType(subType);
@@ -833,14 +830,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void userFlagsShouldBeSupported() throws Exception {
+    void userFlagsShouldBeSupported() throws Exception {
         saveMessages();
         messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(USER_FLAG), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid()));
         assertThat(retrieveMessageFromStorage(message1)).hasFlags(new Flags(USER_FLAG));
     }
 
     @Test
-    public void userFlagsUpdateShouldReturnCorrectUpdatedFlags() throws Exception {
+    void userFlagsUpdateShouldReturnCorrectUpdatedFlags() throws Exception {
         saveMessages();
         long modSeq = messageMapper.getHighestModSeq(benwaInboxMailbox);
         assertThat(messageMapper.updateFlags(benwaInboxMailbox, new FlagsUpdateCalculator(new Flags(USER_FLAG), FlagsUpdateMode.ADD), MessageRange.one(message1.getUid())))
@@ -855,7 +852,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void userFlagsUpdateShouldReturnCorrectUpdatedFlagsWhenNoop() throws Exception {
+    void userFlagsUpdateShouldReturnCorrectUpdatedFlagsWhenNoop() throws Exception {
         saveMessages();
 
         assertThat(
@@ -873,7 +870,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void userFlagsUpdateShouldWorkInConcurrentEnvironment() throws Exception {
+    void userFlagsUpdateShouldWorkInConcurrentEnvironment() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.THREAD_SAFE_FLAGS_UPDATE));
 
         saveMessages();
@@ -895,7 +892,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void setFlagsShouldWorkWithConcurrencyWithRemove() throws Exception {
+    void setFlagsShouldWorkWithConcurrencyWithRemove() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.THREAD_SAFE_FLAGS_UPDATE));
         saveMessages();
 
@@ -925,14 +922,14 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void messagesShouldBeSavedWithTheirUserFlags() throws Exception {
+    void messagesShouldBeSavedWithTheirUserFlags() throws Exception {
         MailboxMessage message = SimpleMailboxMessage.copy(benwaInboxMailbox.getMailboxId(), message1);
         messageMapper.add(benwaInboxMailbox, message);
         assertThat(retrieveMessageFromStorage(message)).hasFlags(new Flags(USER_FLAG));
     }
 
     @Test
-    public void getApplicableFlagShouldUnionAllMessageFlags() throws Exception {
+    void getApplicableFlagShouldUnionAllMessageFlags() throws Exception {
         String customFlags1 = "custom1";
         String customFlags2 = "custom2";
         message1.setFlags(new Flags(customFlags1));
@@ -948,7 +945,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldUnionAllMessageFlagsExceptRecentAndUser() throws Exception {
+    void getApplicableFlagShouldUnionAllMessageFlagsExceptRecentAndUser() throws Exception {
         message1.setFlags(new Flags(Flag.ANSWERED));
         message2.setFlags(new Flags(Flag.DELETED));
 
@@ -967,7 +964,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldContainSystemFlagsByDefault() throws Exception {
+    void getApplicableFlagShouldContainSystemFlagsByDefault() throws Exception {
         assertThat(messageMapper.getApplicableFlag(benwaInboxMailbox))
             .isEqualTo(FlagsBuilder.builder()
                 .add(Flag.DELETED, Flag.ANSWERED, Flag.DRAFT, Flag.FLAGGED, Flag.SEEN)
@@ -976,7 +973,7 @@ public abstract class MessageMapperTest {
 
 
     @Test
-    public void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByAddingThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
+    void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByAddingThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         message1.setFlags(new Flags(Flag.ANSWERED));
         message2.setFlags(new Flags(Flag.DELETED));
 
@@ -994,7 +991,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldHaveNotEffectWhenUpdateFlagsByReplaceThenIncrementalApplicableFlags() throws Exception {
+    void getApplicableFlagShouldHaveNotEffectWhenUpdateFlagsByReplaceThenIncrementalApplicableFlags() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
         String customFlags = "custom";
         message1.setFlags(new Flags(customFlags));
@@ -1012,7 +1009,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByReplaceThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
+    void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByReplaceThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         Assume.assumeFalse(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
         String customFlags = "custom";
         message1.setFlags(new Flags(customFlags));
@@ -1029,7 +1026,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldHaveNotEffectWhenUpdateFlagsByRemoveThenIncrementalApplicableFlags() throws Exception {
+    void getApplicableFlagShouldHaveNotEffectWhenUpdateFlagsByRemoveThenIncrementalApplicableFlags() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
         String customFlags = "custom";
         message1.setFlags(new FlagsBuilder().add(Flag.ANSWERED).add(customFlags).build());
@@ -1047,7 +1044,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByRemoveThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
+    void getApplicableFlagShouldHaveEffectWhenUpdateFlagsByRemoveThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         Assume.assumeFalse(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
         String customFlags = "custom";
         message1.setFlags(new FlagsBuilder().add(Flag.ANSWERED).add(customFlags).build());
@@ -1064,7 +1061,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldHaveEffectWhenUnsetMessageFlagThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
+    void getApplicableFlagShouldHaveEffectWhenUnsetMessageFlagThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         Assume.assumeFalse(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
         String customFlag1 = "custom1";
         String customFlag2 = "custom2";
@@ -1084,7 +1081,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldHaveNotEffectWhenUnsetMessageFlagThenIncrementalApplicableFlags() throws Exception {
+    void getApplicableFlagShouldHaveNotEffectWhenUnsetMessageFlagThenIncrementalApplicableFlags() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.THREAD_SAFE_FLAGS_UPDATE));
         String customFlag1 = "custom1";
         String customFlag2 = "custom2";
@@ -1104,7 +1101,7 @@ public abstract class MessageMapperTest {
 
 
     @Test
-    public void getApplicableFlagShouldHaveNotEffectWhenDeleteMessageThenIncrementalApplicableFlags() throws Exception {
+    void getApplicableFlagShouldHaveNotEffectWhenDeleteMessageThenIncrementalApplicableFlags() throws Exception {
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
         String customFlag1 = "custom1";
         String customFlag2 = "custom2";
@@ -1122,7 +1119,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldReturnDefaultApplicableFlagsWhenMailboxEmpty() throws Exception {
+    void getApplicableFlagShouldReturnDefaultApplicableFlagsWhenMailboxEmpty() throws Exception {
         Mailbox emptyMailbox = createMailbox(MailboxPath.forUser(BENWA, "EMPTY"));
 
         assertThat(messageMapper.getApplicableFlag(emptyMailbox))
@@ -1132,7 +1129,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getApplicableFlagShouldHaveEffectWhenDeleteMessageThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
+    void getApplicableFlagShouldHaveEffectWhenDeleteMessageThenComputingApplicableFlagsFromCurrentMailboxState() throws Exception {
         Assume.assumeFalse(mapperProvider.getSupportedCapabilities().contains(Capabilities.INCREMENTAL_APPLICABLE_FLAGS));
         String customFlag1 = "custom1";
         String customFlag2 = "custom2";
@@ -1150,7 +1147,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getUidsShouldReturnUidsOfMessagesInTheMailbox() throws Exception {
+    void getUidsShouldReturnUidsOfMessagesInTheMailbox() throws Exception {
         saveMessages();
 
         assertThat(messageMapper.listAllMessageUids(benwaInboxMailbox))
@@ -1163,7 +1160,7 @@ public abstract class MessageMapperTest {
     }
 
     @Test
-    public void getUidsShouldNotReturnUidsOfDeletedMessages() throws Exception {
+    void getUidsShouldNotReturnUidsOfDeletedMessages() throws Exception {
         saveMessages();
 
         messageMapper.updateFlags(benwaInboxMailbox,
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
index 8658d50..c531a59 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageMoveTest.java
@@ -40,16 +40,15 @@ import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.junit.Assume;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 public abstract class MessageMoveTest {
 
     private static final char DELIMITER = '.';
     private static final int LIMIT = 10;
     private static final int BODY_START = 16;
-    public static final int UID_VALIDITY = 42;
+    private static final int UID_VALIDITY = 42;
 
     private MapperProvider mapperProvider;
     private MessageMapper messageMapper;
@@ -62,10 +61,8 @@ public abstract class MessageMoveTest {
 
     protected abstract MapperProvider createMapperProvider();
 
-    @Rule
-    public ExpectedException expected = ExpectedException.none();
-
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         this.mapperProvider = createMapperProvider();
         Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.MOVE));
         this.messageMapper = mapperProvider.createMessageMapper();
@@ -80,7 +77,7 @@ public abstract class MessageMoveTest {
     }
 
     @Test
-    public void movingAMessageShouldWork() throws Exception {
+    void movingAMessageShouldWork() throws Exception {
         messageMapper.add(benwaInboxMailbox, message1);
         message1.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
 
@@ -90,7 +87,7 @@ public abstract class MessageMoveTest {
     }
 
     @Test
-    public void movingAMessageShouldReturnCorrectMetadata() throws Exception {
+    void movingAMessageShouldReturnCorrectMetadata() throws Exception {
         messageMapper.add(benwaInboxMailbox, message1);
         message1.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
 
@@ -104,7 +101,7 @@ public abstract class MessageMoveTest {
     }
 
     @Test
-    public void movingAMessageShouldNotViolateMessageCount() throws Exception {
+    void movingAMessageShouldNotViolateMessageCount() throws Exception {
         messageMapper.add(benwaInboxMailbox, message1);
         message1.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
 
@@ -115,7 +112,7 @@ public abstract class MessageMoveTest {
     }
 
     @Test
-    public void movingAMessageShouldNotViolateUnseenMessageCount() throws Exception {
+    void movingAMessageShouldNotViolateUnseenMessageCount() throws Exception {
         messageMapper.add(benwaInboxMailbox, message1);
         message1.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
 
@@ -126,7 +123,7 @@ public abstract class MessageMoveTest {
     }
 
     @Test
-    public void movingASeenMessageShouldNotIncrementUnseenMessageCount() throws Exception {
+    void movingASeenMessageShouldNotIncrementUnseenMessageCount() throws Exception {
         message1.setFlags(new Flags(Flags.Flag.SEEN));
         messageMapper.add(benwaInboxMailbox, message1);
         message1.setModSeq(messageMapper.getHighestModSeq(benwaInboxMailbox));
@@ -150,7 +147,7 @@ public abstract class MessageMoveTest {
         return messageMapper.findInMailbox(mailbox, MessageRange.one(message.getUid()), FetchType.Metadata, LIMIT).next();
     }
     
-    private MailboxMessage createMessage(Mailbox mailbox, MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) throws MailboxException {
+    private MailboxMessage createMessage(Mailbox mailbox, MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) {
         return new SimpleMailboxMessage(messageId, new Date(), content.length(), bodyStart, new SharedByteArrayInputStream(content.getBytes()), new Flags(), propertyBuilder, mailbox.getMailboxId());
     }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
index 7ab9137..a270819 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MessageWithAttachmentMapperTest.java
@@ -45,10 +45,9 @@ import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
-import org.junit.Assume;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.Assumptions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 
@@ -56,7 +55,7 @@ public abstract class MessageWithAttachmentMapperTest {
 
     private static final int LIMIT = 10;
     private static final int BODY_START = 16;
-    public static final int UID_VALIDITY = 42;
+    private static final int UID_VALIDITY = 42;
 
     private MapperProvider mapperProvider;
     private MessageMapper messageMapper;
@@ -68,16 +67,14 @@ public abstract class MessageWithAttachmentMapperTest {
     private SimpleMailboxMessage messageWith1Attachment;
     private SimpleMailboxMessage messageWith2Attachments;
 
-    @Rule
-    public ExpectedException expected = ExpectedException.none();
-
     protected abstract MapperProvider createMapperProvider();
 
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         this.mapperProvider = createMapperProvider();
 
-        Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.MESSAGE));
-        Assume.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.ATTACHMENT));
+        Assumptions.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.MESSAGE));
+        Assumptions.assumeTrue(mapperProvider.getSupportedCapabilities().contains(MapperProvider.Capabilities.ATTACHMENT));
 
         this.messageMapper = mapperProvider.createMessageMapper();
         this.attachmentMapper = mapperProvider.createAttachmentMapper();
@@ -120,7 +117,7 @@ public abstract class MessageWithAttachmentMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsLoadedWhenOneAttachment() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsLoadedWhenOneAttachment() throws MailboxException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
@@ -128,7 +125,7 @@ public abstract class MessageWithAttachmentMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsLoadedWhenTwoAttachments() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsLoadedWhenTwoAttachments() throws MailboxException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith2Attachments.getUid()), fetchType, LIMIT);
@@ -136,7 +133,7 @@ public abstract class MessageWithAttachmentMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeBodyShouldHaveAttachmentsLoadedWhenOneAttachment() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeBodyShouldHaveAttachmentsLoadedWhenOneAttachment() throws MailboxException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Body;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
@@ -144,8 +141,8 @@ public abstract class MessageWithAttachmentMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeHeadersShouldHaveAttachmentsEmptyWhenOneAttachment() throws MailboxException, IOException {
-        Assume.assumeTrue(mapperProvider.supportPartialAttachmentFetch());
+    void messagesRetrievedUsingFetchTypeHeadersShouldHaveAttachmentsEmptyWhenOneAttachment() throws MailboxException {
+        Assumptions.assumeTrue(mapperProvider.supportPartialAttachmentFetch());
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Headers;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
@@ -153,8 +150,8 @@ public abstract class MessageWithAttachmentMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeMetadataShouldHaveAttachmentsEmptyWhenOneAttachment() throws MailboxException, IOException {
-        Assume.assumeTrue(mapperProvider.supportPartialAttachmentFetch());
+    void messagesRetrievedUsingFetchTypeMetadataShouldHaveAttachmentsEmptyWhenOneAttachment() throws MailboxException {
+        Assumptions.assumeTrue(mapperProvider.supportPartialAttachmentFetch());
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Metadata;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
@@ -162,7 +159,7 @@ public abstract class MessageWithAttachmentMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsEmptyWhenNoAttachment() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeFullShouldHaveAttachmentsEmptyWhenNoAttachment() throws MailboxException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWithoutAttachment.getUid()), fetchType, LIMIT);
@@ -170,7 +167,7 @@ public abstract class MessageWithAttachmentMapperTest {
     }
     
     @Test
-    public void messagesCanBeRetrievedInMailboxWithRangeTypeOne() throws MailboxException, IOException {
+    void messagesCanBeRetrievedInMailboxWithRangeTypeOne() throws MailboxException, IOException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Full;
         assertThat(messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT).next())
@@ -178,7 +175,7 @@ public abstract class MessageWithAttachmentMapperTest {
     }
 
     @Test
-    public void messagesRetrievedUsingFetchTypeBodyShouldHaveBodyDataLoaded() throws MailboxException, IOException {
+    void messagesRetrievedUsingFetchTypeBodyShouldHaveBodyDataLoaded() throws MailboxException, IOException {
         saveMessages();
         MessageMapper.FetchType fetchType = MessageMapper.FetchType.Body;
         Iterator<MailboxMessage> retrievedMessageIterator = messageMapper.findInMailbox(attachmentsMailbox, MessageRange.one(messageWith1Attachment.getUid()), fetchType, LIMIT);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
index 9513974..40a8adf 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
@@ -29,111 +29,111 @@ import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 public abstract class GenericMaxQuotaManagerTest {
 
-    public static final Domain DOMAIN = Domain.of("domain");
-    public static final Domain DOMAIN_CASE_VARIATION = Domain.of("doMain");
-    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa@domain", Optional.of(DOMAIN));
+    private static final Domain DOMAIN = Domain.of("domain");
+    private static final Domain DOMAIN_CASE_VARIATION = Domain.of("doMain");
+    private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa@domain", Optional.of(DOMAIN));
     private MaxQuotaManager maxQuotaManager;
 
     protected abstract MaxQuotaManager provideMaxQuotaManager();
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         maxQuotaManager = provideMaxQuotaManager();
     }
 
     @Test
-    public void getMaxMessageShouldReturnEmptyWhenNoGlobalValue() throws Exception {
+    void getMaxMessageShouldReturnEmptyWhenNoGlobalValue() throws Exception {
         assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).isEmpty();
     }
 
     @Test
-    public void getMaxStorageShouldReturnEmptyWhenNoGlobalValue() throws Exception {
+    void getMaxStorageShouldReturnEmptyWhenNoGlobalValue() throws Exception {
         assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).isEmpty();
     }
 
     @Test
-    public void getMaxMessageShouldReturnDomainWhenNoValue() throws Exception {
+    void getMaxMessageShouldReturnDomainWhenNoValue() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(36));
         maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(23));
         assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCount.count(23));
     }
 
     @Test
-    public void getMaxMessageShouldReturnGlobalWhenNoValue() throws Exception {
+    void getMaxMessageShouldReturnGlobalWhenNoValue() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(36));
         assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCount.count(36));
     }
 
     @Test
-    public void getMaxStorageShouldReturnGlobalWhenNoValue() throws Exception {
+    void getMaxStorageShouldReturnGlobalWhenNoValue() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(36));
         assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSize.size(36));
     }
 
     @Test
-    public void getMaxStorageShouldReturnDomainWhenNoValue() throws Exception {
+    void getMaxStorageShouldReturnDomainWhenNoValue() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(234));
         maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(111));
         assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSize.size(111));
     }
 
     @Test
-    public void getMaxMessageShouldReturnProvidedValue() throws Exception {
+    void getMaxMessageShouldReturnProvidedValue() throws Exception {
         maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(36));
         assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCount.count(36));
     }
 
     @Test
-    public void getMaxStorageShouldReturnProvidedValue() throws Exception {
+    void getMaxStorageShouldReturnProvidedValue() throws Exception {
         maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(36));
         assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSize.size(36));
     }
 
     @Test
-    public void deleteMaxStorageShouldRemoveCurrentValue() throws Exception {
+    void deleteMaxStorageShouldRemoveCurrentValue() throws Exception {
         maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(36));
         maxQuotaManager.removeMaxStorage(QUOTA_ROOT);
         assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).isEmpty();
     }
 
     @Test
-    public void deleteMaxMessageShouldRemoveCurrentValue() throws Exception {
+    void deleteMaxMessageShouldRemoveCurrentValue() throws Exception {
         maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(36));
         maxQuotaManager.removeMaxMessage(QUOTA_ROOT);
         assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).isEmpty();
     }
 
     @Test
-    public void deleteGlobalMaxStorageShouldRemoveCurrentValue() throws Exception {
+    void deleteGlobalMaxStorageShouldRemoveCurrentValue() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(36));
         maxQuotaManager.removeGlobalMaxStorage();
         assertThat(maxQuotaManager.getGlobalMaxStorage()).isEmpty();
     }
 
     @Test
-    public void deleteGlobalMaxMessageShouldRemoveCurrentValue() throws Exception {
+    void deleteGlobalMaxMessageShouldRemoveCurrentValue() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(36));
         maxQuotaManager.removeGlobalMaxMessage();
         assertThat(maxQuotaManager.getGlobalMaxMessage()).isEmpty();
     }
 
     @Test
-    public void listMaxMessagesDetailsShouldReturnEmptyWhenNoQuotaDefined() {
+    void listMaxMessagesDetailsShouldReturnEmptyWhenNoQuotaDefined() {
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT)).isEmpty();
     }
 
     @Test
-    public void listMaxStorageDetailsShouldReturnEmptyWhenNoQuotaDefined() {
+    void listMaxStorageDetailsShouldReturnEmptyWhenNoQuotaDefined() {
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT)).isEmpty();
     }
 
     @Test
-    public void listMaxMessagesDetailsShouldReturnGlobalValueWhenDefined() throws Exception {
+    void listMaxMessagesDetailsShouldReturnGlobalValueWhenDefined() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
             .hasSize(1)
@@ -141,7 +141,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxMessagesDetailsShouldReturnDomainValueWhenDefined() throws Exception {
+    void listMaxMessagesDetailsShouldReturnDomainValueWhenDefined() throws Exception {
         maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
             .hasSize(1)
@@ -149,7 +149,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxMessagesDetailsShouldReturnUserValueWhenDefined() throws Exception {
+    void listMaxMessagesDetailsShouldReturnUserValueWhenDefined() throws Exception {
         maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
             .hasSize(1)
@@ -157,7 +157,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxMessagesDetailsShouldReturnBothValuesWhenGlobalAndUserDefined() throws Exception {
+    void listMaxMessagesDetailsShouldReturnBothValuesWhenGlobalAndUserDefined() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(1234));
         maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
@@ -167,7 +167,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxMessagesDetailsShouldReturnAllValuesWhenDefined() throws Exception {
+    void listMaxMessagesDetailsShouldReturnAllValuesWhenDefined() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(1234));
         maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(333));
         maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(123));
@@ -179,7 +179,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxStorageDetailsShouldReturnGlobalValueWhenDefined() throws Exception {
+    void listMaxStorageDetailsShouldReturnGlobalValueWhenDefined() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(1111));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
             .hasSize(1)
@@ -187,7 +187,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxStorageDetailsShouldReturnDomainValueWhenDefined() throws Exception {
+    void listMaxStorageDetailsShouldReturnDomainValueWhenDefined() throws Exception {
         maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(1111));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
             .hasSize(1)
@@ -195,7 +195,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxStorageDetailsShouldReturnUserValueWhenDefined() throws Exception {
+    void listMaxStorageDetailsShouldReturnUserValueWhenDefined() throws Exception {
         maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(2222));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
             .hasSize(1)
@@ -203,7 +203,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxStorageDetailsShouldReturnBothValuesWhenDefined() throws Exception {
+    void listMaxStorageDetailsShouldReturnBothValuesWhenDefined() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(3333));
         maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(4444));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
@@ -213,7 +213,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void listMaxStorageDetailsShouldReturnAllValuesWhenDefined() throws Exception {
+    void listMaxStorageDetailsShouldReturnAllValuesWhenDefined() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(3333));
         maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(2222));
         maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(4444));
@@ -225,43 +225,43 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void getDomainMaxMessageShouldReturnEmptyWhenNoGlobalValue() {
+    void getDomainMaxMessageShouldReturnEmptyWhenNoGlobalValue() {
         assertThat(maxQuotaManager.getDomainMaxMessage(DOMAIN)).isEmpty();
     }
 
     @Test
-    public void getDomainMaxStorageShouldReturnEmptyWhenNoGlobalValue() {
+    void getDomainMaxStorageShouldReturnEmptyWhenNoGlobalValue() {
         assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN)).isEmpty();
     }
 
     @Test
-    public void getDomainMaxMessageShouldReturnProvidedValue() throws Exception {
+    void getDomainMaxMessageShouldReturnProvidedValue() throws Exception {
         maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(36));
         assertThat(maxQuotaManager.getDomainMaxMessage(DOMAIN)).contains(QuotaCount.count(36));
     }
 
     @Test
-    public void getDomainMaxStorageShouldReturnProvidedValue() throws Exception {
+    void getDomainMaxStorageShouldReturnProvidedValue() throws Exception {
         maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(36));
         assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN)).contains(QuotaSize.size(36));
     }
 
     @Test
-    public void deleteDomainMaxStorageShouldRemoveCurrentValue() throws Exception {
+    void deleteDomainMaxStorageShouldRemoveCurrentValue() throws Exception {
         maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(36));
         maxQuotaManager.removeDomainMaxStorage(DOMAIN);
         assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN)).isEmpty();
     }
 
     @Test
-    public void deleteDomainMaxMessageShouldRemoveCurrentValue() throws Exception {
+    void deleteDomainMaxMessageShouldRemoveCurrentValue() throws Exception {
         maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(36));
         maxQuotaManager.removeDomainMaxMessage(DOMAIN);
         assertThat(maxQuotaManager.getDomainMaxMessage(DOMAIN)).isEmpty();
     }
 
     @Test
-    public void deleteDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
+    void deleteDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
         maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(36));
 
         maxQuotaManager.removeDomainMaxMessage(DOMAIN_CASE_VARIATION);
@@ -270,7 +270,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void deleteDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
+    void deleteDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
         maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(36));
 
         maxQuotaManager.removeDomainMaxStorage(DOMAIN_CASE_VARIATION);
@@ -279,7 +279,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void setDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
+    void setDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
         maxQuotaManager.setDomainMaxMessage(DOMAIN_CASE_VARIATION, QuotaCount.count(36));
 
 
@@ -288,7 +288,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void setDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
+    void setDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
         maxQuotaManager.setDomainMaxStorage(DOMAIN_CASE_VARIATION, QuotaSize.size(36));
 
         assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN))
@@ -296,7 +296,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void getDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
+    void getDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
         maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(36));
 
 
@@ -305,7 +305,7 @@ public abstract class GenericMaxQuotaManagerTest {
     }
 
     @Test
-    public void getDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
+    void getDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
         maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(36));
 
         assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN_CASE_VARIATION))
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
index e83aee6..b80322f 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
@@ -20,14 +20,15 @@
 package org.apache.james.mailbox.store.quota;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
 
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.model.QuotaRoot;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 public abstract class StoreCurrentQuotaManagerTest {
     public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
@@ -36,18 +37,18 @@ public abstract class StoreCurrentQuotaManagerTest {
     
     private StoreCurrentQuotaManager testee;
 
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() {
         testee = provideTestee();
     }
 
     @Test
-    public void getCurrentStorageShouldReturnZeroByDefault() throws Exception {
+    void getCurrentStorageShouldReturnZeroByDefault() throws Exception {
         assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSize.size(0));
     }
 
     @Test
-    public void increaseShouldWork() throws Exception {
+    void increaseShouldWork() throws Exception {
         testee.increase(QUOTA_ROOT, 10, 100);
 
         assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCount.count(10));
@@ -55,7 +56,7 @@ public abstract class StoreCurrentQuotaManagerTest {
     }
 
     @Test
-    public void decreaseShouldWork() throws Exception {
+    void decreaseShouldWork() throws Exception {
         testee.increase(QUOTA_ROOT, 20, 200);
 
         testee.decrease(QUOTA_ROOT, 10, 100);
@@ -65,50 +66,58 @@ public abstract class StoreCurrentQuotaManagerTest {
     }
 
     @Test
-    public void decreaseShouldNotFailWhenItLeadsToNegativeValues() throws Exception {
+    void decreaseShouldNotFailWhenItLeadsToNegativeValues() throws Exception {
         testee.decrease(QUOTA_ROOT, 10, 100);
 
         assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCount.count(-10));
         assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSize.size(-100));
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void increaseShouldThrowOnZeroCount() throws Exception {
-        testee.increase(QUOTA_ROOT, 0, 5);
+    @Test
+    void increaseShouldThrowOnZeroCount() {
+        assertThatThrownBy(() -> testee.increase(QUOTA_ROOT, 0, 5))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void increaseShouldThrowOnNegativeCount() throws Exception {
-        testee.increase(QUOTA_ROOT, -1, 5);
+    @Test
+    void increaseShouldThrowOnNegativeCount() {
+        assertThatThrownBy(() -> testee.increase(QUOTA_ROOT, -1, 5))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void increaseShouldThrowOnZeroSize() throws Exception {
-        testee.increase(QUOTA_ROOT, 5, 0);
+    @Test
+    void increaseShouldThrowOnZeroSize() {
+        assertThatThrownBy(() -> testee.increase(QUOTA_ROOT, 5, 0))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void increaseShouldThrowOnNegativeSize() throws Exception {
-        testee.increase(QUOTA_ROOT, 5, -1);
+    @Test
+    void increaseShouldThrowOnNegativeSize() {
+        assertThatThrownBy(() -> testee.increase(QUOTA_ROOT, 5, -1))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void decreaseShouldThrowOnZeroCount() throws Exception {
-        testee.decrease(QUOTA_ROOT, 0, 5);
+    @Test
+    void decreaseShouldThrowOnZeroCount() {
+        assertThatThrownBy(() -> testee.decrease(QUOTA_ROOT, 0, 5))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void decreaseShouldThrowOnNegativeCount() throws Exception {
-        testee.decrease(QUOTA_ROOT, -1, 5);
+    @Test
+    void decreaseShouldThrowOnNegativeCount() {
+        assertThatThrownBy(() -> testee.decrease(QUOTA_ROOT, -1, 5))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void decreaseShouldThrowOnZeroSize() throws Exception {
-        testee.decrease(QUOTA_ROOT, 5, 0);
+    @Test
+    void decreaseShouldThrowOnZeroSize() {
+        assertThatThrownBy(() -> testee.decrease(QUOTA_ROOT, 5, 0))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void decreaseShouldThrowOnNegativeSize() throws Exception {
-        testee.decrease(QUOTA_ROOT, 5, -1);
+    @Test
+    void decreaseShouldThrowOnNegativeSize() {
+        assertThatThrownBy(() -> testee.decrease(QUOTA_ROOT, 5, -1))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 }


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


[james-project] 18/43: [Refactoring] Refactor some mailbox tests and implementations more efficiently

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

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

commit 716c3cfcb5f88a24bd0164b8cbd915db05c65868
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 15 15:03:23 2019 +0700

    [Refactoring] Refactor some mailbox tests and implementations more efficiently
---
 .../james/mailbox/AbstractSubscriptionManagerTest.java      | 10 +++++++---
 .../org/apache/james/mailbox/MailboxManagerStressTest.java  |  6 ++++--
 .../cassandra/CassandraMailboxManagerStressTest.java        |  6 ------
 .../mailbox/cassandra/CassandraSubscriptionManagerTest.java | 13 -------------
 .../james/mailbox/jpa/JPASubscriptionManagerTest.java       |  6 ------
 .../james/mailbox/jpa/JpaMailboxManagerStressTest.java      |  6 ------
 .../maildir/DomainUserMaildirMailboxManagerStressTest.java  |  6 ------
 .../maildir/FullUserMaildirMailboxManagerStressTest.java    |  6 ------
 .../mailbox/maildir/MaildirSubscriptionManagerTest.java     |  6 ------
 .../maildir/UserMaildirMailboxManagerStressTest.java        |  6 ------
 .../mailbox/inmemory/MemoryMailboxManagerStressTest.java    |  6 ------
 11 files changed, 11 insertions(+), 66 deletions(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
index f997204..2a0b5a3 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/AbstractSubscriptionManagerTest.java
@@ -22,6 +22,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -39,13 +41,15 @@ public abstract class AbstractSubscriptionManagerTest {
 
     protected abstract SubscriptionManager createSubscriptionManager();
 
-    protected void setup() {
+    @BeforeEach
+    void setup() {
         manager = createSubscriptionManager();
         session = MailboxSessionUtil.create(USER1);
         manager.startProcessingRequest(session);
     }
-    
-    protected void teardown() throws SubscriptionException {
+
+    @AfterEach
+    void teardown() throws SubscriptionException {
         manager.unsubscribe(session, MAILBOX1);
         manager.unsubscribe(session, MAILBOX2);
         manager.endProcessingRequest(session);
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
index da25c06..09e4dc8 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerStressTest.java
@@ -41,6 +41,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.util.concurrent.NamedThreadFactory;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableSet;
@@ -54,8 +55,9 @@ public abstract class MailboxManagerStressTest<T extends MailboxManager> {
     protected abstract T provideManager() throws MailboxException;
 
     protected abstract EventBus retrieveEventBus(T mailboxManager);
-    
-    protected void setUp() throws Exception {
+
+    @BeforeEach
+    void setUp() throws Exception {
         this.mailboxManager = provideManager();
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
index 677c0b5..e53dc07 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
@@ -25,7 +25,6 @@ import org.apache.james.mailbox.MailboxManagerStressTest;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.store.PreDeletionHooks;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -35,11 +34,6 @@ class CassandraMailboxManagerStressTest extends MailboxManagerStressTest<Cassand
     @RegisterExtension
     static CassandraClusterExtension cassandra = new CassandraClusterExtension(MailboxAggregateModule.MODULE_WITH_QUOTA);
     
-    @BeforeEach
-    void setup() throws Exception {
-        super.setUp();
-    }
-    
     @Override
     protected CassandraMailboxManager provideManager() {
         return CassandraMailboxManagerProvider.provideMailboxManager(cassandra.getCassandraCluster().getConf(),
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
index e1120db..80a0ac6 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
@@ -46,9 +46,6 @@ import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
 import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
 import org.apache.james.mailbox.cassandra.mail.CassandraUserMailboxRightsDAO;
 import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
-import org.apache.james.mailbox.exception.SubscriptionException;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -61,16 +58,6 @@ class CassandraSubscriptionManagerTest extends AbstractSubscriptionManagerTest {
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraSubscriptionModule.MODULE);
 
-    @BeforeEach
-    void init() {
-        super.setup();
-    }
-
-    @AfterEach
-    void close() throws SubscriptionException {
-        super.teardown();
-    }
-
     @Override
     protected SubscriptionManager createSubscriptionManager() {
         CassandraMessageIdToImapUidDAO imapUidDAO = null;
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
index f19d237..3e2cca1 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPASubscriptionManagerTest.java
@@ -27,17 +27,11 @@ import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
 import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 
 class JPASubscriptionManagerTest extends AbstractSubscriptionManagerTest {
 
     private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
     
-    @BeforeEach
-    void init() {
-        super.setup();
-    }
-    
     @Override
     protected SubscriptionManager createSubscriptionManager() {
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
index 3316f03..a55b0b4 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerStressTest.java
@@ -26,17 +26,11 @@ import org.apache.james.mailbox.MailboxManagerStressTest;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
 import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
 
 class JpaMailboxManagerStressTest extends MailboxManagerStressTest<OpenJPAMailboxManager> {
 
     private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES);
     private Optional<OpenJPAMailboxManager> openJPAMailboxManager = Optional.empty();
-
-    @BeforeEach
-    void setup() throws Exception {
-        super.setUp();
-    }
     
     @Override
     protected OpenJPAMailboxManager provideManager() {
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
index c1eb8b3..c9090b1 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/DomainUserMaildirMailboxManagerStressTest.java
@@ -24,17 +24,11 @@ import java.io.File;
 import org.apache.james.mailbox.MailboxManagerStressTest;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.store.StoreMailboxManager;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 
 class DomainUserMaildirMailboxManagerStressTest extends MailboxManagerStressTest<StoreMailboxManager> {
     @TempDir
     File tmpFolder;
-
-    @BeforeEach
-    void setup() throws Exception {
-        super.setUp();
-    }
     
     @Override
     protected StoreMailboxManager provideManager() {
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerStressTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerStressTest.java
index 07664d7..fd9f284 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerStressTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/FullUserMaildirMailboxManagerStressTest.java
@@ -24,17 +24,11 @@ import java.io.File;
 import org.apache.james.mailbox.MailboxManagerStressTest;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.store.StoreMailboxManager;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 
 class FullUserMaildirMailboxManagerStressTest extends MailboxManagerStressTest<StoreMailboxManager> {
     @TempDir
     File tmpFolder;
-
-    @BeforeEach
-    void setup() throws Exception {
-        super.setUp();
-    }
     
     @Override
     protected StoreMailboxManager provideManager() {
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirSubscriptionManagerTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirSubscriptionManagerTest.java
index b458a9a..48e4664 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirSubscriptionManagerTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirSubscriptionManagerTest.java
@@ -24,7 +24,6 @@ import org.apache.james.mailbox.AbstractSubscriptionManagerTest;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 
 class MaildirSubscriptionManagerTest extends AbstractSubscriptionManagerTest {
@@ -32,11 +31,6 @@ class MaildirSubscriptionManagerTest extends AbstractSubscriptionManagerTest {
     @TempDir
     File tmpFolder;
     
-    @BeforeEach
-    void setUp() {
-        super.setup();
-    }
-    
     @Override
     protected SubscriptionManager createSubscriptionManager() {
         MaildirStore store = new MaildirStore(tmpFolder + "/Maildir/%domain/%user", new JVMMailboxPathLocker());
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/UserMaildirMailboxManagerStressTest.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/UserMaildirMailboxManagerStressTest.java
index f64648c..d1f518e 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/UserMaildirMailboxManagerStressTest.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/UserMaildirMailboxManagerStressTest.java
@@ -24,17 +24,11 @@ import java.io.File;
 import org.apache.james.mailbox.MailboxManagerStressTest;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.store.StoreMailboxManager;
-import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.io.TempDir;
 
 class UserMaildirMailboxManagerStressTest extends MailboxManagerStressTest<StoreMailboxManager> {
     @TempDir
     File tmpFolder;
-
-    @BeforeEach
-    void setup() throws Exception {
-        super.setUp();
-    }
     
     @Override
     protected StoreMailboxManager provideManager() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
index 1f8db72..5416c41 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MemoryMailboxManagerStressTest.java
@@ -22,14 +22,8 @@ package org.apache.james.mailbox.inmemory;
 import org.apache.james.mailbox.MailboxManagerStressTest;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.extension.PreDeletionHook;
-import org.junit.jupiter.api.BeforeEach;
 
 class MemoryMailboxManagerStressTest extends MailboxManagerStressTest<InMemoryMailboxManager> {
-
-    @BeforeEach
-    void setup() throws Exception {
-        super.setUp();
-    }
     
     @Override
     protected InMemoryMailboxManager provideManager() {


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


[james-project] 26/43: [Refactoring] IdRange::includes is never used

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

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

commit 26d1b335e6f61ab8752c26977139d5599fee86a0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 14:09:12 2019 +0700

    [Refactoring] IdRange::includes is never used
---
 .../src/main/java/org/apache/james/imap/api/message/IdRange.java  | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
index bae41e8..4dee168 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
@@ -78,14 +78,6 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
         this.highVal = highVal;
     }
 
-    /**
-     * Return true if the {@link IdRange} includes the given value
-     *
-     */
-    public boolean includes(long value) {
-        return lowVal <= value && value <= highVal;
-    }
-
     @Override
     public int hashCode() {
         final int PRIME = 31;


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


[james-project] 09/43: [Refactoring] CRLFOutputStream::checkCRLFTerminator in never called

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

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

commit 00916db45fd56a4b48b96b6a9202c84f12a4fa06
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 17 11:54:56 2019 +0700

    [Refactoring] CRLFOutputStream::checkCRLFTerminator in never called
---
 .../org/apache/james/jdkim/mailets/CRLFOutputStream.java   | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/CRLFOutputStream.java b/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/CRLFOutputStream.java
index 91f8579..5610cf0 100644
--- a/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/CRLFOutputStream.java
+++ b/server/mailet/dkim/src/main/java/org/apache/james/jdkim/mailets/CRLFOutputStream.java
@@ -142,18 +142,4 @@ public class CRLFOutputStream extends FilterOutputStream {
             startOfLine = false;
         }
     }
-
-    /**
-     * Ensure that the stream is CRLF terminated.
-     *
-     * @throws IOException
-     *             if an error occurs writing the byte
-     */
-    public void checkCRLFTerminator() throws IOException {
-        if (statusLast == LAST_WAS_OTHER) {
-            out.write('\r');
-            out.write('\n');
-            statusLast = LAST_WAS_CR;
-        }
-    }
 }


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


[james-project] 05/43: [Refactoring] mailet-base StringUtils: remove unused methods

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

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

commit 82659ad0aa3232a3c6fdb01305aafd75363c56bb
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 17 11:32:14 2019 +0700

    [Refactoring] mailet-base StringUtils: remove unused methods
---
 .../java/org/apache/mailet/base/StringUtils.java   | 56 ----------------------
 1 file changed, 56 deletions(-)

diff --git a/mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java b/mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java
index 5337448..0ba3c5a 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java
@@ -19,8 +19,6 @@
 
 package org.apache.mailet.base;
 
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -67,60 +65,6 @@ public final class StringUtils {
         }
         return list.toArray(new String[list.size()]);
     }
-
-    /**
-     * Creates an MD5 digest from the message.
-     * Note that this implementation is unsalted.
-     * @param message not null
-     * @return MD5 digest, not null
-     */
-    public static String md5(java.lang.String message) {
-        try {
-            MessageDigest md = MessageDigest.getInstance("MD5");
-            StringBuilder sb = new StringBuilder();
-            byte[] buf = message.getBytes();
-            byte[] md5 = md.digest(buf);
-
-            for (byte aMd5 : md5) {
-                String tmpStr = "0" + Integer.toHexString((0xff & aMd5));
-                sb.append(tmpStr.substring(tmpStr.length() - 2));
-            }
-            return sb.toString();
-            
-        } catch (NoSuchAlgorithmException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Capitalizes each word in the given text by converting the
-     * first letter to upper case.
-     * @param data text to be capitalize, possibly null
-     * @return text with each work capitalized, 
-     * or null when the text is null
-     */
-    public static String capitalizeWords(String data) {
-        if (data == null) {
-            return null;
-        }
-        StringBuilder res = new StringBuilder();
-        char ch;
-        char prevCh = '.';
-        for (int i = 0;  i < data.length();  i++) {
-            ch = data.charAt(i);
-            if (Character.isLetter(ch)) {
-                if (!Character.isLetter(prevCh)) {
-                    res.append(Character.toUpperCase(ch));
-                } else {
-                    res.append(Character.toLowerCase(ch));
-                }
-            } else {
-                res.append(ch);
-            }
-            prevCh = ch;
-        }
-        return res.toString();
-    }
     
     /**
      * Utility method for obtaining a string representation of an array of Objects.


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


[james-project] 27/43: [Refactoring] IdRange: reorder methods

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

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

commit 76906992314ad743c8afe1a24f5f97904da5295b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 14:13:05 2019 +0700

    [Refactoring] IdRange: reorder methods
---
 .../org/apache/james/imap/api/message/IdRange.java | 207 ++++++++++-----------
 1 file changed, 102 insertions(+), 105 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
index 4dee168..b2b4c08 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
@@ -34,6 +34,78 @@ import com.google.common.collect.ImmutableList;
  * Represents a range of UID or MSN values.
  */
 public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
+    /**
+     * {@link Iterator} of a range of msn/uid
+     */
+    private final class RangeIterator implements Iterator<Long> {
+
+        private final long to;
+        private long current;
+
+        public RangeIterator(long from, long to) {
+            this.to = to;
+            this.current = from;
+        }
+
+        @Override
+        public boolean hasNext() {
+            return current <= to;
+        }
+
+        @Override
+        public Long next() {
+            if (hasNext()) {
+                return current++;
+            } else {
+                throw new NoSuchElementException("Highest id of " + to + " was reached before");
+            }
+        }
+
+        @Override
+        public void remove() {
+            throw new UnsupportedOperationException("Read-Only");
+        }
+
+    }
+
+    /**
+     * Utility method which will copy the given {@link List} and try to merge
+     * the {@link IdRange} in the copy before return it.
+     *
+     * @return mergedRanges
+     */
+    public static List<IdRange> mergeRanges(List<IdRange> ranges) {
+        List<IdRange> copy = new ArrayList<>(ranges);
+        Collections.sort(copy);
+
+        boolean lastUid = false;
+
+        for (int i = 0; i < copy.size() - 1; i++) {
+            IdRange current = copy.get(i);
+            IdRange next = copy.get(i + 1);
+            if (next.getLowVal() == Long.MAX_VALUE && next.getHighVal() == Long.MAX_VALUE) {
+                if (lastUid) {
+                    copy.remove(next);
+                    i--;
+                } else {
+                    lastUid = true;
+                }
+            } else {
+                // Make sure we handle the "*" and "*:*" correctly and don't
+                // remove ranges by error. See IMAP-289
+                if ((current.getLowVal() != Long.MAX_VALUE && current.getHighVal() != Long.MAX_VALUE) && (current.getHighVal() >= next.getLowVal() - 1)) {
+                    if (next.getHighVal() > current.getHighVal()) {
+                        current.setHighVal(next.getHighVal());
+                    }
+                    // remove the merged id range and decrease the count
+                    copy.remove(next);
+                    i--;
+                }
+            }
+
+        }
+        return copy;
+    }
 
     public static String toString(IdRange[] ranges) {
         return Optional.ofNullable(ranges)
@@ -78,36 +150,6 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
         this.highVal = highVal;
     }
 
-    @Override
-    public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + (int) (highVal ^ (highVal >>> 32));
-        result = PRIME * result + (int) (lowVal ^ (lowVal >>> 32));
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final IdRange other = (IdRange) obj;
-        if (highVal != other.highVal) {
-            return false;
-        }
-        if (lowVal != other.lowVal) {
-            return false;
-        }
-        return true;
-    }
-
     /**
      * Renders text suitable for logging.
      * 
@@ -126,47 +168,6 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
     }
 
     /**
-     * Utility method which will copy the given {@link List} and try to merge
-     * the {@link IdRange} in the copy before return it.
-     *
-     * @return mergedRanges
-     */
-    public static List<IdRange> mergeRanges(List<IdRange> ranges) {
-        List<IdRange> copy = new ArrayList<>(ranges);
-        Collections.sort(copy);
-
-        boolean lastUid = false;
-
-        for (int i = 0; i < copy.size() - 1; i++) {
-            IdRange current = copy.get(i);
-            IdRange next = copy.get(i + 1);
-            if (next.getLowVal() == Long.MAX_VALUE && next.getHighVal() == Long.MAX_VALUE) {
-                if (lastUid) {
-                    copy.remove(next);
-                    i--;
-                } else {
-                    lastUid = true;
-                }
-            } else {
-                // Make sure we handle the "*" and "*:*" correctly and don't
-                // remove ranges by error. See IMAP-289
-                if ((current.getLowVal() != Long.MAX_VALUE && current.getHighVal() != Long.MAX_VALUE) && (current.getHighVal() >= next.getLowVal() - 1)) {
-                    if (next.getHighVal() > current.getHighVal()) {
-                        current.setHighVal(next.getHighVal());
-                    }
-                    // remove the merged id range and decrease the count
-                    copy.remove(next);
-                    i--;
-                }
-            }
-
-        }
-        return copy;
-
-    }
-
-
-    /**
      * Return a read-only {@link Iterator} which contains all msn/uid which fail in the specified range.
      */
     @Override
@@ -178,40 +179,6 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
         long to = getHighVal();
         return new RangeIterator(from, to);
     }
-    
-    /**
-     * {@link Iterator} of a range of msn/uid
-     */
-    private final class RangeIterator implements Iterator<Long> {
-
-        private final long to;
-        private long current;
-        
-        public RangeIterator(long from, long to) {
-            this.to = to;
-            this.current = from;
-        }
-        
-        @Override
-        public boolean hasNext() {
-            return current <= to;
-        }
-
-        @Override
-        public Long next() {
-            if (hasNext()) {
-                return current++;
-            } else {
-                throw new NoSuchElementException("Highest id of " + to + " was reached before");
-            }
-        }
-
-        @Override
-        public void remove() {
-            throw new UnsupportedOperationException("Read-Only");
-        }
-        
-    }
 
     @Override
     public int compareTo(IdRange range2) {
@@ -228,4 +195,34 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
         }
     }
 
+    @Override
+    public int hashCode() {
+        final int PRIME = 31;
+        int result = 1;
+        result = PRIME * result + (int) (highVal ^ (highVal >>> 32));
+        result = PRIME * result + (int) (lowVal ^ (lowVal >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final IdRange other = (IdRange) obj;
+        if (highVal != other.highVal) {
+            return false;
+        }
+        if (lowVal != other.lowVal) {
+            return false;
+        }
+        return true;
+    }
+
 }


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


[james-project] 22/43: [Refactoring] MessageRangeProcessor: avoid final variables

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

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

commit 1ff0539d8354ecb5f5931f1265887e3c3d57910a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 11:05:27 2019 +0700

    [Refactoring] MessageRangeProcessor: avoid final variables
---
 .../james/imap/processor/AbstractMessageRangeProcessor.java  | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index d26eca9..22fe645 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -51,19 +51,19 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
         super(acceptableClass, next, mailboxManager, factory, metricFactory);
     }
 
-    protected abstract List<MessageRange> process(final MailboxPath targetMailbox,
-                                                  final SelectedMailbox currentMailbox,
-                                                  final MailboxSession mailboxSession,
+    protected abstract List<MessageRange> process(MailboxPath targetMailbox,
+                                                  SelectedMailbox currentMailbox,
+                                                  MailboxSession mailboxSession,
                                                   MessageRange messageSet) throws MailboxException;
 
     protected abstract String getOperationName();
 
     @Override
     protected void processRequest(R request, ImapSession session, Responder responder) {
-        final MailboxPath targetMailbox = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
+        MailboxPath targetMailbox = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
 
         try {
-            final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
+            MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
 
             if (!getMailboxManager().mailboxExists(targetMailbox, mailboxSession)) {
                 no(request, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
@@ -84,7 +84,7 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
     }
 
     private StatusResponse.ResponseCode handleRanges(R request, ImapSession session, MailboxPath targetMailbox, MailboxSession mailboxSession) throws MailboxException {
-        final MessageManager mailbox = getMailboxManager().getMailbox(targetMailbox, mailboxSession);
+        MessageManager mailbox = getMailboxManager().getMailbox(targetMailbox, mailboxSession);
 
         List<IdRange> resultRanges = new ArrayList<>();
         for (IdRange range : request.getIdSet()) {


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


[james-project] 28/43: [Refactoring] RangeIterator can be static

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

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

commit 704600776130a520e2e7060e14faed5479162a4b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 14:13:41 2019 +0700

    [Refactoring] RangeIterator can be static
---
 .../imap/src/main/java/org/apache/james/imap/api/message/IdRange.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
index b2b4c08..74f531a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
@@ -37,7 +37,7 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
     /**
      * {@link Iterator} of a range of msn/uid
      */
-    private final class RangeIterator implements Iterator<Long> {
+    private static final class RangeIterator implements Iterator<Long> {
 
         private final long to;
         private long current;


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


[james-project] 24/43: [Refactoring] MessageRangeProcessor: adopt functional programming style

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

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

commit fe33b42cb965bc0aa76af8fa6646e4c8a347138e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 13:18:30 2019 +0700

    [Refactoring] MessageRangeProcessor: adopt functional programming style
---
 .../main/java/org/apache/james/imap/api/message/IdRange.java | 10 +---------
 .../james/imap/processor/AbstractMessageRangeProcessor.java  | 12 ++++--------
 2 files changed, 5 insertions(+), 17 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
index 0862d0a..bae41e8 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
@@ -47,8 +47,7 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
             messageRange.getUidTo().asLong());
     }
 
-    private long lowVal;
-
+    private final long lowVal;
     private long highVal;
 
     public IdRange(long singleVal) {
@@ -72,13 +71,6 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
         return highVal;
     }
 
-    public void setLowVal(long lowVal) {
-        if (lowVal > highVal) {
-            throw new IllegalArgumentException("LowVal must be <= HighVal");
-        }
-        this.lowVal = lowVal;
-    }
-
     public void setHighVal(long highVal) {
         if (lowVal > highVal) {
             throw new IllegalArgumentException("HighVal must be >= LowVal");
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 1fd75cc..314b2e6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -96,9 +96,11 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
                 range -> messageRange(session.getSelected(), range, request.isUseUids()))
                 .sneakyThrow())
             .filter(Objects::nonNull)
-            .flatMap(Throwing.<MessageRange, Stream<IdRange>>function(
-                range -> handleRange(session, targetMailbox, mailboxSession, range))
+            .flatMap(Throwing.<MessageRange, Stream<MessageRange>>function(
+                range -> process(targetMailbox, session.getSelected(), mailboxSession, range)
+                    .stream())
                 .sneakyThrow())
+            .map(IdRange::from)
             .collect(Guavate.toImmutableList()))
             .toArray(new IdRange[0]);
 
@@ -107,10 +109,4 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
 
         return StatusResponse.ResponseCode.copyUid(uidValidity, request.getIdSet(), resultUids);
     }
-
-    private Stream<IdRange> handleRange(ImapSession session, MailboxPath targetMailbox, MailboxSession mailboxSession, MessageRange range) throws MailboxException {
-        return process(targetMailbox, session.getSelected(), mailboxSession, range)
-            .stream()
-            .map(IdRange::from);
-    }
 }


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


[james-project] 34/43: JAMES-2982 dedicated exception of validating username in UserRepository

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

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

commit dedc4385009e4b38398556b3500d6b4502d74c0c
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Nov 15 09:50:45 2019 +0700

    JAMES-2982 dedicated exception of validating username in UserRepository
---
 .../james/user/api/InvalidUsernameException.java   | 31 ++++++++++++++++++++++
 .../james/user/lib/AbstractUsersRepository.java    |  7 ++---
 2 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/server/data/data-api/src/main/java/org/apache/james/user/api/InvalidUsernameException.java b/server/data/data-api/src/main/java/org/apache/james/user/api/InvalidUsernameException.java
new file mode 100644
index 0000000..d0aa0a1
--- /dev/null
+++ b/server/data/data-api/src/main/java/org/apache/james/user/api/InvalidUsernameException.java
@@ -0,0 +1,31 @@
+/****************************************************************
+ * 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.user.api;
+
+public class InvalidUsernameException extends UsersRepositoryException {
+
+    public InvalidUsernameException(String msg, Throwable t) {
+        super(msg, t);
+    }
+
+    public InvalidUsernameException(String msg) {
+        super(msg);
+    }
+}
diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
index 2e26359..58d17a5 100644
--- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
+++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
@@ -33,6 +33,7 @@ import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.user.api.AlreadyExistInUsersRepositoryException;
+import org.apache.james.user.api.InvalidUsernameException;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
 
@@ -75,12 +76,12 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config
         if (supportVirtualHosting()) {
             // need a @ in the username
             if (!username.hasDomainPart()) {
-                throw new UsersRepositoryException("Given Username needs to contain a @domainpart");
+                throw new InvalidUsernameException("Given Username needs to contain a @domainpart");
             } else {
                 Domain domain = username.getDomainPart().get();
                 try {
                     if (!domainList.containsDomain(domain)) {
-                        throw new UsersRepositoryException("Domain does not exist in DomainList");
+                        throw new InvalidUsernameException("Domain does not exist in DomainList");
                     }
                 } catch (DomainListException e) {
                     throw new UsersRepositoryException("Unable to query DomainList", e);
@@ -89,7 +90,7 @@ public abstract class AbstractUsersRepository implements UsersRepository, Config
         } else {
             // @ only allowed when virtualhosting is supported
             if (username.hasDomainPart()) {
-                throw new UsersRepositoryException("Given Username contains a @domainpart but virtualhosting support is disabled");
+                throw new InvalidUsernameException("Given Username contains a @domainpart but virtualhosting support is disabled");
             }
         }
     }


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


[james-project] 16/43: [Refactoring] Move first batch of tests in mailbox cassandra to JUnit 5

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

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

commit 687d9eb7007ebe24cc1e892cf4af4a930f289864
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 15 14:02:57 2019 +0700

    [Refactoring] Move first batch of tests in mailbox cassandra to JUnit 5
---
 .../mailbox/cassandra/ids/CassandraIdTest.java     | 20 +++---
 .../ids/CassandraMailboxIdDeserializerTest.java    | 20 +++---
 .../cassandra/ids/CassandraMessageIdTest.java      | 14 ++---
 .../cassandra/mail/AttachmentLoaderTest.java       | 19 +++---
 .../cassandra/mail/CassandraMailboxMapperTest.java | 71 ++++++++++------------
 .../mail/CassandraMailboxPathV2DAOTest.java        |  2 +-
 .../MessageAttachmentRepresentationByIdTest.java   | 31 +++++-----
 .../mail/utils/FlagsUpdateStageResultTest.java     | 42 ++++++-------
 8 files changed, 107 insertions(+), 112 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraIdTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraIdTest.java
index 4d7a195..a8c16e7 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraIdTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraIdTest.java
@@ -19,28 +19,24 @@
 package org.apache.james.mailbox.cassandra.ids;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.UUID;
 
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class CassandraIdTest {
-
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
+class CassandraIdTest {
 
     @Test
-    public void beanShouldRespectBeanContract() {
+    void beanShouldRespectBeanContract() {
         EqualsVerifier.forClass(CassandraId.class)
             .verify();
     }
 
     @Test
-    public void fromStringShouldWorkWhenParameterIsAnUUID() {
+    void fromStringShouldWorkWhenParameterIsAnUUID() {
         UUID id = UUID.randomUUID();
 
         CassandraId cassandraId = new CassandraId.Factory().fromString(id.toString());
@@ -49,8 +45,8 @@ public class CassandraIdTest {
     }
 
     @Test
-    public void fromStringShouldThrowWhenParameterIsNotAnUUID() {
-        expectedException.expect(IllegalArgumentException.class);
-        new CassandraId.Factory().fromString("not an UUID");
+    void fromStringShouldThrowWhenParameterIsNotAnUUID() {
+        assertThatThrownBy(() -> new CassandraId.Factory().fromString("not an UUID"))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMailboxIdDeserializerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMailboxIdDeserializerTest.java
index 71e78e3..597f529 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMailboxIdDeserializerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMailboxIdDeserializerTest.java
@@ -20,14 +20,15 @@
 package org.apache.james.mailbox.cassandra.ids;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.UUID;
 
 import org.apache.james.mailbox.store.mail.model.MailboxIdDeserialisationException;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
-public class CassandraMailboxIdDeserializerTest {
+class CassandraMailboxIdDeserializerTest {
 
     private static final String UUID_STRING = "5530370f-44c6-4647-990e-7768ce5131d4";
     private static final String MALFORMED_UUID_STRING = "xyz";
@@ -35,19 +36,20 @@ public class CassandraMailboxIdDeserializerTest {
 
     private CassandraMailboxIdDeserializer mailboxIdDeserializer;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         mailboxIdDeserializer = new CassandraMailboxIdDeserializer();
     }
 
     @Test
-    public void deserializeShouldWork() throws Exception {
+    void deserializeShouldWork() throws Exception {
         assertThat(mailboxIdDeserializer.deserialize(UUID_STRING)).isEqualTo(CASSANDRA_ID);
     }
 
-    @Test(expected = MailboxIdDeserialisationException.class)
-    public void deserializeShouldThrowOnMalformedData() throws Exception {
-        mailboxIdDeserializer.deserialize(MALFORMED_UUID_STRING);
+    @Test
+    void deserializeShouldThrowOnMalformedData() {
+        assertThatThrownBy(() -> mailboxIdDeserializer.deserialize(MALFORMED_UUID_STRING))
+            .isInstanceOf(MailboxIdDeserialisationException.class);
     }
 
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageIdTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageIdTest.java
index bb7551a..29cd278 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageIdTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraMessageIdTest.java
@@ -22,20 +22,20 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.UUID;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class CassandraMessageIdTest {
+class CassandraMessageIdTest {
 
     @Test
-    public void beanShouldRespectBeanContract() {
+    void beanShouldRespectBeanContract() {
         EqualsVerifier.forClass(CassandraMessageId.class)
             .verify();
     }
 
     @Test
-    public void generateShouldReturnAValidCassandraMesssageId() {
+    void generateShouldReturnAValidCassandraMesssageId() {
         CassandraMessageId.Factory testee = new CassandraMessageId.Factory();
 
         CassandraMessageId cassandraMessageId = testee.generate();
@@ -43,7 +43,7 @@ public class CassandraMessageIdTest {
     }
 
     @Test
-    public void ofShouldReturnAValidCassandraMesssageId() {
+    void ofShouldReturnAValidCassandraMesssageId() {
         CassandraMessageId.Factory testee = new CassandraMessageId.Factory();
 
         UUID expectedUuid = UUID.randomUUID();
@@ -53,7 +53,7 @@ public class CassandraMessageIdTest {
     }
 
     @Test
-    public void serializeShouldReturnTheUuidAsString() {
+    void serializeShouldReturnTheUuidAsString() {
         CassandraMessageId.Factory testee = new CassandraMessageId.Factory();
 
         UUID uuid = UUID.randomUUID();
@@ -64,7 +64,7 @@ public class CassandraMessageIdTest {
     }
 
     @Test
-    public void shouldBeSerializable() {
+    void shouldBeSerializable() {
         assertThat(new CassandraMessageId.Factory().generate().isSerializable()).isTrue();
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
index 4161e8d..c536650 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoaderTest.java
@@ -29,25 +29,26 @@ import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.MessageAttachment;
-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 reactor.core.publisher.Mono;
 
-public class AttachmentLoaderTest {
+class AttachmentLoaderTest {
 
     private CassandraAttachmentMapper attachmentMapper;
     private AttachmentLoader testee;
 
-    @Before
-    public void setup() {
+    @BeforeEach
+    void setup() {
         attachmentMapper = mock(CassandraAttachmentMapper.class);
         testee = new AttachmentLoader(attachmentMapper);
     }
 
     @Test
-    public void getAttachmentsShouldWorkWithDuplicatedAttachments() {
+    void getAttachmentsShouldWorkWithDuplicatedAttachments() {
         AttachmentId attachmentId = AttachmentId.from("1");
 
         Attachment attachment = Attachment.builder()
@@ -73,7 +74,7 @@ public class AttachmentLoaderTest {
     }
 
     @Test
-    public void getAttachmentsShouldWorkWithDuplicatedIds() {
+    void getAttachmentsShouldWorkWithDuplicatedIds() {
         AttachmentId attachmentId = AttachmentId.from("1");
 
         Attachment attachment = Attachment.builder()
@@ -101,7 +102,7 @@ public class AttachmentLoaderTest {
     }
 
     @Test
-    public void getAttachmentsShouldReturnMultipleAttachmentWhenSeveralAttachmentsRepresentation() {
+    void getAttachmentsShouldReturnMultipleAttachmentWhenSeveralAttachmentsRepresentation() {
         AttachmentId attachmentId1 = AttachmentId.from("1");
         AttachmentId attachmentId2 = AttachmentId.from("2");
 
@@ -137,7 +138,7 @@ public class AttachmentLoaderTest {
     }
 
     @Test
-    public void getAttachmentsShouldReturnEmptyByDefault() {
+    void getAttachmentsShouldReturnEmptyByDefault() {
         AttachmentId attachmentId = AttachmentId.from("1");
 
         Attachment attachment = Attachment.builder()
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
index 60e8036..8fc831e 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperTest.java
@@ -26,7 +26,8 @@ import java.util.List;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -41,13 +42,14 @@ import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.model.search.Wildcard;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-
-public class CassandraMailboxMapperTest {
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMailboxMapperTest {
     
     private static final int UID_VALIDITY = 52;
     private static final Username USER = Username.of("user");
@@ -64,18 +66,17 @@ public class CassandraMailboxMapperTest {
         CassandraSchemaVersionModule.MODULE,
         CassandraAclModule.MODULE);
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MODULES);
 
     private CassandraMailboxDAO mailboxDAO;
     private CassandraMailboxPathDAOImpl mailboxPathDAO;
     private CassandraMailboxPathV2DAO mailboxPathV2DAO;
     private CassandraMailboxMapper testee;
 
-    @Before
-    public void setUp() {
-        cassandra = CassandraCluster.create(MODULES, cassandraServer.getHost());
+    @BeforeEach
+    void setUp() {
+        CassandraCluster cassandra = cassandraCluster.getCassandraCluster();
         mailboxDAO = new CassandraMailboxDAO(cassandra.getConf(), cassandra.getTypesProvider());
         mailboxPathDAO = new CassandraMailboxPathDAOImpl(cassandra.getConf(), cassandra.getTypesProvider());
         mailboxPathV2DAO = new CassandraMailboxPathV2DAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
@@ -90,15 +91,9 @@ public class CassandraMailboxMapperTest {
                 CassandraConfiguration.DEFAULT_CONFIGURATION));
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
-
-    @Ignore("JAMES-2514 Cassandra 3 supports long mailbox names. Hence we can not rely on this for failing")
+    @Disabled("JAMES-2514 Cassandra 3 supports long mailbox names. Hence we can not rely on this for failing")
     @Test
-    public void saveShouldNotRemoveOldMailboxPathWhenCreatingTheNewMailboxPathFails() throws Exception {
+    void saveShouldNotRemoveOldMailboxPathWhenCreatingTheNewMailboxPathFails() throws Exception {
         testee.save(new Mailbox(MAILBOX_PATH, UID_VALIDITY));
         Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH);
 
@@ -116,7 +111,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void deleteShouldDeleteMailboxAndMailboxPathFromV1Table() {
+    void deleteShouldDeleteMailboxAndMailboxPathFromV1Table() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -129,7 +124,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void deleteShouldDeleteMailboxAndMailboxPathFromV2Table() {
+    void deleteShouldDeleteMailboxAndMailboxPathFromV2Table() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -142,7 +137,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void findMailboxByPathShouldReturnMailboxWhenExistsInV1Table() throws Exception {
+    void findMailboxByPathShouldReturnMailboxWhenExistsInV1Table() throws Exception {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -154,7 +149,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void findMailboxByPathShouldReturnMailboxWhenExistsInV2Table() throws Exception {
+    void findMailboxByPathShouldReturnMailboxWhenExistsInV2Table() throws Exception {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -166,7 +161,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void findMailboxByPathShouldReturnMailboxWhenExistsInBothTables() throws Exception {
+    void findMailboxByPathShouldReturnMailboxWhenExistsInBothTables() throws Exception {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -180,7 +175,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void deleteShouldRemoveMailboxWhenInBothTables() {
+    void deleteShouldRemoveMailboxWhenInBothTables() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -195,7 +190,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void deleteShouldRemoveMailboxWhenInV1Tables() {
+    void deleteShouldRemoveMailboxWhenInV1Tables() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -208,7 +203,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void deleteShouldRemoveMailboxWhenInV2Table() {
+    void deleteShouldRemoveMailboxWhenInV2Table() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -221,7 +216,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void findMailboxByPathShouldThrowWhenDoesntExistInBothTables() {
+    void findMailboxByPathShouldThrowWhenDoesntExistInBothTables() {
         mailboxDAO.save(MAILBOX)
             .block();
 
@@ -230,7 +225,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV1Table() {
+    void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV1Table() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -247,7 +242,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInBothTables() {
+    void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInBothTables() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -266,7 +261,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV2Table() {
+    void findMailboxWithPathLikeShouldReturnMailboxesWhenExistsInV2Table() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -283,7 +278,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void hasChildrenShouldReturnChildWhenExistsInV1Table() {
+    void hasChildrenShouldReturnChildWhenExistsInV1Table() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -302,7 +297,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void hasChildrenShouldReturnChildWhenExistsInBothTables() {
+    void hasChildrenShouldReturnChildWhenExistsInBothTables() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -323,7 +318,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void hasChildrenShouldReturnChildWhenExistsInV2Table() {
+    void hasChildrenShouldReturnChildWhenExistsInV2Table() {
         mailboxDAO.save(MAILBOX)
             .block();
         mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
@@ -342,7 +337,7 @@ public class CassandraMailboxMapperTest {
     }
 
     @Test
-    public void findMailboxWithPathLikeShouldRemoveDuplicatesAndKeepV2() {
+    void findMailboxWithPathLikeShouldRemoveDuplicatesAndKeepV2() {
         mailboxDAO.save(MAILBOX).block();
         mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID).block();
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
index dc1f559..1bfcffc 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathV2DAOTest.java
@@ -22,7 +22,7 @@ package org.apache.james.mailbox.cassandra.mail;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 
-public class CassandraMailboxPathV2DAOTest extends CassandraMailboxPathDAOTest {
+class CassandraMailboxPathV2DAOTest extends CassandraMailboxPathDAOTest {
     @Override
     CassandraMailboxPathDAO testee(CassandraCluster cassandra) {
         return new CassandraMailboxPathV2DAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
index 4026300..84d000d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/MessageAttachmentRepresentationByIdTest.java
@@ -20,31 +20,32 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
 
-import org.apache.james.mailbox.cassandra.mail.MessageAttachmentRepresentation;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
-import org.junit.Test;
+import org.apache.james.mailbox.model.MessageAttachment;
+import org.junit.jupiter.api.Test;
 
 
-public class MessageAttachmentRepresentationByIdTest {
+class MessageAttachmentRepresentationByIdTest {
 
-    @Test(expected = IllegalStateException.class)
-    public void buildShouldThrowWhenAttachmentIsNotGiven() {
-        org.apache.james.mailbox.model.MessageAttachment.builder()
-            .build();
+    @Test
+    void buildShouldThrowWhenAttachmentIsNotGiven() {
+        assertThatThrownBy(() -> MessageAttachment.builder().build())
+            .isInstanceOf(IllegalStateException.class);
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void builderShouldThrowWhenAttachmentIsNull() {
-        org.apache.james.mailbox.model.MessageAttachment.builder()
-            .attachment(null);
+    @Test
+    void builderShouldThrowWhenAttachmentIsNull() {
+        assertThatThrownBy(() -> MessageAttachment.builder().attachment(null))
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void buildShouldWorkWhenMandatoryAttributesAreGiven() {
+    void buildShouldWorkWhenMandatoryAttributesAreGiven() {
         AttachmentId attachmentId = AttachmentId.from("1");
         MessageAttachmentRepresentation expectedMessageAttachmentRepresentation = new MessageAttachmentRepresentation(attachmentId, Optional.empty(), Optional.empty(), false);
 
@@ -56,7 +57,7 @@ public class MessageAttachmentRepresentationByIdTest {
     }
 
     @Test
-    public void buildShouldSetIsInlineDefaultValueWhenNotGiven() {
+    void buildShouldSetIsInlineDefaultValueWhenNotGiven() {
         AttachmentId attachmentId = AttachmentId.from("1");
 
         MessageAttachmentRepresentation messageAttachmentRepresentation = MessageAttachmentRepresentation.builder()
@@ -67,7 +68,7 @@ public class MessageAttachmentRepresentationByIdTest {
     }
 
     @Test
-    public void buildShouldAcceptInlineAndWithoutCid() {
+    void buildShouldAcceptInlineAndWithoutCid() {
         AttachmentId attachmentId = AttachmentId.from("1");
         MessageAttachmentRepresentation expectedMessageAttachmentRepresentation = new MessageAttachmentRepresentation(attachmentId, Optional.empty(), Optional.empty(), true);
 
@@ -80,7 +81,7 @@ public class MessageAttachmentRepresentationByIdTest {
     }
 
     @Test
-    public void buildShouldSetAttributesWhenAllAreGiven() {
+    void buildShouldSetAttributesWhenAllAreGiven() {
         AttachmentId attachmentId = AttachmentId.from("1");
         MessageAttachmentRepresentation expectedMessageAttachmentRepresentation = new MessageAttachmentRepresentation(attachmentId, Optional.of("name"), Optional.of(Cid.from("cid")), true);
 
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 93f7273..ee959c3 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
@@ -25,23 +25,23 @@ import javax.mail.Flags;
 
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.UpdatedFlags;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class FlagsUpdateStageResultTest {
+class FlagsUpdateStageResultTest {
 
-    public static final MessageUid UID = MessageUid.of(1L);
-    public static final MessageUid OTHER_UID = MessageUid.of(2L);
-    public static final UpdatedFlags UPDATED_FLAGS = UpdatedFlags.builder()
+    private static final MessageUid UID = MessageUid.of(1L);
+    private static final MessageUid OTHER_UID = MessageUid.of(2L);
+    private static final UpdatedFlags UPDATED_FLAGS = UpdatedFlags.builder()
         .uid(UID)
         .modSeq(18L)
         .oldFlags(new Flags())
         .newFlags(new Flags(Flags.Flag.SEEN))
         .build();
-    public static final UpdatedFlags OTHER_UPDATED_FLAGS = UpdatedFlags.builder()
+    private static final UpdatedFlags OTHER_UPDATED_FLAGS = UpdatedFlags.builder()
         .uid(OTHER_UID)
         .modSeq(18L)
         .oldFlags(new Flags())
@@ -49,66 +49,66 @@ public class FlagsUpdateStageResultTest {
         .build();
 
     @Test
-    public void classShouldRespectBeanContract() {
+    void classShouldRespectBeanContract() {
         EqualsVerifier.forClass(FlagsUpdateStageResult.class);
     }
 
     @Test
-    public void noneShouldCreateResultWithoutSuccessOrFails() {
+    void noneShouldCreateResultWithoutSuccessOrFails() {
         assertThat(FlagsUpdateStageResult.none())
             .isEqualTo(new FlagsUpdateStageResult(ImmutableList.of(), ImmutableList.of()));
     }
 
     @Test
-    public void failShouldCreateResultWithFailedUid() {
+    void failShouldCreateResultWithFailedUid() {
         assertThat(FlagsUpdateStageResult.fail(UID))
             .isEqualTo(new FlagsUpdateStageResult(ImmutableList.of(UID), ImmutableList.of()));
     }
 
     @Test
-    public void successShouldCreateResultWithSucceededUpdatedFlags() {
+    void successShouldCreateResultWithSucceededUpdatedFlags() {
         assertThat(FlagsUpdateStageResult.success(UPDATED_FLAGS))
             .isEqualTo(new FlagsUpdateStageResult(ImmutableList.of(), ImmutableList.of(UPDATED_FLAGS)));
     }
 
     @Test
-    public void noneShouldBeWellMergedWithNone() {
+    void noneShouldBeWellMergedWithNone() {
         assertThat(FlagsUpdateStageResult.none().merge(FlagsUpdateStageResult.none()))
             .isEqualTo(FlagsUpdateStageResult.none());
     }
 
     @Test
-    public void noneShouldBeWellMergedWithFail() {
+    void noneShouldBeWellMergedWithFail() {
         assertThat(FlagsUpdateStageResult.none().merge(FlagsUpdateStageResult.fail(UID)))
             .isEqualTo(FlagsUpdateStageResult.fail(UID));
     }
 
     @Test
-    public void noneShouldBeWellMergedWithSuccess() {
+    void noneShouldBeWellMergedWithSuccess() {
         assertThat(FlagsUpdateStageResult.none().merge(FlagsUpdateStageResult.success(UPDATED_FLAGS)))
             .isEqualTo(FlagsUpdateStageResult.success(UPDATED_FLAGS));
     }
 
     @Test
-    public void failShouldBeWellMergedWithFail() {
+    void failShouldBeWellMergedWithFail() {
         assertThat(FlagsUpdateStageResult.fail(UID).merge(FlagsUpdateStageResult.fail(OTHER_UID)))
             .isEqualTo(new FlagsUpdateStageResult(ImmutableList.of(UID, OTHER_UID), ImmutableList.of()));
     }
 
     @Test
-    public void successShouldBeWellMergedWithFail() {
+    void successShouldBeWellMergedWithFail() {
         assertThat(FlagsUpdateStageResult.success(UPDATED_FLAGS).merge(FlagsUpdateStageResult.fail(UID)))
             .isEqualTo(new FlagsUpdateStageResult(ImmutableList.of(UID), ImmutableList.of(UPDATED_FLAGS)));
     }
 
     @Test
-    public void successShouldBeWellMergedWithSuccess() {
+    void successShouldBeWellMergedWithSuccess() {
         assertThat(FlagsUpdateStageResult.success(UPDATED_FLAGS).merge(FlagsUpdateStageResult.success(OTHER_UPDATED_FLAGS)))
             .isEqualTo(new FlagsUpdateStageResult(ImmutableList.of(), ImmutableList.of(UPDATED_FLAGS, OTHER_UPDATED_FLAGS)));
     }
 
     @Test
-    public void getFailedShouldReturnFailedUid() {
+    void getFailedShouldReturnFailedUid() {
         FlagsUpdateStageResult flagsUpdateStageResult = new FlagsUpdateStageResult(ImmutableList.of(UID), ImmutableList.of(UPDATED_FLAGS));
 
         assertThat(flagsUpdateStageResult.getFailed())
@@ -116,7 +116,7 @@ public class FlagsUpdateStageResultTest {
     }
 
     @Test
-    public void getSucceededShouldReturnSucceedUpdatedFlags() {
+    void getSucceededShouldReturnSucceedUpdatedFlags() {
         FlagsUpdateStageResult flagsUpdateStageResult = new FlagsUpdateStageResult(ImmutableList.of(UID), ImmutableList.of(UPDATED_FLAGS));
 
         assertThat(flagsUpdateStageResult.getSucceeded())
@@ -124,7 +124,7 @@ public class FlagsUpdateStageResultTest {
     }
 
     @Test
-    public void keepSuccessShouldDiscardFailedUids() {
+    void keepSuccessShouldDiscardFailedUids() {
         FlagsUpdateStageResult flagsUpdateStageResult = new FlagsUpdateStageResult(ImmutableList.of(UID), ImmutableList.of(UPDATED_FLAGS));
 
         assertThat(flagsUpdateStageResult.keepSucceded())
@@ -132,14 +132,14 @@ public class FlagsUpdateStageResultTest {
     }
 
     @Test
-    public void containsFailedResultsShouldReturnTrueWhenFailed() {
+    void containsFailedResultsShouldReturnTrueWhenFailed() {
         assertThat(FlagsUpdateStageResult.fail(UID).containsFailedResults())
             .isTrue();
     }
 
 
     @Test
-    public void containsFailedResultsShouldReturnFalseWhenSucceeded() {
+    void containsFailedResultsShouldReturnFalseWhenSucceeded() {
         assertThat(FlagsUpdateStageResult.success(UPDATED_FLAGS).containsFailedResults())
             .isFalse();
     }


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


[james-project] 43/43: JAMES-2964 fix wrong unit test in DTOTest using json assertions on domain objects

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

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

commit e477ab57c29400f8dc72039237ef6c3de5c4c7a1
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Tue Nov 12 17:24:52 2019 +0100

    JAMES-2964 fix wrong unit test in DTOTest using json assertions on domain objects
---
 .../org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java     | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
index d9a323d..2311487 100644
--- a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
+++ b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
@@ -155,7 +155,7 @@ class DTOTest {
 
     @Test
     void shouldDeserializeQuotaThresholdChangedEvent() throws Exception {
-        assertThatJson(new JsonEventSerializer(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE)
+        assertThat(new JsonEventSerializer(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE)
             .deserialize(EVENT_JSON))
             .isEqualTo(EVENT);
     }
@@ -169,7 +169,7 @@ class DTOTest {
 
     @Test
     void shouldDeserializeEvent2() throws Exception {
-        assertThatJson(new JsonEventSerializer(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE)
+        assertThat(new JsonEventSerializer(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE)
             .deserialize(EVENT_JSON_2))
             .isEqualTo(EVENT_2);
     }
@@ -183,7 +183,7 @@ class DTOTest {
 
     @Test
     void shouldDeserializeEvent3() throws Exception {
-        assertThatJson(new JsonEventSerializer(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE)
+        assertThat(new JsonEventSerializer(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE)
             .deserialize(EVENT_JSON_3))
             .isEqualTo(EVENT_3);
     }
@@ -197,7 +197,7 @@ class DTOTest {
 
     @Test
     void shouldDeserializeEvent4() throws Exception {
-        assertThatJson(new JsonEventSerializer(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE)
+        assertThat(new JsonEventSerializer(QuotaEventDTOModules.QUOTA_THRESHOLD_CHANGE)
             .deserialize(EVENT_JSON_4))
             .isEqualTo(EVENT_4);
     }


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


[james-project] 17/43: [Refactoring] Move second batch of tests in mailbox cassandra with other dependant implementations to JUnit 5

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

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

commit 5be4ba8c974dca892564501f129753f843d0e8c6
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 15 14:32:12 2019 +0700

    [Refactoring] Move second batch of tests in mailbox cassandra with other dependant implementations to JUnit 5
---
 .../cassandra/CassandraCombinationManagerTest.java |  32 +---
 .../CassandraMessageIdManagerQuotaTest.java        |  36 ++--
 .../CassandraMessageIdManagerSideEffectTest.java   |  32 +---
 .../CassandraMessageIdManagerStorageTest.java      |  32 +---
 .../user/CassandraSubscriptionMapperTest.java      |  32 +---
 .../inmemory/InMemoryCombinationManagerTest.java   |   9 +-
 .../InMemoryMessageIdManagerStorageTest.java       |   9 +-
 .../InMemoryMessageIdManagerSideEffectTest.java    |   9 +-
 .../user/InMemorySubscriptionMapperTest.java       |   2 +-
 .../store/AbstractCombinationManagerTest.java      |  68 ++++----
 .../store/AbstractMessageIdManagerQuotaTest.java   |  42 ++---
 .../AbstractMessageIdManagerSideEffectTest.java    |  64 ++++---
 .../store/AbstractMessageIdManagerStorageTest.java | 185 +++++++++++----------
 .../mailbox/store/user/SubscriptionMapperTest.java |  24 +--
 14 files changed, 246 insertions(+), 330 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
index 8860dd0..68679a8 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.james.mailbox.cassandra;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
@@ -28,33 +28,19 @@ import org.apache.james.mailbox.store.AbstractCombinationManagerTest;
 import org.apache.james.mailbox.store.CombinationManagerTestSystem;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.api.NoopMetricFactory;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraCombinationManagerTest extends AbstractCombinationManagerTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraCombinationManagerTest extends AbstractCombinationManagerTest {
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
-
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
     @Override
     public CombinationManagerTestSystem createTestingData() {
         InVMEventBus eventBus = new InVMEventBus(new InVmEventDelivery(new NoopMetricFactory()));
-        return CassandraCombinationManagerTestSystem.createTestingData(cassandra, new NoQuotaManager(), eventBus);
+        return CassandraCombinationManagerTestSystem.createTestingData(cassandraCluster.getCassandraCluster(), new NoQuotaManager(), eventBus);
     }
     
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
index 720855f..4c693f8 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.james.mailbox.cassandra;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
@@ -28,37 +28,23 @@ import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.AbstractMessageIdManagerQuotaTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMessageIdManagerQuotaTest extends AbstractMessageIdManagerQuotaTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMessageIdManagerQuotaTest extends AbstractMessageIdManagerQuotaTest {
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE_WITH_QUOTA, cassandraServer.getHost());
-        super.setUp();
-    }
-
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE_WITH_QUOTA);
 
     @Override
     protected MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, CurrentQuotaManager currentQuotaManager) throws Exception {
-        return CassandraMessageIdManagerTestSystem.createTestingDataWithQuota(cassandra, quotaManager, currentQuotaManager);
+        return CassandraMessageIdManagerTestSystem.createTestingDataWithQuota(cassandraCluster.getCassandraCluster(), quotaManager, currentQuotaManager);
     }
 
     @Override
     protected MaxQuotaManager createMaxQuotaManager() {
-        return CassandraTestSystemFixture.createMaxQuotaManager(cassandra);
+        return CassandraTestSystemFixture.createMaxQuotaManager(cassandraCluster.getCassandraCluster());
     }
 
     @Override
@@ -68,6 +54,6 @@ public class CassandraMessageIdManagerQuotaTest extends AbstractMessageIdManager
 
     @Override
     protected CurrentQuotaManager createCurrentQuotaManager() {
-        return CassandraTestSystemFixture.createCurrentQuotaManager(cassandra);
+        return CassandraTestSystemFixture.createCurrentQuotaManager(cassandraCluster.getCassandraCluster());
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
index 8536d80..cfea4ad 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
@@ -21,39 +21,25 @@ package org.apache.james.mailbox.cassandra;
 
 import java.util.Set;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.extension.PreDeletionHook;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.AbstractMessageIdManagerSideEffectTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMessageIdManagerSideEffectTest extends AbstractMessageIdManagerSideEffectTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMessageIdManagerSideEffectTest extends AbstractMessageIdManagerSideEffectTest {
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
 
     @Override
     protected MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus, Set<PreDeletionHook> preDeletionHooks) {
-        return CassandraMessageIdManagerTestSystem.createTestingData(cassandra, quotaManager, eventBus, preDeletionHooks);
+        return CassandraMessageIdManagerTestSystem.createTestingData(cassandraCluster.getCassandraCluster(), quotaManager, eventBus, preDeletionHooks);
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
index 0b7d71c..1a9c4d5 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.james.mailbox.cassandra;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
@@ -29,32 +29,18 @@ import org.apache.james.mailbox.store.AbstractMessageIdManagerStorageTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.api.NoopMetricFactory;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraMessageIdManagerStorageTest extends AbstractMessageIdManagerStorageTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraMessageIdManagerStorageTest extends AbstractMessageIdManagerStorageTest {
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
-    
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
     @Override
     protected MessageIdManagerTestSystem createTestingData() {
         InVMEventBus eventBus = new InVMEventBus(new InVmEventDelivery(new NoopMetricFactory()));
-        return CassandraMessageIdManagerTestSystem.createTestingData(cassandra, new NoQuotaManager(), eventBus, PreDeletionHook.NO_PRE_DELETION_HOOK);
+        return CassandraMessageIdManagerTestSystem.createTestingData(cassandraCluster.getCassandraCluster(), new NoQuotaManager(), eventBus, PreDeletionHook.NO_PRE_DELETION_HOOK);
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java
index 681ec3a..61923ee 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java
@@ -18,38 +18,24 @@
  ****************************************************************/
 package org.apache.james.mailbox.cassandra.user;
 
-import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapperTest;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
-public class CassandraSubscriptionMapperTest extends SubscriptionMapperTest {
+@ExtendWith(CassandraRestartExtension.class)
+class CassandraSubscriptionMapperTest extends SubscriptionMapperTest {
 
-    @Rule public DockerCassandraRule cassandraServer = new DockerCassandraRule().allowRestart();
-
-    private CassandraCluster cassandra;
-
-    @Override
-    @Before
-    public void setUp() {
-        cassandra = CassandraCluster.create(CassandraSubscriptionModule.MODULE, cassandraServer.getHost());
-        super.setUp();
-    }
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraSubscriptionModule.MODULE);
 
     @Override
     protected SubscriptionMapper createSubscriptionMapper() {
-        return new CassandraSubscriptionMapper(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
-    }
-
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-        cassandra.closeCluster();
+        return new CassandraSubscriptionMapper(cassandraCluster.getCassandraCluster().getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
     }
 
 }
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java
index 3aa7c86..bc4bcc8 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryCombinationManagerTest.java
@@ -21,15 +21,8 @@ package org.apache.james.mailbox.inmemory;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.store.AbstractCombinationManagerTest;
 import org.apache.james.mailbox.store.CombinationManagerTestSystem;
-import org.junit.Before;
 
-public class InMemoryCombinationManagerTest extends AbstractCombinationManagerTest {
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
+class InMemoryCombinationManagerTest extends AbstractCombinationManagerTest {
     
     @Override
     public CombinationManagerTestSystem createTestingData() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerStorageTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerStorageTest.java
index 9f0087a..9853c3f 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerStorageTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMessageIdManagerStorageTest.java
@@ -22,15 +22,8 @@ import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.store.AbstractMessageIdManagerStorageTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
 import org.apache.james.mailbox.store.StoreMailboxManager;
-import org.junit.Before;
 
-public class InMemoryMessageIdManagerStorageTest extends AbstractMessageIdManagerStorageTest {
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
+class InMemoryMessageIdManagerStorageTest extends AbstractMessageIdManagerStorageTest {
     
     @Override
     protected MessageIdManagerTestSystem createTestingData() {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
index b0ea823..fc8f774 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryMessageIdManagerSideEffectTest.java
@@ -27,15 +27,8 @@ import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.AbstractMessageIdManagerSideEffectTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
-import org.junit.Before;
 
-public class InMemoryMessageIdManagerSideEffectTest extends AbstractMessageIdManagerSideEffectTest {
-
-    @Override
-    @Before
-    public void setUp() throws Exception {
-        super.setUp();
-    }
+class InMemoryMessageIdManagerSideEffectTest extends AbstractMessageIdManagerSideEffectTest {
 
     @Override
     protected MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus, Set<PreDeletionHook> preDeletionHooks) {
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapperTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapperTest.java
index d9f227d..873f7c0 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapperTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapperTest.java
@@ -22,7 +22,7 @@ package org.apache.james.mailbox.inmemory.user;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapperTest;
 
-public class InMemorySubscriptionMapperTest extends SubscriptionMapperTest {
+class InMemorySubscriptionMapperTest extends SubscriptionMapperTest {
 
     @Override
     protected SubscriptionMapper createSubscriptionMapper() {
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 8f8349b..c817e8c 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
@@ -48,7 +48,8 @@ import org.apache.james.mailbox.model.MessageResult;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mime4j.dom.Message;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 
@@ -71,9 +72,10 @@ public abstract class AbstractCombinationManagerTest {
     private CombinationManagerTestSystem testingData;
     private Message mailContent;
 
-    public abstract CombinationManagerTestSystem createTestingData() throws Exception;
+    protected abstract CombinationManagerTestSystem createTestingData() throws Exception;
 
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         session = MailboxSessionUtil.create(MailboxFixture.ALICE);
         testingData = createTestingData();
 
@@ -93,7 +95,7 @@ public abstract class AbstractCombinationManagerTest {
 
 
     @Test
-    public void getMessageCountFromMessageManagerShouldReturnDataSetInMailboxesFromMessageIdManager() throws Exception {
+    void getMessageCountFromMessageManagerShouldReturnDataSetInMailboxesFromMessageIdManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -103,7 +105,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void searchFromMessageManagerShouldReturnMessagesUsingSetInMailboxesFromMessageIdManager() throws Exception {
+    void searchFromMessageManagerShouldReturnMessagesUsingSetInMailboxesFromMessageIdManager() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
 
@@ -116,7 +118,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void searchFromMessageManagerShouldReturnMessagesUsingSetInMailboxesFromMessageIdManagerWhenSearchByMailboxQueryWithMailboxPath() throws Exception {
+    void searchFromMessageManagerShouldReturnMessagesUsingSetInMailboxesFromMessageIdManagerWhenSearchByMailboxQueryWithMailboxPath() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
 
@@ -135,7 +137,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void searchFromMessageManagerShouldReturnMessagesUsingSetInMailboxesFromMessageIdManagerWhenSearchByMailboxQueryWithUsername() throws Exception {
+    void searchFromMessageManagerShouldReturnMessagesUsingSetInMailboxesFromMessageIdManagerWhenSearchByMailboxQueryWithUsername() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
 
@@ -149,7 +151,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void searchFromMailboxManagerShouldReturnMessagesUsingSetInMailboxesFromMessageIdManagerWhenSearchByMultiMailboxes() throws Exception {
+    void searchFromMailboxManagerShouldReturnMessagesUsingSetInMailboxesFromMessageIdManagerWhenSearchByMultiMailboxes() throws Exception {
         SearchQuery query = new SearchQuery();
         query.andCriteria(SearchQuery.all());
 
@@ -166,7 +168,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void setFlagsToDeleteThenExpungeFromMessageManagerThenGetMessageFromMessageIdManagerShouldNotReturnAnything() throws Exception {
+    void setFlagsToDeleteThenExpungeFromMessageManagerThenGetMessageFromMessageIdManagerShouldNotReturnAnything() throws Exception {
         Flags deleted = new Flags(Flag.DELETED);
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
@@ -178,7 +180,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void expungeFromMessageManagerShouldWorkWhenSetFlagsToDeletedWithMessageIdManager() throws Exception {
+    void expungeFromMessageManagerShouldWorkWhenSetFlagsToDeletedWithMessageIdManager() throws Exception {
         Flags deleted = new Flags(Flag.DELETED);
         ComposedMessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session);
 
@@ -190,7 +192,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void expungeFromMessageManagerShouldWorkWhenSetInMailboxesAMessageWithDeletedFlag() throws Exception { //I can mark as DELETED + expunge an mail with setInMbxs
+    void expungeFromMessageManagerShouldWorkWhenSetInMailboxesAMessageWithDeletedFlag() throws Exception { //I can mark as DELETED + expunge an mail with setInMbxs
         Flags deleted = new Flags(Flag.DELETED);
         ComposedMessageId messageId = messageManager1.appendMessage(
             MessageManager.AppendCommand.builder()
@@ -205,7 +207,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMessageFromMessageIdManagerShouldReturnMessageWhenAppendMessageFromMessageManager() throws Exception {
+    void getMessageFromMessageIdManagerShouldReturnMessageWhenAppendMessageFromMessageManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -213,7 +215,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMessageFromMessageIdManagerShouldReturnMessageWhenCopyMessageWithMailboxIdFromMailboxManager() throws Exception {
+    void getMessageFromMessageIdManagerShouldReturnMessageWhenCopyMessageWithMailboxIdFromMailboxManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -227,7 +229,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMessageFromMessageIdManagerShouldReturnMessageWhenCopyMessageWithMailboxPathFromMailboxManager() throws Exception {
+    void getMessageFromMessageIdManagerShouldReturnMessageWhenCopyMessageWithMailboxPathFromMailboxManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -241,7 +243,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMessageFromMessageIdManagerShouldReturnMessageWhenMoveMessageWithMailboxIdFromMailboxManager() throws Exception {
+    void getMessageFromMessageIdManagerShouldReturnMessageWhenMoveMessageWithMailboxIdFromMailboxManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -255,7 +257,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMessagesFromMessageManagerShouldReturnMessagesCreatedBySetInMailboxesFromMessageIdManager() throws Exception {
+    void getMessagesFromMessageManagerShouldReturnMessagesCreatedBySetInMailboxesFromMessageIdManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -267,7 +269,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnRecentMessageWhenSetInMailboxesFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnRecentMessageWhenSetInMailboxesFromMessageIdManager() throws Exception {
         Flags recent = new Flags(Flag.RECENT);
         ComposedMessageId messageId = messageManager1.appendMessage(
             MessageManager.AppendCommand.builder()
@@ -284,7 +286,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnNumberOfRecentMessageWhenSetInMailboxesFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnNumberOfRecentMessageWhenSetInMailboxesFromMessageIdManager() throws Exception {
         Flags recent = new Flags(Flag.RECENT);
         MessageId messageId = messageManager1.appendMessage(
             MessageManager.AppendCommand.builder()
@@ -298,7 +300,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnUidNextWhenSetInMailboxesFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnUidNextWhenSetInMailboxesFromMessageIdManager() throws Exception {
         Flags recent = new Flags(Flag.RECENT);
         ComposedMessageId messageId = messageManager1.appendMessage(
             MessageManager.AppendCommand.builder()
@@ -321,7 +323,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnHighestModSeqWhenSetInMailboxesFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnHighestModSeqWhenSetInMailboxesFromMessageIdManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -331,7 +333,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnMessageCountWhenSetInMailboxesFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnMessageCountWhenSetInMailboxesFromMessageIdManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -341,7 +343,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnNumberOfUnseenMessageWhenSetInMailboxesFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnNumberOfUnseenMessageWhenSetInMailboxesFromMessageIdManager() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -351,7 +353,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnFirstUnseenMessageWhenSetInMailboxesFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnFirstUnseenMessageWhenSetInMailboxesFromMessageIdManager() throws Exception {
         ComposedMessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session);
 
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
@@ -360,7 +362,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnNumberOfUnseenMessageWhenSetFlagsFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnNumberOfUnseenMessageWhenSetFlagsFromMessageIdManager() throws Exception {
         Flags newFlag = new Flags(Flag.RECENT);
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
@@ -371,7 +373,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getMetadataFromMessageManagerShouldReturnFirstUnseenMessageWhenSetFlagsFromMessageIdManager() throws Exception {
+    void getMetadataFromMessageManagerShouldReturnFirstUnseenMessageWhenSetFlagsFromMessageIdManager() throws Exception {
         Flags newFlag = new Flags(Flag.USER);
         ComposedMessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session);
 
@@ -381,7 +383,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void setInMailboxesFromMessageIdManagerShouldMoveMessage() throws Exception {
+    void setInMailboxesFromMessageIdManagerShouldMoveMessage() throws Exception {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
@@ -398,7 +400,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void appendMessageFromMessageManagerAndSetInMailboxFromMessageIdManagerShouldUpdateApplicableFlag() throws Exception {
+    void appendMessageFromMessageManagerAndSetInMailboxFromMessageIdManagerShouldUpdateApplicableFlag() throws Exception {
         Flags messageFlag = new FlagsBuilder()
             .add(Flag.ANSWERED)
             .add(USER_FLAGS_VALUE)
@@ -424,7 +426,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void appendMessageFromMessageManagerAndSetFlagsFromMessageIdManagerShouldUnionApplicableFlag() throws Exception {
+    void appendMessageFromMessageManagerAndSetFlagsFromMessageIdManagerShouldUnionApplicableFlag() throws Exception {
         Flags messageFlag = new FlagsBuilder()
             .add(Flag.ANSWERED)
             .add(USER_FLAGS_VALUE)
@@ -450,7 +452,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void setFlagsFromMessageManagerAndSetFlagsFromMessageIdManagerShouldUpdateSameApplicableFlag() throws Exception {
+    void setFlagsFromMessageManagerAndSetFlagsFromMessageIdManagerShouldUpdateSameApplicableFlag() throws Exception {
         Flags customFlag1 = new Flags(Flag.ANSWERED);
         Flags customFlag2 = new Flags("customFlag2");
         MessageId messageId = messageManager1.appendMessage(
@@ -472,7 +474,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void setInMailboxFromMessageIdManagerAndSetFlagsFromMessageManagerShouldUnionApplicableFlag() throws Exception {
+    void setInMailboxFromMessageIdManagerAndSetFlagsFromMessageManagerShouldUnionApplicableFlag() throws Exception {
         Flags custom1 = new Flags("custom1");
         Flags custom2 = new Flags("custom2");
         MessageId messageId = messageManager1.appendMessage(
@@ -493,7 +495,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getUidsShouldInteractWellWithSetInMailboxes() throws Exception {
+    void getUidsShouldInteractWellWithSetInMailboxes() throws Exception {
         MessageId messageId = messageManager1
             .appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
@@ -514,7 +516,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getUidsShouldInteractWellWithDelete() throws Exception {
+    void getUidsShouldInteractWellWithDelete() throws Exception {
         MessageId messageId = messageManager1
             .appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
@@ -526,7 +528,7 @@ public abstract class AbstractCombinationManagerTest {
     }
 
     @Test
-    public void getUidsShouldInteractWellWithDeletes() throws Exception {
+    void getUidsShouldInteractWellWithDeletes() throws Exception {
         MessageId messageId1 = messageManager1
             .appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
index 0ab3809..82190d9 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.mailbox.store;
 
 import static org.apache.james.mailbox.fixture.MailboxFixture.ALICE;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import javax.mail.Flags;
 
@@ -36,10 +37,8 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
 
@@ -48,9 +47,6 @@ public abstract class AbstractMessageIdManagerQuotaTest {
 
     public static final Flags FLAGS = new Flags();
 
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-
     private MessageIdManager messageIdManager;
     private MailboxSession session;
     private Mailbox mailbox1;
@@ -67,8 +63,8 @@ public abstract class AbstractMessageIdManagerQuotaTest {
     
     protected abstract QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, CurrentQuotaManager currentQuotaManager);
 
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         maxQuotaManager = createMaxQuotaManager();
         CurrentQuotaManager currentQuotaManager = createCurrentQuotaManager();
         QuotaManager quotaManager = createQuotaManager(maxQuotaManager, currentQuotaManager);
@@ -83,7 +79,7 @@ public abstract class AbstractMessageIdManagerQuotaTest {
     }
 
     @Test
-    public void setInMailboxesShouldNotThrowWhenMessageQuotaNotExceeded() throws Exception {
+    void setInMailboxesShouldNotThrowWhenMessageQuotaNotExceeded() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(1));
 
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
@@ -92,7 +88,7 @@ public abstract class AbstractMessageIdManagerQuotaTest {
     }
 
     @Test
-    public void setInMailboxesShouldNotThrowWhenStorageQuotaNotExceeded() throws Exception {
+    void setInMailboxesShouldNotThrowWhenStorageQuotaNotExceeded() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(testingData.getConstantMessageSize()));
 
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
@@ -101,34 +97,40 @@ public abstract class AbstractMessageIdManagerQuotaTest {
     }
 
     @Test
-    public void setInMailboxesShouldThrowWhenStorageQuotaExceeded() throws Exception {
+    void setInMailboxesShouldThrowWhenStorageQuotaExceeded() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(2 * testingData.getConstantMessageSize()));
 
         testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
 
-        expectedException.expect(OverQuotaException.class);
-        messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
+        assertThatThrownBy(() -> messageIdManager.setInMailboxes(messageId,
+                ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()),
+                session))
+            .isInstanceOf(OverQuotaException.class);
     }
 
     @Test
-    public void setInMailboxesShouldThrowWhenStorageQuotaExceededWhenCopiedToMultipleMailboxes() throws Exception {
+    void setInMailboxesShouldThrowWhenStorageQuotaExceededWhenCopiedToMultipleMailboxes() throws Exception {
         maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(2 * testingData.getConstantMessageSize()));
 
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
 
-        expectedException.expect(OverQuotaException.class);
-        messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId(), mailbox3.getMailboxId()), session);
+        assertThatThrownBy(() -> messageIdManager.setInMailboxes(messageId,
+                ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId(), mailbox3.getMailboxId()),
+                session))
+            .isInstanceOf(OverQuotaException.class);
     }
 
     @Test
-    public void setInMailboxesShouldThrowWhenStorageMessageExceeded() throws Exception {
+    void setInMailboxesShouldThrowWhenStorageMessageExceeded() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(2));
 
         testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
 
-        expectedException.expect(OverQuotaException.class);
-        messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId(), mailbox3.getMailboxId()), session);
+        assertThatThrownBy(() -> messageIdManager.setInMailboxes(messageId,
+                ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId(), mailbox3.getMailboxId()),
+                session))
+            .isInstanceOf(OverQuotaException.class);
     }
 }
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 592281b..0a87367 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
@@ -66,9 +66,8 @@ import org.apache.james.metrics.api.NoopMetricFactory;
 import org.assertj.core.api.AbstractListAssert;
 import org.assertj.core.api.ObjectAssert;
 import org.assertj.core.api.SoftAssertions;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 
 import com.google.common.collect.ImmutableList;
@@ -87,9 +86,6 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
 
     private static final Flags FLAGS = new Flags();
 
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-
     private MessageIdManager messageIdManager;
     private MailboxSession session;
     private Mailbox mailbox1;
@@ -104,7 +100,8 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
 
     protected abstract MessageIdManagerTestSystem createTestSystem(QuotaManager quotaManager, EventBus eventBus, Set<PreDeletionHook> preDeletionHooks) throws Exception;
 
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         eventBus = new InVMEventBus(new InVmEventDelivery(new NoopMetricFactory()));
         eventCollector = new EventCollector();
         quotaManager = mock(QuotaManager.class);
@@ -130,7 +127,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deleteShouldCallEventDispatcher() throws Exception {
+    void deleteShouldCallEventDispatcher() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -153,7 +150,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
 
     @SuppressWarnings("unchecked")
     @Test
-    public void deletesShouldCallEventDispatcher() throws Exception {
+    void deletesShouldCallEventDispatcher() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId1 = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         MessageId messageId2 = testingData.persist(mailbox1.getMailboxId(), messageUid2, FLAGS, session);
@@ -178,7 +175,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deleteShouldNotCallEventDispatcherWhenMessageIsInWrongMailbox() throws Exception {
+    void deleteShouldNotCallEventDispatcherWhenMessageIsInWrongMailbox() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -189,7 +186,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deletesShouldCallAllPreDeletionHooks() throws Exception {
+    void deletesShouldCallAllPreDeletionHooks() throws Exception {
         givenUnlimitedQuota();
 
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
@@ -212,7 +209,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deletesShouldCallAllPreDeletionHooksOnEachMessageDeletionCall() throws Exception {
+    void deletesShouldCallAllPreDeletionHooksOnEachMessageDeletionCall() throws Exception {
         givenUnlimitedQuota();
 
         MessageId messageId1 = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
@@ -239,7 +236,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deletesShouldCallAllPreDeletionHooksOnEachMessageDeletionOnDifferentMailboxes() throws Exception {
+    void deletesShouldCallAllPreDeletionHooksOnEachMessageDeletionOnDifferentMailboxes() throws Exception {
         givenUnlimitedQuota();
 
         MessageId messageId1 = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
@@ -266,7 +263,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deletesShouldNotBeExecutedWhenOneOfPreDeleteHooksFails() throws Exception {
+    void deletesShouldNotBeExecutedWhenOneOfPreDeleteHooksFails() throws Exception {
         givenUnlimitedQuota();
         when(preDeletionHook1.notifyDelete(any(PreDeletionHook.DeleteOperation.class)))
             .thenThrow(new RuntimeException("throw at hook 1"));
@@ -283,7 +280,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deletesShouldBeExecutedAfterAllHooksFinish() throws Exception {
+    void deletesShouldBeExecutedAfterAllHooksFinish() throws Exception {
         givenUnlimitedQuota();
 
         CountDownLatch latchForHook1 = new CountDownLatch(1);
@@ -311,7 +308,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setInMailboxesShouldNotCallDispatcherWhenMessageAlreadyInMailbox() throws Exception {
+    void setInMailboxesShouldNotCallDispatcherWhenMessageAlreadyInMailbox() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -322,7 +319,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setInMailboxesShouldCallDispatcher() throws Exception {
+    void setInMailboxesShouldCallDispatcher() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -336,7 +333,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setInMailboxesShouldCallDispatcherWithMultipleMailboxes() throws Exception {
+    void setInMailboxesShouldCallDispatcherWithMultipleMailboxes() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -352,7 +349,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setInMailboxesShouldThrowExceptionWhenOverQuota() throws Exception {
+    void setInMailboxesShouldThrowExceptionWhenOverQuota() throws Exception {
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
 
         when(quotaManager.getStorageQuota(any(QuotaRoot.class))).thenReturn(
@@ -361,13 +358,14 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         when(quotaManager.getStorageQuota(any(QuotaRoot.class))).thenReturn(
             Quota.<QuotaSize>builder().used(QuotaSize.size(2)).computedLimit(QuotaSize.unlimited()).build());
 
-        expectedException.expect(OverQuotaException.class);
-
-        messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
+        assertThatThrownBy(() -> messageIdManager.setInMailboxes(messageId,
+                ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()),
+                session))
+            .isInstanceOf(OverQuotaException.class);
     }
 
     @Test
-    public void setInMailboxesShouldCallDispatchForOnlyAddedAndRemovedMailboxes() throws Exception {
+    void setInMailboxesShouldCallDispatchForOnlyAddedAndRemovedMailboxes() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
@@ -388,7 +386,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setFlagsShouldNotDispatchWhenFlagAlreadySet() throws Exception {
+    void setFlagsShouldNotDispatchWhenFlagAlreadySet() throws Exception {
         givenUnlimitedQuota();
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, newFlags, session);
@@ -400,7 +398,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setFlagsShouldNotDispatchWhenMessageAlreadyInMailbox() throws Exception {
+    void setFlagsShouldNotDispatchWhenMessageAlreadyInMailbox() throws Exception {
         givenUnlimitedQuota();
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, newFlags, session);
@@ -413,7 +411,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setFlagsShouldNotDispatchWhenMessageDoesNotBelongToMailbox() throws Exception {
+    void setFlagsShouldNotDispatchWhenMessageDoesNotBelongToMailbox() throws Exception {
         givenUnlimitedQuota();
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
@@ -425,7 +423,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setFlagsShouldNotDispatchWhenEmptyMailboxes() throws Exception {
+    void setFlagsShouldNotDispatchWhenEmptyMailboxes() throws Exception {
         givenUnlimitedQuota();
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
@@ -437,7 +435,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setFlagsShouldDispatchWhenMessageBelongsToAllMailboxes() throws Exception {
+    void setFlagsShouldDispatchWhenMessageBelongsToAllMailboxes() throws Exception {
         givenUnlimitedQuota();
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
@@ -450,7 +448,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setFlagsShouldDispatchWhenMessageBelongsToTheMailboxes() throws Exception {
+    void setFlagsShouldDispatchWhenMessageBelongsToTheMailboxes() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -479,7 +477,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deleteShouldNotDispatchEventWhenMessageDoesNotExist() throws Exception {
+    void deleteShouldNotDispatchEventWhenMessageDoesNotExist() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.createNotUsedMessageId();
 
@@ -490,7 +488,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void deletesShouldNotDispatchEventWhenMessageDoesNotExist() throws Exception {
+    void deletesShouldNotDispatchEventWhenMessageDoesNotExist() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.createNotUsedMessageId();
 
@@ -501,7 +499,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setFlagsShouldNotDispatchEventWhenMessageDoesNotExist() throws Exception {
+    void setFlagsShouldNotDispatchEventWhenMessageDoesNotExist() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.createNotUsedMessageId();
 
@@ -512,7 +510,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
     }
 
     @Test
-    public void setInMailboxesShouldNotDispatchEventWhenMessageDoesNotExist() throws Exception {
+    void setInMailboxesShouldNotDispatchEventWhenMessageDoesNotExist() throws Exception {
         givenUnlimitedQuota();
         MessageId messageId = testingData.createNotUsedMessageId();
 
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 3ea3167..966ff22 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
@@ -47,9 +47,8 @@ import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
@@ -70,12 +69,10 @@ public abstract class AbstractMessageIdManagerStorageTest {
     private MailboxSession bobSession;
     private MailboxSession systemSession;
 
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-
     protected abstract MessageIdManagerTestSystem createTestingData() throws Exception;
 
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         aliceSession = MailboxSessionUtil.create(MailboxFixture.ALICE);
         bobSession = MailboxSessionUtil.create(MailboxFixture.BOB);
         systemSession = MailboxSessionUtil.create(Username.of("systemuser"));
@@ -89,7 +86,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void getMessagesShouldReturnEmptyListWhenMessageIdNotUsed() throws Exception {
+    void getMessagesShouldReturnEmptyListWhenMessageIdNotUsed() throws Exception {
         MessageId messageId = testingData.createNotUsedMessageId();
 
         assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession))
@@ -97,14 +94,14 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldNotFailWhenMessageDoesNotExist() throws Exception {
+    void setFlagsShouldNotFailWhenMessageDoesNotExist() throws Exception {
         MessageId messageId = testingData.createNotUsedMessageId();
 
         messageIdManager.setFlags(FLAGS, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
     }
 
     @Test
-    public void deleteMessageShouldReturnNotFoundWhenMessageDoesNotExist() throws MailboxException {
+    void deleteMessageShouldReturnNotFoundWhenMessageDoesNotExist() throws MailboxException {
         MessageId messageId = testingData.createNotUsedMessageId();
 
         assertThat(messageIdManager.delete(messageId, bobSession))
@@ -112,14 +109,14 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldNotFailWhenMessageDoesNotExist() throws Exception {
+    void setInMailboxesShouldNotFailWhenMessageDoesNotExist() throws Exception {
         MessageId messageId = testingData.createNotUsedMessageId();
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
     }
 
     @Test
-    public void getMessagesShouldReturnStoredResults() throws Exception {
+    void getMessagesShouldReturnStoredResults() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession))
@@ -127,7 +124,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void getMessageShouldReturnOnlyMessageBelongingToCurrentUser() throws Exception {
+    void getMessageShouldReturnOnlyMessageBelongingToCurrentUser() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroupImpl.MINIMAL, aliceSession)).hasSize(1);
@@ -135,7 +132,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldSetMessageInBothMailboxes() throws Exception {
+    void setInMailboxesShouldSetMessageInBothMailboxes() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
@@ -145,7 +142,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldNotDuplicateMessageIfSameMailbox() throws Exception {
+    void setInMailboxesShouldNotDuplicateMessageIfSameMailbox() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
@@ -155,7 +152,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldSetHighestUidInNewMailbox() throws Exception {
+    void setInMailboxesShouldSetHighestUidInNewMailbox() throws Exception {
         MessageId messageId1 = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         MessageId messageId2 = testingData.persist(aliceMailbox2.getMailboxId(), messageUid2, FLAGS, aliceSession);
 
@@ -175,7 +172,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldSetHighestModSeqInNewMailbox() throws Exception {
+    void setInMailboxesShouldSetHighestModSeqInNewMailbox() throws Exception {
         MessageId messageId1 = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         MessageId messageId2 = testingData.persist(aliceMailbox2.getMailboxId(), messageUid2, FLAGS, aliceSession);
 
@@ -195,7 +192,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldNotChangeUidAndModSeqInOriginalMailbox() throws Exception {
+    void setInMailboxesShouldNotChangeUidAndModSeqInOriginalMailbox() throws Exception {
         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();
@@ -216,7 +213,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldAddAndRemoveMailboxes() throws Exception {
+    void setInMailboxesShouldAddAndRemoveMailboxes() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox3.getMailboxId()), aliceSession);
@@ -230,7 +227,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldReplaceFlagsOfMessageInAddedMailboxes() throws Exception {
+    void setInMailboxesShouldReplaceFlagsOfMessageInAddedMailboxes() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
@@ -247,25 +244,27 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldThrowExceptionWhenSetInMailboxesInAnotherSession() throws Exception {
-        expectedException.expect(MailboxNotFoundException.class);
-
+    void setInMailboxesShouldThrowExceptionWhenSetInMailboxesInAnotherSession() {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), bobSession);
+        assertThatThrownBy(() -> messageIdManager.setInMailboxes(messageId,
+                ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()),
+                bobSession))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void setInMailboxesShouldThrowExceptionWhenOneMailboxDoesNotBelongToMailboxSession() throws Exception {
-        expectedException.expect(MailboxNotFoundException.class);
-
+    void setInMailboxesShouldThrowExceptionWhenOneMailboxDoesNotBelongToMailboxSession() {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), bobMailbox1.getMailboxId()), aliceSession);
+        assertThatThrownBy(() -> messageIdManager.setInMailboxes(messageId,
+                ImmutableList.of(aliceMailbox1.getMailboxId(), bobMailbox1.getMailboxId()),
+                aliceSession))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void setInMailboxesShouldIgnoreMessagesBelongingToOtherUsers() throws Exception {
+    void setInMailboxesShouldIgnoreMessagesBelongingToOtherUsers() throws Exception {
         MessageId messageId = testingData.persist(bobMailbox1.getMailboxId(), messageUid1, FLAGS, bobSession);
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
@@ -274,7 +273,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteMessageShouldRemoveMessageFromMailbox() throws Exception {
+    void deleteMessageShouldRemoveMessageFromMailbox() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
@@ -283,7 +282,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteAllMessageShouldRemoveMessageFromMailbox() throws Exception {
+    void deleteAllMessageShouldRemoveMessageFromMailbox() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         messageIdManager.delete(messageId, aliceSession);
@@ -292,7 +291,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteMessageShouldRemoveMessageOnlyFromMailbox() throws Exception {
+    void deleteMessageShouldRemoveMessageOnlyFromMailbox() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
@@ -304,7 +303,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteAllShouldRemoveMessageFromAllMailbox() throws Exception {
+    void deleteAllShouldRemoveMessageFromAllMailbox() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
@@ -314,7 +313,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteMessageShouldNotRemoveMessageOnAnotherMailbox() throws Exception {
+    void deleteMessageShouldNotRemoveMessageOnAnotherMailbox() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox2.getMailboxId()), aliceSession);
@@ -325,16 +324,15 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteMessageShouldThrowExceptionWhenDeletingOnOtherSession() throws Exception {
-        expectedException.expect(MailboxNotFoundException.class);
-
+    void deleteMessageShouldThrowExceptionWhenDeletingOnOtherSession() {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
+        assertThatThrownBy(() -> messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void deleteAllShouldReturnNotFoundWhenDeletingOnOtherSession() throws Exception {
+    void deleteAllShouldReturnNotFoundWhenDeletingOnOtherSession() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         assertThat(messageIdManager.delete(messageId, bobSession))
@@ -342,25 +340,23 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteMessageShouldThrowExceptionWhenDeletingOnSystemSession() throws Exception {
-        expectedException.expect(MailboxNotFoundException.class);
-
+    void deleteMessageShouldThrowExceptionWhenDeletingOnSystemSession() {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), systemSession);
+        assertThatThrownBy(() -> messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), systemSession))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void deleteMessageShouldThrowExceptionWhenOneMailboxDoesNotBelongToUser() throws Exception {
-        expectedException.expect(MailboxNotFoundException.class);
-
+    void deleteMessageShouldThrowExceptionWhenOneMailboxDoesNotBelongToUser() {
         MessageId messageId = testingData.persist(bobMailbox1.getMailboxId(), messageUid1, FLAGS, bobSession);
 
-        messageIdManager.delete(messageId, ImmutableList.of(bobMailbox1.getMailboxId()), aliceSession);
+        assertThatThrownBy(() -> messageIdManager.delete(messageId, ImmutableList.of(bobMailbox1.getMailboxId()), aliceSession))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void setFlagsShouldUpdateFlags() throws Exception {
+    void setFlagsShouldUpdateFlags() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
@@ -371,7 +367,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldNotChangeTheUid() throws Exception {
+    void setFlagsShouldNotChangeTheUid() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
@@ -387,7 +383,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldChangeTheModSeq() throws Exception {
+    void setFlagsShouldChangeTheModSeq() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
@@ -403,7 +399,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldChangeFlagsInAllMailboxes() throws Exception {
+    void setFlagsShouldChangeFlagsInAllMailboxes() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
@@ -421,7 +417,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldNotChangeFlagsOfAnotherMessageInSameMailbox() throws Exception {
+    void setFlagsShouldNotChangeFlagsOfAnotherMessageInSameMailbox() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId1 = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         MessageId messageId2 = testingData.persist(aliceMailbox1.getMailboxId(), messageUid2, FLAGS, aliceSession);
@@ -438,7 +434,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldNotChangeFlagsWhenEmptyMailboxes() throws Exception {
+    void setFlagsShouldNotChangeFlagsWhenEmptyMailboxes() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId1 = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
@@ -454,7 +450,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldNotChangeFlagsWhenMessageDoesNotBelongToTheMailboxes() throws Exception {
+    void setFlagsShouldNotChangeFlagsWhenMessageDoesNotBelongToTheMailboxes() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId1 = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
@@ -470,7 +466,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldChangeFlagsWhenMessageBelongsToTheMailboxes() throws Exception {
+    void setFlagsShouldChangeFlagsWhenMessageBelongsToTheMailboxes() throws Exception {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId1 = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         MessageId messageId2 = testingData.persist(aliceMailbox2.getMailboxId(), messageUid2, FLAGS, aliceSession);
@@ -487,37 +483,46 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldThrowExceptionWhenSetFlagsOnOtherSession() throws Exception {
-        expectedException.expect(MailboxNotFoundException.class);
-
+    void setFlagsShouldThrowExceptionWhenSetFlagsOnOtherSession() {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
+        assertThatThrownBy(() -> messageIdManager.setFlags(newFlags,
+                MessageManager.FlagsUpdateMode.ADD,
+                messageId,
+                ImmutableList.of(aliceMailbox1.getMailboxId()),
+                bobSession))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void setFlagsShouldThrowExceptionWhenSetFlagsOnSystemSession() throws Exception {
-        expectedException.expect(MailboxNotFoundException.class);
-
+    void setFlagsShouldThrowExceptionWhenSetFlagsOnSystemSession() {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), systemSession);
+        assertThatThrownBy(() -> messageIdManager.setFlags(newFlags,
+                MessageManager.FlagsUpdateMode.ADD,
+                messageId,
+                ImmutableList.of(aliceMailbox1.getMailboxId()),
+                systemSession))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void setFlagsShouldThrowExceptionWhenMailboxDoesNotBelongToMailboxSession() throws Exception {
-        expectedException.expect(MailboxNotFoundException.class);
+    void setFlagsShouldThrowExceptionWhenMailboxDoesNotBelongToMailboxSession() {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), bobMailbox1.getMailboxId()), aliceSession);
-
+        assertThatThrownBy(() -> messageIdManager.setFlags(newFlags,
+                MessageManager.FlagsUpdateMode.ADD,
+                messageId,
+                ImmutableList.of(aliceMailbox1.getMailboxId(), bobMailbox1.getMailboxId()),
+                aliceSession))
+            .isInstanceOf(MailboxNotFoundException.class);
     }
 
     @Test
-    public void getMessageShouldBeEmptyWhenMessageHasNoMoreMailboxes() throws Exception {
+    void getMessageShouldBeEmptyWhenMessageHasNoMoreMailboxes() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         testingData.deleteMailbox(aliceMailbox1.getMailboxId(), aliceSession);
@@ -526,7 +531,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldPreserveMessageFromOneMailboxDeletion() throws Exception {
+    void setInMailboxesShouldPreserveMessageFromOneMailboxDeletion() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox2.getMailboxId()), aliceSession);
 
@@ -538,7 +543,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void accessibleMessagesShouldReturnMessageIdsThatBelongsToTheUser() throws Exception {
+    void accessibleMessagesShouldReturnMessageIdsThatBelongsToTheUser() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         assertThat(messageIdManager.accessibleMessages(ImmutableList.of(messageId), aliceSession))
@@ -546,19 +551,19 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void accessibleMessagesShouldReturnEmptyWhenSuppliedMessageIdsAreEmpty() throws Exception {
+    void accessibleMessagesShouldReturnEmptyWhenSuppliedMessageIdsAreEmpty() throws Exception {
         assertThat(messageIdManager.accessibleMessages(ImmutableList.of(), aliceSession))
             .isEmpty();
     }
 
     @Test
-    public void accessibleMessagesShouldFilterOutMessageIdsWhenNotExisting() throws Exception {
+    void accessibleMessagesShouldFilterOutMessageIdsWhenNotExisting() throws Exception {
         assertThat(messageIdManager.accessibleMessages(ImmutableList.of(testingData.createNotUsedMessageId()), aliceSession))
             .isEmpty();
     }
 
     @Test
-    public void accessibleMessagesShouldFilterOutMessageIdsWhenNotBelongingToTheUser() throws Exception {
+    void accessibleMessagesShouldFilterOutMessageIdsWhenNotBelongingToTheUser() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
         assertThat(messageIdManager.accessibleMessages(ImmutableList.of(messageId), bobSession))
@@ -570,7 +575,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void getMessagesShouldReturnMessagesWhenReadDelegated() throws Exception {
+    void getMessagesShouldReturnMessagesWhenReadDelegated() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -589,7 +594,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void getMessagesShouldNotReturnMessagesWhenNotReadDelegated() throws Exception {
+    void getMessagesShouldNotReturnMessagesWhenNotReadDelegated() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -606,7 +611,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldUpdateFlagsWhenWriteDelegated() throws Exception {
+    void setFlagsShouldUpdateFlagsWhenWriteDelegated() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -627,7 +632,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setFlagsShouldNotUpdateFlagsWhenNotWriteDelegated() throws Exception {
+    void setFlagsShouldNotUpdateFlagsWhenNotWriteDelegated() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -649,7 +654,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldAllowCopyingMessageFromReadOnlySharedMailbox() throws Exception {
+    void setInMailboxesShouldAllowCopyingMessageFromReadOnlySharedMailbox() throws Exception {
         //Given
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
@@ -674,7 +679,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldDenyCopyingMessageFromNotReadSharedMailbox() throws Exception {
+    void setInMailboxesShouldDenyCopyingMessageFromNotReadSharedMailbox() throws Exception {
         //Given
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
@@ -702,7 +707,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldAllowCopyingToAInsertSharedMailbox() throws Exception {
+    void setInMailboxesShouldAllowCopyingToAInsertSharedMailbox() throws Exception {
         //Given
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
@@ -730,7 +735,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldDenyCopyingToANonInsertSharedMailbox() throws Exception {
+    void setInMailboxesShouldDenyCopyingToANonInsertSharedMailbox() throws Exception {
         //Given
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
@@ -762,7 +767,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldAllowMovingMessagesFromASharedMailboxWhenDeleteRight() throws Exception {
+    void setInMailboxesShouldAllowMovingMessagesFromASharedMailboxWhenDeleteRight() throws Exception {
         //Given
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
@@ -790,7 +795,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldDenyMovingMessagesFromASharedMailboxWhenNoDeleteRight() throws Exception {
+    void setInMailboxesShouldDenyMovingMessagesFromASharedMailboxWhenNoDeleteRight() throws Exception {
         //Given
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
@@ -822,7 +827,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxShouldAllowDistinctMailboxSetForShareeAndOwner() throws Exception {
+    void setInMailboxShouldAllowDistinctMailboxSetForShareeAndOwner() throws Exception {
         //Given
         testingData.setACL(aliceMailbox2.getMailboxId(),
             MailboxACL.EMPTY.apply(
@@ -864,7 +869,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteShouldRemoveMessagesFromSharedMailboxWhenAllowed() throws Exception {
+    void deleteShouldRemoveMessagesFromSharedMailboxWhenAllowed() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -882,7 +887,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void deleteShouldNotRemoveMessagesFromSharedMailboxWhenNotAllowed() throws Exception {
+    void deleteShouldNotRemoveMessagesFromSharedMailboxWhenNotAllowed() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -903,7 +908,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void accessibleMessagesShouldReturnMessagesWhenReadDelegated() throws Exception {
+    void accessibleMessagesShouldReturnMessagesWhenReadDelegated() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -920,7 +925,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void accessibleMessagesShouldNotReturnMessagesWhenNotReadDelegated() throws Exception {
+    void accessibleMessagesShouldNotReturnMessagesWhenNotReadDelegated() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -937,7 +942,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldSanitizeFlagsWhenNoWriteRight() throws Exception {
+    void setInMailboxesShouldSanitizeFlagsWhenNoWriteRight() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
@@ -957,7 +962,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     }
 
     @Test
-    public void setInMailboxesShouldPreserveFlagsWhenWriteRight() throws Exception {
+    void setInMailboxesShouldPreserveFlagsWhenWriteRight() throws Exception {
         testingData.setACL(aliceMailbox1.getMailboxId(),
             MailboxACL.EMPTY.apply(
                 MailboxACL.command()
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
index e4feba0..f085ff8 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
@@ -26,8 +26,8 @@ import java.util.List;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.store.user.model.Subscription;
 import org.apache.james.mailbox.store.user.model.impl.SimpleSubscription;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 public abstract class SubscriptionMapperTest {
     private static final String USER_1 = "user1";
@@ -39,27 +39,27 @@ public abstract class SubscriptionMapperTest {
 
     protected abstract SubscriptionMapper createSubscriptionMapper();
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         testee = createSubscriptionMapper();
     }
 
     @Test
-    public void findSubscriptionsForUserShouldBeEmptyByDefault() throws SubscriptionException {
+    void findSubscriptionsForUserShouldBeEmptyByDefault() throws SubscriptionException {
         List<Subscription> subscriptions = testee.findSubscriptionsForUser(USER_1);
 
         assertThat(subscriptions).isEmpty();
     }
 
     @Test
-    public void findMailboxSubscriptionForUserShouldReturnNullByDefault() throws SubscriptionException {
+    void findMailboxSubscriptionForUserShouldReturnNullByDefault() throws SubscriptionException {
         Subscription subscriptions = testee.findMailboxSubscriptionForUser(USER_1,MAILBOX_1);
 
         assertThat(subscriptions).isNull();
     }
 
     @Test
-    public void findMailboxSubscriptionForUserShouldReturnSubscription() throws SubscriptionException {
+    void findMailboxSubscriptionForUserShouldReturnSubscription() throws SubscriptionException {
         SimpleSubscription subscription = new SimpleSubscription(USER_1, MAILBOX_1);
         testee.save(subscription);
 
@@ -69,7 +69,7 @@ public abstract class SubscriptionMapperTest {
     }
 
     @Test
-    public void findSubscriptionsForUserShouldReturnSubscriptions() throws SubscriptionException {
+    void findSubscriptionsForUserShouldReturnSubscriptions() throws SubscriptionException {
         SimpleSubscription subscription1 = new SimpleSubscription(USER_1, MAILBOX_1);
         SimpleSubscription subscription2 = new SimpleSubscription(USER_1, MAILBOX_2);
         testee.save(subscription1);
@@ -81,7 +81,7 @@ public abstract class SubscriptionMapperTest {
     }
 
     @Test
-    public void findSubscriptionsForUserShouldReturnOnlyUserSubscriptions() throws SubscriptionException {
+    void findSubscriptionsForUserShouldReturnOnlyUserSubscriptions() throws SubscriptionException {
         SimpleSubscription subscription1 = new SimpleSubscription(USER_1,MAILBOX_1);
         SimpleSubscription subscription2 = new SimpleSubscription(USER_2,MAILBOX_2);
         testee.save(subscription1);
@@ -93,7 +93,7 @@ public abstract class SubscriptionMapperTest {
     }
 
     @Test
-    public void findMailboxSubscriptionForUserShouldReturnOnlyUserSubscriptions() throws SubscriptionException {
+    void findMailboxSubscriptionForUserShouldReturnOnlyUserSubscriptions() throws SubscriptionException {
         SimpleSubscription subscription1 = new SimpleSubscription(USER_1,MAILBOX_1);
         SimpleSubscription subscription2 = new SimpleSubscription(USER_2,MAILBOX_1);
         testee.save(subscription1);
@@ -105,7 +105,7 @@ public abstract class SubscriptionMapperTest {
     }
 
     @Test
-    public void findMailboxSubscriptionForUserShouldReturnSubscriptionConcerningTheMailbox() throws SubscriptionException {
+    void findMailboxSubscriptionForUserShouldReturnSubscriptionConcerningTheMailbox() throws SubscriptionException {
         SimpleSubscription subscription1 = new SimpleSubscription(USER_1,MAILBOX_1);
         SimpleSubscription subscription2 = new SimpleSubscription(USER_1,MAILBOX_2);
         testee.save(subscription1);
@@ -117,7 +117,7 @@ public abstract class SubscriptionMapperTest {
     }
 
     @Test
-    public void deleteShouldRemoveSubscription() throws SubscriptionException {
+    void deleteShouldRemoveSubscription() throws SubscriptionException {
         SimpleSubscription subscription = new SimpleSubscription(USER_1, MAILBOX_1);
         testee.save(subscription);
 


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


[james-project] 38/43: JAMES-2964 forbid to create quotas with negative number

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

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

commit 92750e2165cd5c51dd412da877da3b90d6d8c664
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Wed Nov 6 15:06:25 2019 +0100

    JAMES-2964 forbid to create quotas with negative number
---
 .../org/apache/james/core/quota/QuotaCount.java    |  2 +
 .../org/apache/james/core/quota/QuotaSize.java     |  2 +
 .../org/apache/james/core/quota/QuotaValue.java    |  6 ++
 .../org/apache/james/webadmin/dto/QuotaDTO.java    | 21 ++---
 .../apache/james/webadmin/dto/QuotaDetailsDTO.java | 36 ++++----
 .../apache/james/webadmin/dto/QuotaDomainDTO.java  | 26 +++---
 .../dto/{QuotaDTO.java => ValidatedQuotaDTO.java}  | 15 ++--
 .../james/webadmin/routes/DomainQuotaRoutes.java   | 44 ++++------
 .../james/webadmin/routes/GlobalQuotaRoutes.java   | 15 ++--
 .../james/webadmin/routes/UserQuotaRoutes.java     | 22 ++++-
 .../james/webadmin/service/DomainQuotaService.java | 10 +--
 .../james/webadmin/service/GlobalQuotaService.java |  8 +-
 .../james/webadmin/service/UserQuotaService.java   | 12 +--
 .../webadmin/validation/QuotaDTOValidator.java     | 70 ++++++++++++++++
 .../webadmin/dto/QuotaValueDeserializerTest.java   |  4 +-
 .../webadmin/routes/DomainQuotaRoutesTest.java     | 73 ++++++++++++++++
 .../webadmin/routes/GlobalQuotaRoutesTest.java     | 80 ++++++++++++++++++
 .../james/webadmin/routes/UserQuotaRoutesTest.java | 97 +++++++++++++++++++++-
 18 files changed, 436 insertions(+), 107 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaCount.java b/core/src/main/java/org/apache/james/core/quota/QuotaCount.java
index eef03fa..0eb6915 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaCount.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaCount.java
@@ -22,6 +22,7 @@ import java.util.Optional;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
 
 public class QuotaCount implements QuotaValue<QuotaCount> {
 
@@ -40,6 +41,7 @@ public class QuotaCount implements QuotaValue<QuotaCount> {
     private final Optional<Long> value;
 
     private QuotaCount(Optional<Long> value) {
+        Preconditions.checkArgument(QuotaValue.isValidValue(value), "Quota limit should be positive");
         this.value = value;
     }
 
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaSize.java b/core/src/main/java/org/apache/james/core/quota/QuotaSize.java
index 6d1f2ac..22d788f 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaSize.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaSize.java
@@ -22,6 +22,7 @@ import java.util.Optional;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
 
 public class QuotaSize implements QuotaValue<QuotaSize> {
 
@@ -42,6 +43,7 @@ public class QuotaSize implements QuotaValue<QuotaSize> {
     private final Optional<Long> value;
 
     private QuotaSize(Optional<Long> value) {
+        Preconditions.checkArgument(QuotaValue.isValidValue(value), "Quota limit should be positive");
         this.value = value;
     }
 
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaValue.java b/core/src/main/java/org/apache/james/core/quota/QuotaValue.java
index f4342d3..4f07eec 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaValue.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaValue.java
@@ -18,8 +18,14 @@
  ****************************************************************/
 package org.apache.james.core.quota;
 
+import java.util.Optional;
+
 public interface QuotaValue<T extends QuotaValue<T>> {
 
+    static boolean isValidValue(Optional<Long> value) {
+        return !value.isPresent() || value.get() >= 0;
+    }
+
     long asLong();
 
     boolean isLimited();
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDTO.java
index 9a02cc6..f7a1ba7 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDTO.java
@@ -23,9 +23,6 @@ package org.apache.james.webadmin.dto;
 import java.util.Objects;
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
-
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.base.MoreObjects;
@@ -39,20 +36,20 @@ public class QuotaDTO {
 
     @JsonPOJOBuilder(withPrefix = "")
     public static class Builder {
-        private Optional<QuotaCount> count;
-        private Optional<QuotaSize> size;
+        private Optional<Long> count;
+        private Optional<Long> size;
 
         private Builder() {
             count = Optional.empty();
             size = Optional.empty();
         }
 
-        public Builder count(Optional<QuotaCount> count) {
+        public Builder count(Optional<Long> count) {
             this.count = count;
             return this;
         }
 
-        public Builder size(Optional<QuotaSize> size) {
+        public Builder size(Optional<Long> size) {
             this.size = size;
             return this;
         }
@@ -62,19 +59,19 @@ public class QuotaDTO {
         }
     }
 
-    private final Optional<QuotaCount> count;
-    private final Optional<QuotaSize> size;
+    private final Optional<Long> count;
+    private final Optional<Long> size;
 
-    private QuotaDTO(Optional<QuotaCount> count, Optional<QuotaSize> size) {
+    private QuotaDTO(Optional<Long> count, Optional<Long> size) {
         this.count = count;
         this.size = size;
     }
 
-    public Optional<QuotaCount> getCount() {
+    public Optional<Long> getCount() {
         return count;
     }
 
-    public Optional<QuotaSize> getSize() {
+    public Optional<Long> getSize() {
         return size;
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
index 9042122..7449c90 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
@@ -35,10 +35,10 @@ public class QuotaDetailsDTO {
     }
 
     public static class Builder {
-        private Optional<QuotaDTO> global;
-        private Optional<QuotaDTO> domain;
-        private Optional<QuotaDTO> user;
-        private Optional<QuotaDTO> computed;
+        private Optional<ValidatedQuotaDTO> global;
+        private Optional<ValidatedQuotaDTO> domain;
+        private Optional<ValidatedQuotaDTO> user;
+        private Optional<ValidatedQuotaDTO> computed;
         private OccupationDTO occupation;
 
         private Builder() {
@@ -47,22 +47,22 @@ public class QuotaDetailsDTO {
             computed = Optional.empty();
         }
 
-        public Builder global(QuotaDTO global) {
+        public Builder global(ValidatedQuotaDTO global) {
             this.global = Optional.of(global);
             return this;
         }
 
-        public Builder domain(QuotaDTO domain) {
+        public Builder domain(ValidatedQuotaDTO domain) {
             this.domain = Optional.of(domain);
             return this;
         }
 
-        public Builder user(QuotaDTO user) {
+        public Builder user(ValidatedQuotaDTO user) {
             this.user = Optional.of(user);
             return this;
         }
 
-        public Builder computed(QuotaDTO computed) {
+        public Builder computed(ValidatedQuotaDTO computed) {
             this.computed = Optional.of(computed);
             return this;
         }
@@ -72,7 +72,7 @@ public class QuotaDetailsDTO {
             return this;
         }
 
-        public Builder valueForScope(Quota.Scope scope, QuotaDTO value) {
+        public Builder valueForScope(Quota.Scope scope, ValidatedQuotaDTO value) {
             switch (scope) {
                 case Global:
                     return global(value);
@@ -90,13 +90,13 @@ public class QuotaDetailsDTO {
         }
     }
 
-    private final Optional<QuotaDTO> global;
-    private final Optional<QuotaDTO> domain;
-    private final Optional<QuotaDTO> user;
-    private final Optional<QuotaDTO> computed;
+    private final Optional<ValidatedQuotaDTO> global;
+    private final Optional<ValidatedQuotaDTO> domain;
+    private final Optional<ValidatedQuotaDTO> user;
+    private final Optional<ValidatedQuotaDTO> computed;
     private final OccupationDTO occupation;
 
-    private QuotaDetailsDTO(Optional<QuotaDTO> global, Optional<QuotaDTO> domain, Optional<QuotaDTO> user, Optional<QuotaDTO> computed, OccupationDTO occupation) {
+    private QuotaDetailsDTO(Optional<ValidatedQuotaDTO> global, Optional<ValidatedQuotaDTO> domain, Optional<ValidatedQuotaDTO> user, Optional<ValidatedQuotaDTO> computed, OccupationDTO occupation) {
         this.global = global;
         this.domain = domain;
         this.user = user;
@@ -104,19 +104,19 @@ public class QuotaDetailsDTO {
         this.occupation = occupation;
     }
 
-    public Optional<QuotaDTO> getGlobal() {
+    public Optional<ValidatedQuotaDTO> getGlobal() {
         return global;
     }
 
-    public Optional<QuotaDTO> getDomain() {
+    public Optional<ValidatedQuotaDTO> getDomain() {
         return domain;
     }
 
-    public Optional<QuotaDTO> getUser() {
+    public Optional<ValidatedQuotaDTO> getUser() {
         return user;
     }
 
-    public Optional<QuotaDTO> getComputed() {
+    public Optional<ValidatedQuotaDTO> getComputed() {
         return computed;
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDomainDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDomainDTO.java
index 527491f..4113418 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDomainDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDomainDTO.java
@@ -29,26 +29,26 @@ public class QuotaDomainDTO {
     }
 
     public static class Builder {
-        private Optional<QuotaDTO> global;
-        private Optional<QuotaDTO> domain;
-        private Optional<QuotaDTO> computed;
+        private Optional<ValidatedQuotaDTO> global;
+        private Optional<ValidatedQuotaDTO> domain;
+        private Optional<ValidatedQuotaDTO> computed;
 
         private Builder() {
             global = Optional.empty();
             computed = Optional.empty();
         }
 
-        public Builder global(QuotaDTO.Builder global) {
+        public Builder global(ValidatedQuotaDTO.Builder global) {
             this.global = Optional.of(global.build());
             return this;
         }
 
-        public Builder domain(QuotaDTO.Builder domain) {
+        public Builder domain(ValidatedQuotaDTO.Builder domain) {
             this.domain = Optional.of(domain.build());
             return this;
         }
 
-        public Builder computed(QuotaDTO.Builder computed) {
+        public Builder computed(ValidatedQuotaDTO.Builder computed) {
             this.computed = Optional.of(computed.build());
             return this;
         }
@@ -58,25 +58,25 @@ public class QuotaDomainDTO {
         }
     }
 
-    private final Optional<QuotaDTO> global;
-    private final Optional<QuotaDTO> domain;
-    private final Optional<QuotaDTO> computed;
+    private final Optional<ValidatedQuotaDTO> global;
+    private final Optional<ValidatedQuotaDTO> domain;
+    private final Optional<ValidatedQuotaDTO> computed;
 
-    private QuotaDomainDTO(Optional<QuotaDTO> global, Optional<QuotaDTO> domain, Optional<QuotaDTO> computed) {
+    private QuotaDomainDTO(Optional<ValidatedQuotaDTO> global, Optional<ValidatedQuotaDTO> domain, Optional<ValidatedQuotaDTO> computed) {
         this.global = global;
         this.domain = domain;
         this.computed = computed;
     }
 
-    public Optional<QuotaDTO> getGlobal() {
+    public Optional<ValidatedQuotaDTO> getGlobal() {
         return global;
     }
 
-    public Optional<QuotaDTO> getDomain() {
+    public Optional<ValidatedQuotaDTO> getDomain() {
         return domain;
     }
 
-    public Optional<QuotaDTO> getComputed() {
+    public Optional<ValidatedQuotaDTO> getComputed() {
         return computed;
     }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/ValidatedQuotaDTO.java
similarity index 88%
copy from server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDTO.java
copy to server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/ValidatedQuotaDTO.java
index 9a02cc6..6023096 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/ValidatedQuotaDTO.java
@@ -30,8 +30,8 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
 import com.google.common.base.MoreObjects;
 
-@JsonDeserialize(builder = QuotaDTO.Builder.class)
-public class QuotaDTO {
+@JsonDeserialize(builder = ValidatedQuotaDTO.Builder.class)
+public class ValidatedQuotaDTO {
 
     public static Builder builder() {
         return new Builder();
@@ -57,15 +57,16 @@ public class QuotaDTO {
             return this;
         }
 
-        public QuotaDTO build() {
-            return new QuotaDTO(count, size);
+        public ValidatedQuotaDTO build() {
+            return new ValidatedQuotaDTO(count, size);
         }
     }
 
+
     private final Optional<QuotaCount> count;
     private final Optional<QuotaSize> size;
 
-    private QuotaDTO(Optional<QuotaCount> count, Optional<QuotaSize> size) {
+    private ValidatedQuotaDTO(Optional<QuotaCount> count, Optional<QuotaSize> size) {
         this.count = count;
         this.size = size;
     }
@@ -80,8 +81,8 @@ public class QuotaDTO {
 
     @Override
     public boolean equals(Object o) {
-        if (o instanceof QuotaDTO) {
-            QuotaDTO that = (QuotaDTO) o;
+        if (o instanceof ValidatedQuotaDTO) {
+            ValidatedQuotaDTO that = (ValidatedQuotaDTO) o;
 
             return Objects.equals(this.count, that.count) &&
                 Objects.equals(this.size, that.size);
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
index 115bb83..c080910 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
@@ -40,14 +40,15 @@ import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.dto.QuotaDTO;
 import org.apache.james.webadmin.dto.QuotaDomainDTO;
+import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
 import org.apache.james.webadmin.service.DomainQuotaService;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.ErrorResponder.ErrorType;
-import org.apache.james.webadmin.utils.JsonExtractException;
 import org.apache.james.webadmin.utils.JsonExtractor;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.james.webadmin.utils.JsonTransformerModule;
 import org.apache.james.webadmin.utils.Responses;
+import org.apache.james.webadmin.validation.QuotaDTOValidator;
 import org.apache.james.webadmin.validation.Quotas;
 import org.eclipse.jetty.http.HttpStatus;
 
@@ -76,6 +77,7 @@ public class DomainQuotaRoutes implements Routes {
     private final UsersRepository usersRepository;
     private final JsonTransformer jsonTransformer;
     private final JsonExtractor<QuotaDTO> jsonExtractor;
+    private final QuotaDTOValidator quotaDTOValidator;
     private Service service;
 
     @Inject
@@ -85,6 +87,7 @@ public class DomainQuotaRoutes implements Routes {
         this.usersRepository = usersRepository;
         this.jsonTransformer = jsonTransformer;
         this.jsonExtractor = new JsonExtractor<>(QuotaDTO.class, modules.stream().map(JsonTransformerModule::asJacksonModule).collect(Collectors.toList()));
+        this.quotaDTOValidator = new QuotaDTOValidator();
     }
 
     @Override
@@ -130,10 +133,20 @@ public class DomainQuotaRoutes implements Routes {
     })
     public void defineUpdateQuota() {
         service.put(QUOTA_ENDPOINT, ((request, response) -> {
-            Domain domain = checkDomainExist(request);
-            QuotaDTO quotaDTO = parseQuotaDTO(request);
-            domainQuotaService.defineQuota(domain, quotaDTO);
-            return Responses.returnNoContent(response);
+            try {
+                Domain domain = checkDomainExist(request);
+                QuotaDTO quotaDTO = jsonExtractor.parse(request.body());
+                ValidatedQuotaDTO validatedQuotaDTO = quotaDTOValidator.validatedQuotaDTO(quotaDTO);
+                domainQuotaService.defineQuota(domain, validatedQuotaDTO);
+                return Responses.returnNoContent(response);
+            } catch (IllegalArgumentException e) {
+                throw ErrorResponder.builder()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .type(ErrorType.INVALID_ARGUMENT)
+                    .message("Quota should be positive or unlimited (-1)")
+                    .cause(e)
+                    .haltError();
+            }
         }));
     }
 
@@ -307,25 +320,4 @@ public class DomainQuotaRoutes implements Routes {
                 .haltError();
         }
     }
-
-    private QuotaDTO parseQuotaDTO(Request request) {
-        try {
-            return jsonExtractor.parse(request.body());
-        } catch (IllegalArgumentException e) {
-            throw ErrorResponder.builder()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .type(ErrorType.INVALID_ARGUMENT)
-                .message("Quota should be positive or unlimited (-1)")
-                .cause(e)
-                .haltError();
-        } catch (JsonExtractException e) {
-            throw ErrorResponder.builder()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .type(ErrorType.INVALID_ARGUMENT)
-                .message("Malformed JSON input")
-                .cause(e)
-                .haltError();
-        }
-    }
-
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java
index a1c4cb6..a4c255f 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java
@@ -33,14 +33,15 @@ import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.dto.QuotaDTO;
+import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
 import org.apache.james.webadmin.jackson.QuotaModule;
 import org.apache.james.webadmin.service.GlobalQuotaService;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.ErrorResponder.ErrorType;
-import org.apache.james.webadmin.utils.JsonExtractException;
 import org.apache.james.webadmin.utils.JsonExtractor;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.james.webadmin.utils.Responses;
+import org.apache.james.webadmin.validation.QuotaDTOValidator;
 import org.apache.james.webadmin.validation.Quotas;
 import org.eclipse.jetty.http.HttpStatus;
 
@@ -65,6 +66,7 @@ public class GlobalQuotaRoutes implements Routes {
 
     private final JsonTransformer jsonTransformer;
     private final JsonExtractor<QuotaDTO> jsonExtractor;
+    private final QuotaDTOValidator quotaDTOValidator;
     private final GlobalQuotaService globalQuotaService;
     private Service service;
 
@@ -73,6 +75,7 @@ public class GlobalQuotaRoutes implements Routes {
         this.globalQuotaService = globalQuotaService;
         this.jsonTransformer = jsonTransformer;
         this.jsonExtractor = new JsonExtractor<>(QuotaDTO.class, new QuotaModule().asJacksonModule());
+        quotaDTOValidator = new QuotaDTOValidator();
     }
 
     @Override
@@ -115,15 +118,9 @@ public class GlobalQuotaRoutes implements Routes {
         service.put(QUOTA_ENDPOINT, ((request, response) -> {
             try {
                 QuotaDTO quotaDTO = jsonExtractor.parse(request.body());
-                globalQuotaService.defineQuota(quotaDTO);
+                ValidatedQuotaDTO validatedQuotaDTO = quotaDTOValidator.validatedQuotaDTO(quotaDTO);
+                globalQuotaService.defineQuota(validatedQuotaDTO);
                 return Responses.returnNoContent(response);
-            } catch (JsonExtractException e) {
-                throw ErrorResponder.builder()
-                    .statusCode(HttpStatus.BAD_REQUEST_400)
-                    .type(ErrorType.INVALID_ARGUMENT)
-                    .message("Malformed JSON input")
-                    .cause(e)
-                    .haltError();
             } catch (IllegalArgumentException e) {
                 throw ErrorResponder.builder()
                     .statusCode(HttpStatus.BAD_REQUEST_400)
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
index e06818c..4fbf4cc 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
@@ -46,6 +46,7 @@ import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.dto.QuotaDTO;
 import org.apache.james.webadmin.dto.QuotaDetailsDTO;
+import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
 import org.apache.james.webadmin.service.UserQuotaService;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.ErrorResponder.ErrorType;
@@ -55,6 +56,7 @@ import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.james.webadmin.utils.JsonTransformerModule;
 import org.apache.james.webadmin.utils.ParametersExtractor;
 import org.apache.james.webadmin.utils.Responses;
+import org.apache.james.webadmin.validation.QuotaDTOValidator;
 import org.apache.james.webadmin.validation.Quotas;
 import org.eclipse.jetty.http.HttpStatus;
 
@@ -85,6 +87,7 @@ public class UserQuotaRoutes implements Routes {
     private final UserQuotaService userQuotaService;
     private final JsonTransformer jsonTransformer;
     private final JsonExtractor<QuotaDTO> jsonExtractor;
+    private final QuotaDTOValidator quotaDTOValidator;
     private Service service;
 
     @Inject
@@ -93,6 +96,7 @@ public class UserQuotaRoutes implements Routes {
         this.userQuotaService = userQuotaService;
         this.jsonTransformer = jsonTransformer;
         this.jsonExtractor = new JsonExtractor<>(QuotaDTO.class, modules.stream().map(JsonTransformerModule::asJacksonModule).collect(Collectors.toList()));
+        this.quotaDTOValidator = new QuotaDTOValidator();
     }
 
     @Override
@@ -131,10 +135,20 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineUpdateQuota() {
         service.put(QUOTA_ENDPOINT, ((request, response) -> {
-            Username username = checkUserExist(request);
-            QuotaDTO quotaDTO = parseQuotaDTO(request);
-            userQuotaService.defineQuota(username, quotaDTO);
-            return Responses.returnNoContent(response);
+            try {
+                Username username = checkUserExist(request);
+                QuotaDTO quotaDTO = jsonExtractor.parse(request.body());
+                ValidatedQuotaDTO validatedQuotaDTO = quotaDTOValidator.validatedQuotaDTO(quotaDTO);
+                userQuotaService.defineQuota(username, validatedQuotaDTO);
+                return Responses.returnNoContent(response);
+            } catch (IllegalArgumentException e) {
+                throw ErrorResponder.builder()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .type(ErrorType.INVALID_ARGUMENT)
+                    .message("Quota should be positive or unlimited (-1)")
+                    .cause(e)
+                    .haltError();
+            }
         }));
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java
index 0c30c19..e9b7491 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java
@@ -28,8 +28,8 @@ import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
-import org.apache.james.webadmin.dto.QuotaDTO;
 import org.apache.james.webadmin.dto.QuotaDomainDTO;
+import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
 
 public class DomainQuotaService {
 
@@ -66,22 +66,22 @@ public class DomainQuotaService {
 
     public QuotaDomainDTO getQuota(Domain domain) throws MailboxException {
         return QuotaDomainDTO.builder()
-            .domain(QuotaDTO
+            .domain(ValidatedQuotaDTO
                 .builder()
                 .count(maxQuotaManager.getDomainMaxMessage(domain))
                 .size(maxQuotaManager.getDomainMaxStorage(domain)))
-            .global(QuotaDTO
+            .global(ValidatedQuotaDTO
                 .builder()
                 .count(maxQuotaManager.getGlobalMaxMessage())
                 .size(maxQuotaManager.getGlobalMaxStorage()))
-            .computed(QuotaDTO
+            .computed(ValidatedQuotaDTO
                 .builder()
                 .count(maxQuotaManager.getComputedMaxMessage(domain))
                 .size(maxQuotaManager.getComputedMaxStorage(domain)))
             .build();
     }
 
-    public void defineQuota(Domain domain, QuotaDTO quota) {
+    public void defineQuota(Domain domain, ValidatedQuotaDTO quota) {
         try {
             if (quota.getCount().isPresent()) {
                 maxQuotaManager.setDomainMaxMessage(domain, quota.getCount().get());
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java
index 83e7a32..abd3aed 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java
@@ -26,7 +26,7 @@ import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
-import org.apache.james.webadmin.dto.QuotaDTO;
+import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
 
 public class GlobalQuotaService {
 
@@ -37,7 +37,7 @@ public class GlobalQuotaService {
         this.maxQuotaManager = maxQuotaManager;
     }
 
-    public void defineQuota(QuotaDTO quota) throws MailboxException {
+    public void defineQuota(ValidatedQuotaDTO quota) throws MailboxException {
         Optional<QuotaCount> count = quota.getCount();
         if (count.isPresent()) {
             maxQuotaManager.setGlobalMaxMessage(count.get());
@@ -53,8 +53,8 @@ public class GlobalQuotaService {
         }
     }
 
-    public QuotaDTO getQuota() throws MailboxException {
-        return QuotaDTO
+    public ValidatedQuotaDTO getQuota() throws MailboxException {
+        return ValidatedQuotaDTO
             .builder()
             .count(maxQuotaManager.getGlobalMaxMessage())
             .size(maxQuotaManager.getGlobalMaxStorage())
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
index 0edddc8..1aaf012 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
@@ -37,9 +37,9 @@ import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.quota.search.QuotaQuery;
 import org.apache.james.quota.search.QuotaSearcher;
-import org.apache.james.webadmin.dto.QuotaDTO;
 import org.apache.james.webadmin.dto.QuotaDetailsDTO;
 import org.apache.james.webadmin.dto.UsersQuotaDetailsDTO;
+import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
 
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
@@ -60,7 +60,7 @@ public class UserQuotaService {
         this.quotaSearcher = quotaSearcher;
     }
 
-    public void defineQuota(Username username, QuotaDTO quota) {
+    public void defineQuota(Username username, ValidatedQuotaDTO quota) {
         try {
             QuotaRoot quotaRoot = userQuotaRootResolver.forUser(username);
             if (quota.getCount().isPresent()) {
@@ -94,19 +94,19 @@ public class UserQuotaService {
         return quotaDetails.build();
     }
 
-    private QuotaDTO computedQuota(QuotaRoot quotaRoot) throws MailboxException {
-        return QuotaDTO
+    private ValidatedQuotaDTO computedQuota(QuotaRoot quotaRoot) throws MailboxException {
+        return ValidatedQuotaDTO
                 .builder()
                 .count(maxQuotaManager.getMaxMessage(quotaRoot))
                 .size(maxQuotaManager.getMaxStorage(quotaRoot))
                 .build();
     }
 
-    private Map<Quota.Scope, QuotaDTO> mergeMaps(Map<Quota.Scope, QuotaCount> counts, Map<Quota.Scope, QuotaSize> sizes) {
+    private Map<Quota.Scope, ValidatedQuotaDTO> mergeMaps(Map<Quota.Scope, QuotaCount> counts, Map<Quota.Scope, QuotaSize> sizes) {
        return Sets.union(counts.keySet(), sizes.keySet())
             .stream()
             .collect(Collectors.toMap(Function.identity(),
-                scope -> QuotaDTO
+                scope -> ValidatedQuotaDTO
                             .builder()
                             .count(Optional.ofNullable(counts.get(scope)))
                             .size(Optional.ofNullable(sizes.get(scope)))
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java
new file mode 100644
index 0000000..63de521
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java
@@ -0,0 +1,70 @@
+/****************************************************************
+ * 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.webadmin.validation;
+
+import java.util.Optional;
+
+import org.apache.james.core.quota.QuotaCount;
+import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.webadmin.dto.QuotaDTO;
+import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
+import org.apache.james.webadmin.utils.ErrorResponder;
+import org.eclipse.jetty.http.HttpStatus;
+
+public class QuotaDTOValidator {
+
+    private static final int UNLIMITED = -1;
+
+    public ValidatedQuotaDTO validatedQuotaDTO(QuotaDTO quotaDTO) {
+        try {
+            Optional<QuotaCount> count = quotaDTO.getCount()
+                .map(this::getQuotaCount);
+            Optional<QuotaSize> size = quotaDTO.getSize()
+                .map(this::getQuotaSize);
+
+            return ValidatedQuotaDTO.builder()
+                .count(count)
+                .size(size)
+                .build();
+        } catch (IllegalArgumentException e) {
+            throw ErrorResponder.builder()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
+                .message("Invalid quota. Need to be an integer value greater or equal to -1")
+                .cause(e)
+                .haltError();
+        }
+    }
+
+    private QuotaSize getQuotaSize(Long quotaValue) {
+        if (quotaValue == UNLIMITED) {
+            return QuotaSize.unlimited();
+        } else {
+            return QuotaSize.size(quotaValue);
+        }
+    }
+
+    private QuotaCount getQuotaCount(Long quotaValue) {
+        if (quotaValue == UNLIMITED) {
+            return QuotaCount.unlimited();
+        } else {
+            return QuotaCount.count(quotaValue);
+        }
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaValueDeserializerTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaValueDeserializerTest.java
index 8cb7f28..fd0d679 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaValueDeserializerTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaValueDeserializerTest.java
@@ -32,14 +32,14 @@ class QuotaValueDeserializerTest {
     @Test
     void objectDeserializeShouldContainGivenValues() throws JsonExtractException {
         String payload = "{\"count\":52,\"size\":42}";
-        QuotaDTO actual = new JsonExtractor<>(QuotaDTO.class,
+        ValidatedQuotaDTO actual = new JsonExtractor<>(ValidatedQuotaDTO.class,
             new SimpleModule()
                 .addDeserializer(QuotaCount.class, new QuotaValueDeserializer<>(QuotaCount.unlimited(), QuotaCount::count))
                 .addDeserializer(QuotaSize.class, new QuotaValueDeserializer<>(QuotaSize.unlimited(), QuotaSize::size))
         ).parse(payload);
         Assertions.assertThat(actual)
             .isEqualTo(
-                QuotaDTO
+                ValidatedQuotaDTO
                     .builder()
                     .count(java.util.Optional.of(QuotaCount.count(52)))
                     .size(java.util.Optional.of(QuotaSize.size(42)))
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java
index 17c1770..df823e3 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java
@@ -29,6 +29,7 @@ import java.util.Map;
 import org.apache.james.core.Domain;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.jupiter.api.BeforeEach;
@@ -448,6 +449,78 @@ class DomainQuotaRoutesTest {
     }
 
     @Test
+    void putQuotaWithNegativeCountShouldFail() throws MailboxException {
+        maxQuotaManager.setDomainMaxMessage(TROUVÉ_COM, QuotaCount.count(52));
+        maxQuotaManager.setDomainMaxStorage(TROUVÉ_COM, QuotaSize.size(42));
+        Map<String, Object> errors = given()
+            .body("{\"count\":-5,\"size\":30}")
+            .put(QUOTA_DOMAINS + "/" + TROUVÉ_COM.name())
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .contentType(ContentType.JSON)
+        .extract()
+            .body()
+            .jsonPath()
+            .getMap(".");
+
+        assertThat(errors)
+            .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
+            .containsEntry("type", "InvalidArgument")
+            .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1");
+    }
+
+    @Test
+    void putQuotaWithNegativeCountShouldNotUpdatePreviousQuota() throws MailboxException {
+        maxQuotaManager.setDomainMaxMessage(TROUVÉ_COM, QuotaCount.count(52));
+        maxQuotaManager.setDomainMaxStorage(TROUVÉ_COM, QuotaSize.size(42));
+        given()
+            .body("{\"count\":-5,\"size\":30}")
+            .put(QUOTA_DOMAINS + "/" + TROUVÉ_COM.name())
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .contentType(ContentType.JSON);
+
+        assertThat(maxQuotaManager.getDomainMaxMessage(TROUVÉ_COM)).contains(QuotaCount.count(52));
+        assertThat(maxQuotaManager.getDomainMaxStorage(TROUVÉ_COM)).contains(QuotaSize.size(42));
+    }
+
+    @Test
+    void putQuotaWithNegativeSizeShouldFail() throws MailboxException {
+        maxQuotaManager.setDomainMaxMessage(TROUVÉ_COM, QuotaCount.count(52));
+        maxQuotaManager.setDomainMaxStorage(TROUVÉ_COM, QuotaSize.size(42));
+        Map<String, Object> errors = given()
+            .body("{\"count\":40,\"size\":-19}")
+            .put(QUOTA_DOMAINS + "/" + TROUVÉ_COM.name())
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .contentType(ContentType.JSON)
+        .extract()
+            .body()
+            .jsonPath()
+            .getMap(".");
+
+        assertThat(errors)
+            .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
+            .containsEntry("type", "InvalidArgument")
+            .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1");
+    }
+
+    @Test
+    void putQuotaWithNegativeSizeShouldNotUpdatePreviousQuota() throws MailboxException {
+        maxQuotaManager.setDomainMaxMessage(TROUVÉ_COM, QuotaCount.count(52));
+        maxQuotaManager.setDomainMaxStorage(TROUVÉ_COM, QuotaSize.size(42));
+        given()
+            .body("{\"count\":40,\"size\":-19}")
+            .put(QUOTA_DOMAINS + "/" + TROUVÉ_COM.name())
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .contentType(ContentType.JSON);
+
+        assertThat(maxQuotaManager.getDomainMaxMessage(TROUVÉ_COM)).contains(QuotaCount.count(52));
+        assertThat(maxQuotaManager.getDomainMaxStorage(TROUVÉ_COM)).contains(QuotaSize.size(42));
+    }
+
+    @Test
     void putQuotaShouldBeAbleToRemoveBothQuota() {
         given()
             .body("{\"count\":52,\"size\":42}")
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
index 48032b0..2132646 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
@@ -371,6 +371,86 @@ class GlobalQuotaRoutesTest {
     }
 
     @Test
+    void putQuotaWithNegativeCountShouldFail() throws Exception {
+        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(43));
+
+        Map<String, Object> errors = given()
+            .body("{\"count\":-2,\"size\":43}")
+            .when()
+            .put("/quota")
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .contentType(ContentType.JSON)
+        .extract()
+            .body()
+            .jsonPath()
+            .getMap(".");
+
+        assertThat(errors)
+            .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
+            .containsEntry("type", "InvalidArgument")
+            .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1");
+    }
+
+    @Test
+    void putQuotaWithNegativeCountShouldNotUpdatePreviousQuota() throws Exception {
+        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(43));
+
+        given()
+            .body("{\"count\":-2,\"size\":43}")
+            .when()
+            .put("/quota")
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .contentType(ContentType.JSON);
+
+        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCount.count(42));
+        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSize.size(43));
+    }
+
+    @Test
+    void putQuotaWithNegativeSizeShouldFail() throws Exception {
+        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(43));
+
+        Map<String, Object> errors = given()
+            .body("{\"count\":42,\"size\":-2}")
+            .when()
+            .put("/quota")
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .contentType(ContentType.JSON)
+        .extract()
+            .body()
+            .jsonPath()
+            .getMap(".");
+
+        assertThat(errors)
+            .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
+            .containsEntry("type", "InvalidArgument")
+            .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1");
+    }
+
+    @Test
+    void putQuotaWithNegativeSizeShouldNotUpdatePreviousQuota() throws Exception {
+        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(43));
+
+        given()
+            .body("{\"count\":42,\"size\":-2}")
+            .when()
+            .put("/quota")
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .contentType(ContentType.JSON);
+
+        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCount.count(42));
+        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSize.size(43));
+    }
+
+    @Test
     void putQuotaShouldUnsetCountWhenNull() throws Exception {
         maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
         given()
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
index 1cfe929..8841e27 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
@@ -57,7 +57,6 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
 import com.google.common.base.Strings;
-
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
 import io.restassured.path.json.JsonPath;
@@ -1055,6 +1054,102 @@ class UserQuotaRoutesTest {
         }
 
         @Test
+        void putQuotaWithNegativeCountShouldFail(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
+            MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
+            UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
+
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+
+            Map<String, Object> errors = with()
+                .body("{\"count\":-2,\"size\":42}")
+                .put(QUOTA_USERS + "/" + BOB.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .contentType(ContentType.JSON)
+            .extract()
+                .body()
+                .jsonPath()
+                .getMap(".");
+
+            assertThat(errors)
+                .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
+                .containsEntry("type", "InvalidArgument")
+                .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1");
+        }
+
+        @Test
+        void putQuotaWithNegativeCountShouldNotUpdatePreviousQuota(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
+            MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
+            UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
+
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+
+            with()
+                .body("{\"count\":-2,\"size\":42}")
+                .put(QUOTA_USERS + "/" + BOB.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .contentType(ContentType.JSON);
+
+            SoftAssertions softly = new SoftAssertions();
+            softly.assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
+                .contains(QuotaCount.count(52));
+            softly.assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
+                .contains(QuotaSize.size(42));
+            softly.assertAll();
+        }
+
+        @Test
+        void putQuotaWithNegativeSizeShouldFail(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
+            MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
+            UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
+
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+
+            Map<String, Object> errors = with()
+                .body("{\"count\":52,\"size\":-3}")
+                .put(QUOTA_USERS + "/" + BOB.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .contentType(ContentType.JSON)
+            .extract()
+                .body()
+                .jsonPath()
+                .getMap(".");
+
+            assertThat(errors)
+                .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
+                .containsEntry("type", "InvalidArgument")
+                .containsEntry("message", "Invalid quota. Need to be an integer value greater or equal to -1");
+        }
+
+        @Test
+        void putQuotaWithNegativeSizeShouldNotUpdatePreviousQuota(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
+            MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
+            UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
+
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+
+            with()
+                .body("{\"count\":52,\"size\":-3}")
+                .put(QUOTA_USERS + "/" + BOB.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .contentType(ContentType.JSON);
+
+            SoftAssertions softly = new SoftAssertions();
+            softly.assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
+                .contains(QuotaCount.count(52));
+            softly.assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
+                .contains(QuotaSize.size(42));
+            softly.assertAll();
+        }
+
+        @Test
         void putQuotaShouldUpdateBothQuota(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();


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


[james-project] 06/43: [Refactoring] Replace StringUtils::arrayToString by Arrays::toString

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

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

commit 937532dbe591516aee8f7fe7718bdb1697e4a99f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 17 11:38:28 2019 +0700

    [Refactoring] Replace StringUtils::arrayToString by Arrays::toString
---
 .../java/org/apache/mailet/base/GenericMailet.java |  4 +--
 .../java/org/apache/mailet/base/StringUtils.java   | 18 ++----------
 .../org/apache/mailet/base/StringUtilsTest.java    | 32 +---------------------
 3 files changed, 5 insertions(+), 49 deletions(-)

diff --git a/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java b/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java
index 6dce7c5..70488b0 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/GenericMailet.java
@@ -21,6 +21,7 @@
 package org.apache.mailet.base;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -313,8 +314,7 @@ public abstract class GenericMailet implements Mailet, MailetConfig {
         }
         
         if (bad.size() > 0) {
-            throw new MessagingException("Unexpected init parameters found: "
-                    + org.apache.mailet.base.StringUtils.arrayToString(bad.toArray()));
+            throw new MessagingException("Unexpected init parameters found: " + Arrays.toString(bad.toArray()));
         }
     }
 
diff --git a/mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java b/mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java
index 0ba3c5a..ff535e7 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/StringUtils.java
@@ -20,9 +20,9 @@
 package org.apache.mailet.base;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
-import com.google.common.base.Joiner;
 import com.google.common.collect.Iterables;
 
 /**
@@ -65,22 +65,8 @@ public final class StringUtils {
         }
         return list.toArray(new String[list.size()]);
     }
-    
-    /**
-     * Utility method for obtaining a string representation of an array of Objects.
-     */
-    public static String arrayToString(Object[] array) {
-        if (array == null) {
-            return "null";
-        }
-        StringBuilder sb = new StringBuilder(1024);
-        sb.append("[");
-        sb.append(Joiner.on(",").join(array));
-        sb.append("]");
-        return sb.toString();
-    }
 
     public static String listToString(List<String> strings) {
-        return arrayToString(Iterables.toArray(strings, String.class));
+        return Arrays.toString(Iterables.toArray(strings, String.class));
     }
 }
diff --git a/mailet/base/src/test/java/org/apache/mailet/base/StringUtilsTest.java b/mailet/base/src/test/java/org/apache/mailet/base/StringUtilsTest.java
index ff88b4d..01636ae 100644
--- a/mailet/base/src/test/java/org/apache/mailet/base/StringUtilsTest.java
+++ b/mailet/base/src/test/java/org/apache/mailet/base/StringUtilsTest.java
@@ -32,36 +32,6 @@ public class StringUtilsTest {
     public ExpectedException expectedException = ExpectedException.none();
 
     @Test
-    public void arrayToStringShouldReturnNullWhenArrayIsNull() {
-        String arrayToString = StringUtils.arrayToString(null);
-        assertThat(arrayToString).isEqualTo("null");
-    }
-
-    @Test
-    public void arrayToStringShouldReturnOnlyBracketsWhenArrayIsEmpty() {
-        String arrayToString = StringUtils.arrayToString(new String[] {});
-        assertThat(arrayToString).isEqualTo("[]");
-    }
-
-    @Test
-    public void arrayToStringShouldReturnOneElementWhenArrayContainsOneElement() {
-        String arrayToString = StringUtils.arrayToString(new String[] { "first" });
-        assertThat(arrayToString).isEqualTo("[first]");
-    }
-
-    @Test
-    public void arrayToStringShouldReturnSeparatedElementsWhenArrayContainsMultipleElements() {
-        String arrayToString = StringUtils.arrayToString(new String[] { "first", "second", "fourth" });
-        assertThat(arrayToString).isEqualTo("[first,second,fourth]");
-    }
-
-    @Test
-    public void arrayToStringShouldThrowWhenArrayContainsANullElement() {
-        expectedException.expect(NullPointerException.class);
-        StringUtils.arrayToString(new String[] { "first", null, "fourth" });
-    }
-
-    @Test
     public void listToStringShouldThrowWhenListIsNull() {
         expectedException.expect(NullPointerException.class);
         StringUtils.listToString(null);
@@ -82,7 +52,7 @@ public class StringUtilsTest {
     @Test
     public void listToStringShouldReturnSeparatedElementsWhenListContainsMultipleElements() {
         String listToString = StringUtils.listToString(ImmutableList.of("first", "second", "fourth"));
-        assertThat(listToString).isEqualTo("[first,second,fourth]");
+        assertThat(listToString).isEqualTo("[first, second, fourth]");
     }
 
     @Test


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


[james-project] 42/43: JAMES-2964 simplify quota limit domain object to better represent the domain

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

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

commit 8f91b92a995eaaa6820777793e6224ec613d5a73
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Thu Nov 7 15:06:48 2019 +0100

    JAMES-2964 simplify quota limit domain object to better represent the domain
---
 .../apache/james/core/quota/QuotaCountLimit.java   | 18 --------
 .../apache/james/core/quota/QuotaLimitValue.java   |  7 +---
 .../apache/james/core/quota/QuotaSizeLimit.java    | 18 --------
 .../james/core/quota/QuotaLimitValueTest.java      | 48 ++--------------------
 4 files changed, 5 insertions(+), 86 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaCountLimit.java b/core/src/main/java/org/apache/james/core/quota/QuotaCountLimit.java
index 1867e83..40add28 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaCountLimit.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaCountLimit.java
@@ -56,19 +56,6 @@ public class QuotaCountLimit implements QuotaLimitValue<QuotaCountLimit> {
     }
 
     @Override
-    public QuotaCountLimit add(long additionalValue) {
-        return new QuotaCountLimit(value.map(x -> x + additionalValue));
-    }
-
-    @Override
-    public QuotaCountLimit add(QuotaCountLimit additionalValue) {
-        if (additionalValue.isUnlimited()) {
-            return unlimited();
-        }
-        return new QuotaCountLimit(value.map(x -> x + additionalValue.asLong()));
-    }
-
-    @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
             .add("value", value.map(String::valueOf).orElse("unlimited"))
@@ -76,11 +63,6 @@ public class QuotaCountLimit implements QuotaLimitValue<QuotaCountLimit> {
     }
 
     @Override
-    public boolean isGreaterThan(QuotaCountLimit other) {
-        return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
-    }
-
-    @Override
     public final boolean equals(Object o) {
         if (o instanceof QuotaCountLimit) {
             QuotaCountLimit that = (QuotaCountLimit) o;
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaLimitValue.java b/core/src/main/java/org/apache/james/core/quota/QuotaLimitValue.java
index ff32575..89de7a9 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaLimitValue.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaLimitValue.java
@@ -23,7 +23,7 @@ import java.util.Optional;
 public interface QuotaLimitValue<T extends QuotaLimitValue<T>> {
 
     static boolean isValidValue(Optional<Long> value) {
-        return !value.isPresent() || value.get() >= 0;
+        return value.map(longValue -> longValue >= 0).orElse(true);
     }
 
     long asLong();
@@ -34,9 +34,4 @@ public interface QuotaLimitValue<T extends QuotaLimitValue<T>> {
         return !isLimited();
     }
 
-    T add(long additionalValue);
-
-    T add(T additionalValue);
-
-    boolean isGreaterThan(T other);
 }
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaSizeLimit.java b/core/src/main/java/org/apache/james/core/quota/QuotaSizeLimit.java
index d8997ae..968a11b 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaSizeLimit.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaSizeLimit.java
@@ -58,24 +58,6 @@ public class QuotaSizeLimit implements QuotaLimitValue<QuotaSizeLimit> {
     }
 
     @Override
-    public QuotaSizeLimit add(long additionalValue) {
-        return new QuotaSizeLimit(value.map(x -> x + additionalValue));
-    }
-
-    @Override
-    public QuotaSizeLimit add(QuotaSizeLimit additionalValue) {
-        if (additionalValue.isUnlimited()) {
-            return unlimited();
-        }
-        return new QuotaSizeLimit(value.map(x -> x + additionalValue.asLong()));
-    }
-
-    @Override
-    public boolean isGreaterThan(QuotaSizeLimit other) {
-        return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
-    }
-
-    @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
             .add("value", value.map(String::valueOf).orElse("unlimited"))
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java
index 8a8e28f..09a3ce7 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java
@@ -18,58 +18,18 @@
  ****************************************************************/
 package org.apache.james.core.quota;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.junit.jupiter.api.Test;
 
 public interface QuotaLimitValueTest<T extends QuotaLimitValue<T>> {
 
-    T instance(long i);
+    T instance(long value);
 
     T unlimited();
 
     @Test
-    default void greaterThanShouldReturnFalseWhenFirstEqualToSecond() {
-        assertThat(instance(1).isGreaterThan(instance(1))).isFalse();
-    }
-
-    @Test
-    default void greaterThanShouldReturnFalseWhenFirstSmallerThanSecond() {
-        assertThat(instance(1).isGreaterThan(instance(2))).isFalse();
-    }
-
-    @Test
-    default void greaterThanShouldReturnTrueWhenFirstGreaterThanSecond() {
-        assertThat(instance(2).isGreaterThan(instance(1))).isTrue();
-    }
-
-    @Test
-    default void greaterThanShouldReturnFalseWhenFirstIsLimitedAndSecondUnlimited() {
-        assertThat(instance(1).isGreaterThan(unlimited())).isFalse();
-    }
-
-    @Test
-    default void greaterThanShouldReturnFalseWhenBothAreUnlimited() {
-        assertThat(unlimited().isGreaterThan(unlimited())).isFalse();
-    }
-
-    @Test
-    default void greaterThanShouldReturnTrueWhenFirstIsUnlimitedAndSecondLimited() {
-        assertThat(unlimited().isGreaterThan(instance(1))).isTrue();
-    }
-
-    @Test
-    default void addShouldReturnUnlimitedWhenThisIsUnlimited() {
-        assertThat(unlimited().add(2)).isEqualTo(unlimited());
-    }
-
-    @Test
-    default void addShouldReturnUnlimitedWhenBothAre() {
-        assertThat(unlimited().add(unlimited())).isEqualTo(unlimited());
-    }
-
-    @Test
-    default void addShouldReturnSumResult() {
-        assertThat(instance(12).add(instance(23))).isEqualTo(instance(35));
+    default void creatingANegativeQuotaLimitShouldFail() {
+        assertThatThrownBy(() -> instance(-1)).isInstanceOf(IllegalArgumentException.class);
     }
 }


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


[james-project] 21/43: [Refactoring] MessageRangeProcessor: avoid propagating MailboxManager

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

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

commit 5db6823887e6b20917f69e01c71691b0f03fb3e1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 11:04:21 2019 +0700

    [Refactoring] MessageRangeProcessor: avoid propagating MailboxManager
---
 .../apache/james/imap/processor/AbstractMessageRangeProcessor.java   | 5 +----
 .../src/main/java/org/apache/james/imap/processor/CopyProcessor.java | 4 ++--
 .../src/main/java/org/apache/james/imap/processor/MoveProcessor.java | 5 ++---
 3 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 64c52a0..d26eca9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -54,7 +54,6 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
     protected abstract List<MessageRange> process(final MailboxPath targetMailbox,
                                                   final SelectedMailbox currentMailbox,
                                                   final MailboxSession mailboxSession,
-                                                  final MailboxManager mailboxManager,
                                                   MessageRange messageSet) throws MailboxException;
 
     protected abstract String getOperationName();
@@ -91,9 +90,7 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
         for (IdRange range : request.getIdSet()) {
             MessageRange messageSet = messageRange(session.getSelected(), range, request.isUseUids());
             if (messageSet != null) {
-                List<MessageRange> processedUids = process(
-                    targetMailbox, session.getSelected(), mailboxSession,
-                    getMailboxManager(), messageSet);
+                List<MessageRange> processedUids = process(targetMailbox, session.getSelected(), mailboxSession, messageSet);
                 for (MessageRange mr : processedUids) {
                     // Set recent flag on copied message as this SHOULD be
                     // done.
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CopyProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
index 42b65c7..d96f327 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CopyProcessor.java
@@ -51,8 +51,8 @@ public class CopyProcessor extends AbstractMessageRangeProcessor<CopyRequest> {
     protected List<MessageRange> process(MailboxPath targetMailbox,
                                          SelectedMailbox currentMailbox,
                                          MailboxSession mailboxSession,
-                                         MailboxManager mailboxManager, MessageRange messageSet) throws MailboxException {
-        return mailboxManager.copyMessages(messageSet, currentMailbox.getPath(), targetMailbox, mailboxSession);
+                                         MessageRange messageSet) throws MailboxException {
+        return getMailboxManager().copyMessages(messageSet, currentMailbox.getPath(), targetMailbox, mailboxSession);
     }
 
     @Override
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java
index 2adb49a..129251c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/MoveProcessor.java
@@ -51,9 +51,8 @@ public class MoveProcessor extends AbstractMessageRangeProcessor<MoveRequest> im
 
     @Override
     protected List<MessageRange> process(MailboxPath targetMailbox, SelectedMailbox currentMailbox,
-                                         MailboxSession mailboxSession,
-                                         MailboxManager mailboxManager, MessageRange messageSet) throws MailboxException {
-        return mailboxManager.moveMessages(messageSet, currentMailbox.getPath(), targetMailbox, mailboxSession);
+                                         MailboxSession mailboxSession, MessageRange messageSet) throws MailboxException {
+        return getMailboxManager().moveMessages(messageSet, currentMailbox.getPath(), targetMailbox, mailboxSession);
     }
 
     @Override


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


[james-project] 13/43: [Refactoring] Review visibilities in MessageBuilder

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

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

commit 2dc15629c0f4fcfa183648ec8e0ff4528402c8b1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Nov 16 12:29:08 2019 +0700

    [Refactoring] Review visibilities in MessageBuilder
---
 .../LuceneMailboxMessageSearchIndexTest.java       | 55 +++++++++++-----------
 .../james/vault/DeletedMessageConverterTest.java   | 47 +++++++++++-------
 .../store/MailboxMessageResultImplTest.java        |  8 ++--
 .../apache/james/mailbox/store/MessageBuilder.java | 37 +++++++++++----
 .../store/SearchUtilsMultipartMixedTest.java       |  2 +-
 .../james/mailbox/store/SearchUtilsRFC822Test.java |  2 +-
 .../james/mailbox/store/SearchUtilsTest.java       | 16 +++----
 .../mail/model/DelegatingMailboxMessageTest.java   |  6 +--
 8 files changed, 103 insertions(+), 70 deletions(-)

diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
index 5b54c2b..3156f23 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
@@ -126,23 +126,23 @@ public class LuceneMailboxMessageSearchIndexTest {
         uid1 = MessageUid.of(1);
         MessageBuilder builder1 = new MessageBuilder()
             .headers(headersSubject)
-            .flags(new Flags(Flag.ANSWERED));
-        builder1.body = "My Body".getBytes(StandardCharsets.UTF_8);
-        builder1.size = 200;
-        builder1.internalDate = new Date();
-        builder1.mailboxId = TEST_ID_1;
-        builder1.uid = uid1;
+            .flags(new Flags(Flag.ANSWERED))
+            .mailboxId(TEST_ID_1)
+            .uid(uid1)
+            .internalDate(new Date())
+            .body("My Body".getBytes(StandardCharsets.UTF_8))
+            .size(200);
         index.add(session, mailbox, builder1.build(id1));
 
         uid2 = MessageUid.of(1);
         MessageBuilder builder2 = new MessageBuilder()
             .headers(headersSubject)
-            .flags(new Flags(Flag.ANSWERED));
-        builder2.body = "My Body".getBytes(StandardCharsets.UTF_8);
-        builder2.size = 20;
-        builder2.internalDate = new Date();
-        builder2.mailboxId = TEST_ID_2;
-        builder2.uid = uid2;
+            .flags(new Flags(Flag.ANSWERED))
+            .mailboxId(TEST_ID_2)
+            .uid(uid2)
+            .internalDate(new Date())
+            .body("My Body".getBytes(StandardCharsets.UTF_8))
+            .size(20);
         index.add(session, mailbox2, builder2.build(id2));
         
         uid3 = MessageUid.of(2);
@@ -150,12 +150,12 @@ public class LuceneMailboxMessageSearchIndexTest {
         cal.set(1980, 2, 10);
         MessageBuilder builder3 = new MessageBuilder()
             .headers(headersTest)
-            .flags(new Flags(Flag.DELETED));
-        builder3.body = "My Otherbody".getBytes(StandardCharsets.UTF_8);
-        builder3.size = 20;
-        builder3.internalDate = cal.getTime();
-        builder3.mailboxId = TEST_ID_1;
-        builder3.uid = uid3;
+            .flags(new Flags(Flag.DELETED))
+            .mailboxId(TEST_ID_1)
+            .uid(uid3)
+            .internalDate(cal.getTime())
+            .body("My Otherbody".getBytes(StandardCharsets.UTF_8))
+            .size(20);
         index.add(session, mailbox, builder3.build(id3));
         
         uid4 = MessageUid.of(3);
@@ -163,12 +163,12 @@ public class LuceneMailboxMessageSearchIndexTest {
         cal2.set(8000, 2, 10);
         MessageBuilder builder4 = new MessageBuilder()
             .headers(headersTestSubject)
-            .flags(new Flags(Flag.DELETED));
-        builder4.body = "My Otherbody2".getBytes(StandardCharsets.UTF_8);
-        builder4.size = 20;
-        builder4.internalDate = cal2.getTime();
-        builder4.mailboxId = TEST_ID_1;
-        builder4.uid = uid4;
+            .flags(new Flags(Flag.DELETED))
+            .mailboxId(TEST_ID_1)
+            .uid(uid4)
+            .internalDate(cal2.getTime())
+            .body("My Otherbody2".getBytes(StandardCharsets.UTF_8))
+            .size(20);
         index.add(session, mailbox, builder4.build(id4));
         
         uid5 = MessageUid.of(10);
@@ -177,10 +177,9 @@ public class LuceneMailboxMessageSearchIndexTest {
         builder.header("To", FROM_ADDRESS);
         builder.header("Subject", "A " + SUBJECT_PART + " Multipart Mail");
         builder.header("Date", "Thu, 14 Feb 2008 12:00:00 +0000 (GMT)");
-        builder.body = StandardCharsets.US_ASCII.encode(BODY).array();
-        builder.uid = uid5;
-        builder.mailboxId = (TestId) mailbox3.getMailboxId();
-        
+        builder.body(StandardCharsets.US_ASCII.encode(BODY).array());
+        builder.uid(uid5);
+        builder.mailboxId(TEST_ID_3);
         index.add(session, mailbox3, builder.build(id5));
 
     }
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
index a3af37b..e22c8e8 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
@@ -81,14 +81,13 @@ class DeletedMessageConverterTest {
     private DeletedMessageConverter deletedMessageConverter;
 
     private MessageBuilder getMessageBuilder() {
-        MessageBuilder builder = new MessageBuilder();
-        builder.header(SENDER_FIELD, SENDER.asString());
-        builder.header(FROM_FIELD, "alice@james.com");
-        builder.header(TO_FIELD, RECIPIENT1.asString());
-        builder.header(CC_FIELD, RECIPIENT2.asString());
-        builder.header(SUBJECT_FIELD, SUBJECT);
-        builder.header(DATE_FIELD, "Thu, 30 Oct 2014 14:12:00 +0000 (GMT)");
-        return builder;
+        return new MessageBuilder()
+            .header(SENDER_FIELD, SENDER.asString())
+            .header(FROM_FIELD, "alice@james.com")
+            .header(TO_FIELD, RECIPIENT1.asString())
+            .header(CC_FIELD, RECIPIENT2.asString())
+            .header(SUBJECT_FIELD, SUBJECT)
+            .header(DATE_FIELD, "Thu, 30 Oct 2014 14:12:00 +0000 (GMT)");
     }
 
     private MailboxMessage buildMessage(MessageBuilder messageBuilder, Collection<MessageAttachment> attachments) throws Exception {
@@ -116,8 +115,12 @@ class DeletedMessageConverterTest {
 
     @Test
     void convertShouldReturnCorrespondingDeletedMessageWhenNoDeliveryDateInMimeMessageButInMailboxMessage() throws Exception {
-        MessageBuilder builder = getMessageBuilder();
-        builder.headers.remove(DATE_FIELD);
+        MessageBuilder builder = new MessageBuilder()
+            .header(SENDER_FIELD, SENDER.asString())
+            .header(FROM_FIELD, "alice@james.com")
+            .header(TO_FIELD, RECIPIENT1.asString())
+            .header(CC_FIELD, RECIPIENT2.asString())
+            .header(SUBJECT_FIELD, SUBJECT);
 
         assertThat(deletedMessageConverter.convert(DELETED_MESSAGE_MAILBOX_CONTEXT, buildMessage(builder, NO_ATTACHMENT), DELETION_DATE))
             .isEqualTo(DELETED_MESSAGE_WITH_SUBJECT);
@@ -125,8 +128,12 @@ class DeletedMessageConverterTest {
 
     @Test
     void convertShouldReturnCorrespondingDeletedMessageWhenNoSubject() throws Exception {
-        MessageBuilder builder = getMessageBuilder();
-        builder.headers.remove(SUBJECT_FIELD);
+        MessageBuilder builder = new MessageBuilder()
+            .header(SENDER_FIELD, SENDER.asString())
+            .header(FROM_FIELD, "alice@james.com")
+            .header(TO_FIELD, RECIPIENT1.asString())
+            .header(CC_FIELD, RECIPIENT2.asString())
+            .header(DATE_FIELD, "Thu, 30 Oct 2014 14:12:00 +0000 (GMT)");
 
         assertThat(deletedMessageConverter.convert(DELETED_MESSAGE_MAILBOX_CONTEXT, buildMessage(builder, NO_ATTACHMENT), DELETION_DATE))
             .isEqualTo(DELETED_MESSAGE);
@@ -142,9 +149,11 @@ class DeletedMessageConverterTest {
 
     @Test
     void convertShouldReturnCorrespondingDeletedMessageWhenNoRecipient() throws Exception {
-        MessageBuilder builder = getMessageBuilder();
-        builder.headers.remove(TO_FIELD);
-        builder.headers.remove(CC_FIELD);
+        MessageBuilder builder = new MessageBuilder()
+            .header(SENDER_FIELD, SENDER.asString())
+            .header(FROM_FIELD, "alice@james.com")
+            .header(SUBJECT_FIELD, SUBJECT)
+            .header(DATE_FIELD, "Thu, 30 Oct 2014 14:12:00 +0000 (GMT)");
 
         DeletedMessage deletedMessage = deletedMessageConverter.convert(DELETED_MESSAGE_MAILBOX_CONTEXT, buildMessage(builder, NO_ATTACHMENT), DELETION_DATE);
 
@@ -175,8 +184,12 @@ class DeletedMessageConverterTest {
 
     @Test
     void convertShouldReturnCorrespondingDeletedMessageWhenNoSender() throws Exception {
-        MessageBuilder builder = getMessageBuilder();
-        builder.headers.remove(SENDER_FIELD);
+        MessageBuilder builder = new MessageBuilder()
+            .header(FROM_FIELD, "alice@james.com")
+            .header(TO_FIELD, RECIPIENT1.asString())
+            .header(CC_FIELD, RECIPIENT2.asString())
+            .header(SUBJECT_FIELD, SUBJECT)
+            .header(DATE_FIELD, "Thu, 30 Oct 2014 14:12:00 +0000 (GMT)");
 
         DeletedMessage deletedMessage = deletedMessageConverter.convert(DELETED_MESSAGE_MAILBOX_CONTEXT, buildMessage(builder, NO_ATTACHMENT), DELETION_DATE);
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxMessageResultImplTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxMessageResultImplTest.java
index e8baaac..a22bfe4 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxMessageResultImplTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MailboxMessageResultImplTest.java
@@ -52,10 +52,10 @@ public class MailboxMessageResultImplTest {
 
 
     private MailboxMessage buildMessage(MessageUid uid, Date aDate) throws Exception {
-        MessageBuilder builder = new MessageBuilder();
-        builder.uid = uid;
-        builder.internalDate = aDate;
-        return builder.build();
+        return new MessageBuilder()
+            .uid(uid)
+            .internalDate(aDate)
+            .build();
     }
 
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
index a100ad6..3c800a5 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
@@ -46,13 +46,33 @@ public class MessageBuilder {
     private static final char[] NEW_LINE = { 0x0D, 0x0A };
     private static final ImmutableList<MessageAttachment> NO_ATTACHMENTS = ImmutableList.of();
 
-    public TestId mailboxId = TestId.of(113);
-    public MessageUid uid = MessageUid.of(776);
-    public Date internalDate = new Date();
-    public int size = 8867;
-    public Flags flags = new Flags();
-    public byte[] body = {};
-    public final Map<String, String> headers = new HashMap<>();
+    private TestId mailboxId = TestId.of(113);
+    private MessageUid uid = MessageUid.of(776);
+    private Date internalDate = new Date();
+    private int size = 8867;
+    private Flags flags = new Flags();
+    private byte[] body = {};
+    private final Map<String, String> headers = new HashMap<>();
+
+    public MessageBuilder mailboxId(TestId testId) {
+        this.mailboxId = testId;
+        return this;
+    }
+
+    public MessageBuilder uid(MessageUid uid) {
+        this.uid = uid;
+        return this;
+    }
+
+    public MessageBuilder internalDate(Date internalDate) {
+        this.internalDate = internalDate;
+        return this;
+    }
+
+    public MessageBuilder body(byte[] body) {
+        this.body = body;
+        return this;
+    }
     
     public MailboxMessage build() throws Exception {
         return build(new DefaultMessageId());
@@ -86,8 +106,9 @@ public class MessageBuilder {
         return this;
     }
 
-    public void header(String field, String value) {
+    public MessageBuilder header(String field, String value) {
         headers.put(field, value);
+        return this;
     }
 
     public MessageBuilder headers(Map<String, String> headers) {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
index 0e2b6e4..60482e9 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
@@ -122,7 +122,7 @@ public class SearchUtilsMultipartMixedTest {
         builder.header("Subject", "A Mixed Multipart Mail");
         builder.header("Date", "Thu, 14 Feb 2008 12:00:00 +0000 (GMT)");
         builder.header("Content-Type", "multipart/mixed;boundary=1729");
-        builder.body = Charset.forName("us-ascii").encode(BODY).array();
+        builder.body(Charset.forName("us-ascii").encode(BODY).array());
         row = builder.build();
         recent = new ArrayList<>();
         
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
index 2752856..f819980 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
@@ -63,7 +63,7 @@ public class SearchUtilsRFC822Test {
         builder.header("To", FROM_ADDRESS);
         builder.header("Subject", "A " + SUBJECT_PART + " Multipart Mail");
         builder.header("Date", "Thu, 14 Feb 2008 12:00:00 +0000 (GMT)");
-        builder.body = Charset.forName("us-ascii").encode(BODY).array();
+        builder.body(Charset.forName("us-ascii").encode(BODY).array());
         row = builder.build();
         
         Iterator<MailboxMessage> messages = null;
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java
index 5d275d1..ffb7784 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java
@@ -78,8 +78,8 @@ public class SearchUtilsTest {
     @Before
     public void setUp() throws Exception {
         recent = new ArrayList<>();
-        builder = new MessageBuilder();
-        builder.uid = MessageUid.of(1009);
+        builder = new MessageBuilder()
+            .uid(MessageUid.of(1009));
         
         Iterator<MailboxMessage> messages = null;
         SearchQuery query = null; 
@@ -89,7 +89,7 @@ public class SearchUtilsTest {
     
     @Test
     public void testMatchSizeLessThan() throws Exception {
-        builder.size = SIZE;
+        builder.size(SIZE);
         MailboxMessage row = builder.build();
         assertThat(messageSearches.isMatch(SearchQuery.sizeLessThan(SIZE - 1), row,
                 recent)).isFalse();
@@ -103,7 +103,7 @@ public class SearchUtilsTest {
 
     @Test
     public void testMatchSizeMoreThan() throws Exception {
-        builder.size = SIZE;
+        builder.size(SIZE);
         MailboxMessage row = builder.build();
         assertThat(messageSearches.isMatch(SearchQuery.sizeGreaterThan(SIZE - 1), row,
                 recent)).isTrue();
@@ -117,7 +117,7 @@ public class SearchUtilsTest {
 
     @Test
     public void testMatchSizeEquals() throws Exception {
-        builder.size = SIZE;
+        builder.size(SIZE);
         MailboxMessage row = builder.build();
         assertThat(messageSearches.isMatch(SearchQuery.sizeEquals(SIZE - 1), row,
                 recent)).isFalse();
@@ -130,7 +130,7 @@ public class SearchUtilsTest {
 
     @Test
     public void testMatchInternalDateEquals() throws Exception {
-        builder.internalDate = SUN_SEP_9TH_2001;
+        builder.internalDate(SUN_SEP_9TH_2001);
         MailboxMessage row = builder.build();
         assertThat(messageSearches.isMatch(SearchQuery.internalDateOn(getDate(9, 9, 2000), DateResolution.Day),
                 row, recent)).isFalse();
@@ -147,7 +147,7 @@ public class SearchUtilsTest {
     
     @Test
     public void testMatchInternalDateBefore() throws Exception {
-        builder.internalDate = SUN_SEP_9TH_2001;
+        builder.internalDate(SUN_SEP_9TH_2001);
         MailboxMessage row = builder.build();
         assertThat(messageSearches.isMatch(
                 SearchQuery.internalDateBefore(getDate(9, 9, 2000), DateResolution.Day), row, recent)).isFalse();
@@ -163,7 +163,7 @@ public class SearchUtilsTest {
 
     @Test
     public void testMatchInternalDateAfter() throws Exception {
-        builder.internalDate = SUN_SEP_9TH_2001;
+        builder.internalDate(SUN_SEP_9TH_2001);
         MailboxMessage row = builder.build();
         assertThat(messageSearches.isMatch(SearchQuery.internalDateAfter(getDate(9, 9, 2000), DateResolution.Day),
                 row, recent)).isTrue();
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java
index fa60940..567c4e3 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessageTest.java
@@ -36,9 +36,9 @@ public class DelegatingMailboxMessageTest {
     }
 
     private MailboxMessage buildMessage(int uid) throws Exception {
-        MessageBuilder builder = new MessageBuilder();
-        builder.uid = MessageUid.of(uid);
-        return builder.build();
+        return new MessageBuilder()
+            .uid(MessageUid.of(uid))
+            .build();
     }
 
     @Test


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


[james-project] 10/43: [Refactoring] MessageBuilder should return SimpleMailboxMessage

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

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

commit 25fcfb5534cd55681d8b7d884e5f38118667efce
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Nov 16 11:43:26 2019 +0700

    [Refactoring] MessageBuilder should return SimpleMailboxMessage
---
 .../apache/james/mailbox/store/MessageBuilder.java | 47 +++++++++++++++++++++-
 1 file changed, 45 insertions(+), 2 deletions(-)

diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
index 3d45777..a100ad6 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
@@ -18,20 +18,34 @@
  ****************************************************************/
 package org.apache.james.mailbox.store;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.mail.Flags;
+import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.MessageAttachment;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
+import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.primitives.Bytes;
 
 public class MessageBuilder {
-    
+    private static final char[] NEW_LINE = { 0x0D, 0x0A };
+    private static final ImmutableList<MessageAttachment> NO_ATTACHMENTS = ImmutableList.of();
+
     public TestId mailboxId = TestId.of(113);
     public MessageUid uid = MessageUid.of(776);
     public Date internalDate = new Date();
@@ -45,7 +59,26 @@ public class MessageBuilder {
     }
 
     public MailboxMessage build(MessageId messageId) throws Exception {
-        return new SimpleMailboxMembership(messageId, mailboxId, uid, -1,  internalDate, size, flags, body, headers);
+        byte[] headerContent = getHeaderContent();
+        SimpleMailboxMessage mailboxMessage = new SimpleMailboxMessage(messageId, internalDate, size, headerContent.length,
+            new SharedByteArrayInputStream(Bytes.concat(headerContent, body)), flags, new PropertyBuilder(), mailboxId, NO_ATTACHMENTS);
+        mailboxMessage.setUid(uid);
+        return mailboxMessage;
+    }
+
+    private byte[] getHeaderContent() throws IOException {
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final Writer writer = new OutputStreamWriter(baos, StandardCharsets.US_ASCII);
+
+        for (Map.Entry<String, String> header : headers.entrySet()) {
+            writer.write(header.getKey());
+            writer.write(": ");
+            writer.write(header.getValue());
+            writer.write(NEW_LINE);
+        }
+        writer.write(NEW_LINE);
+        writer.flush();
+        return baos.toByteArray();
     }
 
     public MessageBuilder size(int size) {
@@ -57,6 +90,11 @@ public class MessageBuilder {
         headers.put(field, value);
     }
 
+    public MessageBuilder headers(Map<String, String> headers) {
+        this.headers.putAll(headers);
+        return this;
+    }
+
     public void setKey(int mailboxId, MessageUid uid) {
         this.uid = uid;
         this.mailboxId = TestId.of(mailboxId);
@@ -83,4 +121,9 @@ public class MessageBuilder {
             flags.add(Flags.Flag.RECENT);
         }
     }
+
+    public MessageBuilder flags(Flags flags) {
+        this.flags = flags;
+        return this;
+    }
 }


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


[james-project] 40/43: JAMES-2964 differentiate domain objects for quota limits and quota usages

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

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

commit 05078f9e4b4451df1687a0e9f355d94365c37edc
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Thu Nov 7 13:42:18 2019 +0100

    JAMES-2964 differentiate domain objects for quota limits and quota usages
---
 .../{QuotaCount.java => QuotaCountLimit.java}      |  30 ++---
 .../{QuotaCount.java => QuotaCountUsage.java}      |  48 +++++---
 .../{QuotaValue.java => QuotaLimitValue.java}      |   2 +-
 .../quota/{QuotaSize.java => QuotaSizeLimit.java}  |  30 ++---
 .../quota/{QuotaSize.java => QuotaSizeUsage.java}  |  39 +++---
 .../{QuotaValue.java => QuotaUsageValue.java}      |   8 +-
 ...uotaCountTest.java => QuotaCountLimitTest.java} |  12 +-
 ...QuotaSizeTest.java => QuotaCountUsageTest.java} |  22 ++--
 ...uotaValueTest.java => QuotaLimitValueTest.java} |   2 +-
 ...{QuotaSizeTest.java => QuotaSizeLimitTest.java} |  12 +-
 ...{QuotaSizeTest.java => QuotaSizeUsageTest.java} |  22 ++--
 ...uotaValueTest.java => QuotaUsageValueTest.java} |  35 +++---
 .../james/mailbox/events/MailboxListener.java      |  26 ++--
 .../mailbox/exception/OverQuotaException.java      |  15 +--
 .../java/org/apache/james/mailbox/model/Quota.java |  37 +++---
 .../org/apache/james/mailbox/model/QuotaRatio.java |  18 +--
 .../james/mailbox/model/SerializableQuota.java     |  25 ++--
 ...Value.java => SerializableQuotaLimitValue.java} |  60 ++++-----
 ...Value.java => SerializableQuotaUsageValue.java} |  61 ++++-----
 .../org/apache/james/mailbox/probe/QuotaProbe.java |  28 +++--
 .../james/mailbox/quota/CurrentQuotaManager.java   |   8 +-
 .../james/mailbox/quota/MaxQuotaManager.java       |  44 +++----
 .../apache/james/mailbox/quota/QuotaManager.java   |  10 +-
 .../apache/james/mailbox/MailboxListenerTest.java  |  19 +--
 .../apache/james/mailbox/MailboxManagerTest.java   |  23 ++--
 .../mailbox/manager/ManagerTestProvisionner.java   |   8 +-
 .../mailbox/manager/QuotaMessageManagerTest.java   |  38 +++---
 .../apache/james/mailbox/model/QuotaRatioTest.java |  18 +--
 .../org/apache/james/mailbox/model/QuotaTest.java  |  43 +++----
 .../apache/james/mailbox/quota/QuotaFixture.java   | 102 ++++++++--------
 .../quota/CassandraCurrentQuotaManager.java        |  16 +--
 .../quota/CassandraGlobalMaxQuotaDao.java          |  12 +-
 .../quota/CassandraPerDomainMaxQuotaDao.java       |  12 +-
 .../quota/CassandraPerUserMaxQuotaDao.java         |  12 +-
 .../quota/CassandraPerUserMaxQuotaManager.java     |  32 ++---
 .../james/mailbox/cassandra/quota/QuotaCodec.java  |  18 +--
 .../scala/org/apache/james/event/json/DTOs.scala   |  10 +-
 .../apache/james/event/json/EventSerializer.scala  |  41 ++++---
 .../json/MailboxDeletionSerializationTest.java     |   8 +-
 .../QuotaUsageUpdatedEventSerializationTest.java   |  18 +--
 .../james/event/json/dtos/QuotaCountTest.java      |  89 +++++++++-----
 .../james/event/json/dtos/QuotaSizeTest.java       |  89 +++++++++-----
 .../mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java   |  54 ++++----
 .../jpa/quota/JPAPerUserMaxQuotaManager.java       |  32 ++---
 .../mailbox/jpa/quota/JpaCurrentQuotaManager.java  |  12 +-
 .../mailbox/jpa/quota/model/JpaCurrentQuota.java   |  12 +-
 .../quota/InMemoryCurrentQuotaManager.java         |  12 +-
 .../quota/InMemoryPerUserMaxQuotaManager.java      |  44 +++----
 .../quota/InMemoryCurrentQuotaManagerTest.java     |  12 +-
 .../mailbox/quota/cassandra/dto/QuotaDTO.java      |  24 ++--
 .../james/mailbox/quota/cassandra/dto/DTOTest.java |  16 +--
 .../mailing/aggregates/UserQuotaThresholds.java    |  10 +-
 .../mailing/commands/DetectThresholdCrossing.java  |  16 +--
 .../mailing/events/QuotaThresholdChangedEvent.java |  16 +--
 .../mailing/subscribers/QuotaThresholdNotice.java  |  20 +--
 .../james/mailbox/quota/model/QuotaThreshold.java  |   2 +-
 .../james/mailbox/quota/model/QuotaThresholds.java |   2 +-
 .../subscribers/QuotaThresholdNoticeTest.java      |  30 ++---
 .../mailbox/quota/model/QuotaThresholdTest.java    |   9 +-
 .../mailbox/quota/model/QuotaThresholdsTest.java   |  16 +--
 .../ElasticSearchQuotaSearcherTest.java            |   6 +-
 .../elasticsearch/json/QuotaRatioAsJsonTest.java   |  18 +--
 .../quota/search/scanning/ClauseConverter.java     |  10 +-
 .../james/quota/search/QuotaSearcherContract.java  |  22 ++--
 .../james/mailbox/store/StoreMailboxManager.java   |   8 +-
 .../james/mailbox/store/event/EventFactory.java    |  26 ++--
 .../mailbox/store/quota/FixedMaxQuotaManager.java  |  36 +++---
 .../mailbox/store/quota/NoMaxQuotaManager.java     |  32 ++---
 .../james/mailbox/store/quota/NoQuotaManager.java  |  22 ++--
 .../james/mailbox/store/quota/QuotaChecker.java    |  16 +--
 .../mailbox/store/quota/StoreQuotaManager.java     |  22 ++--
 .../store/AbstractMessageIdManagerQuotaTest.java   |  14 +--
 .../AbstractMessageIdManagerSideEffectTest.java    |  21 ++--
 .../store/event/MailboxAnnotationListenerTest.java |   8 +-
 .../store/quota/GenericMaxQuotaManagerTest.java    | 136 ++++++++++-----------
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |  12 +-
 .../mailbox/store/quota/QuotaCheckerTest.java      |  26 ++--
 .../store/quota/StoreCurrentQuotaManagerTest.java  |  18 +--
 .../mailbox/store/quota/StoreQuotaManagerTest.java |  30 ++---
 .../org/apache/james/mpt/api/ImapHostSystem.java   |   6 +-
 .../apache/james/mpt/host/ExternalHostSystem.java  |   6 +-
 .../cassandra/host/CassandraHostSystem.java        |   6 +-
 .../james/mpt/imapmailbox/suite/QuotaTest.java     |   8 +-
 .../imapmailbox/cyrus/host/CyrusHostSystem.java    |   6 +-
 .../host/ElasticSearchHostSystem.java              |   6 +-
 .../host/external/ExternalJamesImapHostSystem.java |   6 +-
 .../inmemory/host/InMemoryHostSystem.java          |   6 +-
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java    |   6 +-
 .../lucenesearch/host/LuceneSearchHostSystem.java  |   6 +-
 .../maildir/host/MaildirHostSystem.java            |   6 +-
 .../rabbitmq/host/RabbitMQEventBusHostSystem.java  |   6 +-
 .../james/mpt/host/JamesManageSieveHostSystem.java |   4 +-
 .../james/imap/encode/QuotaResponseEncoder.java    |   6 +-
 .../james/imap/message/response/QuotaResponse.java |   6 +-
 .../james/imap/processor/GetQuotaProcessor.java    |  10 +-
 .../imap/processor/GetQuotaRootProcessor.java      |  10 +-
 .../imap/encode/QuotaResponseEncoderTest.java      |  10 +-
 .../imap/message/response/QuotaResponseTest.java   |  15 +--
 .../imap/processor/GetQuotaProcessorTest.java      |  14 ++-
 .../imap/processor/GetQuotaRootProcessorTest.java  |  14 ++-
 .../main/java/org/apache/james/cli/ServerCmd.java  |  36 +++---
 .../apache/james/cli/probe/impl/JmxQuotaProbe.java |  28 +++--
 .../java/org/apache/james/cli/ServerCmdTest.java   |  36 +++---
 .../java/org/apache/james/JPAJamesServerTest.java  |   6 +-
 .../org/apache/james/modules/QuotaProbesImpl.java  |  48 ++++----
 .../james/modules/protocols/SieveProbeImpl.java    |   6 +-
 .../james/adapter/mailbox/QuotaManagement.java     |  48 ++++----
 .../adapter/mailbox/QuotaManagementMBean.java      |  28 +++--
 .../mailbox/MaxQuotaConfigurationReader.java       |  12 +-
 .../sieverepository/api/SieveQuotaRepository.java  |  10 +-
 .../sieve/cassandra/CassandraSieveQuotaDAO.java    |  14 +--
 .../sieve/cassandra/CassandraSieveRepository.java  |  18 +--
 .../james/sieve/cassandra/model/SieveQuota.java    |  11 +-
 .../cassandra/CassandraSieveQuotaDAOTest.java      |   4 +-
 .../sieve/cassandra/model/SieveQuotaTest.java      |   8 +-
 .../sieverepository/file/SieveFileRepository.java  |  14 +--
 .../apache/james/sieve/jpa/JPASieveRepository.java |  29 ++---
 .../james/sieve/jpa/model/JPASieveQuota.java       |   8 +-
 .../lib/SieveRepositoryManagement.java             |   6 +-
 .../lib/AbstractSieveRepositoryTest.java           |  16 +--
 .../memory/InMemorySieveQuotaRepository.java       |  16 +--
 .../transport/mailets/IsOverQuotaMatcherTest.java  |  12 +-
 .../james/transport/matchers/IsOverQuotaTest.java  |  16 +--
 .../integration/GetMailboxesMethodTest.java        |  14 +--
 .../methods/integration/QuotaMailingTest.java      |   8 +-
 .../methods/integration/SendMDNMethodTest.java     |   6 +-
 .../methods/integration/SetMessagesMethodTest.java |  10 +-
 .../james/jmap/draft/model/mailbox/Quotas.java     |  21 ++--
 .../james/jmap/draft/utils/quotas/QuotaLoader.java |  17 ++-
 .../james/webadmin/routes/SieveQuotaRoutes.java    |  16 +--
 .../webadmin/routes/SieveQuotaRoutesTest.java      |  14 +--
 .../apache/james/webadmin/dto/OccupationDTO.java   |   8 +-
 .../james/webadmin/dto/OccupationRatioDTO.java     |   8 +-
 .../apache/james/webadmin/dto/QuotaDetailsDTO.java |   8 +-
 .../james/webadmin/dto/QuotaValueDeserializer.java |   4 +-
 .../james/webadmin/dto/QuotaValueSerializer.java   |   4 +-
 .../james/webadmin/dto/ValidatedQuotaDTO.java      |  22 ++--
 .../apache/james/webadmin/jackson/QuotaModule.java |  12 +-
 .../james/webadmin/routes/DomainQuotaRoutes.java   |  12 +-
 .../james/webadmin/routes/GlobalQuotaRoutes.java   |  16 +--
 .../james/webadmin/routes/UserQuotaRoutes.java     |  12 +-
 .../james/webadmin/service/DomainQuotaService.java |  12 +-
 .../james/webadmin/service/GlobalQuotaService.java |  16 +--
 .../james/webadmin/service/UserQuotaService.java   |  14 +--
 .../webadmin/validation/QuotaDTOValidator.java     |  20 +--
 .../apache/james/webadmin/validation/Quotas.java   |  16 +--
 ...t.java => QuotaLimitValueDeserializerTest.java} |  14 +--
 .../webadmin/dto/UsersQuotaDetailsDTOTest.java     |  10 +-
 .../webadmin/routes/DomainQuotaRoutesTest.java     |  78 ++++++------
 .../webadmin/routes/GlobalQuotaRoutesTest.java     |  68 +++++------
 .../james/webadmin/routes/UserQuotaRoutesTest.java | 108 ++++++++--------
 ...uotaValueTest.java => QuotaLimitValueTest.java} |  10 +-
 152 files changed, 1683 insertions(+), 1512 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaCount.java b/core/src/main/java/org/apache/james/core/quota/QuotaCountLimit.java
similarity index 72%
copy from core/src/main/java/org/apache/james/core/quota/QuotaCount.java
copy to core/src/main/java/org/apache/james/core/quota/QuotaCountLimit.java
index 0eb6915..1867e83 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaCount.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaCountLimit.java
@@ -24,24 +24,24 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
-public class QuotaCount implements QuotaValue<QuotaCount> {
+public class QuotaCountLimit implements QuotaLimitValue<QuotaCountLimit> {
 
-    public static QuotaCount unlimited() {
-        return new QuotaCount(Optional.empty());
+    public static QuotaCountLimit unlimited() {
+        return new QuotaCountLimit(Optional.empty());
     }
 
-    public static QuotaCount count(long value) {
+    public static QuotaCountLimit count(long value) {
         return count(Optional.of(value));
     }
 
-    public static QuotaCount count(Optional<Long> value) {
-        return new QuotaCount(value);
+    public static QuotaCountLimit count(Optional<Long> value) {
+        return new QuotaCountLimit(value);
     }
 
     private final Optional<Long> value;
 
-    private QuotaCount(Optional<Long> value) {
-        Preconditions.checkArgument(QuotaValue.isValidValue(value), "Quota limit should be positive");
+    private QuotaCountLimit(Optional<Long> value) {
+        Preconditions.checkArgument(QuotaLimitValue.isValidValue(value), "Quota limit should be positive");
         this.value = value;
     }
 
@@ -56,16 +56,16 @@ public class QuotaCount implements QuotaValue<QuotaCount> {
     }
 
     @Override
-    public QuotaCount add(long additionalValue) {
-        return new QuotaCount(value.map(x -> x + additionalValue));
+    public QuotaCountLimit add(long additionalValue) {
+        return new QuotaCountLimit(value.map(x -> x + additionalValue));
     }
 
     @Override
-    public QuotaCount add(QuotaCount additionalValue) {
+    public QuotaCountLimit add(QuotaCountLimit additionalValue) {
         if (additionalValue.isUnlimited()) {
             return unlimited();
         }
-        return new QuotaCount(value.map(x -> x + additionalValue.asLong()));
+        return new QuotaCountLimit(value.map(x -> x + additionalValue.asLong()));
     }
 
     @Override
@@ -76,14 +76,14 @@ public class QuotaCount implements QuotaValue<QuotaCount> {
     }
 
     @Override
-    public boolean isGreaterThan(QuotaCount other) {
+    public boolean isGreaterThan(QuotaCountLimit other) {
         return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
     }
 
     @Override
     public final boolean equals(Object o) {
-        if (o instanceof QuotaCount) {
-            QuotaCount that = (QuotaCount) o;
+        if (o instanceof QuotaCountLimit) {
+            QuotaCountLimit that = (QuotaCountLimit) o;
             return Objects.equal(this.value, that.value);
         }
         return false;
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaCount.java b/core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java
similarity index 68%
rename from core/src/main/java/org/apache/james/core/quota/QuotaCount.java
rename to core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java
index 0eb6915..7e67f1b 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaCount.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java
@@ -22,26 +22,24 @@ import java.util.Optional;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
 
-public class QuotaCount implements QuotaValue<QuotaCount> {
+public class QuotaCountUsage implements QuotaUsageValue<QuotaCountUsage, QuotaCountLimit> {
 
-    public static QuotaCount unlimited() {
-        return new QuotaCount(Optional.empty());
+    public static QuotaCountUsage unlimited() {
+        return new QuotaCountUsage(Optional.empty());
     }
 
-    public static QuotaCount count(long value) {
+    public static QuotaCountUsage count(long value) {
         return count(Optional.of(value));
     }
 
-    public static QuotaCount count(Optional<Long> value) {
-        return new QuotaCount(value);
+    public static QuotaCountUsage count(Optional<Long> value) {
+        return new QuotaCountUsage(value);
     }
 
     private final Optional<Long> value;
 
-    private QuotaCount(Optional<Long> value) {
-        Preconditions.checkArgument(QuotaValue.isValidValue(value), "Quota limit should be positive");
+    private QuotaCountUsage(Optional<Long> value) {
         this.value = value;
     }
 
@@ -56,16 +54,30 @@ public class QuotaCount implements QuotaValue<QuotaCount> {
     }
 
     @Override
-    public QuotaCount add(long additionalValue) {
-        return new QuotaCount(value.map(x -> x + additionalValue));
+    public QuotaCountUsage add(long additionalValue) {
+        return new QuotaCountUsage(value.map(x -> x + additionalValue));
     }
 
     @Override
-    public QuotaCount add(QuotaCount additionalValue) {
+    public QuotaCountUsage add(QuotaCountUsage additionalValue) {
         if (additionalValue.isUnlimited()) {
             return unlimited();
         }
-        return new QuotaCount(value.map(x -> x + additionalValue.asLong()));
+        return new QuotaCountUsage(value.map(x -> x + additionalValue.asLong()));
+    }
+
+    @Override
+    public boolean greaterThan(QuotaCountUsage other) {
+        return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
+    }
+
+    @Override
+    public boolean exceedLimit(QuotaCountLimit limit) {
+        if (limit.isLimited()) {
+            return value.orElse(Long.MAX_VALUE) > limit.asLong();
+        } else {
+            return false;
+        }
     }
 
     @Override
@@ -76,14 +88,9 @@ public class QuotaCount implements QuotaValue<QuotaCount> {
     }
 
     @Override
-    public boolean isGreaterThan(QuotaCount other) {
-        return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
-    }
-
-    @Override
     public final boolean equals(Object o) {
-        if (o instanceof QuotaCount) {
-            QuotaCount that = (QuotaCount) o;
+        if (o instanceof QuotaCountUsage) {
+            QuotaCountUsage that = (QuotaCountUsage) o;
             return Objects.equal(this.value, that.value);
         }
         return false;
@@ -93,4 +100,5 @@ public class QuotaCount implements QuotaValue<QuotaCount> {
     public final int hashCode() {
         return Objects.hashCode(value);
     }
+
 }
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaValue.java b/core/src/main/java/org/apache/james/core/quota/QuotaLimitValue.java
similarity index 96%
copy from core/src/main/java/org/apache/james/core/quota/QuotaValue.java
copy to core/src/main/java/org/apache/james/core/quota/QuotaLimitValue.java
index 4f07eec..ff32575 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaValue.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaLimitValue.java
@@ -20,7 +20,7 @@ package org.apache.james.core.quota;
 
 import java.util.Optional;
 
-public interface QuotaValue<T extends QuotaValue<T>> {
+public interface QuotaLimitValue<T extends QuotaLimitValue<T>> {
 
     static boolean isValidValue(Optional<Long> value) {
         return !value.isPresent() || value.get() >= 0;
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaSize.java b/core/src/main/java/org/apache/james/core/quota/QuotaSizeLimit.java
similarity index 71%
copy from core/src/main/java/org/apache/james/core/quota/QuotaSize.java
copy to core/src/main/java/org/apache/james/core/quota/QuotaSizeLimit.java
index 22d788f..d8997ae 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaSize.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaSizeLimit.java
@@ -24,26 +24,26 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
-public class QuotaSize implements QuotaValue<QuotaSize> {
+public class QuotaSizeLimit implements QuotaLimitValue<QuotaSizeLimit> {
 
-    public static final QuotaSize QUOTA_SIZE = new QuotaSize(Optional.empty());
+    public static final QuotaSizeLimit QUOTA_SIZE = new QuotaSizeLimit(Optional.empty());
 
-    public static QuotaSize unlimited() {
+    public static QuotaSizeLimit unlimited() {
         return QUOTA_SIZE;
     }
 
-    public static QuotaSize size(long value) {
+    public static QuotaSizeLimit size(long value) {
         return size(Optional.of(value));
     }
 
-    public static QuotaSize size(Optional<Long> value) {
-        return new QuotaSize(value);
+    public static QuotaSizeLimit size(Optional<Long> value) {
+        return new QuotaSizeLimit(value);
     }
 
     private final Optional<Long> value;
 
-    private QuotaSize(Optional<Long> value) {
-        Preconditions.checkArgument(QuotaValue.isValidValue(value), "Quota limit should be positive");
+    private QuotaSizeLimit(Optional<Long> value) {
+        Preconditions.checkArgument(QuotaLimitValue.isValidValue(value), "Quota limit should be positive");
         this.value = value;
     }
 
@@ -58,20 +58,20 @@ public class QuotaSize implements QuotaValue<QuotaSize> {
     }
 
     @Override
-    public QuotaSize add(long additionalValue) {
-        return new QuotaSize(value.map(x -> x + additionalValue));
+    public QuotaSizeLimit add(long additionalValue) {
+        return new QuotaSizeLimit(value.map(x -> x + additionalValue));
     }
 
     @Override
-    public QuotaSize add(QuotaSize additionalValue) {
+    public QuotaSizeLimit add(QuotaSizeLimit additionalValue) {
         if (additionalValue.isUnlimited()) {
             return unlimited();
         }
-        return new QuotaSize(value.map(x -> x + additionalValue.asLong()));
+        return new QuotaSizeLimit(value.map(x -> x + additionalValue.asLong()));
     }
 
     @Override
-    public boolean isGreaterThan(QuotaSize other) {
+    public boolean isGreaterThan(QuotaSizeLimit other) {
         return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
     }
 
@@ -84,8 +84,8 @@ public class QuotaSize implements QuotaValue<QuotaSize> {
 
     @Override
     public final boolean equals(Object o) {
-        if (o instanceof QuotaSize) {
-            QuotaSize that = (QuotaSize) o;
+        if (o instanceof QuotaSizeLimit) {
+            QuotaSizeLimit that = (QuotaSizeLimit) o;
             return Objects.equal(this.value, that.value);
         }
         return false;
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaSize.java b/core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java
similarity index 68%
rename from core/src/main/java/org/apache/james/core/quota/QuotaSize.java
rename to core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java
index 22d788f..7bc74fb 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaSize.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java
@@ -22,28 +22,26 @@ import java.util.Optional;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
 
-public class QuotaSize implements QuotaValue<QuotaSize> {
+public class QuotaSizeUsage implements QuotaUsageValue<QuotaSizeUsage, QuotaSizeLimit> {
 
-    public static final QuotaSize QUOTA_SIZE = new QuotaSize(Optional.empty());
+    public static final QuotaSizeUsage QUOTA_SIZE = new QuotaSizeUsage(Optional.empty());
 
-    public static QuotaSize unlimited() {
+    public static QuotaSizeUsage unlimited() {
         return QUOTA_SIZE;
     }
 
-    public static QuotaSize size(long value) {
+    public static QuotaSizeUsage size(long value) {
         return size(Optional.of(value));
     }
 
-    public static QuotaSize size(Optional<Long> value) {
-        return new QuotaSize(value);
+    public static QuotaSizeUsage size(Optional<Long> value) {
+        return new QuotaSizeUsage(value);
     }
 
     private final Optional<Long> value;
 
-    private QuotaSize(Optional<Long> value) {
-        Preconditions.checkArgument(QuotaValue.isValidValue(value), "Quota limit should be positive");
+    private QuotaSizeUsage(Optional<Long> value) {
         this.value = value;
     }
 
@@ -58,24 +56,33 @@ public class QuotaSize implements QuotaValue<QuotaSize> {
     }
 
     @Override
-    public QuotaSize add(long additionalValue) {
-        return new QuotaSize(value.map(x -> x + additionalValue));
+    public QuotaSizeUsage add(long additionalValue) {
+        return new QuotaSizeUsage(value.map(x -> x + additionalValue));
     }
 
     @Override
-    public QuotaSize add(QuotaSize additionalValue) {
+    public QuotaSizeUsage add(QuotaSizeUsage additionalValue) {
         if (additionalValue.isUnlimited()) {
             return unlimited();
         }
-        return new QuotaSize(value.map(x -> x + additionalValue.asLong()));
+        return new QuotaSizeUsage(value.map(x -> x + additionalValue.asLong()));
     }
 
     @Override
-    public boolean isGreaterThan(QuotaSize other) {
+    public boolean greaterThan(QuotaSizeUsage other) {
         return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
     }
 
     @Override
+    public boolean exceedLimit(QuotaSizeLimit limit) {
+        if (limit.isLimited()) {
+            return value.orElse(Long.MAX_VALUE) > limit.asLong();
+        } else {
+            return false;
+        }
+    }
+
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
             .add("value", value.map(String::valueOf).orElse("unlimited"))
@@ -84,8 +91,8 @@ public class QuotaSize implements QuotaValue<QuotaSize> {
 
     @Override
     public final boolean equals(Object o) {
-        if (o instanceof QuotaSize) {
-            QuotaSize that = (QuotaSize) o;
+        if (o instanceof QuotaSizeUsage) {
+            QuotaSizeUsage that = (QuotaSizeUsage) o;
             return Objects.equal(this.value, that.value);
         }
         return false;
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaValue.java b/core/src/main/java/org/apache/james/core/quota/QuotaUsageValue.java
similarity index 87%
rename from core/src/main/java/org/apache/james/core/quota/QuotaValue.java
rename to core/src/main/java/org/apache/james/core/quota/QuotaUsageValue.java
index 4f07eec..d96d55d 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaValue.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaUsageValue.java
@@ -20,10 +20,10 @@ package org.apache.james.core.quota;
 
 import java.util.Optional;
 
-public interface QuotaValue<T extends QuotaValue<T>> {
+public interface QuotaUsageValue<T extends QuotaUsageValue<T, U>, U extends QuotaLimitValue<U>> {
 
     static boolean isValidValue(Optional<Long> value) {
-        return !value.isPresent() || value.get() >= 0;
+        return !value.isPresent() || value.get() >= -1;
     }
 
     long asLong();
@@ -38,5 +38,7 @@ public interface QuotaValue<T extends QuotaValue<T>> {
 
     T add(T additionalValue);
 
-    boolean isGreaterThan(T other);
+    boolean greaterThan(T other);
+
+    boolean exceedLimit(U limit);
 }
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaCountTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaCountLimitTest.java
similarity index 81%
rename from core/src/test/java/org/apache/james/core/quota/QuotaCountTest.java
rename to core/src/test/java/org/apache/james/core/quota/QuotaCountLimitTest.java
index 4722297..f001076 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaCountTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaCountLimitTest.java
@@ -22,21 +22,21 @@ import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class QuotaCountTest implements QuotaValueTest<QuotaCount> {
+public class QuotaCountLimitTest implements QuotaLimitValueTest<QuotaCountLimit> {
 
     @Override
-    public QuotaCount instance(long value) {
-        return QuotaCount.count(value);
+    public QuotaCountLimit instance(long value) {
+        return QuotaCountLimit.count(value);
     }
 
     @Override
-    public QuotaCount unlimited() {
-        return QuotaCount.unlimited();
+    public QuotaCountLimit unlimited() {
+        return QuotaCountLimit.unlimited();
     }
 
     @Test
     void shouldRespectBeanContract() {
-        EqualsVerifier.forClass(QuotaCount.class).verify();
+        EqualsVerifier.forClass(QuotaCountLimit.class).verify();
     }
 
 }
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaCountUsageTest.java
similarity index 75%
copy from core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java
copy to core/src/test/java/org/apache/james/core/quota/QuotaCountUsageTest.java
index 7d1fa7b..5e6679a 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaCountUsageTest.java
@@ -18,25 +18,19 @@
  ****************************************************************/
 package org.apache.james.core.quota;
 
-import org.junit.jupiter.api.Test;
-
-import nl.jqno.equalsverifier.EqualsVerifier;
-
-public class QuotaSizeTest implements QuotaValueTest<QuotaSize> {
-
+public class QuotaCountUsageTest implements QuotaUsageValueTest<QuotaCountLimit, QuotaCountUsage> {
     @Override
-    public QuotaSize instance(long value) {
-        return QuotaSize.size(value);
+    public QuotaCountUsage usageInstance(long value) {
+        return QuotaCountUsage.count(value);
     }
 
     @Override
-    public QuotaSize unlimited() {
-        return QuotaSize.unlimited();
+    public QuotaCountLimit limitInstance(long value) {
+        return QuotaCountLimit.count(value);
     }
 
-    @Test
-    void shouldRespectBeanContract() {
-        EqualsVerifier.forClass(QuotaSize.class).verify();
+    @Override
+    public QuotaCountLimit unlimited() {
+        return QuotaCountLimit.unlimited();
     }
-
 }
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaValueTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java
similarity index 97%
copy from core/src/test/java/org/apache/james/core/quota/QuotaValueTest.java
copy to core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java
index 8545e31..8a8e28f 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaValueTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaLimitValueTest.java
@@ -22,7 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.junit.jupiter.api.Test;
 
-public interface QuotaValueTest<T extends QuotaValue<T>> {
+public interface QuotaLimitValueTest<T extends QuotaLimitValue<T>> {
 
     T instance(long i);
 
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaSizeLimitTest.java
similarity index 81%
copy from core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java
copy to core/src/test/java/org/apache/james/core/quota/QuotaSizeLimitTest.java
index 7d1fa7b..d540166 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaSizeLimitTest.java
@@ -22,21 +22,21 @@ import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class QuotaSizeTest implements QuotaValueTest<QuotaSize> {
+public class QuotaSizeLimitTest implements QuotaLimitValueTest<QuotaSizeLimit> {
 
     @Override
-    public QuotaSize instance(long value) {
-        return QuotaSize.size(value);
+    public QuotaSizeLimit instance(long value) {
+        return QuotaSizeLimit.size(value);
     }
 
     @Override
-    public QuotaSize unlimited() {
-        return QuotaSize.unlimited();
+    public QuotaSizeLimit unlimited() {
+        return QuotaSizeLimit.unlimited();
     }
 
     @Test
     void shouldRespectBeanContract() {
-        EqualsVerifier.forClass(QuotaSize.class).verify();
+        EqualsVerifier.forClass(QuotaSizeLimit.class).verify();
     }
 
 }
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaSizeUsageTest.java
similarity index 75%
rename from core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java
rename to core/src/test/java/org/apache/james/core/quota/QuotaSizeUsageTest.java
index 7d1fa7b..7e81862 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaSizeUsageTest.java
@@ -18,25 +18,19 @@
  ****************************************************************/
 package org.apache.james.core.quota;
 
-import org.junit.jupiter.api.Test;
-
-import nl.jqno.equalsverifier.EqualsVerifier;
-
-public class QuotaSizeTest implements QuotaValueTest<QuotaSize> {
-
+public class QuotaSizeUsageTest implements QuotaUsageValueTest<QuotaSizeLimit, QuotaSizeUsage> {
     @Override
-    public QuotaSize instance(long value) {
-        return QuotaSize.size(value);
+    public QuotaSizeUsage usageInstance(long value) {
+        return QuotaSizeUsage.size(value);
     }
 
     @Override
-    public QuotaSize unlimited() {
-        return QuotaSize.unlimited();
+    public QuotaSizeLimit limitInstance(long value) {
+        return QuotaSizeLimit.size(value);
     }
 
-    @Test
-    void shouldRespectBeanContract() {
-        EqualsVerifier.forClass(QuotaSize.class).verify();
+    @Override
+    public QuotaSizeLimit unlimited() {
+        return QuotaSizeLimit.unlimited();
     }
-
 }
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaValueTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java
similarity index 61%
rename from core/src/test/java/org/apache/james/core/quota/QuotaValueTest.java
rename to core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java
index 8545e31..8e4ddce 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaValueTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java
@@ -22,54 +22,51 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.junit.jupiter.api.Test;
 
-public interface QuotaValueTest<T extends QuotaValue<T>> {
+public interface QuotaUsageValueTest<T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> {
 
-    T instance(long i);
+    U usageInstance(long value);
+
+    T limitInstance(long value);
 
     T unlimited();
 
     @Test
     default void greaterThanShouldReturnFalseWhenFirstEqualToSecond() {
-        assertThat(instance(1).isGreaterThan(instance(1))).isFalse();
+        assertThat(usageInstance(1).greaterThan(usageInstance(1))).isFalse();
     }
 
     @Test
     default void greaterThanShouldReturnFalseWhenFirstSmallerThanSecond() {
-        assertThat(instance(1).isGreaterThan(instance(2))).isFalse();
+        assertThat(usageInstance(1).greaterThan(usageInstance(2))).isFalse();
     }
 
     @Test
     default void greaterThanShouldReturnTrueWhenFirstGreaterThanSecond() {
-        assertThat(instance(2).isGreaterThan(instance(1))).isTrue();
-    }
-
-    @Test
-    default void greaterThanShouldReturnFalseWhenFirstIsLimitedAndSecondUnlimited() {
-        assertThat(instance(1).isGreaterThan(unlimited())).isFalse();
+        assertThat(usageInstance(2).greaterThan(usageInstance(1))).isTrue();
     }
 
     @Test
-    default void greaterThanShouldReturnFalseWhenBothAreUnlimited() {
-        assertThat(unlimited().isGreaterThan(unlimited())).isFalse();
+    default void greaterThanShouldReturnFalseWhenUsageEqualToLimit() {
+        assertThat(usageInstance(1).exceedLimit(limitInstance(1))).isFalse();
     }
 
     @Test
-    default void greaterThanShouldReturnTrueWhenFirstIsUnlimitedAndSecondLimited() {
-        assertThat(unlimited().isGreaterThan(instance(1))).isTrue();
+    default void greaterThanShouldReturnFalseWhenUsageSmallerThanLimit() {
+        assertThat(usageInstance(1).exceedLimit(limitInstance(2))).isFalse();
     }
 
     @Test
-    default void addShouldReturnUnlimitedWhenThisIsUnlimited() {
-        assertThat(unlimited().add(2)).isEqualTo(unlimited());
+    default void greaterThanShouldReturnTrueWhenUsageGreaterThanLimit() {
+        assertThat(usageInstance(2).exceedLimit(limitInstance(1))).isTrue();
     }
 
     @Test
-    default void addShouldReturnUnlimitedWhenBothAre() {
-        assertThat(unlimited().add(unlimited())).isEqualTo(unlimited());
+    default void greaterThanShouldReturnFalseWhenUsageIsLimitedAndLimitIsUnlimited() {
+        assertThat(usageInstance(1).exceedLimit(unlimited())).isFalse();
     }
 
     @Test
     default void addShouldReturnSumResult() {
-        assertThat(instance(12).add(instance(23))).isEqualTo(instance(35));
+        assertThat(usageInstance(12).add(usageInstance(23))).isEqualTo(usageInstance(35));
     }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java b/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java
index 34bfdc6..7c71968 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/events/MailboxListener.java
@@ -27,8 +27,10 @@ import java.util.Objects;
 import java.util.SortedMap;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.acl.ACLDiff;
@@ -83,11 +85,11 @@ public interface MailboxListener {
         private final EventId eventId;
         private final Username username;
         private final QuotaRoot quotaRoot;
-        private final Quota<QuotaCount> countQuota;
-        private final Quota<QuotaSize> sizeQuota;
+        private final Quota<QuotaCountLimit, QuotaCountUsage> countQuota;
+        private final Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota;
         private final Instant instant;
 
-        public QuotaUsageUpdatedEvent(EventId eventId, Username username, QuotaRoot quotaRoot, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
+        public QuotaUsageUpdatedEvent(EventId eventId, Username username, QuotaRoot quotaRoot, Quota<QuotaCountLimit, QuotaCountUsage> countQuota, Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Instant instant) {
             this.eventId = eventId;
             this.username = username;
             this.quotaRoot = quotaRoot;
@@ -106,11 +108,11 @@ public interface MailboxListener {
             return username;
         }
 
-        public Quota<QuotaCount> getCountQuota() {
+        public Quota<QuotaCountLimit, QuotaCountUsage> getCountQuota() {
             return countQuota;
         }
 
-        public Quota<QuotaSize> getSizeQuota() {
+        public Quota<QuotaSizeLimit, QuotaSizeUsage> getSizeQuota() {
             return sizeQuota;
         }
 
@@ -218,10 +220,10 @@ public interface MailboxListener {
      */
     class MailboxDeletion extends MailboxEvent {
         private final QuotaRoot quotaRoot;
-        private final QuotaCount deletedMessageCount;
-        private final QuotaSize totalDeletedSize;
+        private final QuotaCountUsage deletedMessageCount;
+        private final QuotaSizeUsage totalDeletedSize;
 
-        public MailboxDeletion(MailboxSession.SessionId sessionId, Username username, MailboxPath path, QuotaRoot quotaRoot, QuotaCount deletedMessageCount, QuotaSize totalDeletedSize,
+        public MailboxDeletion(MailboxSession.SessionId sessionId, Username username, MailboxPath path, QuotaRoot quotaRoot, QuotaCountUsage deletedMessageCount, QuotaSizeUsage totalDeletedSize,
                                MailboxId mailboxId, EventId eventId) {
             super(sessionId, username, path, mailboxId, eventId);
             this.quotaRoot = quotaRoot;
@@ -238,11 +240,11 @@ public interface MailboxListener {
             return quotaRoot;
         }
 
-        public QuotaCount getDeletedMessageCount() {
+        public QuotaCountUsage getDeletedMessageCount() {
             return deletedMessageCount;
         }
 
-        public QuotaSize getTotalDeletedSize() {
+        public QuotaSizeUsage getTotalDeletedSize() {
             return totalDeletedSize;
         }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java
index b8b13bd..711bfc0 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java
@@ -18,7 +18,8 @@
  ****************************************************************/
 package org.apache.james.mailbox.exception;
 
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaUsageValue;
 
 /**
  * {@link MailboxException} which identicate that a user was over-quota
@@ -27,24 +28,24 @@ public class OverQuotaException extends MailboxException {
 
     private static final long serialVersionUID = 532673188582481689L;
     
-    private QuotaValue<?> used;
-    private QuotaValue<?> max;
+    private QuotaUsageValue<?, ?> used;
+    private QuotaLimitValue<?> max;
 
-    public OverQuotaException(String msg, QuotaValue<?> max, QuotaValue<?> used) {
+    public OverQuotaException(String msg, QuotaLimitValue<?> max, QuotaUsageValue<?, ?> used) {
         super(msg);
         this.used = used;
         this.max = max;
     }
     
-    public OverQuotaException(QuotaValue<?> max, QuotaValue<?> used) {
+    public OverQuotaException(QuotaLimitValue<?> max, QuotaUsageValue<?, ?> used) {
         this(null, max, used);
     }
     
-    public QuotaValue<?> getUsed() {
+    public QuotaUsageValue<?, ?> getUsed() {
         return used;
     }
     
-    public QuotaValue<?> getMax() {
+    public QuotaLimitValue<?> getMax() {
         return max;
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
index 0ea126f..0cbfe2e 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
@@ -20,13 +20,14 @@ package org.apache.james.mailbox.model;
 
 import java.util.Map;
 
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaUsageValue;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 
-public class Quota<T extends QuotaValue<T>> {
+public class Quota<T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> {
 
     public enum Scope {
         Domain,
@@ -34,53 +35,53 @@ public class Quota<T extends QuotaValue<T>> {
         User
     }
 
-    public static <T extends QuotaValue<T>> Builder<T> builder() {
+    public static <T extends QuotaLimitValue<T>,  U extends QuotaUsageValue<U, T>> Builder<T, U> builder() {
         return new Builder<>();
     }
 
-    public static class Builder<T extends QuotaValue<T>> {
+    public static class Builder<T extends QuotaLimitValue<T>,  U extends QuotaUsageValue<U, T>> {
 
         private final ImmutableMap.Builder<Scope, T> limitsByScope;
         private T computedLimit;
-        private T used;
+        private U used;
 
         private Builder() {
             limitsByScope = ImmutableMap.builder();
         }
 
-        public Builder<T> computedLimit(T limit) {
+        public Builder<T, U> computedLimit(T limit) {
             this.computedLimit = limit;
             return this;
         }
 
-        public Builder<T> used(T used) {
+        public Builder<T, U> used(U used) {
             this.used = used;
             return this;
         }
 
-        public Builder<T> limitsByScope(Map<Scope, T> limits) {
+        public Builder<T, U> limitsByScope(Map<Scope, T> limits) {
             limitsByScope.putAll(limits);
             return this;
         }
 
-        public Builder<T> limitForScope(T limit, Scope scope) {
+        public Builder<T, U> limitForScope(T limit, Scope scope) {
             limitsByScope.put(scope, limit);
             return this;
         }
 
-        public Quota<T> build() {
+        public Quota<T, U> build() {
             Preconditions.checkState(used != null);
             Preconditions.checkState(computedLimit != null);
-            return new Quota<>(used, computedLimit, limitsByScope.build());
+            return new Quota<T, U>(used, computedLimit, limitsByScope.build());
         }
 
     }
 
     private final T limit;
     private final ImmutableMap<Scope, T> limitByScope;
-    private final T used;
+    private final U used;
 
-    private Quota(T used, T max, ImmutableMap<Scope, T> limitByScope) {
+    private Quota(U used, T max, ImmutableMap<Scope, T> limitByScope) {
         this.used = used;
         this.limit = max;
         this.limitByScope = limitByScope;
@@ -90,7 +91,7 @@ public class Quota<T extends QuotaValue<T>> {
         return limit;
     }
 
-    public T getUsed() {
+    public U getUsed() {
         return used;
     }
 
@@ -105,8 +106,8 @@ public class Quota<T extends QuotaValue<T>> {
         return limitByScope;
     }
 
-    public Quota<T> addValueToQuota(T value) {
-        return new Quota<>(used.add(value), limit, limitByScope);
+    public Quota<T, U> addValueToQuota(U value) {
+        return new Quota<T, U>(used.add(value), limit, limitByScope);
     }
 
     /**
@@ -120,7 +121,7 @@ public class Quota<T extends QuotaValue<T>> {
 
     public boolean isOverQuotaWithAdditionalValue(long additionalValue) {
         Preconditions.checkArgument(additionalValue >= 0);
-        return limit.isLimited() && used.add(additionalValue).isGreaterThan(limit);
+        return limit.isLimited() && used.add(additionalValue).exceedLimit(limit);
     }
 
     @Override
@@ -133,7 +134,7 @@ public class Quota<T extends QuotaValue<T>> {
         if (o == null || ! (o instanceof  Quota)) {
             return false;
         }
-        Quota<?> other = (Quota<?>) o;
+        Quota<?, ?> other = (Quota<?, ?>) o;
         return Objects.equal(used, other.getUsed())
             && Objects.equal(limit,other.getLimit());
     }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java
index 649439f..dcf3d15 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java
@@ -20,33 +20,35 @@ package org.apache.james.mailbox.model;
 
 import java.util.Objects;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 
 public class QuotaRatio {
 
-    public static QuotaRatio from(Quota<QuotaSize> quotaSize, Quota<QuotaCount> quotaCount) {
+    public static QuotaRatio from(Quota<QuotaSizeLimit, QuotaSizeUsage> quotaSize, Quota<QuotaCountLimit, QuotaCountUsage> quotaCount) {
         return new QuotaRatio(quotaSize, quotaCount);
     }
 
-    private final Quota<QuotaSize> quotaSize;
-    private final Quota<QuotaCount> quotaCount;
+    private final Quota<QuotaSizeLimit, QuotaSizeUsage> quotaSize;
+    private final Quota<QuotaCountLimit, QuotaCountUsage> quotaCount;
 
-    private QuotaRatio(Quota<QuotaSize> quotaSize, Quota<QuotaCount> quotaCount) {
+    private QuotaRatio(Quota<QuotaSizeLimit, QuotaSizeUsage> quotaSize, Quota<QuotaCountLimit, QuotaCountUsage> quotaCount) {
         Preconditions.checkNotNull(quotaSize, "'quotaSize' is mandatory");
         Preconditions.checkNotNull(quotaCount, "'quotaCount' is mandatory");
         this.quotaSize = quotaSize;
         this.quotaCount = quotaCount;
     }
 
-    public Quota<QuotaSize> getQuotaSize() {
+    public Quota<QuotaSizeLimit, QuotaSizeUsage> getQuotaSize() {
         return quotaSize;
     }
 
-    public Quota<QuotaCount> getQuotaCount() {
+    public Quota<QuotaCountLimit, QuotaCountUsage> getQuotaCount() {
         return quotaCount;
     }
 
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuota.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuota.java
index 4e1ff1d..a490201 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuota.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuota.java
@@ -23,29 +23,30 @@ import java.io.Serializable;
 import java.util.Objects;
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaUsageValue;
 
 import com.google.common.base.MoreObjects;
 
-public class SerializableQuota<T extends QuotaValue<T>> implements Serializable {
+public class SerializableQuota<T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> implements Serializable {
 
     public static final long UNLIMITED = -1;
 
-    public static <U extends QuotaValue<U>> SerializableQuota<U> newInstance(Quota<U> quota) {
+    public static <T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> SerializableQuota<T, U> newInstance(Quota<T, U> quota) {
         return newInstance(quota.getUsed(), quota.getLimit());
     }
 
-    public static <U extends QuotaValue<U>> SerializableQuota<U> newInstance(U used, U max) {
+    public static <T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> SerializableQuota<T, U> newInstance(U used, T max) {
         return new SerializableQuota<>(
-            new SerializableQuotaValue<>(used),
-            new SerializableQuotaValue<>(max)
+            new SerializableQuotaUsageValue<>(used),
+            new SerializableQuotaLimitValue<>(max)
         );
     }
 
-    private final SerializableQuotaValue<T> max;
-    private final SerializableQuotaValue<T> used;
+    private final SerializableQuotaLimitValue<T> max;
+    private final SerializableQuotaUsageValue<T, U> used;
 
-    private SerializableQuota(SerializableQuotaValue<T> used, SerializableQuotaValue<T> max) {
+    private SerializableQuota(SerializableQuotaUsageValue<T, U> used, SerializableQuotaLimitValue<T> max) {
         this.max = max;
         this.used = used;
     }
@@ -55,13 +56,13 @@ public class SerializableQuota<T extends QuotaValue<T>> implements Serializable
     }
 
     public Long getUsed() {
-        return Optional.ofNullable(used).map(SerializableQuotaValue::encodeAsLong).orElse(null);
+        return Optional.ofNullable(used).map(SerializableQuotaUsageValue::encodeAsLong).orElse(null);
     }
 
     @Override
     public boolean equals(Object o) {
-        if (o instanceof SerializableQuota<?>) {
-            SerializableQuota<?> that = (SerializableQuota<?>) o;
+        if (o instanceof SerializableQuota<?, ?>) {
+            SerializableQuota<?, ?> that = (SerializableQuota<?,?>) o;
             return Objects.equals(max, that.max) &&
                 Objects.equals(used, that.used);
         }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaValue.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaLimitValue.java
similarity index 79%
copy from mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaValue.java
copy to mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaLimitValue.java
index 20689f9..07fe751 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaValue.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaLimitValue.java
@@ -24,32 +24,54 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Function;
 
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaLimitValue;
 
 import com.google.common.base.MoreObjects;
 
-public class SerializableQuotaValue<T extends QuotaValue<T>> implements Serializable {
+public class SerializableQuotaLimitValue<T extends QuotaLimitValue<T>> implements Serializable {
 
-    public static <U extends QuotaValue<U>> SerializableQuotaValue<U> valueOf(Optional<U> input) {
-        return new SerializableQuotaValue<>(input.orElse(null));
+    public static <U extends QuotaLimitValue<U>> SerializableQuotaLimitValue<U> valueOf(Optional<U> input) {
+        return new SerializableQuotaLimitValue<>(input.orElse(null));
     }
 
     public static final long UNLIMITED = -1;
 
+    private static <U extends QuotaLimitValue<U>> Long encodeAsLong(U quota) {
+        if (quota.isLimited()) {
+            return quota.asLong();
+        }
+        return UNLIMITED;
+    }
+
     private final Long value;
 
-    public SerializableQuotaValue(T value) {
+    public SerializableQuotaLimitValue(T value) {
         this(encodeAsLong(value));
     }
 
-    SerializableQuotaValue(Long value) {
+    SerializableQuotaLimitValue(Long value) {
         this.value = value;
     }
 
+    public Long encodeAsLong() {
+        return value;
+    }
+
+    public Optional<T> toValue(Function<Long, T> factory, T unlimited) {
+        Long longValue = encodeAsLong();
+        if (longValue == null) {
+            return Optional.empty();
+        }
+        if (longValue == UNLIMITED) {
+            return Optional.of(unlimited);
+        }
+        return Optional.of(factory.apply(longValue));
+    }
+
     @Override
     public boolean equals(Object o) {
-        if (o instanceof SerializableQuotaValue<?>) {
-            SerializableQuotaValue<?> that = (SerializableQuotaValue<?>) o;
+        if (o instanceof SerializableQuotaLimitValue<?>) {
+            SerializableQuotaLimitValue<?> that = (SerializableQuotaLimitValue<?>) o;
             return Objects.equals(value, that.value);
         }
         return false;
@@ -66,26 +88,4 @@ public class SerializableQuotaValue<T extends QuotaValue<T>> implements Serializ
             .add("value", value)
             .toString();
     }
-
-    private static <U extends QuotaValue<U>> Long encodeAsLong(U quota) {
-        if (quota.isLimited()) {
-            return quota.asLong();
-        }
-        return UNLIMITED;
-    }
-
-    public Long encodeAsLong() {
-        return value;
-    }
-
-    public Optional<T> toValue(Function<Long, T> factory, T unlimited) {
-        Long longValue = encodeAsLong();
-        if (longValue == null) {
-            return Optional.empty();
-        }
-        if (longValue == UNLIMITED) {
-            return Optional.of(unlimited);
-        }
-        return Optional.of(factory.apply(longValue));
-    }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaValue.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaUsageValue.java
similarity index 73%
rename from mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaValue.java
rename to mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaUsageValue.java
index 20689f9..d62bc71 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaValue.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaUsageValue.java
@@ -24,32 +24,55 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.function.Function;
 
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaUsageValue;
 
 import com.google.common.base.MoreObjects;
 
-public class SerializableQuotaValue<T extends QuotaValue<T>> implements Serializable {
+public class SerializableQuotaUsageValue<T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> implements Serializable {
 
-    public static <U extends QuotaValue<U>> SerializableQuotaValue<U> valueOf(Optional<U> input) {
-        return new SerializableQuotaValue<>(input.orElse(null));
+    public static <T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> SerializableQuotaUsageValue<T, U> valueOf(Optional<U> input) {
+        return new SerializableQuotaUsageValue<T, U>(input.orElse(null));
     }
 
     public static final long UNLIMITED = -1;
 
+    private static <T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> Long encodeAsLong(U quota) {
+        if (quota.isLimited()) {
+            return quota.asLong();
+        }
+        return UNLIMITED;
+    }
+
     private final Long value;
 
-    public SerializableQuotaValue(T value) {
+    public SerializableQuotaUsageValue(U value) {
         this(encodeAsLong(value));
     }
 
-    SerializableQuotaValue(Long value) {
+    SerializableQuotaUsageValue(Long value) {
         this.value = value;
     }
 
+    public Long encodeAsLong() {
+        return value;
+    }
+
+    public Optional<U> toValue(Function<Long, U> factory, U unlimited) {
+        Long longValue = encodeAsLong();
+        if (longValue == null) {
+            return Optional.empty();
+        }
+        if (longValue == UNLIMITED) {
+            return Optional.of(unlimited);
+        }
+        return Optional.of(factory.apply(longValue));
+    }
+
     @Override
     public boolean equals(Object o) {
-        if (o instanceof SerializableQuotaValue<?>) {
-            SerializableQuotaValue<?> that = (SerializableQuotaValue<?>) o;
+        if (o instanceof SerializableQuotaUsageValue<?, ?>) {
+            SerializableQuotaUsageValue<?, ?> that = (SerializableQuotaUsageValue<?,?>) o;
             return Objects.equals(value, that.value);
         }
         return false;
@@ -66,26 +89,4 @@ public class SerializableQuotaValue<T extends QuotaValue<T>> implements Serializ
             .add("value", value)
             .toString();
     }
-
-    private static <U extends QuotaValue<U>> Long encodeAsLong(U quota) {
-        if (quota.isLimited()) {
-            return quota.asLong();
-        }
-        return UNLIMITED;
-    }
-
-    public Long encodeAsLong() {
-        return value;
-    }
-
-    public Optional<T> toValue(Function<Long, T> factory, T unlimited) {
-        Long longValue = encodeAsLong();
-        if (longValue == null) {
-            return Optional.empty();
-        }
-        if (longValue == UNLIMITED) {
-            return Optional.of(unlimited);
-        }
-        return Optional.of(factory.apply(longValue));
-    }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/probe/QuotaProbe.java b/mailbox/api/src/main/java/org/apache/james/mailbox/probe/QuotaProbe.java
index 40f89ac..1a223a7 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/probe/QuotaProbe.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/probe/QuotaProbe.java
@@ -19,34 +19,36 @@
 
 package org.apache.james.mailbox.probe;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.SerializableQuota;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 
 public interface QuotaProbe {
 
     String getQuotaRoot(String namespace, String user, String name) throws MailboxException;
 
-    SerializableQuota<QuotaCount> getMessageCountQuota(String quotaRoot) throws MailboxException;
+    SerializableQuota<QuotaCountLimit, QuotaCountUsage> getMessageCountQuota(String quotaRoot) throws MailboxException;
 
-    SerializableQuota<QuotaSize> getStorageQuota(String quotaRoot) throws MailboxException;
+    SerializableQuota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(String quotaRoot) throws MailboxException;
 
-    SerializableQuotaValue<QuotaCount> getMaxMessageCount(String quotaRoot) throws MailboxException;
+    SerializableQuotaLimitValue<QuotaCountLimit> getMaxMessageCount(String quotaRoot) throws MailboxException;
 
-    SerializableQuotaValue<QuotaSize> getMaxStorage(String quotaRoot) throws MailboxException;
+    SerializableQuotaLimitValue<QuotaSizeLimit> getMaxStorage(String quotaRoot) throws MailboxException;
 
-    SerializableQuotaValue<QuotaCount> getGlobalMaxMessageCount() throws MailboxException;
+    SerializableQuotaLimitValue<QuotaCountLimit> getGlobalMaxMessageCount() throws MailboxException;
 
-    SerializableQuotaValue<QuotaSize> getGlobalMaxStorage() throws MailboxException;
+    SerializableQuotaLimitValue<QuotaSizeLimit> getGlobalMaxStorage() throws MailboxException;
 
-    void setMaxMessageCount(String quotaRoot, SerializableQuotaValue<QuotaCount> maxMessageCount) throws MailboxException;
+    void setMaxMessageCount(String quotaRoot, SerializableQuotaLimitValue<QuotaCountLimit> maxMessageCount) throws MailboxException;
 
-    void setMaxStorage(String quotaRoot, SerializableQuotaValue<QuotaSize> maxSize) throws MailboxException;
+    void setMaxStorage(String quotaRoot, SerializableQuotaLimitValue<QuotaSizeLimit> maxSize) throws MailboxException;
 
-    void setGlobalMaxMessageCount(SerializableQuotaValue<QuotaCount> maxGlobalMessageCount) throws MailboxException;
+    void setGlobalMaxMessageCount(SerializableQuotaLimitValue<QuotaCountLimit> maxGlobalMessageCount) throws MailboxException;
 
-    void setGlobalMaxStorage(SerializableQuotaValue<QuotaSize> maxGlobalSize) throws MailboxException;
+    void setGlobalMaxStorage(SerializableQuotaLimitValue<QuotaSizeLimit> maxGlobalSize) throws MailboxException;
 
 }
\ No newline at end of file
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
index 4fe63b5..06cc970 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
@@ -19,8 +19,8 @@
 
 package org.apache.james.mailbox.quota;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.QuotaRoot;
 
@@ -29,8 +29,8 @@ import org.apache.james.mailbox.model.QuotaRoot;
  */
 public interface CurrentQuotaManager {
 
-    QuotaCount getCurrentMessageCount(QuotaRoot quotaRoot) throws MailboxException;
+    QuotaCountUsage getCurrentMessageCount(QuotaRoot quotaRoot) throws MailboxException;
 
-    QuotaSize getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException;
+    QuotaSizeUsage getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException;
 
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
index 6cb89b7..76afb3f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
@@ -23,8 +23,8 @@ import java.util.Map;
 import java.util.Optional;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.Quota.Scope;
@@ -45,7 +45,7 @@ public interface MaxQuotaManager {
      * @param quotaRoot Quota root argument from RFC 2087 ( correspond to the user owning this mailbox )
      * @param maxStorageQuota The new storage quota ( in bytes ) for this user
      */
-    void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) throws MailboxException;
+    void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) throws MailboxException;
 
     /**
      * Method allowing you to set the maximum message count allowed for this quotaroot
@@ -53,7 +53,7 @@ public interface MaxQuotaManager {
      * @param quotaRoot Quota root argument from RFC 2087
      * @param maxMessageCount The new message count allowed.
      */
-    void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount) throws MailboxException;
+    void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) throws MailboxException;
 
     /**
      * Method allowing you to remove the maximum messages count allowed for this quotaroot
@@ -74,7 +74,7 @@ public interface MaxQuotaManager {
      *
      * @param globalMaxStorage new global maximum storage
      */
-    void setGlobalMaxStorage(QuotaSize globalMaxStorage) throws MailboxException;
+    void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) throws MailboxException;
 
     /**
      * Method allowing you to remove the global maximum messages size in bytes.
@@ -86,7 +86,7 @@ public interface MaxQuotaManager {
      *
      * @param globalMaxMessageCount new global message count
      */
-    void setGlobalMaxMessage(QuotaCount globalMaxMessageCount) throws MailboxException;
+    void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) throws MailboxException;
 
     /**
      * Method allowing you to remove the global maximum messages count.
@@ -98,14 +98,14 @@ public interface MaxQuotaManager {
      *
      * @return global maximum storage, if defined
      */
-    Optional<QuotaSize> getGlobalMaxStorage() throws MailboxException;
+    Optional<QuotaSizeLimit> getGlobalMaxStorage() throws MailboxException;
 
     /**
      * Method allowing you to get the global maximum message count allowed
      *
      * @return global maximum message count, if defined
      */
-    Optional<QuotaCount> getGlobalMaxMessage() throws MailboxException;
+    Optional<QuotaCountLimit> getGlobalMaxMessage() throws MailboxException;
 
     /**
      * Return the maximum storage which is allowed for the given {@link QuotaRoot} (in fact the user which the session is bound to)
@@ -115,12 +115,12 @@ public interface MaxQuotaManager {
      * @param quotaRoot Quota root argument from RFC 2087 ( correspond to the user owning this mailbox )
      * @return The maximum storage in bytes if any
      */
-    default Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) throws MailboxException {
-        Map<Scope, QuotaSize> maxStorageDetails = listMaxStorageDetails(quotaRoot);
+    default Optional<QuotaSizeLimit> getMaxStorage(QuotaRoot quotaRoot) throws MailboxException {
+        Map<Scope, QuotaSizeLimit> maxStorageDetails = listMaxStorageDetails(quotaRoot);
         return getMaxStorage(maxStorageDetails);
     }
 
-    default Optional<QuotaSize> getMaxStorage(Map<Quota.Scope, QuotaSize> maxStorageDetails) {
+    default Optional<QuotaSizeLimit> getMaxStorage(Map<Quota.Scope, QuotaSizeLimit> maxStorageDetails) {
         return OptionalUtils.or(
             Optional.ofNullable(maxStorageDetails.get(Quota.Scope.User)),
             Optional.ofNullable(maxStorageDetails.get(Quota.Scope.Domain)),
@@ -133,41 +133,41 @@ public interface MaxQuotaManager {
      * @param quotaRoot Quota root argument from RFC 2087 ( correspond to the user owning this mailbox )
      * @return maximum of allowed message count
      */
-    default Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) throws MailboxException {
-        Map<Scope, QuotaCount> maxMessagesDetails = listMaxMessagesDetails(quotaRoot);
+    default Optional<QuotaCountLimit> getMaxMessage(QuotaRoot quotaRoot) throws MailboxException {
+        Map<Scope, QuotaCountLimit> maxMessagesDetails = listMaxMessagesDetails(quotaRoot);
         return getMaxMessage(maxMessagesDetails);
     }
 
-    default Optional<QuotaCount> getMaxMessage(Map<Quota.Scope, QuotaCount> maxMessagesDetails) {
+    default Optional<QuotaCountLimit> getMaxMessage(Map<Quota.Scope, QuotaCountLimit> maxMessagesDetails) {
         return OptionalUtils.or(
             Optional.ofNullable(maxMessagesDetails.get(Quota.Scope.User)),
             Optional.ofNullable(maxMessagesDetails.get(Quota.Scope.Domain)),
             Optional.ofNullable(maxMessagesDetails.get(Quota.Scope.Global)));
     }
 
-    Map<Quota.Scope, QuotaCount> listMaxMessagesDetails(QuotaRoot quotaRoot);
+    Map<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot);
 
-    Map<Quota.Scope, QuotaSize> listMaxStorageDetails(QuotaRoot quotaRoot);
+    Map<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot);
 
-    Optional<QuotaCount> getDomainMaxMessage(Domain domain);
+    Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain);
 
-    void setDomainMaxMessage(Domain domain, QuotaCount count) throws MailboxException;
+    void setDomainMaxMessage(Domain domain, QuotaCountLimit count) throws MailboxException;
 
     void removeDomainMaxMessage(Domain domain) throws MailboxException;
 
-    void setDomainMaxStorage(Domain domain, QuotaSize size) throws MailboxException;
+    void setDomainMaxStorage(Domain domain, QuotaSizeLimit size) throws MailboxException;
 
-    Optional<QuotaSize> getDomainMaxStorage(Domain domain);
+    Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain);
 
     void removeDomainMaxStorage(Domain domain) throws MailboxException;
 
-    default Optional<QuotaCount> getComputedMaxMessage(Domain domain) throws MailboxException {
+    default Optional<QuotaCountLimit> getComputedMaxMessage(Domain domain) throws MailboxException {
         return OptionalUtils.orSuppliers(
             Throwing.supplier(() -> getDomainMaxMessage(domain)).sneakyThrow(),
             Throwing.supplier(this::getGlobalMaxMessage).sneakyThrow());
     }
 
-    default Optional<QuotaSize> getComputedMaxStorage(Domain domain) throws MailboxException {
+    default Optional<QuotaSizeLimit> getComputedMaxStorage(Domain domain) throws MailboxException {
         return OptionalUtils.orSuppliers(
             Throwing.supplier(() -> getDomainMaxStorage(domain)).sneakyThrow(),
             Throwing.supplier(this::getGlobalMaxStorage).sneakyThrow());
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
index 675f2e5..5d1262c 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
@@ -18,8 +18,10 @@
  ****************************************************************/
 package org.apache.james.mailbox.quota;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -37,7 +39,7 @@ public interface QuotaManager {
      *
      * @param quotaRoot Quota root argument from RFC 2087 ( correspond to the user owning this mailbox )
      */
-    Quota<QuotaCount> getMessageQuota(QuotaRoot quotaRoot) throws MailboxException;
+    Quota<QuotaCountLimit, QuotaCountUsage> getMessageQuota(QuotaRoot quotaRoot) throws MailboxException;
 
 
     /**
@@ -46,5 +48,5 @@ public interface QuotaManager {
      *
      * @param quotaRoot Quota root argument from RFC 2087 ( correspond to the user owning this mailbox )
      */
-    Quota<QuotaSize> getStorageQuota(QuotaRoot quotaRoot) throws MailboxException;
+    Quota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(QuotaRoot quotaRoot) throws MailboxException;
 }
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 f58f049..fdaaf67 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
@@ -29,8 +29,10 @@ import javax.mail.Flags;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.acl.ACLDiff;
 import org.apache.james.mailbox.events.Event;
 import org.apache.james.mailbox.events.MailboxListener;
@@ -46,7 +48,6 @@ 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 {
@@ -56,8 +57,8 @@ class MailboxListenerTest {
     private static final MailboxSession.SessionId SESSION_ID = MailboxSession.SessionId.of(42);
     private static final TestId MAILBOX_ID = TestId.of(18);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("bob", Optional.empty());
-    private static final QuotaCount QUOTA_COUNT = QuotaCount.count(34);
-    private static final QuotaSize QUOTA_SIZE = QuotaSize.size(48);
+    private static final QuotaCountUsage QUOTA_COUNT = QuotaCountUsage.count(34);
+    private static final QuotaSizeUsage QUOTA_SIZE = QuotaSizeUsage.size(48);
     private static final MailboxACL ACL_1 = new MailboxACL(
         Pair.of(MailboxACL.EntryKey.createUserEntryKey(Username.of("Bob")), new MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer)));
     private static final MailboxACL ACL_2 = new MailboxACL(
@@ -204,13 +205,13 @@ class MailboxListenerTest {
     @Test
     void quotaUsageUpdatedEventShouldNotBeNoop() {
         MailboxListener.QuotaUsageUpdatedEvent event = new MailboxListener.QuotaUsageUpdatedEvent(Event.EventId.random(), BOB, QUOTA_ROOT,
-            Quota.<QuotaCount>builder()
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder()
                 .used(QUOTA_COUNT)
-                .computedLimit(QuotaCount.unlimited())
+                .computedLimit(QuotaCountLimit.unlimited())
                 .build(),
-            Quota.<QuotaSize>builder()
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
                 .used(QUOTA_SIZE)
-                .computedLimit(QuotaSize.unlimited())
+                .computedLimit(QuotaSizeLimit.unlimited())
                 .build(), Instant.now());
 
         assertThat(event.isNoop()).isFalse();
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 14fd87e..6293e57 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
@@ -40,8 +40,10 @@ import java.util.concurrent.CountDownLatch;
 import javax.mail.Flags;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MailboxManager.MailboxCapabilities;
 import org.apache.james.mailbox.MessageManager.AppendCommand;
 import org.apache.james.mailbox.events.EventBus;
@@ -86,7 +88,6 @@ import org.mockito.ArgumentCaptor;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-
 import reactor.core.publisher.Mono;
 
 /**
@@ -633,8 +634,8 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 .element(0)
                 .satisfies(event -> assertThat(event.getMailboxId()).isEqualTo(inboxId))
                 .satisfies(event -> assertThat(event.getQuotaRoot()).isEqualTo(quotaRoot))
-                .satisfies(event -> assertThat(event.getDeletedMessageCount()).isEqualTo(QuotaCount.count(0)))
-                .satisfies(event -> assertThat(event.getTotalDeletedSize()).isEqualTo(QuotaSize.size(0)));
+                .satisfies(event -> assertThat(event.getDeletedMessageCount()).isEqualTo(QuotaCountUsage.count(0)))
+                .satisfies(event -> assertThat(event.getTotalDeletedSize()).isEqualTo(QuotaSizeUsage.size(0)));
         }
 
         @Test
@@ -665,13 +666,13 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
                 .extracting(event -> (MailboxListener.QuotaUsageUpdatedEvent) event)
                 .element(0)
                 .satisfies(event -> assertThat(event.getQuotaRoot()).isEqualTo(quotaRoot))
-                .satisfies(event -> assertThat(event.getSizeQuota()).isEqualTo(Quota.<QuotaSize>builder()
-                    .used(QuotaSize.size(85))
-                    .computedLimit(QuotaSize.unlimited())
+                .satisfies(event -> assertThat(event.getSizeQuota()).isEqualTo(Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                    .used(QuotaSizeUsage.size(85))
+                    .computedLimit(QuotaSizeLimit.unlimited())
                     .build()))
-                .satisfies(event -> assertThat(event.getCountQuota()).isEqualTo(Quota.<QuotaCount>builder()
-                    .used(QuotaCount.count(1))
-                    .computedLimit(QuotaCount.unlimited())
+                .satisfies(event -> assertThat(event.getCountQuota()).isEqualTo(Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+                    .used(QuotaCountUsage.count(1))
+                    .computedLimit(QuotaCountLimit.unlimited())
                     .build()));
         }
 
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java
index 26d36af..0bb8411 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestProvisionner.java
@@ -27,8 +27,8 @@ import java.util.Calendar;
 import javax.mail.Flags;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
@@ -63,8 +63,8 @@ public class ManagerTestProvisionner {
         subFolder = new MailboxPath(inbox, "INBOX.SUB");
 
         MaxQuotaManager maxQuotaManager = integrationResources.getMaxQuotaManager();
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(1000));
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(1000000));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(1000));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(1000000));
     }
 
     public void createMailboxes() throws MailboxException {
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
index a2ce2da..c97b475 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
@@ -27,8 +27,10 @@ import java.util.List;
 
 import javax.mail.Flags;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -87,7 +89,7 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
 
     @Test
     void testAppendOverQuotaMessages() throws Exception {
-        QuotaCount maxMessageCount = QuotaCount.count(8);
+        QuotaCountLimit maxMessageCount = QuotaCountLimit.count(8);
         maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox), maxMessageCount);
 
         assertThatThrownBy(() -> provisionner.fillMailbox())
@@ -96,7 +98,7 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
 
     @Test
     void testAppendOverQuotaSize() throws Exception {
-        QuotaSize maxQuotaSize = QuotaSize.size(3 * MockMail.MAIL_TEXT_PLAIN.length() + 1);
+        QuotaSizeLimit maxQuotaSize = QuotaSizeLimit.size(3 * MockMail.MAIL_TEXT_PLAIN.length() + 1);
         maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), maxQuotaSize);
 
         assertThatThrownBy(() -> provisionner.fillMailbox())
@@ -110,7 +112,7 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
         } catch (OverQuotaException overQuotaException) {
             // Silent these exception as we don't want it to disturb the test
         }
-        QuotaCount maxMessageCount = QuotaCount.count(15L);
+        QuotaCountLimit maxMessageCount = QuotaCountLimit.count(15L);
         maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox), maxMessageCount);
 
         assertThatThrownBy(() -> mailboxManager.copyMessages(MessageRange.all(), inbox, subFolder, session))
@@ -119,7 +121,7 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
 
     @Test
     void testCopyOverQuotaSize() throws Exception {
-        QuotaSize maxQuotaSize = QuotaSize.size(15L * MockMail.MAIL_TEXT_PLAIN.length());
+        QuotaSizeLimit maxQuotaSize = QuotaSizeLimit.size(15L * MockMail.MAIL_TEXT_PLAIN.length());
         maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), maxQuotaSize);
         try {
             provisionner.fillMailbox();
@@ -132,7 +134,7 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
 
     @Test
     void testRetrievalOverMaxMessageAfterExpunge() throws Exception {
-        QuotaCount maxMessageCount = QuotaCount.count(15L);
+        QuotaCountLimit maxMessageCount = QuotaCountLimit.count(15L);
         maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox), maxMessageCount);
         try {
             provisionner.fillMailbox();
@@ -147,7 +149,7 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
 
     @Test
     void testRetrievalOverMaxStorageAfterExpunge() throws Exception {
-        QuotaSize maxQuotaSize = QuotaSize.size(15 * MockMail.MAIL_TEXT_PLAIN.getBytes(StandardCharsets.UTF_8).length + 1);
+        QuotaSizeLimit maxQuotaSize = QuotaSizeLimit.size(15 * MockMail.MAIL_TEXT_PLAIN.getBytes(StandardCharsets.UTF_8).length + 1);
         maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), maxQuotaSize);
         try {
             provisionner.fillMailbox();
@@ -162,7 +164,7 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
 
     @Test
     void testRetrievalOverMaxMessageAfterDelete() throws Exception {
-        QuotaCount maxMessageCount = QuotaCount.count(15L);
+        QuotaCountLimit maxMessageCount = QuotaCountLimit.count(15L);
         maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox), maxMessageCount);
         try {
             provisionner.fillMailbox();
@@ -179,7 +181,7 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
 
     @Test
     void testRetrievalOverMaxStorageAfterDelete() throws Exception {
-        QuotaSize maxQuotaSize = QuotaSize.size(15 * MockMail.MAIL_TEXT_PLAIN.getBytes(StandardCharsets.UTF_8).length + 1);
+        QuotaSizeLimit maxQuotaSize = QuotaSizeLimit.size(15 * MockMail.MAIL_TEXT_PLAIN.getBytes(StandardCharsets.UTF_8).length + 1);
         maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), maxQuotaSize);
         try {
             provisionner.fillMailbox();
@@ -201,11 +203,11 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
         mailboxManager.deleteMailbox(inbox, session);
 
         QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(inbox);
-        Quota<QuotaCount> messageQuota = quotaManager.getMessageQuota(quotaRoot);
-        Quota<QuotaSize> storageQuota = quotaManager.getStorageQuota(quotaRoot);
+        Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = quotaManager.getMessageQuota(quotaRoot);
+        Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = quotaManager.getStorageQuota(quotaRoot);
         SoftAssertions.assertSoftly(softly -> {
-            softly.assertThat(messageQuota.getUsed()).isEqualTo(QuotaCount.count(0));
-            softly.assertThat(storageQuota.getUsed()).isEqualTo(QuotaSize.size(0));
+            softly.assertThat(messageQuota.getUsed()).isEqualTo(QuotaCountUsage.count(0));
+            softly.assertThat(storageQuota.getUsed()).isEqualTo(QuotaSizeUsage.size(0));
         });
     }
 
@@ -223,11 +225,11 @@ public abstract class QuotaMessageManagerTest<T extends MailboxManager> {
         mailboxManager.deleteMailbox(subFolder, session);
 
         QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(inbox);
-        Quota<QuotaCount> messageQuota = quotaManager.getMessageQuota(quotaRoot);
-        Quota<QuotaSize> storageQuota = quotaManager.getStorageQuota(quotaRoot);
+        Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = quotaManager.getMessageQuota(quotaRoot);
+        Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = quotaManager.getStorageQuota(quotaRoot);
         SoftAssertions.assertSoftly(softly -> {
-            softly.assertThat(messageQuota.getUsed()).isEqualTo(QuotaCount.count(16));
-            softly.assertThat(storageQuota.getUsed()).isEqualTo(QuotaSize.size(16 * 247));
+            softly.assertThat(messageQuota.getUsed()).isEqualTo(QuotaCountUsage.count(16));
+            softly.assertThat(storageQuota.getUsed()).isEqualTo(QuotaSizeUsage.size(16 * 247));
         });
     }
 }
\ No newline at end of file
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java
index 98fc6ce..4461f91 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java
@@ -21,21 +21,23 @@ package org.apache.james.mailbox.model;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 class QuotaRatioTest {
 
-    private static final Quota<QuotaSize> QUOTA_SIZE = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(15))
-            .computedLimit(QuotaSize.size(60))
+    private static final Quota<QuotaSizeLimit, QuotaSizeUsage> QUOTA_SIZE = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(15))
+            .computedLimit(QuotaSizeLimit.size(60))
             .build();
-    private static final Quota<QuotaCount> QUOTA_COUNT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(1))
-            .computedLimit(QuotaCount.count(2))
+    private static final Quota<QuotaCountLimit, QuotaCountUsage> QUOTA_COUNT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(1))
+            .computedLimit(QuotaCountLimit.count(2))
             .build();
 
     @Test
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java
index f1633bc..4bfa64f 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java
@@ -22,74 +22,75 @@ package org.apache.james.mailbox.model;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.junit.jupiter.api.Test;
 
 class QuotaTest {
 
-
     @Test
     void isOverQuotaShouldReturnFalseWhenQuotaIsNotExceeded() {
-        Quota<QuotaCount> quota = Quota.<QuotaCount>builder().used(QuotaCount.count(36)).computedLimit(QuotaCount.count(360)).build();
+        Quota<QuotaCountLimit, QuotaCountUsage> quota = Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(36)).computedLimit(QuotaCountLimit.count(360)).build();
         assertThat(quota.isOverQuota()).isFalse();
     }
 
     @Test
     void isOverQuotaShouldReturnFalseWhenMaxValueIsUnlimited() {
-        Quota<QuotaCount> quota = Quota.<QuotaCount>builder().used(QuotaCount.count(36)).computedLimit(QuotaCount.unlimited()).build();
+        Quota<QuotaCountLimit, QuotaCountUsage> quota = Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(36)).computedLimit(QuotaCountLimit.unlimited()).build();
         assertThat(quota.isOverQuota()).isFalse();
     }
 
     @Test
     void isOverQuotaShouldReturnTrueWhenQuotaIsExceeded() {
-        Quota<QuotaCount> quota = Quota.<QuotaCount>builder().used(QuotaCount.count(360)).computedLimit(QuotaCount.count(36)).build();
+        Quota<QuotaCountLimit, QuotaCountUsage> quota = Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(360)).computedLimit(QuotaCountLimit.count(36)).build();
         assertThat(quota.isOverQuota()).isTrue();
     }
 
     @Test
     void isOverQuotaWithAdditionalValueShouldReturnTrueWhenOverLimit() {
-        Quota<QuotaCount> quota = Quota.<QuotaCount>builder().used(QuotaCount.count(36)).computedLimit(QuotaCount.count(36)).build();
+        Quota<QuotaCountLimit, QuotaCountUsage> quota = Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(36)).computedLimit(QuotaCountLimit.count(36)).build();
         assertThat(quota.isOverQuotaWithAdditionalValue(1)).isTrue();
     }
 
     @Test
     void isOverQuotaWithAdditionalValueShouldReturnTrueWhenUnderLimit() {
-        Quota<QuotaCount> quota = Quota.<QuotaCount>builder().used(QuotaCount.count(34)).computedLimit(QuotaCount.count(36)).build();
+        Quota<QuotaCountLimit, QuotaCountUsage> quota = Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(34)).computedLimit(QuotaCountLimit.count(36)).build();
         assertThat(quota.isOverQuotaWithAdditionalValue(1)).isFalse();
     }
 
     @Test
     void isOverQuotaWithAdditionalValueShouldReturnFalseWhenAtLimit() {
-        Quota<QuotaCount> quota = Quota.<QuotaCount>builder().used(QuotaCount.count(36)).computedLimit(QuotaCount.count(36)).build();
+        Quota<QuotaCountLimit, QuotaCountUsage> quota = Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(36)).computedLimit(QuotaCountLimit.count(36)).build();
         assertThat(quota.isOverQuotaWithAdditionalValue(0)).isFalse();
     }
 
     @Test
     void isOverQuotaWithAdditionalValueShouldThrowOnNegativeValue() {
-        Quota<QuotaCount> quota = Quota.<QuotaCount>builder().used(QuotaCount.count(25)).computedLimit(QuotaCount.count(36)).build();
+        Quota<QuotaCountLimit, QuotaCountUsage> quota = Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(25)).computedLimit(QuotaCountLimit.count(36)).build();
         assertThatThrownBy(() -> quota.isOverQuotaWithAdditionalValue(-1)).isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
     void buildShouldThrowOnMissingUsedValue() {
         assertThatThrownBy(
-            () -> Quota.<QuotaCount>builder().computedLimit(QuotaCount.count(1)).build())
+            () -> Quota.<QuotaCountLimit, QuotaCountUsage>builder().computedLimit(QuotaCountLimit.count(1)).build())
             .isInstanceOf(IllegalStateException.class);
     }
 
     @Test
     void buildShouldThrowOnMissingComputedLimitValue() {
         assertThatThrownBy(
-            () -> Quota.<QuotaCount>builder().used(QuotaCount.count(1)).build())
+            () -> Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(1)).build())
             .isInstanceOf(IllegalStateException.class);
     }
 
     @Test
     void buildShouldCreateValidObjectGivenMandatoryFields() {
-        Quota<QuotaCount> actual = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(1))
-            .computedLimit(QuotaCount.count(2))
+        Quota<QuotaCountLimit, QuotaCountUsage> actual = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(1))
+            .computedLimit(QuotaCountLimit.count(2))
             .build();
         assertThat(actual).isNotNull();
     }
@@ -97,9 +98,9 @@ class QuotaTest {
     @Test
     void getRatioShouldReturnUsedDividedByLimit() {
         assertThat(
-            Quota.<QuotaSize>builder()
-                .used(QuotaSize.size(15))
-                .computedLimit(QuotaSize.size(60))
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                .used(QuotaSizeUsage.size(15))
+                .computedLimit(QuotaSizeLimit.size(60))
                 .build()
                 .getRatio())
             .isEqualTo(0.25);
@@ -108,9 +109,9 @@ class QuotaTest {
     @Test
     void getRatioShouldReturnZeroWhenUnlimited() {
         assertThat(
-            Quota.<QuotaSize>builder()
-                .used(QuotaSize.size(15))
-                .computedLimit(QuotaSize.unlimited())
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                .used(QuotaSizeUsage.size(15))
+                .computedLimit(QuotaSizeLimit.unlimited())
                 .build()
                 .getRatio())
             .isEqualTo(0);
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaFixture.java b/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaFixture.java
index 594c787..e77b86a 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaFixture.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaFixture.java
@@ -19,91 +19,93 @@
 
 package org.apache.james.mailbox.quota;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 
 public interface QuotaFixture {
     interface Counts {
-        Quota<QuotaCount> _32_PERCENT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(32))
-            .computedLimit(QuotaCount.count(100))
+        Quota<QuotaCountLimit, QuotaCountUsage> _32_PERCENT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(32))
+            .computedLimit(QuotaCountLimit.count(100))
             .build();
 
-        Quota<QuotaCount> _40_PERCENT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(40))
-            .computedLimit(QuotaCount.count(100))
+        Quota<QuotaCountLimit, QuotaCountUsage> _40_PERCENT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(40))
+            .computedLimit(QuotaCountLimit.count(100))
             .build();
 
-        Quota<QuotaCount> _52_PERCENT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(52))
-            .computedLimit(QuotaCount.count(100))
+        Quota<QuotaCountLimit, QuotaCountUsage> _52_PERCENT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(52))
+            .computedLimit(QuotaCountLimit.count(100))
             .build();
 
-        Quota<QuotaCount> _72_PERCENT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(72))
-            .computedLimit(QuotaCount.count(100))
+        Quota<QuotaCountLimit, QuotaCountUsage> _72_PERCENT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(72))
+            .computedLimit(QuotaCountLimit.count(100))
             .build();
 
-        Quota<QuotaCount> _82_PERCENT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(82))
-            .computedLimit(QuotaCount.count(100))
+        Quota<QuotaCountLimit, QuotaCountUsage> _82_PERCENT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(82))
+            .computedLimit(QuotaCountLimit.count(100))
             .build();
 
-        Quota<QuotaCount> _85_PERCENT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(85))
-            .computedLimit(QuotaCount.count(100))
+        Quota<QuotaCountLimit, QuotaCountUsage> _85_PERCENT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(85))
+            .computedLimit(QuotaCountLimit.count(100))
             .build();
 
-        Quota<QuotaCount> _92_PERCENT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(92))
-            .computedLimit(QuotaCount.count(100))
+        Quota<QuotaCountLimit, QuotaCountUsage> _92_PERCENT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(92))
+            .computedLimit(QuotaCountLimit.count(100))
             .build();
 
-        Quota<QuotaCount> _UNLIMITED = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(92))
-            .computedLimit(QuotaCount.unlimited())
+        Quota<QuotaCountLimit, QuotaCountUsage> _UNLIMITED = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(92))
+            .computedLimit(QuotaCountLimit.unlimited())
             .build();
     }
 
     interface Sizes {
-        Quota<QuotaSize> _30_PERCENT = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(30))
-            .computedLimit(QuotaSize.size(100))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> _30_PERCENT = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(30))
+            .computedLimit(QuotaSizeLimit.size(100))
             .build();
-        Quota<QuotaSize> _42_PERCENT = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(42))
-            .computedLimit(QuotaSize.size(100))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> _42_PERCENT = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(42))
+            .computedLimit(QuotaSizeLimit.size(100))
             .build();
 
-        Quota<QuotaSize> _55_PERCENT = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(55))
-            .computedLimit(QuotaSize.size(100))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> _55_PERCENT = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(55))
+            .computedLimit(QuotaSizeLimit.size(100))
             .build();
 
-        Quota<QuotaSize> _60_PERCENT = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(60))
-            .computedLimit(QuotaSize.size(100))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> _60_PERCENT = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(60))
+            .computedLimit(QuotaSizeLimit.size(100))
             .build();
 
-        Quota<QuotaSize> _75_PERCENT = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(75))
-            .computedLimit(QuotaSize.size(100))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> _75_PERCENT = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(75))
+            .computedLimit(QuotaSizeLimit.size(100))
             .build();
 
-        Quota<QuotaSize> _82_PERCENT = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(82))
-            .computedLimit(QuotaSize.size(100))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> _82_PERCENT = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(82))
+            .computedLimit(QuotaSizeLimit.size(100))
             .build();
 
-        Quota<QuotaSize> _92_PERCENT = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(92))
-            .computedLimit(QuotaSize.size(100))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> _92_PERCENT = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(92))
+            .computedLimit(QuotaSizeLimit.size(100))
             .build();
 
-        Quota<QuotaSize> _992_PERTHOUSAND = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(992))
-            .computedLimit(QuotaSize.size(1000))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> _992_PERTHOUSAND = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(992))
+            .computedLimit(QuotaSizeLimit.size(1000))
             .build();
     }
 
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
index 873cc9c..eb23bf2 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
@@ -28,8 +28,8 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.update;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -80,21 +80,21 @@ public class CassandraCurrentQuotaManager implements StoreCurrentQuotaManager {
     }
 
     @Override
-    public QuotaCount getCurrentMessageCount(QuotaRoot quotaRoot) throws MailboxException {
+    public QuotaCountUsage getCurrentMessageCount(QuotaRoot quotaRoot) throws MailboxException {
         ResultSet resultSet = session.execute(getCurrentMessageCountStatement.bind(quotaRoot.getValue()));
         if (resultSet.isExhausted()) {
-            return QuotaCount.count(0L);
+            return QuotaCountUsage.count(0L);
         }
-        return QuotaCount.count(resultSet.one().getLong(CassandraCurrentQuota.MESSAGE_COUNT));
+        return QuotaCountUsage.count(resultSet.one().getLong(CassandraCurrentQuota.MESSAGE_COUNT));
     }
 
     @Override
-    public QuotaSize getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException {
+    public QuotaSizeUsage getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException {
         ResultSet resultSet = session.execute(getCurrentStorageStatement.bind(quotaRoot.getValue()));
         if (resultSet.isExhausted()) {
-            return QuotaSize.size(0L);
+            return QuotaSizeUsage.size(0L);
         }
-        return QuotaSize.size(resultSet.one().getLong(CassandraCurrentQuota.STORAGE));
+        return QuotaSizeUsage.size(resultSet.one().getLong(CassandraCurrentQuota.STORAGE));
     }
 
     private void checkArguments(long count, long size) {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
index eda028e..fba2c52 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
@@ -29,8 +29,8 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.cassandra.table.CassandraGlobalMaxQuota;
 
 import com.datastax.driver.core.PreparedStatement;
@@ -81,15 +81,15 @@ public class CassandraGlobalMaxQuotaDao {
             .where(eq(CassandraGlobalMaxQuota.TYPE, bindMarker(CassandraGlobalMaxQuota.TYPE)));
     }
 
-    public void setGlobalMaxStorage(QuotaSize globalMaxStorage) {
+    public void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) {
         session.execute(setGlobalMaxStorageStatement.bind(QuotaCodec.quotaValueToLong(globalMaxStorage)));
     }
 
-    public void setGlobalMaxMessage(QuotaCount globalMaxMessageCount) {
+    public void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) {
         session.execute(setGlobalMaxMessageStatement.bind(QuotaCodec.quotaValueToLong(globalMaxMessageCount)));
     }
 
-    public Optional<QuotaSize> getGlobalMaxStorage() {
+    public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
         ResultSet resultSet = session.execute(getGlobalMaxStatement.bind()
             .setString(CassandraGlobalMaxQuota.TYPE, CassandraGlobalMaxQuota.STORAGE));
         if (resultSet.isExhausted()) {
@@ -99,7 +99,7 @@ public class CassandraGlobalMaxQuotaDao {
         return QuotaCodec.longToQuotaSize(maxStorage);
     }
 
-    public Optional<QuotaCount> getGlobalMaxMessage() {
+    public Optional<QuotaCountLimit> getGlobalMaxMessage() {
         ResultSet resultSet = session.execute(getGlobalMaxStatement.bind()
             .setString(CassandraGlobalMaxQuota.TYPE, CassandraGlobalMaxQuota.MESSAGE));
         if (resultSet.isExhausted()) {
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
index 0b34759..cccbdc2 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
@@ -30,8 +30,8 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.cassandra.table.CassandraDomainMaxQuota;
 
 import com.datastax.driver.core.PreparedStatement;
@@ -98,15 +98,15 @@ public class CassandraPerDomainMaxQuotaDao {
             .value(CassandraDomainMaxQuota.STORAGE, bindMarker());
     }
 
-    public void setMaxStorage(Domain domain, QuotaSize maxStorageQuota) {
+    public void setMaxStorage(Domain domain, QuotaSizeLimit maxStorageQuota) {
         session.execute(setMaxStorageStatement.bind(domain.asString(), QuotaCodec.quotaValueToLong(maxStorageQuota)));
     }
 
-    public void setMaxMessage(Domain domain, QuotaCount maxMessageCount) {
+    public void setMaxMessage(Domain domain, QuotaCountLimit maxMessageCount) {
         session.execute(setMaxMessageStatement.bind(domain.asString(), QuotaCodec.quotaValueToLong(maxMessageCount)));
     }
 
-    public Optional<QuotaSize> getMaxStorage(Domain domain) {
+    public Optional<QuotaSizeLimit> getMaxStorage(Domain domain) {
         ResultSet resultSet = session.execute(getMaxStorageStatement.bind(domain.asString()));
         if (resultSet.isExhausted()) {
             return Optional.empty();
@@ -115,7 +115,7 @@ public class CassandraPerDomainMaxQuotaDao {
         return QuotaCodec.longToQuotaSize(maxStorage);
     }
 
-    public Optional<QuotaCount> getMaxMessage(Domain domain) {
+    public Optional<QuotaCountLimit> getMaxMessage(Domain domain) {
         ResultSet resultSet = session.execute(getMaxMessageStatement.bind(domain.asString()));
         if (resultSet.isExhausted()) {
             return Optional.empty();
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
index 5eeff8f..52beb42 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
@@ -29,8 +29,8 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
 import org.apache.james.mailbox.model.QuotaRoot;
 
@@ -98,15 +98,15 @@ public class CassandraPerUserMaxQuotaDao {
             .value(CassandraMaxQuota.STORAGE, bindMarker());
     }
 
-    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) {
+    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
         session.execute(setMaxStorageStatement.bind(quotaRoot.getValue(), QuotaCodec.quotaValueToLong(maxStorageQuota)));
     }
 
-    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount) {
+    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
         session.execute(setMaxMessageStatement.bind(quotaRoot.getValue(), QuotaCodec.quotaValueToLong(maxMessageCount)));
     }
 
-    public Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) {
+    public Optional<QuotaSizeLimit> getMaxStorage(QuotaRoot quotaRoot) {
         ResultSet resultSet = session.execute(getMaxStorageStatement.bind(quotaRoot.getValue()));
         if (resultSet.isExhausted()) {
             return Optional.empty();
@@ -115,7 +115,7 @@ public class CassandraPerUserMaxQuotaDao {
         return QuotaCodec.longToQuotaSize(maxStorage);
     }
 
-    public Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) {
+    public Optional<QuotaCountLimit> getMaxMessage(QuotaRoot quotaRoot) {
         ResultSet resultSet = session.execute(getMaxMessageStatement.bind(quotaRoot.getValue()));
         if (resultSet.isExhausted()) {
             return Optional.empty();
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
index c278ae6..671e707 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
@@ -28,8 +28,8 @@ import javax.inject.Inject;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
@@ -53,22 +53,22 @@ public class CassandraPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) {
+    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
         perUserQuota.setMaxStorage(quotaRoot, maxStorageQuota);
     }
 
     @Override
-    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount) {
+    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
         perUserQuota.setMaxMessage(quotaRoot, maxMessageCount);
     }
 
     @Override
-    public void setDomainMaxMessage(Domain domain, QuotaCount count) {
+    public void setDomainMaxMessage(Domain domain, QuotaCountLimit count) {
         perDomainQuota.setMaxMessage(domain, count);
     }
 
     @Override
-    public void setDomainMaxStorage(Domain domain, QuotaSize size) {
+    public void setDomainMaxStorage(Domain domain, QuotaSizeLimit size) {
         perDomainQuota.setMaxStorage(domain, size);
     }
 
@@ -83,12 +83,12 @@ public class CassandraPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public Optional<QuotaCount> getDomainMaxMessage(Domain domain) {
+    public Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain) {
         return perDomainQuota.getMaxMessage(domain);
     }
 
     @Override
-    public Optional<QuotaSize> getDomainMaxStorage(Domain domain) {
+    public Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain) {
         return perDomainQuota.getMaxStorage(domain);
     }
 
@@ -103,7 +103,7 @@ public class CassandraPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setGlobalMaxStorage(QuotaSize globalMaxStorage) {
+    public void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) {
         globalQuota.setGlobalMaxStorage(globalMaxStorage);
     }
 
@@ -113,7 +113,7 @@ public class CassandraPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setGlobalMaxMessage(QuotaCount globalMaxMessageCount) {
+    public void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) {
         globalQuota.setGlobalMaxMessage(globalMaxMessageCount);
     }
 
@@ -123,18 +123,18 @@ public class CassandraPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public Optional<QuotaSize> getGlobalMaxStorage() {
+    public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
         return globalQuota.getGlobalMaxStorage();
     }
 
     @Override
-    public Optional<QuotaCount> getGlobalMaxMessage() {
+    public Optional<QuotaCountLimit> getGlobalMaxMessage() {
         return globalQuota.getGlobalMaxMessage();
     }
 
     @Override
-    public Map<Quota.Scope, QuotaCount> listMaxMessagesDetails(QuotaRoot quotaRoot) {
-        Function<Domain, Optional<QuotaCount>> domainQuotaSupplier = Throwing.function(this::getDomainMaxMessage).sneakyThrow();
+    public Map<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot) {
+        Function<Domain, Optional<QuotaCountLimit>> domainQuotaSupplier = Throwing.function(this::getDomainMaxMessage).sneakyThrow();
         return Stream.of(
                 Pair.of(Quota.Scope.User, perUserQuota.getMaxMessage(quotaRoot)),
                 Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaSupplier)),
@@ -144,8 +144,8 @@ public class CassandraPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public Map<Quota.Scope, QuotaSize> listMaxStorageDetails(QuotaRoot quotaRoot) {
-        Function<Domain, Optional<QuotaSize>> domainQuotaSupplier = Throwing.function(this::getDomainMaxStorage).sneakyThrow();
+    public Map<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot) {
+        Function<Domain, Optional<QuotaSizeLimit>> domainQuotaSupplier = Throwing.function(this::getDomainMaxStorage).sneakyThrow();
         return Stream.of(
                 Pair.of(Quota.Scope.User, perUserQuota.getMaxStorage(quotaRoot)),
                 Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaSupplier)),
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java
index d68d104..87b6cdc 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java
@@ -21,31 +21,31 @@ package org.apache.james.mailbox.cassandra.quota;
 import java.util.Optional;
 import java.util.function.Function;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaSizeLimit;
 
 public class QuotaCodec {
 
     private static final long INFINITE = -1;
     private static final long NO_RIGHT = 0L;
 
-    static Long quotaValueToLong(QuotaValue<?> value) {
+    static Long quotaValueToLong(QuotaLimitValue<?> value) {
         if (value.isUnlimited()) {
             return INFINITE;
         }
         return value.asLong();
     }
 
-    static Optional<QuotaSize> longToQuotaSize(Long value) {
-        return longToQuotaValue(value, QuotaSize.unlimited(), QuotaSize::size);
+    static Optional<QuotaSizeLimit> longToQuotaSize(Long value) {
+        return longToQuotaValue(value, QuotaSizeLimit.unlimited(), QuotaSizeLimit::size);
     }
 
-    static Optional<QuotaCount> longToQuotaCount(Long value) {
-        return longToQuotaValue(value, QuotaCount.unlimited(), QuotaCount::count);
+    static Optional<QuotaCountLimit> longToQuotaCount(Long value) {
+        return longToQuotaValue(value, QuotaCountLimit.unlimited(), QuotaCountLimit::count);
     }
 
-    private static <T extends QuotaValue<T>> Optional<T> longToQuotaValue(Long value, T infiniteValue, Function<Long, T> quotaFactory) {
+    private static <T extends QuotaLimitValue<T>> Optional<T> longToQuotaValue(Long value, T infiniteValue, Function<Long, T> quotaFactory) {
         if (value == null) {
             return Optional.empty();
         }
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 9917073..880e676 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
@@ -25,7 +25,7 @@ import java.util.Date
 import javax.mail.Flags.Flag
 import javax.mail.{Flags => JavaMailFlags}
 import org.apache.james.core.Username
-import org.apache.james.core.quota.QuotaValue
+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}
@@ -49,7 +49,7 @@ object DTOs {
   }
 
   object Quota {
-    def toScala[T <: QuotaValue[T]](java: JavaQuota[T]): Quota[T] = Quota(
+    def toScala[T <: QuotaLimitValue[T], U <: QuotaUsageValue[U, T]](java: JavaQuota[T, U]): Quota[T, U] = Quota(
       used = java.getUsed,
       limit = java.getLimit,
       limits = java.getLimitByScope.asScala.toMap)
@@ -64,9 +64,9 @@ object DTOs {
     def toJava: JavaMailboxPath = new JavaMailboxPath(namespace.orNull, user.orNull, name)
   }
 
-  case class Quota[T <: QuotaValue[T]](used: T, limit: T, limits: Map[JavaQuota.Scope, T]) {
-    def toJava: JavaQuota[T] =
-      JavaQuota.builder[T]
+  case class Quota[T <: QuotaLimitValue[T], U <: QuotaUsageValue[U, T]](used: U, limit: T, limits: Map[JavaQuota.Scope, T]) {
+    def toJava: JavaQuota[T, U] =
+      JavaQuota.builder[T, U]
         .used(used)
         .computedLimit(limit)
         .limitsByScope(limits.asJava)
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 bc9831f..be52b08 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
@@ -25,7 +25,7 @@ import java.util.{TreeMap => JavaTreeMap}
 import javax.inject.Inject
 import julienrf.json.derived
 import org.apache.james.core.Username
-import org.apache.james.core.quota.{QuotaCount, QuotaSize, QuotaValue}
+import org.apache.james.core.quota.{QuotaCountLimit, QuotaCountUsage, QuotaLimitValue, QuotaSizeLimit, QuotaSizeUsage, QuotaUsageValue}
 import org.apache.james.event.json.DTOs.SystemFlag.SystemFlag
 import org.apache.james.event.json.DTOs._
 import org.apache.james.mailbox.MailboxSession.SessionId
@@ -53,7 +53,7 @@ private object DTO {
   }
 
   case class MailboxDeletion(eventId: EventId, sessionId: SessionId, user: Username, path: MailboxPath, quotaRoot: QuotaRoot,
-                             deletedMessageCount: QuotaCount, totalDeletedSize: QuotaSize, mailboxId: MailboxId) extends Event {
+                             deletedMessageCount: QuotaCountUsage, totalDeletedSize: QuotaSizeUsage, mailboxId: MailboxId) extends Event {
     override def toJava: JavaEvent = new JavaMailboxDeletion(sessionId, user, path.toJava, quotaRoot, deletedMessageCount,
       totalDeletedSize, mailboxId, eventId)
   }
@@ -62,8 +62,8 @@ private object DTO {
     override def toJava: JavaEvent = new JavaMailboxRenamed(sessionId, user, path.toJava, mailboxId, newPath.toJava, eventId)
   }
 
-  case class QuotaUsageUpdatedEvent(eventId: EventId, user: Username, quotaRoot: QuotaRoot, countQuota: Quota[QuotaCount],
-                                    sizeQuota: Quota[QuotaSize], time: Instant) extends Event {
+  case class QuotaUsageUpdatedEvent(eventId: EventId, user: Username, quotaRoot: QuotaRoot, countQuota: Quota[QuotaCountLimit, QuotaCountUsage],
+                                    sizeQuota: Quota[QuotaSizeLimit, QuotaSizeUsage], time: Instant) extends Event {
     override def toJava: JavaEvent = new JavaQuotaUsageUpdatedEvent(eventId, user, quotaRoot, countQuota.toJava, sizeQuota.toJava, time)
   }
 
@@ -205,10 +205,11 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
   implicit val systemFlagsWrites: Writes[SystemFlag] = Writes.enumNameWrites
   implicit val userWriters: Writes[Username] = (user: Username) => JsString(user.asString)
   implicit val quotaRootWrites: Writes[QuotaRoot] = quotaRoot => JsString(quotaRoot.getValue)
-  implicit val quotaValueWrites: Writes[QuotaValue[_]] = value => if (value.isUnlimited) JsNull else JsNumber(value.asLong())
+  implicit val quotaUsageValueWrites: Writes[QuotaUsageValue[_, _]] = value => if (value.isUnlimited) JsNull else JsNumber(value.asLong())
+  implicit val quotaLimitValueWrites: Writes[QuotaLimitValue[_]] = value => if (value.isUnlimited) JsNull else JsNumber(value.asLong())
   implicit val quotaScopeWrites: Writes[JavaQuota.Scope] = value => JsString(value.name)
-  implicit val quotaCountWrites: Writes[Quota[QuotaCount]] = Json.writes[Quota[QuotaCount]]
-  implicit val quotaSizeWrites: Writes[Quota[QuotaSize]] = Json.writes[Quota[QuotaSize]]
+  implicit val quotaCountWrites: Writes[Quota[QuotaCountLimit, QuotaCountUsage]] = Json.writes[Quota[QuotaCountLimit, QuotaCountUsage]]
+  implicit val quotaSizeWrites: Writes[Quota[QuotaSizeLimit, QuotaSizeUsage]] = Json.writes[Quota[QuotaSizeLimit, QuotaSizeUsage]]
   implicit val mailboxPathWrites: Writes[MailboxPath] = Json.writes[MailboxPath]
   implicit val mailboxIdWrites: Writes[MailboxId] = value => JsString(value.serialize())
   implicit val sessionIdWrites: Writes[SessionId] = value => JsNumber(value.getValue)
@@ -238,9 +239,14 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
     case JsString(serializedMailboxId) => JsSuccess(mailboxIdFactory.fromString(serializedMailboxId))
     case _ => JsError()
   }
-  implicit val quotaCountReads: Reads[QuotaCount] = {
-    case JsNumber(count) => JsSuccess(QuotaCount.count(count.toLong))
-    case JsNull => JsSuccess(QuotaCount.unlimited())
+  implicit val quotaCountLimitReads: Reads[QuotaCountLimit] = {
+    case JsNumber(count) => JsSuccess(QuotaCountLimit.count(count.toLong))
+    case JsNull => JsSuccess(QuotaCountLimit.unlimited())
+    case _ => JsError()
+  }
+  implicit val quotaCountUsageReads: Reads[QuotaCountUsage] = {
+    case JsNumber(count) => JsSuccess(QuotaCountUsage.count(count.toLong))
+    case JsNull => JsSuccess(QuotaCountUsage.unlimited())
     case _ => JsError()
   }
   implicit val quotaRootReads: Reads[QuotaRoot] = {
@@ -251,9 +257,14 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
     case JsString(value) => JsSuccess(JavaQuota.Scope.valueOf(value))
     case _ => JsError()
   }
-  implicit val quotaSizeReads: Reads[QuotaSize] = {
-    case JsNumber(size) => JsSuccess(QuotaSize.size(size.toLong))
-    case JsNull => JsSuccess(QuotaSize.unlimited())
+  implicit val quotaSizeLimitReads: Reads[QuotaSizeLimit] = {
+    case JsNumber(size) => JsSuccess(QuotaSizeLimit.size(size.toLong))
+    case JsNull => JsSuccess(QuotaSizeLimit.unlimited())
+    case _ => JsError()
+  }
+  implicit val quotaSizeUsageReads: Reads[QuotaSizeUsage] = {
+    case JsNumber(size) => JsSuccess(QuotaSizeUsage.size(size.toLong))
+    case JsNull => JsSuccess(QuotaSizeUsage.unlimited())
     case _ => JsError()
   }
   implicit val sessionIdReads: Reads[SessionId] = {
@@ -314,8 +325,8 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
 
   implicit val flagsReads: Reads[Flags] = Json.reads[Flags]
   implicit val aclDiffReads: Reads[ACLDiff] = Json.reads[ACLDiff]
-  implicit val quotaCReads: Reads[DTOs.Quota[QuotaCount]] = Json.reads[DTOs.Quota[QuotaCount]]
-  implicit val quotaSReads: Reads[DTOs.Quota[QuotaSize]] = Json.reads[DTOs.Quota[QuotaSize]]
+  implicit val quotaCReads: Reads[DTOs.Quota[QuotaCountLimit, QuotaCountUsage]] = Json.reads[DTOs.Quota[QuotaCountLimit, QuotaCountUsage]]
+  implicit val quotaSReads: Reads[DTOs.Quota[QuotaSizeLimit, QuotaSizeUsage]] = Json.reads[DTOs.Quota[QuotaSizeLimit, QuotaSizeUsage]]
   implicit val mailboxPathReads: Reads[DTOs.MailboxPath] = Json.reads[DTOs.MailboxPath]
   implicit val messageMetaDataReads: Reads[DTOs.MessageMetaData] = Json.reads[DTOs.MessageMetaData]
   implicit val updatedFlagsReads: Reads[DTOs.UpdatedFlags] = Json.reads[DTOs.UpdatedFlags]
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
index e5d0e95..068d866 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxDeletionSerializationTest.java
@@ -31,8 +31,8 @@ import java.util.Optional;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.MailboxId;
@@ -49,8 +49,8 @@ class MailboxDeletionSerializationTest {
     private static final MailboxPath MAILBOX_PATH = new MailboxPath(USER_NAMESPACE, USERNAME, "mailboxName");
     private static final MailboxId MAILBOX_ID = TestId.of(789);
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&user@domain", Optional.of(Domain.of("domain")));
-    private static final QuotaCount DELETED_MESSAGE_COUNT = QuotaCount.count(60);
-    private static final QuotaSize TOTAL_DELETED_SIZE = QuotaSize.size(100);
+    private static final QuotaCountUsage DELETED_MESSAGE_COUNT = QuotaCountUsage.count(60);
+    private static final QuotaSizeUsage TOTAL_DELETED_SIZE = QuotaSizeUsage.size(100);
     private static final MailboxListener.MailboxDeletion DEFAULT_MAILBOX_DELETION_EVENT = new MailboxListener.MailboxDeletion(
         SESSION_ID,
         USERNAME,
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
index 5753b70..345016e 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/QuotaUsageUpdatedEventSerializationTest.java
@@ -30,8 +30,10 @@ import java.util.NoSuchElementException;
 import java.util.Optional;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -39,13 +41,13 @@ import org.junit.jupiter.api.Test;
 
 class QuotaUsageUpdatedEventSerializationTest {
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&foo", Optional.empty());
-    private static final Quota<QuotaCount> QUOTA_COUNT = Quota.<QuotaCount>builder()
-        .used(QuotaCount.count(12))
-        .computedLimit(QuotaCount.count(100))
+    private static final Quota<QuotaCountLimit, QuotaCountUsage> QUOTA_COUNT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+        .used(QuotaCountUsage.count(12))
+        .computedLimit(QuotaCountLimit.count(100))
         .build();
-    private static final Quota<QuotaSize> QUOTA_SIZE = Quota.<QuotaSize>builder()
-        .used(QuotaSize.size(1234))
-        .computedLimit(QuotaSize.size(10000))
+    private static final Quota<QuotaSizeLimit, QuotaSizeUsage> QUOTA_SIZE = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+        .used(QuotaSizeUsage.size(1234))
+        .computedLimit(QuotaSizeLimit.size(10000))
         .build();
     private static final Instant INSTANT = Instant.parse("2018-11-13T12:00:55Z");
     private final MailboxListener.QuotaUsageUpdatedEvent eventWithUserContainsUsername = new MailboxListener.QuotaUsageUpdatedEvent(
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java
index e203cc6..80191db 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java
@@ -24,7 +24,8 @@ import static org.apache.james.event.json.SerializerFixture.DTO_JSON_SERIALIZE;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.quota.QuotaCount;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.event.json.DTOs;
 import org.apache.james.mailbox.model.Quota;
 import org.junit.jupiter.api.Nested;
@@ -39,49 +40,79 @@ import scala.math.BigDecimal;
 
 class QuotaCountTest {
     @Test
-    void quotaCountShouldBeWellSerialized() {
-        assertThat(DTO_JSON_SERIALIZE.quotaValueWrites().writes(QuotaCount.count(18)))
+    void quotaCountLimitShouldBeWellSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.quotaLimitValueWrites().writes(QuotaCountLimit.count(18)))
             .isEqualTo(new JsNumber(BigDecimal.valueOf(18)));
     }
 
     @Test
-    void quotaCountShouldBeWellDeSerialized() {
-        assertThat(DTO_JSON_SERIALIZE.quotaCountReads().reads(new JsNumber(BigDecimal.valueOf(18))).get())
-            .isEqualTo(QuotaCount.count(18));
+    void quotaCountLimitShouldBeWellDeSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.quotaCountLimitReads().reads(new JsNumber(BigDecimal.valueOf(18))).get())
+            .isEqualTo(QuotaCountLimit.count(18));
     }
 
     @Test
-    void quotaCountShouldBeWellSerializedWhenUnlimited() {
-        assertThat(DTO_JSON_SERIALIZE.quotaValueWrites().writes(QuotaCount.unlimited()))
+    void quotaCountLimitShouldBeWellSerializedWhenUnlimited() {
+        assertThat(DTO_JSON_SERIALIZE.quotaLimitValueWrites().writes(QuotaCountLimit.unlimited()))
             .isEqualTo(JsNull$.MODULE$);
     }
 
     @Test
-    void quotaCountShouldBeWellDeSerializedWhenUnlimited() {
-        assertThat(DTO_JSON_SERIALIZE.quotaCountReads().reads(JsNull$.MODULE$).get())
-            .isEqualTo(QuotaCount.unlimited());
+    void quotaCountLimitShouldBeWellDeSerializedWhenUnlimited() {
+        assertThat(DTO_JSON_SERIALIZE.quotaCountLimitReads().reads(JsNull$.MODULE$).get())
+            .isEqualTo(QuotaCountLimit.unlimited());
     }
 
     @Test
-    void quotaCountShouldReturnErrorWhenString() {
-        assertThat(DTO_JSON_SERIALIZE.quotaCountReads().reads(new JsString("18")))
+    void quotaCountLimitShouldReturnErrorWhenString() {
+        assertThat(DTO_JSON_SERIALIZE.quotaCountLimitReads().reads(new JsString("18")))
+            .isInstanceOf(JsError.class);
+    }
+
+    @Test
+    void quotaCountUsageShouldBeWellSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.quotaUsageValueWrites().writes(QuotaCountUsage.count(18)))
+            .isEqualTo(new JsNumber(BigDecimal.valueOf(18)));
+    }
+
+    @Test
+    void quotaCountUsageShouldBeWellDeSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.quotaCountUsageReads().reads(new JsNumber(BigDecimal.valueOf(18))).get())
+            .isEqualTo(QuotaCountUsage.count(18));
+    }
+
+    @Test
+    void quotaCountUsageShouldBeWellSerializedWhenUnlimited() {
+        assertThat(DTO_JSON_SERIALIZE.quotaUsageValueWrites().writes(QuotaCountUsage.unlimited()))
+            .isEqualTo(JsNull$.MODULE$);
+    }
+
+    @Test
+    void quotaCountUsageShouldBeWellDeSerializedWhenUnUnlimited() {
+        assertThat(DTO_JSON_SERIALIZE.quotaCountUsageReads().reads(JsNull$.MODULE$).get())
+            .isEqualTo(QuotaCountUsage.unlimited());
+    }
+
+    @Test
+    void quotaCountUsageShouldReturnErrorWhenString() {
+        assertThat(DTO_JSON_SERIALIZE.quotaCountUsageReads().reads(new JsString("18")))
             .isInstanceOf(JsError.class);
     }
 
     @Nested
     class LimitedQuotaCount {
-        private Quota<QuotaCount> limitedQuotaCountByScopes(Quota.Scope scope) {
-            return Quota.<QuotaCount>builder()
-                .used(QuotaCount.count(12))
-                .computedLimit(QuotaCount.count(100))
-                .limitForScope(QuotaCount.count(100), scope)
+        private Quota<QuotaCountLimit, QuotaCountUsage> limitedQuotaCountByScopes(Quota.Scope scope) {
+            return Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+                .used(QuotaCountUsage.count(12))
+                .computedLimit(QuotaCountLimit.count(100))
+                .limitForScope(QuotaCountLimit.count(100), scope)
                 .build();
         }
 
         @Nested
         class LimitedQuotaGlobalScope {
             private final String json = "{\"used\":12,\"limit\":100,\"limits\":{\"Global\":100}}";
-            private final Quota<QuotaCount> quota = limitedQuotaCountByScopes(Quota.Scope.Global);
+            private final Quota<QuotaCountLimit, QuotaCountUsage> quota = limitedQuotaCountByScopes(Quota.Scope.Global);
 
             @Test
             void toJsonShouldSerializeQuotaCount() {
@@ -100,7 +131,7 @@ class QuotaCountTest {
         @Nested
         class LimitedQuotaDomainScope {
             private final String json = "{\"used\":12,\"limit\":100,\"limits\":{\"Domain\":100}}";
-            private final Quota<QuotaCount> quota = limitedQuotaCountByScopes(Quota.Scope.Domain);
+            private final Quota<QuotaCountLimit, QuotaCountUsage> quota = limitedQuotaCountByScopes(Quota.Scope.Domain);
 
             @Test
             void toJsonShouldSerializeQuotaCount() {
@@ -119,7 +150,7 @@ class QuotaCountTest {
         @Nested
         class LimitedQuotaUserScope {
             private final String json = "{\"used\":12,\"limit\":100,\"limits\":{\"User\":100}}";
-            private final Quota<QuotaCount> quota = limitedQuotaCountByScopes(Quota.Scope.User);
+            private final Quota<QuotaCountLimit, QuotaCountUsage> quota = limitedQuotaCountByScopes(Quota.Scope.User);
 
             @Test
             void toJsonShouldSerializeQuotaCount() {
@@ -138,18 +169,18 @@ class QuotaCountTest {
 
     @Nested
     class UnLimitedQuotaCount {
-        private Quota<QuotaCount> unLimitedQuotaCountByScopes(Quota.Scope scope) {
-            return Quota.<QuotaCount>builder()
-                .used(QuotaCount.count(12))
-                .computedLimit(QuotaCount.unlimited())
-                .limitForScope(QuotaCount.unlimited(), scope)
+        private Quota<QuotaCountLimit, QuotaCountUsage> unLimitedQuotaCountByScopes(Quota.Scope scope) {
+            return Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+                .used(QuotaCountUsage.count(12))
+                .computedLimit(QuotaCountLimit.unlimited())
+                .limitForScope(QuotaCountLimit.unlimited(), scope)
                 .build();
         }
 
         @Nested
         class UnLimitedQuotaGlobalScope {
             private final String json = "{\"used\":12,\"limit\":null,\"limits\":{\"Global\":null}}";
-            private final Quota<QuotaCount> quota = unLimitedQuotaCountByScopes(Quota.Scope.Global);
+            private final Quota<QuotaCountLimit, QuotaCountUsage> quota = unLimitedQuotaCountByScopes(Quota.Scope.Global);
 
             @Test
             void toJsonShouldSerializeQuotaCount() {
@@ -168,7 +199,7 @@ class QuotaCountTest {
         @Nested
         class UnLimitedQuotaDomainScope {
             private final String json = "{\"used\":12,\"limit\":null,\"limits\":{\"Domain\":null}}";
-            private final Quota<QuotaCount> quota = unLimitedQuotaCountByScopes(Quota.Scope.Domain);
+            private final Quota<QuotaCountLimit, QuotaCountUsage> quota = unLimitedQuotaCountByScopes(Quota.Scope.Domain);
 
             @Test
             void toJsonShouldSerializeQuotaCount() {
@@ -187,7 +218,7 @@ class QuotaCountTest {
         @Nested
         class UnLimitedQuotaUserScope {
             private final String json = "{\"used\":12,\"limit\":null,\"limits\":{\"User\":null}}";
-            private final Quota<QuotaCount> quota = unLimitedQuotaCountByScopes(Quota.Scope.User);
+            private final Quota<QuotaCountLimit, QuotaCountUsage> quota = unLimitedQuotaCountByScopes(Quota.Scope.User);
 
             @Test
             void toJsonShouldSerializeQuotaCount() {
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java
index 5940f13..ad2d54a 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java
@@ -23,7 +23,8 @@ import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
 import static org.apache.james.event.json.SerializerFixture.DTO_JSON_SERIALIZE;
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.event.json.DTOs;
 import org.apache.james.mailbox.model.Quota;
 import org.junit.jupiter.api.Nested;
@@ -38,49 +39,79 @@ import scala.math.BigDecimal;
 
 class QuotaSizeTest {
     @Test
-    void quotaSizeShouldBeWellSerialized() {
-        assertThat(DTO_JSON_SERIALIZE.quotaValueWrites().writes(QuotaSize.size(18)))
+    void quotaSizeLimitShouldBeWellSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.quotaLimitValueWrites().writes(QuotaSizeLimit.size(18)))
             .isEqualTo(new JsNumber(BigDecimal.valueOf(18)));
     }
 
     @Test
-    void quotaSizeShouldBeWellDeSerialized() {
-        assertThat(DTO_JSON_SERIALIZE.quotaSizeReads().reads(new JsNumber(BigDecimal.valueOf(18))).get())
-            .isEqualTo(QuotaSize.size(18));
+    void quotaSizeLimitShouldBeWellDeSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.quotaSizeLimitReads().reads(new JsNumber(BigDecimal.valueOf(18))).get())
+            .isEqualTo(QuotaSizeLimit.size(18));
     }
 
     @Test
-    void quotaSizeShouldBeWellSerializedWhenUnlimited() {
-        assertThat(DTO_JSON_SERIALIZE.quotaValueWrites().writes(QuotaSize.unlimited()))
+    void quotaSizeLimitShouldBeWellSerializedWhenUnlimited() {
+        assertThat(DTO_JSON_SERIALIZE.quotaLimitValueWrites().writes(QuotaSizeLimit.unlimited()))
             .isEqualTo(JsNull$.MODULE$);
     }
 
     @Test
-    void quotaSizeShouldBeWellDeSerializedWhenUnlimited() {
-        assertThat(DTO_JSON_SERIALIZE.quotaSizeReads().reads(JsNull$.MODULE$).get())
-            .isEqualTo(QuotaSize.unlimited());
+    void quotaSizeLimitShouldBeWellDeSerializedWhenUnlimited() {
+        assertThat(DTO_JSON_SERIALIZE.quotaSizeLimitReads().reads(JsNull$.MODULE$).get())
+            .isEqualTo(QuotaSizeLimit.unlimited());
     }
 
     @Test
-    void quotaSizeShouldReturnErrorWhenString() {
-        assertThat(DTO_JSON_SERIALIZE.quotaSizeReads().reads(new JsString("18")))
+    void quotaSizeLimitShouldReturnErrorWhenString() {
+        assertThat(DTO_JSON_SERIALIZE.quotaSizeLimitReads().reads(new JsString("18")))
+            .isInstanceOf(JsError.class);
+    }
+
+    @Test
+    void quotaSizeUsageShouldBeWellSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.quotaUsageValueWrites().writes(QuotaSizeUsage.size(18)))
+            .isEqualTo(new JsNumber(BigDecimal.valueOf(18)));
+    }
+
+    @Test
+    void quotaSizeUsageShouldBeWellDeSerialized() {
+        assertThat(DTO_JSON_SERIALIZE.quotaSizeUsageReads().reads(new JsNumber(BigDecimal.valueOf(18))).get())
+            .isEqualTo(QuotaSizeUsage.size(18));
+    }
+
+    @Test
+    void quotaSizeUsageShouldBeWellSerializedWhenUnlimited() {
+        assertThat(DTO_JSON_SERIALIZE.quotaUsageValueWrites().writes(QuotaSizeUsage.unlimited()))
+            .isEqualTo(JsNull$.MODULE$);
+    }
+
+    @Test
+    void quotaSizeUsageShouldBeWellDeSerializedWhenUnlimited() {
+        assertThat(DTO_JSON_SERIALIZE.quotaSizeUsageReads().reads(JsNull$.MODULE$).get())
+            .isEqualTo(QuotaSizeUsage.unlimited());
+    }
+
+    @Test
+    void quotaSizeUsageShouldReturnErrorWhenString() {
+        assertThat(DTO_JSON_SERIALIZE.quotaSizeUsageReads().reads(new JsString("18")))
             .isInstanceOf(JsError.class);
     }
 
     @Nested
     class LimitedQuotaSize {
-        private Quota<QuotaSize> limitedQuotaSizeByScopes(Quota.Scope scope) {
-            return Quota.<QuotaSize>builder()
-                .used(QuotaSize.size(12))
-                .computedLimit(QuotaSize.size(100))
-                .limitForScope(QuotaSize.size(100), scope)
+        private Quota<QuotaSizeLimit, QuotaSizeUsage> limitedQuotaSizeByScopes(Quota.Scope scope) {
+            return Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                .used(QuotaSizeUsage.size(12))
+                .computedLimit(QuotaSizeLimit.size(100))
+                .limitForScope(QuotaSizeLimit.size(100), scope)
                 .build();
         }
 
         @Nested
         class LimitedQuotaGlobalScope {
             private final String json = "{\"used\":12,\"limit\":100,\"limits\":{\"Global\":100}}";
-            private final Quota<QuotaSize> quota = limitedQuotaSizeByScopes(Quota.Scope.Global);
+            private final Quota<QuotaSizeLimit, QuotaSizeUsage> quota = limitedQuotaSizeByScopes(Quota.Scope.Global);
 
             @Test
             void toJsonShouldSerializeQuotaSize() {
@@ -98,7 +129,7 @@ class QuotaSizeTest {
         @Nested
         class LimitedQuotaDomainScope {
             private final String json = "{\"used\":12,\"limit\":100,\"limits\":{\"Domain\":100}}";
-            private final Quota<QuotaSize> quota = limitedQuotaSizeByScopes(Quota.Scope.Domain);
+            private final Quota<QuotaSizeLimit, QuotaSizeUsage> quota = limitedQuotaSizeByScopes(Quota.Scope.Domain);
 
             @Test
             void toJsonShouldSerializeQuotaSize() {
@@ -116,7 +147,7 @@ class QuotaSizeTest {
         @Nested
         class LimitedQuotaUserScope {
             private final String json = "{\"used\":12,\"limit\":100,\"limits\":{\"User\":100}}";
-            private final Quota<QuotaSize> quota = limitedQuotaSizeByScopes(Quota.Scope.User);
+            private final Quota<QuotaSizeLimit, QuotaSizeUsage> quota = limitedQuotaSizeByScopes(Quota.Scope.User);
 
             @Test
             void toJsonShouldSerializeQuotaSize() {
@@ -134,18 +165,18 @@ class QuotaSizeTest {
 
     @Nested
     class UnLimitedQuotaSize {
-        private Quota<QuotaSize> unLimitedQuotaSizeByScopes(Quota.Scope scope) {
-            return Quota.<QuotaSize>builder()
-                .used(QuotaSize.size(12))
-                .computedLimit(QuotaSize.unlimited())
-                .limitForScope(QuotaSize.unlimited(), scope)
+        private Quota<QuotaSizeLimit, QuotaSizeUsage> unLimitedQuotaSizeByScopes(Quota.Scope scope) {
+            return Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                .used(QuotaSizeUsage.size(12))
+                .computedLimit(QuotaSizeLimit.unlimited())
+                .limitForScope(QuotaSizeLimit.unlimited(), scope)
                 .build();
         }
 
         @Nested
         class UnLimitedQuotaGlobalScope {
             private final String json = "{\"used\":12,\"limit\":null,\"limits\":{\"Global\":null}}";
-            private final Quota<QuotaSize> quota = unLimitedQuotaSizeByScopes(Quota.Scope.Global);
+            private final Quota<QuotaSizeLimit, QuotaSizeUsage> quota = unLimitedQuotaSizeByScopes(Quota.Scope.Global);
 
             @Test
             void toJsonShouldSerializeQuotaSize() {
@@ -163,7 +194,7 @@ class QuotaSizeTest {
         @Nested
         class UnLimitedQuotaDomainScope {
             private final String json = "{\"used\":12,\"limit\":null,\"limits\":{\"Domain\":null}}";
-            private final Quota<QuotaSize> quota = unLimitedQuotaSizeByScopes(Quota.Scope.Domain);
+            private final Quota<QuotaSizeLimit, QuotaSizeUsage> quota = unLimitedQuotaSizeByScopes(Quota.Scope.Domain);
 
             @Test
             void toJsonShouldSerializeQuotaSize() {
@@ -181,7 +212,7 @@ class QuotaSizeTest {
         @Nested
         class UnLimitedQuotaUserScope {
             private final String json = "{\"used\":12,\"limit\":null,\"limits\":{\"User\":null}}";
-            private final Quota<QuotaSize> quota = unLimitedQuotaSizeByScopes(Quota.Scope.User);
+            private final Quota<QuotaSizeLimit, QuotaSizeUsage> quota = unLimitedQuotaSizeByScopes(Quota.Scope.User);
 
             @Test
             void toJsonShouldSerializeQuotaSize() {
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java
index f0b21d2..dcd23ba 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java
@@ -28,9 +28,9 @@ import javax.persistence.EntityManagerFactory;
 
 import org.apache.james.backends.jpa.TransactionRunner;
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.jpa.quota.model.MaxDomainMessageCount;
 import org.apache.james.mailbox.jpa.quota.model.MaxDomainStorage;
 import org.apache.james.mailbox.jpa.quota.model.MaxGlobalMessageCount;
@@ -51,7 +51,7 @@ public class JPAPerUserMaxQuotaDAO {
         this.transactionRunner = new TransactionRunner(entityManagerFactory);
     }
 
-    public void setMaxStorage(QuotaRoot quotaRoot, Optional<QuotaSize> maxStorageQuota) {
+    public void setMaxStorage(QuotaRoot quotaRoot, Optional<QuotaSizeLimit> maxStorageQuota) {
         transactionRunner.run(
             entityManager -> {
                 MaxUserStorage storedValue = getMaxUserStorageEntity(entityManager, quotaRoot, maxStorageQuota);
@@ -59,7 +59,7 @@ public class JPAPerUserMaxQuotaDAO {
             });
     }
 
-    private MaxUserStorage getMaxUserStorageEntity(EntityManager entityManager, QuotaRoot quotaRoot, Optional<QuotaSize> maxStorageQuota) {
+    private MaxUserStorage getMaxUserStorageEntity(EntityManager entityManager, QuotaRoot quotaRoot, Optional<QuotaSizeLimit> maxStorageQuota) {
         MaxUserStorage storedValue = entityManager.find(MaxUserStorage.class, quotaRoot.getValue());
         Long value = quotaValueToLong(maxStorageQuota);
         if (storedValue == null) {
@@ -69,7 +69,7 @@ public class JPAPerUserMaxQuotaDAO {
         return storedValue;
     }
 
-    public void setMaxMessage(QuotaRoot quotaRoot, Optional<QuotaCount> maxMessageCount) {
+    public void setMaxMessage(QuotaRoot quotaRoot, Optional<QuotaCountLimit> maxMessageCount) {
         transactionRunner.run(
             entityManager -> {
                 MaxUserMessageCount storedValue = getMaxUserMessageEntity(entityManager, quotaRoot, maxMessageCount);
@@ -77,7 +77,7 @@ public class JPAPerUserMaxQuotaDAO {
             });
     }
 
-    private MaxUserMessageCount getMaxUserMessageEntity(EntityManager entityManager, QuotaRoot quotaRoot, Optional<QuotaCount> maxMessageQuota) {
+    private MaxUserMessageCount getMaxUserMessageEntity(EntityManager entityManager, QuotaRoot quotaRoot, Optional<QuotaCountLimit> maxMessageQuota) {
         MaxUserMessageCount storedValue = entityManager.find(MaxUserMessageCount.class, quotaRoot.getValue());
         Long value = quotaValueToLong(maxMessageQuota);
         if (storedValue == null) {
@@ -87,7 +87,7 @@ public class JPAPerUserMaxQuotaDAO {
         return storedValue;
     }
 
-    public void setDomainMaxMessage(Domain domain, Optional<QuotaCount> count) {
+    public void setDomainMaxMessage(Domain domain, Optional<QuotaCountLimit> count) {
         transactionRunner.run(
             entityManager -> {
                 MaxDomainMessageCount storedValue = getMaxDomainMessageEntity(entityManager, domain, count);
@@ -96,7 +96,7 @@ public class JPAPerUserMaxQuotaDAO {
     }
 
 
-    public void setDomainMaxStorage(Domain domain, Optional<QuotaSize> size) {
+    public void setDomainMaxStorage(Domain domain, Optional<QuotaSizeLimit> size) {
         transactionRunner.run(
             entityManager -> {
                 MaxDomainStorage storedValue = getMaxDomainStorageEntity(entityManager, domain, size);
@@ -104,7 +104,7 @@ public class JPAPerUserMaxQuotaDAO {
             });
     }
 
-    private MaxDomainMessageCount getMaxDomainMessageEntity(EntityManager entityManager, Domain domain, Optional<QuotaCount> maxMessageQuota) {
+    private MaxDomainMessageCount getMaxDomainMessageEntity(EntityManager entityManager, Domain domain, Optional<QuotaCountLimit> maxMessageQuota) {
         MaxDomainMessageCount storedValue = entityManager.find(MaxDomainMessageCount.class, domain.asString());
         Long value = quotaValueToLong(maxMessageQuota);
         if (storedValue == null) {
@@ -114,7 +114,7 @@ public class JPAPerUserMaxQuotaDAO {
         return storedValue;
     }
 
-    private MaxDomainStorage getMaxDomainStorageEntity(EntityManager entityManager, Domain domain, Optional<QuotaSize> maxStorageQuota) {
+    private MaxDomainStorage getMaxDomainStorageEntity(EntityManager entityManager, Domain domain, Optional<QuotaSizeLimit> maxStorageQuota) {
         MaxDomainStorage storedValue = entityManager.find(MaxDomainStorage.class, domain.asString());
         Long value = quotaValueToLong(maxStorageQuota);
         if (storedValue == null) {
@@ -125,7 +125,7 @@ public class JPAPerUserMaxQuotaDAO {
     }
 
 
-    public void setGlobalMaxStorage(Optional<QuotaSize> globalMaxStorage) {
+    public void setGlobalMaxStorage(Optional<QuotaSizeLimit> globalMaxStorage) {
         transactionRunner.run(
             entityManager -> {
                 MaxGlobalStorage globalMaxStorageEntity = getGlobalMaxStorageEntity(entityManager, globalMaxStorage);
@@ -133,7 +133,7 @@ public class JPAPerUserMaxQuotaDAO {
             });
     }
 
-    private MaxGlobalStorage getGlobalMaxStorageEntity(EntityManager entityManager, Optional<QuotaSize> maxSizeQuota) {
+    private MaxGlobalStorage getGlobalMaxStorageEntity(EntityManager entityManager, Optional<QuotaSizeLimit> maxSizeQuota) {
         MaxGlobalStorage storedValue = entityManager.find(MaxGlobalStorage.class, MaxGlobalStorage.DEFAULT_KEY);
         Long value = quotaValueToLong(maxSizeQuota);
         if (storedValue == null) {
@@ -143,7 +143,7 @@ public class JPAPerUserMaxQuotaDAO {
         return storedValue;
     }
 
-    public void setGlobalMaxMessage(Optional<QuotaCount> globalMaxMessageCount) {
+    public void setGlobalMaxMessage(Optional<QuotaCountLimit> globalMaxMessageCount) {
         transactionRunner.run(
             entityManager -> {
                 MaxGlobalMessageCount globalMaxMessageEntity = getGlobalMaxMessageEntity(entityManager, globalMaxMessageCount);
@@ -151,7 +151,7 @@ public class JPAPerUserMaxQuotaDAO {
             });
     }
 
-    private MaxGlobalMessageCount getGlobalMaxMessageEntity(EntityManager entityManager, Optional<QuotaCount> maxMessageQuota) {
+    private MaxGlobalMessageCount getGlobalMaxMessageEntity(EntityManager entityManager, Optional<QuotaCountLimit> maxMessageQuota) {
         MaxGlobalMessageCount storedValue = entityManager.find(MaxGlobalMessageCount.class, MaxGlobalMessageCount.DEFAULT_KEY);
         Long value = quotaValueToLong(maxMessageQuota);
         if (storedValue == null) {
@@ -161,7 +161,7 @@ public class JPAPerUserMaxQuotaDAO {
         return storedValue;
     }
 
-    public Optional<QuotaSize> getGlobalMaxStorage() {
+    public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         MaxGlobalStorage storedValue = entityManager.find(MaxGlobalStorage.class, MaxGlobalStorage.DEFAULT_KEY);
         if (storedValue == null) {
@@ -170,7 +170,7 @@ public class JPAPerUserMaxQuotaDAO {
         return longToQuotaSize(storedValue.getValue());
     }
 
-    public Optional<QuotaCount> getGlobalMaxMessage() {
+    public Optional<QuotaCountLimit> getGlobalMaxMessage() {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         MaxGlobalMessageCount storedValue = entityManager.find(MaxGlobalMessageCount.class, MaxGlobalMessageCount.DEFAULT_KEY);
         if (storedValue == null) {
@@ -179,7 +179,7 @@ public class JPAPerUserMaxQuotaDAO {
         return longToQuotaCount(storedValue.getValue());
     }
 
-    public Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) {
+    public Optional<QuotaSizeLimit> getMaxStorage(QuotaRoot quotaRoot) {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         MaxUserStorage storedValue = entityManager.find(MaxUserStorage.class, quotaRoot.getValue());
         if (storedValue == null) {
@@ -188,7 +188,7 @@ public class JPAPerUserMaxQuotaDAO {
         return longToQuotaSize(storedValue.getValue());
     }
 
-    public Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) {
+    public Optional<QuotaCountLimit> getMaxMessage(QuotaRoot quotaRoot) {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         MaxUserMessageCount storedValue = entityManager.find(MaxUserMessageCount.class, quotaRoot.getValue());
         if (storedValue == null) {
@@ -197,7 +197,7 @@ public class JPAPerUserMaxQuotaDAO {
         return longToQuotaCount(storedValue.getValue());
     }
 
-    public Optional<QuotaCount> getDomainMaxMessage(Domain domain) {
+    public Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain) {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         MaxDomainMessageCount storedValue = entityManager.find(MaxDomainMessageCount.class, domain.asString());
         if (storedValue == null) {
@@ -206,7 +206,7 @@ public class JPAPerUserMaxQuotaDAO {
         return longToQuotaCount(storedValue.getValue());
     }
 
-    public Optional<QuotaSize> getDomainMaxStorage(Domain domain) {
+    public Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain) {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         MaxDomainStorage storedValue = entityManager.find(MaxDomainStorage.class, domain.asString());
         if (storedValue == null) {
@@ -216,7 +216,7 @@ public class JPAPerUserMaxQuotaDAO {
     }
 
 
-    private Long quotaValueToLong(Optional<? extends QuotaValue<?>> maxStorageQuota) {
+    private Long quotaValueToLong(Optional<? extends QuotaLimitValue<?>> maxStorageQuota) {
         return maxStorageQuota.map(value -> {
             if (value.isUnlimited()) {
                 return INFINITE;
@@ -225,15 +225,15 @@ public class JPAPerUserMaxQuotaDAO {
         }).orElse(null);
     }
 
-    private Optional<QuotaSize> longToQuotaSize(Long value) {
-        return longToQuotaValue(value, QuotaSize.unlimited(), QuotaSize::size);
+    private Optional<QuotaSizeLimit> longToQuotaSize(Long value) {
+        return longToQuotaValue(value, QuotaSizeLimit.unlimited(), QuotaSizeLimit::size);
     }
 
-    private Optional<QuotaCount> longToQuotaCount(Long value) {
-        return longToQuotaValue(value, QuotaCount.unlimited(), QuotaCount::count);
+    private Optional<QuotaCountLimit> longToQuotaCount(Long value) {
+        return longToQuotaValue(value, QuotaCountLimit.unlimited(), QuotaCountLimit::count);
     }
 
-    private <T extends QuotaValue<T>> Optional<T> longToQuotaValue(Long value, T infiniteValue, Function<Long, T> quotaFactory) {
+    private <T extends QuotaLimitValue<T>> Optional<T> longToQuotaValue(Long value, T infiniteValue, Function<Long, T> quotaFactory) {
         if (value == null) {
             return Optional.empty();
         }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java
index 53b6ccd..12ac40b 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java
@@ -28,8 +28,8 @@ import javax.inject.Inject;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
@@ -47,22 +47,22 @@ public class JPAPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) {
+    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
         dao.setMaxStorage(quotaRoot, Optional.of(maxStorageQuota));
     }
 
     @Override
-    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount) {
+    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
         dao.setMaxMessage(quotaRoot, Optional.of(maxMessageCount));
     }
 
     @Override
-    public void setDomainMaxMessage(Domain domain, QuotaCount count) {
+    public void setDomainMaxMessage(Domain domain, QuotaCountLimit count) {
         dao.setDomainMaxMessage(domain, Optional.of(count));
     }
 
     @Override
-    public void setDomainMaxStorage(Domain domain, QuotaSize size) {
+    public void setDomainMaxStorage(Domain domain, QuotaSizeLimit size) {
         dao.setDomainMaxStorage(domain, Optional.of(size));
     }
 
@@ -77,12 +77,12 @@ public class JPAPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public Optional<QuotaCount> getDomainMaxMessage(Domain domain) {
+    public Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain) {
         return dao.getDomainMaxMessage(domain);
     }
 
     @Override
-    public Optional<QuotaSize> getDomainMaxStorage(Domain domain) {
+    public Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain) {
         return dao.getDomainMaxStorage(domain);
     }
 
@@ -92,7 +92,7 @@ public class JPAPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setGlobalMaxStorage(QuotaSize globalMaxStorage) {
+    public void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) {
         dao.setGlobalMaxStorage(Optional.of(globalMaxStorage));
     }
 
@@ -102,23 +102,23 @@ public class JPAPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setGlobalMaxMessage(QuotaCount globalMaxMessageCount) {
+    public void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) {
         dao.setGlobalMaxMessage(Optional.of(globalMaxMessageCount));
     }
 
     @Override
-    public Optional<QuotaSize> getGlobalMaxStorage() {
+    public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
         return dao.getGlobalMaxStorage();
     }
 
     @Override
-    public Optional<QuotaCount> getGlobalMaxMessage() {
+    public Optional<QuotaCountLimit> getGlobalMaxMessage() {
         return dao.getGlobalMaxMessage();
     }
 
     @Override
-    public Map<Quota.Scope, QuotaCount> listMaxMessagesDetails(QuotaRoot quotaRoot) {
-        Function<Domain, Optional<QuotaCount>> domainQuotaFunction = Throwing.function(this::getDomainMaxMessage).sneakyThrow();
+    public Map<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot) {
+        Function<Domain, Optional<QuotaCountLimit>> domainQuotaFunction = Throwing.function(this::getDomainMaxMessage).sneakyThrow();
         return Stream.of(
             Pair.of(Quota.Scope.User, dao.getMaxMessage(quotaRoot)),
             Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaFunction)),
@@ -128,8 +128,8 @@ public class JPAPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public Map<Quota.Scope, QuotaSize> listMaxStorageDetails(QuotaRoot quotaRoot) {
-        Function<Domain, Optional<QuotaSize>> domainQuotaFunction = Throwing.function(this::getDomainMaxStorage).sneakyThrow();
+    public Map<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot) {
+        Function<Domain, Optional<QuotaSizeLimit>> domainQuotaFunction = Throwing.function(this::getDomainMaxStorage).sneakyThrow();
         return Stream.of(
             Pair.of(Quota.Scope.User, dao.getMaxStorage(quotaRoot)),
             Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaFunction)),
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
index bca9406..99ff928 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
@@ -26,8 +26,8 @@ import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 
 import org.apache.james.backends.jpa.TransactionRunner;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.quota.model.JpaCurrentQuota;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -50,19 +50,19 @@ public class JpaCurrentQuotaManager implements StoreCurrentQuotaManager {
     }
 
     @Override
-    public QuotaCount getCurrentMessageCount(QuotaRoot quotaRoot) {
+    public QuotaCountUsage getCurrentMessageCount(QuotaRoot quotaRoot) {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         return Optional.ofNullable(retrieveUserQuota(entityManager, quotaRoot))
             .map(JpaCurrentQuota::getMessageCount)
-            .orElse(QuotaCount.count(NO_STORED_BYTES));
+            .orElse(QuotaCountUsage.count(NO_STORED_BYTES));
     }
 
     @Override
-    public QuotaSize getCurrentStorage(QuotaRoot quotaRoot) {
+    public QuotaSizeUsage getCurrentStorage(QuotaRoot quotaRoot) {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         return Optional.ofNullable(retrieveUserQuota(entityManager, quotaRoot))
             .map(JpaCurrentQuota::getSize)
-            .orElse(QuotaSize.size(NO_STORED_BYTES));
+            .orElse(QuotaSizeUsage.size(NO_STORED_BYTES));
     }
 
     @Override
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/JpaCurrentQuota.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/JpaCurrentQuota.java
index 0011e41..f058ba0 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/JpaCurrentQuota.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/JpaCurrentQuota.java
@@ -24,8 +24,8 @@ import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 
 @Entity(name = "CurrentQuota")
 @Table(name = "JAMES_QUOTA_CURRENTQUOTA")
@@ -50,12 +50,12 @@ public class JpaCurrentQuota {
         this.size = size;
     }
 
-    public QuotaCount getMessageCount() {
-        return QuotaCount.count(messageCount);
+    public QuotaCountUsage getMessageCount() {
+        return QuotaCountUsage.count(messageCount);
     }
 
-    public QuotaSize getSize() {
-        return QuotaSize.size(size);
+    public QuotaSizeUsage getSize() {
+        return QuotaSizeUsage.size(size);
     }
 
     @Override
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index 02ef7b6..5df517f 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -25,8 +25,8 @@ import java.util.concurrent.atomic.AtomicLong;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.store.SessionProvider;
@@ -65,18 +65,18 @@ public class InMemoryCurrentQuotaManager implements StoreCurrentQuotaManager {
     }
 
     @Override
-    public QuotaCount getCurrentMessageCount(QuotaRoot quotaRoot) throws MailboxException {
+    public QuotaCountUsage getCurrentMessageCount(QuotaRoot quotaRoot) throws MailboxException {
         try {
-            return QuotaCount.count(quotaCache.get(quotaRoot).getCount().get());
+            return QuotaCountUsage.count(quotaCache.get(quotaRoot).getCount().get());
         } catch (ExecutionException e) {
             throw new MailboxException("Exception caught", e);
         }
     }
 
     @Override
-    public QuotaSize getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException {
+    public QuotaSizeUsage getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException {
         try {
-            return QuotaSize.size(quotaCache.get(quotaRoot).getSize().get());
+            return QuotaSizeUsage.size(quotaCache.get(quotaRoot).getSize().get());
         } catch (ExecutionException e) {
             throw new MailboxException("Exception caught", e);
         }
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManager.java
index 848118a..6808197 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryPerUserMaxQuotaManager.java
@@ -26,8 +26,8 @@ import java.util.stream.Stream;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
@@ -37,27 +37,27 @@ import com.github.steveash.guavate.Guavate;
 
 public class InMemoryPerUserMaxQuotaManager implements MaxQuotaManager {
 
-    private Optional<QuotaCount> maxMessage = Optional.empty();
-    private Optional<QuotaSize> maxStorage = Optional.empty();
+    private Optional<QuotaCountLimit> maxMessage = Optional.empty();
+    private Optional<QuotaSizeLimit> maxStorage = Optional.empty();
 
-    private final Map<Domain, QuotaCount> domainMaxMessage = new ConcurrentHashMap<>();
-    private final Map<Domain, QuotaSize> domainMaxStorage = new ConcurrentHashMap<>();
+    private final Map<Domain, QuotaCountLimit> domainMaxMessage = new ConcurrentHashMap<>();
+    private final Map<Domain, QuotaSizeLimit> domainMaxStorage = new ConcurrentHashMap<>();
 
-    private final Map<String, QuotaSize> userMaxStorage = new ConcurrentHashMap<>();
-    private final Map<String, QuotaCount> userMaxMessage = new ConcurrentHashMap<>();
+    private final Map<String, QuotaSizeLimit> userMaxStorage = new ConcurrentHashMap<>();
+    private final Map<String, QuotaCountLimit> userMaxMessage = new ConcurrentHashMap<>();
 
     @Override
-    public void setGlobalMaxStorage(QuotaSize maxStorage) {
+    public void setGlobalMaxStorage(QuotaSizeLimit maxStorage) {
         this.maxStorage = Optional.of(maxStorage);
     }
 
     @Override
-    public void setDomainMaxMessage(Domain domain, QuotaCount count) {
+    public void setDomainMaxMessage(Domain domain, QuotaCountLimit count) {
         domainMaxMessage.put(domain, count);
     }
 
     @Override
-    public void setDomainMaxStorage(Domain domain, QuotaSize size) {
+    public void setDomainMaxStorage(Domain domain, QuotaSizeLimit size) {
         domainMaxStorage.put(domain, size);
     }
 
@@ -72,8 +72,8 @@ public class InMemoryPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public Map<Quota.Scope, QuotaCount> listMaxMessagesDetails(QuotaRoot quotaRoot) {
-        Function<Domain, Optional<QuotaCount>> domainQuotaFunction = Throwing.function(this::getDomainMaxMessage).sneakyThrow();
+    public Map<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot) {
+        Function<Domain, Optional<QuotaCountLimit>> domainQuotaFunction = Throwing.function(this::getDomainMaxMessage).sneakyThrow();
         return Stream.of(
                 Pair.of(Quota.Scope.User, Optional.ofNullable(userMaxMessage.get(quotaRoot.getValue()))),
                 Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaFunction)),
@@ -83,8 +83,8 @@ public class InMemoryPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public Map<Quota.Scope, QuotaSize> listMaxStorageDetails(QuotaRoot quotaRoot) {
-        Function<Domain, Optional<QuotaSize>> domainQuotaFunction = Throwing.function(this::getDomainMaxStorage).sneakyThrow();
+    public Map<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot) {
+        Function<Domain, Optional<QuotaSizeLimit>> domainQuotaFunction = Throwing.function(this::getDomainMaxStorage).sneakyThrow();
         return Stream.of(
                 Pair.of(Quota.Scope.User, Optional.ofNullable(userMaxStorage.get(quotaRoot.getValue()))),
                 Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaFunction)),
@@ -94,37 +94,37 @@ public class InMemoryPerUserMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setGlobalMaxMessage(QuotaCount maxMessage) {
+    public void setGlobalMaxMessage(QuotaCountLimit maxMessage) {
         this.maxMessage = Optional.of(maxMessage);
     }
 
     @Override
-    public Optional<QuotaCount> getDomainMaxMessage(Domain domain) {
+    public Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain) {
         return Optional.ofNullable(domainMaxMessage.get(domain));
     }
 
     @Override
-    public Optional<QuotaSize> getDomainMaxStorage(Domain domain) {
+    public Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain) {
         return Optional.ofNullable(domainMaxStorage.get(domain));
     }
 
     @Override
-    public void setMaxStorage(QuotaRoot user, QuotaSize maxStorageQuota) {
+    public void setMaxStorage(QuotaRoot user, QuotaSizeLimit maxStorageQuota) {
         userMaxStorage.put(user.getValue(), maxStorageQuota);
     }
 
     @Override
-    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount) {
+    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
         userMaxMessage.put(quotaRoot.getValue(), maxMessageCount);
     }
 
     @Override
-    public Optional<QuotaSize> getGlobalMaxStorage() {
+    public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
         return maxStorage;
     }
 
     @Override
-    public Optional<QuotaCount> getGlobalMaxMessage() {
+    public Optional<QuotaCountLimit> getGlobalMaxMessage() {
         return maxMessage;
     }
 
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
index 1446af8..95aa1b4 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
@@ -25,8 +25,8 @@ import static org.mockito.Mockito.when;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.store.SessionProvider;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
@@ -51,7 +51,7 @@ public class InMemoryCurrentQuotaManagerTest {
         when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
             .thenReturn(new CurrentQuotaCalculator.CurrentQuotas(18, 512));
 
-        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCount.count(18));
+        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCountUsage.count(18));
     }
 
     @Test
@@ -59,7 +59,7 @@ public class InMemoryCurrentQuotaManagerTest {
         when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
             .thenReturn(new CurrentQuotaCalculator.CurrentQuotas(18, 512));
 
-        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSize.size(512));
+        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSizeUsage.size(512));
     }
 
     @Test
@@ -69,8 +69,8 @@ public class InMemoryCurrentQuotaManagerTest {
 
         testee.increase(QUOTA_ROOT, 10, 100);
 
-        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCount.count(28));
-        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSize.size(612));
+        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCountUsage.count(28));
+        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSizeUsage.size(612));
     }
 
     @Test(expected = IllegalArgumentException.class)
diff --git a/mailbox/plugin/quota-mailing-cassandra/src/main/java/org/apache/james/mailbox/quota/cassandra/dto/QuotaDTO.java b/mailbox/plugin/quota-mailing-cassandra/src/main/java/org/apache/james/mailbox/quota/cassandra/dto/QuotaDTO.java
index 30b0685..78e69cd 100644
--- a/mailbox/plugin/quota-mailing-cassandra/src/main/java/org/apache/james/mailbox/quota/cassandra/dto/QuotaDTO.java
+++ b/mailbox/plugin/quota-mailing-cassandra/src/main/java/org/apache/james/mailbox/quota/cassandra/dto/QuotaDTO.java
@@ -21,8 +21,10 @@ package org.apache.james.mailbox.quota.cassandra.dto;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -30,7 +32,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
 class QuotaDTO {
-    public static QuotaDTO from(Quota<?> quota) {
+    public static QuotaDTO from(Quota<?, ?> quota) {
         if (quota.getLimit().isUnlimited()) {
             return new QuotaDTO(quota.getUsed().asLong(), Optional.empty());
         }
@@ -56,18 +58,18 @@ class QuotaDTO {
     }
 
     @JsonIgnore
-    public Quota<QuotaSize> asSizeQuota() {
-        return Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(used))
-            .computedLimit(QuotaSize.size(limit))
+    public Quota<QuotaSizeLimit, QuotaSizeUsage> asSizeQuota() {
+        return Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(used))
+            .computedLimit(QuotaSizeLimit.size(limit))
             .build();
     }
 
     @JsonIgnore
-    public Quota<QuotaCount> asCountQuota() {
-        return Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(used))
-            .computedLimit(QuotaCount.count(limit))
+    public Quota<QuotaCountLimit, QuotaCountUsage> asCountQuota() {
+        return Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(used))
+            .computedLimit(QuotaCountLimit.count(limit))
             .build();
     }
 }
diff --git a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
index a239520..d9a323d 100644
--- a/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
+++ b/mailbox/plugin/quota-mailing-cassandra/src/test/java/org/apache/james/mailbox/quota/cassandra/dto/DTOTest.java
@@ -27,8 +27,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.time.Instant;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.eventsourcing.EventId;
 import org.apache.james.eventsourcing.eventstore.cassandra.JsonEventSerializer;
 import org.apache.james.mailbox.model.Quota;
@@ -46,8 +48,8 @@ import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
 
 class DTOTest {
 
-    static final Quota<QuotaSize> SIZE_QUOTA = Quota.<QuotaSize>builder().used(QuotaSize.size(23)).computedLimit(QuotaSize.size(33)).build();
-    static final Quota<QuotaCount> COUNT_QUOTA = Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.count(45)).build();
+    static final Quota<QuotaSizeLimit, QuotaSizeUsage> SIZE_QUOTA = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(23)).computedLimit(QuotaSizeLimit.size(33)).build();
+    static final Quota<QuotaCountLimit, QuotaCountUsage> COUNT_QUOTA = Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(12)).computedLimit(QuotaCountLimit.count(45)).build();
     static final Instant INSTANT = Instant.ofEpochMilli(45554);
     public static final String DEFAULT_LISTENER_NAME = "default";
     static final QuotaThresholdChangedEvent EVENT = new QuotaThresholdChangedEvent(
@@ -62,7 +64,7 @@ class DTOTest {
         HistoryEvolution.lowerThresholdReached(new QuotaThresholdChange(_75, INSTANT)),
         HistoryEvolution.noChanges(),
         SIZE_QUOTA,
-        Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
+        Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(12)).computedLimit(QuotaCountLimit.unlimited()).build(),
         UserQuotaThresholds.Id.from(Username.of("foo@bar.com"), DEFAULT_LISTENER_NAME));
     static final QuotaThresholdChangedEvent EVENT_3 = new QuotaThresholdChangedEvent(
         EventId.first(),
@@ -70,7 +72,7 @@ class DTOTest {
         HistoryEvolution.higherThresholdReached(new QuotaThresholdChange(_80, INSTANT),
             HistoryEvolution.HighestThresholdRecentness.NotAlreadyReachedDuringGracePeriod),
         SIZE_QUOTA,
-        Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
+        Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(12)).computedLimit(QuotaCountLimit.unlimited()).build(),
         UserQuotaThresholds.Id.from(Username.of("foo@bar.com"), DEFAULT_LISTENER_NAME));
     static final QuotaThresholdChangedEvent EVENT_4 = new QuotaThresholdChangedEvent(
         EventId.first(),
@@ -78,7 +80,7 @@ class DTOTest {
         HistoryEvolution.higherThresholdReached(new QuotaThresholdChange(_80, INSTANT),
             HistoryEvolution.HighestThresholdRecentness.AlreadyReachedDuringGracePeriod),
         SIZE_QUOTA,
-        Quota.<QuotaCount>builder().used(QuotaCount.count(12)).computedLimit(QuotaCount.unlimited()).build(),
+        Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(12)).computedLimit(QuotaCountLimit.unlimited()).build(),
         UserQuotaThresholds.Id.from(Username.of("foo@bar.com"), DEFAULT_LISTENER_NAME));
 
     static final String EVENT_JSON = ClassLoaderUtils.getSystemResourceAsString("json/event.json");
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
index 7203a7a..d3162cf 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/aggregates/UserQuotaThresholds.java
@@ -26,8 +26,10 @@ import java.util.Objects;
 import java.util.stream.Collectors;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.eventsourcing.AggregateId;
 import org.apache.james.eventsourcing.eventstore.History;
 import org.apache.james.mailbox.model.Quota;
@@ -142,7 +144,7 @@ public class UserQuotaThresholds {
         return events;
     }
 
-    private List<QuotaThresholdChangedEvent> generateEvents(QuotaThresholds configuration, Duration gracePeriod, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant now) {
+    private List<QuotaThresholdChangedEvent> generateEvents(QuotaThresholds configuration, Duration gracePeriod, Quota<QuotaCountLimit, QuotaCountUsage> countQuota, Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Instant now) {
         QuotaThresholdChange countThresholdChange = new QuotaThresholdChange(configuration.highestExceededThreshold(countQuota), now);
         QuotaThresholdChange sizeThresholdChange = new QuotaThresholdChange(configuration.highestExceededThreshold(sizeQuota), now);
 
@@ -172,7 +174,7 @@ public class UserQuotaThresholds {
                 .collect(Guavate.toImmutableList()));
     }
 
-    private List<QuotaThresholdChangedEvent> generateEvents(HistoryEvolution countHistoryEvolution, HistoryEvolution sizeHistoryEvolution, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota) {
+    private List<QuotaThresholdChangedEvent> generateEvents(HistoryEvolution countHistoryEvolution, HistoryEvolution sizeHistoryEvolution, Quota<QuotaCountLimit, QuotaCountUsage> countQuota, Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota) {
         if (countHistoryEvolution.isChange() || sizeHistoryEvolution.isChange()) {
             return ImmutableList.of(
                 new QuotaThresholdChangedEvent(
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java
index 833388d..557d22e 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/commands/DetectThresholdCrossing.java
@@ -23,19 +23,21 @@ import java.time.Instant;
 import java.util.Objects;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.eventsourcing.Command;
 import org.apache.james.mailbox.model.Quota;
 
 public class DetectThresholdCrossing implements Command {
 
     private final Username username;
-    private final Quota<QuotaCount> countQuota;
-    private final Quota<QuotaSize> sizeQuota;
+    private final Quota<QuotaCountLimit, QuotaCountUsage> countQuota;
+    private final Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota;
     private final Instant instant;
 
-    public DetectThresholdCrossing(Username username, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
+    public DetectThresholdCrossing(Username username, Quota<QuotaCountLimit, QuotaCountUsage> countQuota, Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Instant instant) {
         this.username = username;
         this.countQuota = countQuota;
         this.sizeQuota = sizeQuota;
@@ -46,11 +48,11 @@ public class DetectThresholdCrossing implements Command {
         return username;
     }
 
-    public Quota<QuotaCount> getCountQuota() {
+    public Quota<QuotaCountLimit, QuotaCountUsage> getCountQuota() {
         return countQuota;
     }
 
-    public Quota<QuotaSize> getSizeQuota() {
+    public Quota<QuotaSizeLimit, QuotaSizeUsage> getSizeQuota() {
         return sizeQuota;
     }
 
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/QuotaThresholdChangedEvent.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/QuotaThresholdChangedEvent.java
index 99022f3..d5017e2 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/QuotaThresholdChangedEvent.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/events/QuotaThresholdChangedEvent.java
@@ -21,8 +21,10 @@ package org.apache.james.mailbox.quota.mailing.events;
 
 import java.util.Objects;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.eventsourcing.Event;
 import org.apache.james.eventsourcing.EventId;
 import org.apache.james.mailbox.model.Quota;
@@ -34,11 +36,11 @@ public class QuotaThresholdChangedEvent implements Event {
     private final EventId eventId;
     private final HistoryEvolution sizeHistoryEvolution;
     private final HistoryEvolution countHistoryEvolution;
-    private final Quota<QuotaSize> sizeQuota;
-    private final Quota<QuotaCount> countQuota;
+    private final Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota;
+    private final Quota<QuotaCountLimit, QuotaCountUsage> countQuota;
     private final UserQuotaThresholds.Id aggregateId;
 
-    public QuotaThresholdChangedEvent(EventId eventId, HistoryEvolution sizeHistoryEvolution, HistoryEvolution countHistoryEvolution, Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota, UserQuotaThresholds.Id aggregateId) {
+    public QuotaThresholdChangedEvent(EventId eventId, HistoryEvolution sizeHistoryEvolution, HistoryEvolution countHistoryEvolution, Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Quota<QuotaCountLimit, QuotaCountUsage> countQuota, UserQuotaThresholds.Id aggregateId) {
         this.eventId = eventId;
         this.sizeHistoryEvolution = sizeHistoryEvolution;
         this.countHistoryEvolution = countHistoryEvolution;
@@ -55,11 +57,11 @@ public class QuotaThresholdChangedEvent implements Event {
         return countHistoryEvolution;
     }
 
-    public Quota<QuotaSize> getSizeQuota() {
+    public Quota<QuotaSizeLimit, QuotaSizeUsage> getSizeQuota() {
         return sizeQuota;
     }
 
-    public Quota<QuotaCount> getCountQuota() {
+    public Quota<QuotaCountLimit, QuotaCountUsage> getCountQuota() {
         return countQuota;
     }
 
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNotice.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNotice.java
index 884f4a1..018d1fa 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNotice.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNotice.java
@@ -34,8 +34,10 @@ import java.util.stream.Stream;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.core.builder.MimeMessageBuilder;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.quota.mailing.QuotaMailingListenerConfiguration;
@@ -56,8 +58,8 @@ public class QuotaThresholdNotice {
     public static class Builder {
         private Optional<QuotaThreshold> countThreshold;
         private Optional<QuotaThreshold> sizeThreshold;
-        private Quota<QuotaSize> sizeQuota;
-        private Quota<QuotaCount> countQuota;
+        private Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota;
+        private Quota<QuotaCountLimit, QuotaCountUsage> countQuota;
         private QuotaMailingListenerConfiguration configuration;
 
         public Builder() {
@@ -65,12 +67,12 @@ public class QuotaThresholdNotice {
             sizeThreshold = Optional.empty();
         }
 
-        public Builder sizeQuota(Quota<QuotaSize> sizeQuota) {
+        public Builder sizeQuota(Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota) {
             this.sizeQuota = sizeQuota;
             return this;
         }
 
-        public Builder countQuota(Quota<QuotaCount> countQuota) {
+        public Builder countQuota(Quota<QuotaCountLimit, QuotaCountUsage> countQuota) {
             this.countQuota = countQuota;
             return this;
         }
@@ -120,13 +122,13 @@ public class QuotaThresholdNotice {
 
     private final Optional<QuotaThreshold> countThreshold;
     private final Optional<QuotaThreshold> sizeThreshold;
-    private final Quota<QuotaSize> sizeQuota;
-    private final Quota<QuotaCount> countQuota;
+    private final Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota;
+    private final Quota<QuotaCountLimit, QuotaCountUsage> countQuota;
     private final QuotaMailingListenerConfiguration configuration;
 
     @VisibleForTesting
     QuotaThresholdNotice(Optional<QuotaThreshold> countThreshold, Optional<QuotaThreshold> sizeThreshold,
-                         Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota, QuotaMailingListenerConfiguration configuration) {
+                         Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Quota<QuotaCountLimit, QuotaCountUsage> countQuota, QuotaMailingListenerConfiguration configuration) {
         this.countThreshold = countThreshold;
         this.sizeThreshold = sizeThreshold;
         this.sizeQuota = sizeQuota;
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThreshold.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThreshold.java
index dea2676..1706e6e 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThreshold.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThreshold.java
@@ -47,7 +47,7 @@ public class QuotaThreshold implements Comparable<QuotaThreshold> {
         return Double.valueOf(quotaOccupationRatio * 100).intValue();
     }
 
-    public boolean isExceeded(Quota<?> quota) {
+    public boolean isExceeded(Quota<?, ?> quota) {
         if (quota.getLimit().isUnlimited()) {
             return false;
         }
diff --git a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThresholds.java b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThresholds.java
index 8f92ed3..1b8c551 100644
--- a/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThresholds.java
+++ b/mailbox/plugin/quota-mailing/src/main/java/org/apache/james/mailbox/quota/model/QuotaThresholds.java
@@ -43,7 +43,7 @@ public class QuotaThresholds {
             .collect(Guavate.toImmutableList());
     }
 
-    public QuotaThreshold highestExceededThreshold(Quota<?> quota) {
+    public QuotaThreshold highestExceededThreshold(Quota<?, ?> quota) {
         return quotaThresholds.stream()
             .filter(quotaLevel -> quotaLevel.isExceeded(quota))
             .findFirst()
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNoticeTest.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNoticeTest.java
index f62ad85..325b111 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNoticeTest.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/mailing/subscribers/QuotaThresholdNoticeTest.java
@@ -29,8 +29,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.quota.QuotaFixture.Counts;
@@ -107,8 +109,8 @@ class QuotaThresholdNoticeTest {
 
     @Test
     void buildShouldReturnPresentWhenAbove() {
-        Quota<QuotaSize> sizeQuota = Sizes._82_PERCENT;
-        Quota<QuotaCount> countQuota = Counts._82_PERCENT;
+        Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota = Sizes._82_PERCENT;
+        Quota<QuotaCountLimit, QuotaCountUsage> countQuota = Counts._82_PERCENT;
         QuotaThresholdChange sizeThresholdChange = new QuotaThresholdChange(_80, NOW);
 
         assertThat(QuotaThresholdNotice.builder()
@@ -123,8 +125,8 @@ class QuotaThresholdNoticeTest {
 
     @Test
     void buildShouldFilterOutNotInterestingFields() {
-        Quota<QuotaSize> sizeQuota = Sizes._82_PERCENT;
-        Quota<QuotaCount> countQuota = Counts._82_PERCENT;
+        Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota = Sizes._82_PERCENT;
+        Quota<QuotaCountLimit, QuotaCountUsage> countQuota = Counts._82_PERCENT;
         QuotaThresholdChange sizeThresholdChange = new QuotaThresholdChange(_80, NOW);
         QuotaThresholdChange countThresholdChange = new QuotaThresholdChange(_80, NOW);
 
@@ -141,8 +143,8 @@ class QuotaThresholdNoticeTest {
 
     @Test
     void buildShouldKeepAllInterestingFields() {
-        Quota<QuotaSize> sizeQuota = Sizes._82_PERCENT;
-        Quota<QuotaCount> countQuota = Counts._82_PERCENT;
+        Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota = Sizes._82_PERCENT;
+        Quota<QuotaCountLimit, QuotaCountUsage> countQuota = Counts._82_PERCENT;
         QuotaThresholdChange sizeThresholdChange = new QuotaThresholdChange(_80, NOW);
         QuotaThresholdChange countThresholdChange = new QuotaThresholdChange(_80, NOW);
 
@@ -210,9 +212,9 @@ class QuotaThresholdNoticeTest {
 
         assertThat(QuotaThresholdNotice.builder()
             .withConfiguration(DEFAULT_CONFIGURATION)
-            .sizeQuota(Quota.<QuotaSize>builder()
-                .used(QuotaSize.size(801 * 1024 * 1024))
-                .computedLimit(QuotaSize.size(1 * 1024 * 1024 * 1024))
+            .sizeQuota(Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                .used(QuotaSizeUsage.size(801 * 1024 * 1024))
+                .computedLimit(QuotaSizeLimit.size(1 * 1024 * 1024 * 1024))
                 .build())
             .countQuota(Counts._72_PERCENT)
             .sizeThreshold(HistoryEvolution.higherThresholdReached(sizeThresholdChange, NotAlreadyReachedDuringGracePeriod))
@@ -228,9 +230,9 @@ class QuotaThresholdNoticeTest {
 
         assertThat(QuotaThresholdNotice.builder()
             .withConfiguration(DEFAULT_CONFIGURATION)
-            .sizeQuota(Quota.<QuotaSize>builder()
-                .used(QuotaSize.size(801 * 1024 * 1024))
-                .computedLimit(QuotaSize.size((2 * 1024 * 1024 * 1024) - 1))
+            .sizeQuota(Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                .used(QuotaSizeUsage.size(801 * 1024 * 1024))
+                .computedLimit(QuotaSizeLimit.size((2 * 1024 * 1024 * 1024) - 1))
                 .build())
             .countQuota(Counts._72_PERCENT)
             .sizeThreshold(HistoryEvolution.higherThresholdReached(sizeThresholdChange, NotAlreadyReachedDuringGracePeriod))
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdTest.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdTest.java
index f316459..15a47e8 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdTest.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdTest.java
@@ -26,7 +26,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.quota.QuotaFixture.Sizes;
 import org.junit.jupiter.api.Test;
@@ -86,9 +87,9 @@ public class QuotaThresholdTest {
 
     @Test
     public void isExceededShouldReturnFalseWhenUnlimited() {
-        Quota<QuotaSize> quota = Quota.<QuotaSize>builder()
-            .computedLimit(QuotaSize.unlimited())
-            .used(QuotaSize.size(80))
+        Quota<QuotaSizeLimit, QuotaSizeUsage> quota = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .computedLimit(QuotaSizeLimit.unlimited())
+            .used(QuotaSizeUsage.size(80))
             .build();
 
         assertThat(_75.isExceeded(quota))
diff --git a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdsTest.java b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdsTest.java
index 4674f02..c2a07bb 100644
--- a/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdsTest.java
+++ b/mailbox/plugin/quota-mailing/src/test/java/org/apache/james/mailbox/quota/model/QuotaThresholdsTest.java
@@ -25,13 +25,13 @@ import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture._95;
 import static org.apache.james.mailbox.quota.model.QuotaThresholdFixture._99;
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.quota.QuotaFixture.Sizes;
 import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableList;
-
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 public class QuotaThresholdsTest {
@@ -46,9 +46,9 @@ public class QuotaThresholdsTest {
     public void highestExceededThresholdShouldReturnZeroWhenBelowAllThresholds() {
         assertThat(
             new QuotaThresholds(ImmutableList.of(_50, _80, _95, _99))
-                .highestExceededThreshold(Quota.<QuotaSize>builder()
-                    .used(QuotaSize.size(40))
-                    .computedLimit(QuotaSize.size(100))
+                .highestExceededThreshold(Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                    .used(QuotaSizeUsage.size(40))
+                    .computedLimit(QuotaSizeLimit.size(100))
                     .build()))
             .isEqualTo(QuotaThreshold.ZERO);
     }
@@ -81,9 +81,9 @@ public class QuotaThresholdsTest {
     public void highestExceededThresholdShouldReturnZeroWhenUnlimitedQuota() {
         assertThat(
             new QuotaThresholds(ImmutableList.of(_50, _80, _95, _99))
-                .highestExceededThreshold(Quota.<QuotaSize>builder()
-                    .used(QuotaSize.size(992))
-                    .computedLimit(QuotaSize.unlimited())
+                .highestExceededThreshold(Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+                    .used(QuotaSizeUsage.size(992))
+                    .computedLimit(QuotaSizeLimit.unlimited())
                     .build()))
             .isEqualTo(QuotaThreshold.ZERO);
     }
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
index 373a069..1489e72 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/ElasticSearchQuotaSearcherTest.java
@@ -25,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.stream.IntStream;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.quota.search.Limit;
 import org.apache.james.quota.search.Offset;
 import org.apache.james.quota.search.QuotaQuery;
@@ -40,7 +40,7 @@ class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
     void searchShouldNotBeLimitedByElasticSearchDefaultSearchLimit(QuotaSearchTestSystem testSystem) throws Exception {
         int userCount = 11;
         testSystem.getDomainList().addDomain(SIMPSON_COM);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         IntStream.range(0, userCount)
             .boxed()
@@ -60,7 +60,7 @@ class ElasticSearchQuotaSearcherTest implements QuotaSearcherContract {
     void searchShouldNotBeLimitedByElasticSearchDefaultSearchLimitWhenUsingOffset(QuotaSearchTestSystem testSystem) throws Exception {
         int userCount = 12;
         testSystem.getDomainList().addDomain(SIMPSON_COM);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         IntStream.range(0, userCount)
             .boxed()
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
index 68ff7d9..67102ef 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
@@ -23,8 +23,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRatio;
 import org.junit.jupiter.api.Test;
@@ -33,13 +35,13 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 
 class QuotaRatioAsJsonTest {
 
-    private static final Quota<QuotaSize> QUOTA_SIZE = Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(15))
-            .computedLimit(QuotaSize.size(60))
+    private static final Quota<QuotaSizeLimit, QuotaSizeUsage> QUOTA_SIZE = Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(15))
+            .computedLimit(QuotaSizeLimit.size(60))
             .build();
-    private static final Quota<QuotaCount> QUOTA_COUNT = Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(1))
-            .computedLimit(QuotaCount.count(2))
+    private static final Quota<QuotaCountLimit, QuotaCountUsage> QUOTA_COUNT = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(1))
+            .computedLimit(QuotaCountLimit.count(2))
             .build();
 
     @Test
diff --git a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
index 0a9105a..b7728c0 100644
--- a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
+++ b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
@@ -26,8 +26,10 @@ import java.util.function.Predicate;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRatio;
@@ -93,8 +95,8 @@ public class ClauseConverter {
     private double retrieveUserRatio(Username username) {
         try {
             QuotaRoot quotaRoot = quotaRootResolver.forUser(username);
-            Quota<QuotaSize> storageQuota = quotaManager.getStorageQuota(quotaRoot);
-            Quota<QuotaCount> messageQuota = quotaManager.getMessageQuota(quotaRoot);
+            Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = quotaManager.getStorageQuota(quotaRoot);
+            Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = quotaManager.getMessageQuota(quotaRoot);
 
             return QuotaRatio.from(storageQuota, messageQuota).max();
         } catch (MailboxException e) {
diff --git a/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java b/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java
index 9fbac9a..a24b393 100644
--- a/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java
+++ b/mailbox/plugin/quota-search/src/test/java/org/apache/james/quota/search/QuotaSearcherContract.java
@@ -32,7 +32,7 @@ import java.nio.charset.StandardCharsets;
 import org.apache.james.core.CoreFixture.Users.Alphabet;
 import org.apache.james.core.CoreFixture.Users.Simpson;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -54,7 +54,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.HOMER, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
         appendMessage(testSystem, Simpson.HOMER, withSize(50));
@@ -74,7 +74,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.HOMER, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
         appendMessage(testSystem, Simpson.HOMER, withSize(50));
@@ -94,7 +94,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.HOMER, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(40));
         appendMessage(testSystem, Simpson.HOMER, withSize(51));
@@ -117,7 +117,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
         testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
         appendMessage(testSystem, Simpson.LISA, withSize(51));
@@ -138,7 +138,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Simpson.BART, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
         testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
         appendMessage(testSystem, Simpson.LISA, withSize(51));
@@ -160,7 +160,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Alphabet.ABA, PASSWORD);
         testSystem.getUsersRepository().addUser(Alphabet.ABB, PASSWORD);
         testSystem.getUsersRepository().addUser(Alphabet.ACB, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Alphabet.AAA, withSize(49));
         appendMessage(testSystem, Alphabet.ABA, withSize(50));
@@ -181,7 +181,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Alphabet.ABA, PASSWORD);
         testSystem.getUsersRepository().addUser(Alphabet.ABB, PASSWORD);
         testSystem.getUsersRepository().addUser(Alphabet.ACB, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Alphabet.AAA, withSize(49));
         appendMessage(testSystem, Alphabet.ABA, withSize(50));
@@ -203,7 +203,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Alphabet.ABA, PASSWORD);
         testSystem.getUsersRepository().addUser(Alphabet.ABB, PASSWORD);
         testSystem.getUsersRepository().addUser(Alphabet.ACB, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Alphabet.AAA, withSize(49));
         appendMessage(testSystem, Alphabet.ABA, withSize(50));
@@ -226,7 +226,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Simpson.HOMER, PASSWORD);
         testSystem.getUsersRepository().addUser(Simpson.LISA, PASSWORD);
         testSystem.getUsersRepository().addUser(BENOIT_AT_DOMAIN_TLD, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Simpson.BART, withSize(49));
         appendMessage(testSystem, Simpson.HOMER, withSize(50));
@@ -248,7 +248,7 @@ public interface QuotaSearcherContract {
         testSystem.getUsersRepository().addUser(Alphabet.ABA, PASSWORD);
         testSystem.getUsersRepository().addUser(Alphabet.ABB, PASSWORD);
         testSystem.getUsersRepository().addUser(Alphabet.ACB, PASSWORD);
-        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSize.size(100));
+        testSystem.getMaxQuotaManager().setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         appendMessage(testSystem, Alphabet.AAA, withSize(49));
         appendMessage(testSystem, Alphabet.ABA, withSize(50));
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 671bc8c..877fca0 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -33,8 +33,8 @@ import java.util.stream.Stream;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MailboxAnnotationManager;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPathLocker;
@@ -449,8 +449,8 @@ public class StoreMailboxManager implements MailboxManager {
                 .mailboxSession(session)
                 .mailbox(mailbox)
                 .quotaRoot(quotaRoot)
-                .quotaCount(QuotaCount.count(messageCount))
-                .quotaSize(QuotaSize.size(totalSize))
+                .quotaCount(QuotaCountUsage.count(messageCount))
+                .quotaSize(QuotaSizeUsage.size(totalSize))
                 .build(),
                 new MailboxIdRegistrationKey(mailbox.getMailboxId()))
                 .block();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
index e2dd560..42f852c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/event/EventFactory.java
@@ -25,8 +25,10 @@ import java.util.Map;
 import java.util.SortedMap;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.acl.ACLDiff;
@@ -154,22 +156,22 @@ public class EventFactory {
 
     @FunctionalInterface
     public interface RequireQuotaCountValue<T> {
-        T quotaCount(QuotaCount quotaCount);
+        T quotaCount(QuotaCountUsage quotaCount);
     }
 
     @FunctionalInterface
     public interface RequireQuotaSizeValue<T> {
-        T quotaSize(QuotaSize quotaSize);
+        T quotaSize(QuotaSizeUsage quotaSize);
     }
 
     @FunctionalInterface
     public interface RequireQuotaCount<T> {
-        T quotaCount(Quota<QuotaCount> quotaCount);
+        T quotaCount(Quota<QuotaCountLimit, QuotaCountUsage> quotaCount);
     }
 
     @FunctionalInterface
     public interface RequireQuotaSize<T> {
-        T quotaSize(Quota<QuotaSize> quotaSize);
+        T quotaSize(Quota<QuotaSizeLimit, QuotaSizeUsage> quotaSize);
     }
 
     @FunctionalInterface
@@ -296,10 +298,10 @@ public class EventFactory {
         private final Username username;
         private final MailboxSession.SessionId sessionId;
         private final QuotaRoot quotaRoot;
-        private final QuotaCount deletedMessageCount;
-        private final QuotaSize totalDeletedSize;
+        private final QuotaCountUsage deletedMessageCount;
+        private final QuotaSizeUsage totalDeletedSize;
 
-        MailboxDeletionFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId, QuotaRoot quotaRoot, QuotaCount deletedMessageCount, QuotaSize totalDeletedSize) {
+        MailboxDeletionFinalStage(Event.EventId eventId, MailboxPath path, MailboxId mailboxId, Username username, MailboxSession.SessionId sessionId, QuotaRoot quotaRoot, QuotaCountUsage deletedMessageCount, QuotaSizeUsage totalDeletedSize) {
             this.eventId = eventId;
             this.path = path;
             this.mailboxId = mailboxId;
@@ -385,11 +387,11 @@ public class EventFactory {
         private final Event.EventId eventId;
         private final Username username;
         private final QuotaRoot quotaRoot;
-        private final Quota<QuotaCount> countQuota;
-        private final Quota<QuotaSize> sizeQuota;
+        private final Quota<QuotaCountLimit, QuotaCountUsage> countQuota;
+        private final Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota;
         private final Instant instant;
 
-        QuotaUsageUpdatedFinalStage(Event.EventId eventId, Username username, QuotaRoot quotaRoot, Quota<QuotaCount> countQuota, Quota<QuotaSize> sizeQuota, Instant instant) {
+        QuotaUsageUpdatedFinalStage(Event.EventId eventId, Username username, QuotaRoot quotaRoot, Quota<QuotaCountLimit, QuotaCountUsage> countQuota, Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Instant instant) {
             this.eventId = eventId;
             this.username = username;
             this.quotaRoot = quotaRoot;
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/FixedMaxQuotaManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/FixedMaxQuotaManager.java
index 63847a9..5ee9d8e 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/FixedMaxQuotaManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/FixedMaxQuotaManager.java
@@ -4,8 +4,8 @@ import java.util.Map;
 import java.util.Optional;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.UnsupportedOperationException;
 import org.apache.james.mailbox.model.Quota;
@@ -21,16 +21,16 @@ import com.google.common.collect.ImmutableMap;
  */
 public class FixedMaxQuotaManager implements MaxQuotaManager {
 
-    private Optional<QuotaSize> maxStorage = Optional.empty();
-    private Optional<QuotaCount> maxMessage = Optional.empty();
+    private Optional<QuotaSizeLimit> maxStorage = Optional.empty();
+    private Optional<QuotaCountLimit> maxMessage = Optional.empty();
 
     @Override
-    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) throws MailboxException {
+    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) throws MailboxException {
         throw new UnsupportedOperationException("Can not modify QuotaRoot specific upper limit for FixedMaxQuotaManager");
     }
 
     @Override
-    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount) throws MailboxException {
+    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) throws MailboxException {
         throw new UnsupportedOperationException("Can not modify QuotaRoot specific upper limit for FixedMaxQuotaManager");
     }
 
@@ -45,17 +45,17 @@ public class FixedMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setDomainMaxMessage(Domain domain, QuotaCount count) throws MailboxException {
+    public void setDomainMaxMessage(Domain domain, QuotaCountLimit count) throws MailboxException {
         throw new UnsupportedOperationException("Can not modify domain specific upper limit for FixedMaxQuotaManager");
     }
 
     @Override
-    public void setDomainMaxStorage(Domain domain, QuotaSize size) throws UnsupportedOperationException {
+    public void setDomainMaxStorage(Domain domain, QuotaSizeLimit size) throws UnsupportedOperationException {
         throw new UnsupportedOperationException("Can not modify domain specific upper limit for FixedMaxQuotaManager");
     }
 
     @Override
-    public void setGlobalMaxStorage(QuotaSize globalMaxStorage) {
+    public void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) {
         maxStorage = Optional.of(globalMaxStorage);
     }
 
@@ -70,41 +70,41 @@ public class FixedMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setGlobalMaxMessage(QuotaCount globalMaxMessageCount) {
+    public void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) {
         maxMessage = Optional.empty();
     }
 
     @Override
-    public Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) {
+    public Optional<QuotaSizeLimit> getMaxStorage(QuotaRoot quotaRoot) {
         return maxStorage;
     }
 
     @Override
-    public Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) {
+    public Optional<QuotaCountLimit> getMaxMessage(QuotaRoot quotaRoot) {
         return maxMessage;
     }
 
     @Override
-    public Map<Quota.Scope, QuotaCount> listMaxMessagesDetails(QuotaRoot quotaRoot) {
+    public Map<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot) {
         return maxMessage
             .map(value -> ImmutableMap.of(Quota.Scope.Global, value))
             .orElse(ImmutableMap.of());
     }
 
     @Override
-    public Map<Quota.Scope, QuotaSize> listMaxStorageDetails(QuotaRoot quotaRoot) {
+    public Map<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot) {
         return maxStorage
             .map(value -> ImmutableMap.of(Quota.Scope.Global, value))
             .orElse(ImmutableMap.of());
     }
 
     @Override
-    public Optional<QuotaCount> getDomainMaxMessage(Domain domain) {
+    public Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain) {
         return Optional.empty();
     }
 
     @Override
-    public Optional<QuotaSize> getDomainMaxStorage(Domain domain) {
+    public Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain) {
         return Optional.empty();
     }
 
@@ -119,12 +119,12 @@ public class FixedMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public Optional<QuotaSize> getGlobalMaxStorage() {
+    public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
         return maxStorage;
     }
 
     @Override
-    public Optional<QuotaCount> getGlobalMaxMessage() {
+    public Optional<QuotaCountLimit> getGlobalMaxMessage() {
         return maxMessage;
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoMaxQuotaManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoMaxQuotaManager.java
index 9f52bce..a280e8d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoMaxQuotaManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoMaxQuotaManager.java
@@ -23,8 +23,8 @@ import java.util.Map;
 import java.util.Optional;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -40,12 +40,12 @@ import com.google.common.collect.ImmutableMap;
 public class NoMaxQuotaManager implements MaxQuotaManager {
 
     @Override
-    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) throws MailboxException {
+    public void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) throws MailboxException {
         throw new MailboxException("Operation is not supported");
     }
 
     @Override
-    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount) throws MailboxException {
+    public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) throws MailboxException {
         throw new MailboxException("Operation is not supported");
     }
 
@@ -60,12 +60,12 @@ public class NoMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setDomainMaxMessage(Domain domain, QuotaCount count) throws MailboxException {
+    public void setDomainMaxMessage(Domain domain, QuotaCountLimit count) throws MailboxException {
         throw new MailboxException("Operation is not supported");
     }
 
     @Override
-    public void setDomainMaxStorage(Domain domain, QuotaSize size) throws MailboxException {
+    public void setDomainMaxStorage(Domain domain, QuotaSizeLimit size) throws MailboxException {
         throw new MailboxException("Operation is not supported");
     }
 
@@ -80,7 +80,7 @@ public class NoMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setGlobalMaxStorage(QuotaSize globalMaxStorage) throws MailboxException {
+    public void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) throws MailboxException {
         throw new MailboxException("Operation is not supported");
     }
 
@@ -95,47 +95,47 @@ public class NoMaxQuotaManager implements MaxQuotaManager {
     }
 
     @Override
-    public void setGlobalMaxMessage(QuotaCount globalMaxMessageCount) throws MailboxException {
+    public void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) throws MailboxException {
         throw new MailboxException("Operation is not supported");
     }
 
     @Override
-    public Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) {
+    public Optional<QuotaSizeLimit> getMaxStorage(QuotaRoot quotaRoot) {
         return Optional.empty();
     }
 
     @Override
-    public Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) {
+    public Optional<QuotaCountLimit> getMaxMessage(QuotaRoot quotaRoot) {
         return Optional.empty();
     }
 
     @Override
-    public Map<Quota.Scope, QuotaCount> listMaxMessagesDetails(QuotaRoot quotaRoot) {
+    public Map<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot) {
         return ImmutableMap.of();
     }
 
     @Override
-    public Map<Quota.Scope, QuotaSize> listMaxStorageDetails(QuotaRoot quotaRoot) {
+    public Map<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot) {
         return ImmutableMap.of();
     }
 
     @Override
-    public Optional<QuotaCount> getDomainMaxMessage(Domain domain) {
+    public Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain) {
         return Optional.empty();
     }
 
     @Override
-    public Optional<QuotaSize> getDomainMaxStorage(Domain domain) {
+    public Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain) {
         return Optional.empty();
     }
 
     @Override
-    public Optional<QuotaSize> getGlobalMaxStorage() {
+    public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
         return Optional.empty();
     }
 
     @Override
-    public Optional<QuotaCount> getGlobalMaxMessage() {
+    public Optional<QuotaCountLimit> getGlobalMaxMessage() {
         return Optional.empty();
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoQuotaManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoQuotaManager.java
index ded398a..15ae69a 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoQuotaManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/NoQuotaManager.java
@@ -19,8 +19,10 @@
 
 package org.apache.james.mailbox.store.quota;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.QuotaManager;
@@ -31,18 +33,18 @@ import org.apache.james.mailbox.quota.QuotaManager;
 public class NoQuotaManager implements QuotaManager {
 
     @Override
-    public Quota<QuotaCount> getMessageQuota(QuotaRoot quotaRoot) {
-        return Quota.<QuotaCount>builder()
-            .used(QuotaCount.count(0))
-            .computedLimit(QuotaCount.unlimited())
+    public Quota<QuotaCountLimit, QuotaCountUsage> getMessageQuota(QuotaRoot quotaRoot) {
+        return Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .used(QuotaCountUsage.count(0))
+            .computedLimit(QuotaCountLimit.unlimited())
             .build();
     }
 
     @Override
-    public Quota<QuotaSize> getStorageQuota(QuotaRoot quotaRoot) {
-        return Quota.<QuotaSize>builder()
-            .used(QuotaSize.size(0))
-            .computedLimit(QuotaSize.unlimited())
+    public Quota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(QuotaRoot quotaRoot) {
+        return Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
+            .used(QuotaSizeUsage.size(0))
+            .computedLimit(QuotaSizeLimit.unlimited())
             .build();
     }
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
index 2c870ea..87e0816 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/QuotaChecker.java
@@ -19,8 +19,10 @@
 
 package org.apache.james.mailbox.store.quota;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.OverQuotaException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -31,8 +33,8 @@ import org.apache.james.mailbox.quota.QuotaRootResolver;
 
 public class QuotaChecker {
 
-    private final Quota<QuotaCount> messageQuota;
-    private final Quota<QuotaSize> sizeQuota;
+    private final Quota<QuotaCountLimit, QuotaCountUsage> messageQuota;
+    private final Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota;
     private final QuotaRoot quotaRoot;
 
     public QuotaChecker(QuotaManager quotaManager, QuotaRootResolver quotaRootResolver, Mailbox mailbox) throws MailboxException {
@@ -41,7 +43,7 @@ public class QuotaChecker {
         this.sizeQuota = quotaManager.getStorageQuota(quotaRoot);
     }
 
-    public QuotaChecker(Quota<QuotaCount> messageQuota, Quota<QuotaSize> sizeQuota, QuotaRoot quotaRoot) {
+    public QuotaChecker(Quota<QuotaCountLimit, QuotaCountUsage> messageQuota, Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, QuotaRoot quotaRoot) {
         this.messageQuota = messageQuota;
         this.sizeQuota = sizeQuota;
         this.quotaRoot = quotaRoot;
@@ -53,7 +55,7 @@ public class QuotaChecker {
     }
 
     private void trySizeAddition(long size) throws OverQuotaException {
-        Quota<QuotaSize> afterAdditionQuotaSize = sizeQuota.addValueToQuota(QuotaSize.size(size));
+        Quota<QuotaSizeLimit, QuotaSizeUsage> afterAdditionQuotaSize = sizeQuota.addValueToQuota(QuotaSizeUsage.size(size));
         if (afterAdditionQuotaSize.isOverQuota()) {
             throw new OverQuotaException(
                 "You use too much space in " + quotaRoot.getValue(),
@@ -63,7 +65,7 @@ public class QuotaChecker {
     }
 
     private void tryCountAddition(long count) throws OverQuotaException {
-        Quota<QuotaCount> afterAdditionQuotaCount = messageQuota.addValueToQuota(QuotaCount.count(count));
+        Quota<QuotaCountLimit, QuotaCountUsage> afterAdditionQuotaCount = messageQuota.addValueToQuota(QuotaCountUsage.count(count));
         if (afterAdditionQuotaCount.isOverQuota()) {
             throw new OverQuotaException(
                 "You have too many messages in " + quotaRoot.getValue(),
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreQuotaManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreQuotaManager.java
index 2889270..82d227d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreQuotaManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreQuotaManager.java
@@ -23,8 +23,10 @@ import java.util.Map;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.Quota.Scope;
@@ -49,22 +51,22 @@ public class StoreQuotaManager implements QuotaManager {
     }
 
     @Override
-    public Quota<QuotaCount> getMessageQuota(QuotaRoot quotaRoot) throws MailboxException {
-        Map<Scope, QuotaCount> maxMessageDetails = maxQuotaManager.listMaxMessagesDetails(quotaRoot);
-        return Quota.<QuotaCount>builder()
+    public Quota<QuotaCountLimit, QuotaCountUsage> getMessageQuota(QuotaRoot quotaRoot) throws MailboxException {
+        Map<Scope, QuotaCountLimit> maxMessageDetails = maxQuotaManager.listMaxMessagesDetails(quotaRoot);
+        return Quota.<QuotaCountLimit, QuotaCountUsage>builder()
             .used(currentQuotaManager.getCurrentMessageCount(quotaRoot))
-            .computedLimit(maxQuotaManager.getMaxMessage(maxMessageDetails).orElse(QuotaCount.unlimited()))
+            .computedLimit(maxQuotaManager.getMaxMessage(maxMessageDetails).orElse(QuotaCountLimit.unlimited()))
             .limitsByScope(maxMessageDetails)
             .build();
     }
 
 
     @Override
-    public Quota<QuotaSize> getStorageQuota(QuotaRoot quotaRoot) throws MailboxException {
-        Map<Scope, QuotaSize> maxStorageDetails = maxQuotaManager.listMaxStorageDetails(quotaRoot);
-        return Quota.<QuotaSize>builder()
+    public Quota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(QuotaRoot quotaRoot) throws MailboxException {
+        Map<Scope, QuotaSizeLimit> maxStorageDetails = maxQuotaManager.listMaxStorageDetails(quotaRoot);
+        return Quota.<QuotaSizeLimit, QuotaSizeUsage>builder()
             .used(currentQuotaManager.getCurrentStorage(quotaRoot))
-            .computedLimit(maxQuotaManager.getMaxStorage(maxStorageDetails).orElse(QuotaSize.unlimited()))
+            .computedLimit(maxQuotaManager.getMaxStorage(maxStorageDetails).orElse(QuotaSizeLimit.unlimited()))
             .limitsByScope(maxStorageDetails)
             .build();
     }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
index 82190d9..8624426 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
@@ -24,8 +24,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import javax.mail.Flags;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
@@ -80,7 +80,7 @@ public abstract class AbstractMessageIdManagerQuotaTest {
 
     @Test
     void setInMailboxesShouldNotThrowWhenMessageQuotaNotExceeded() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(1));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(1));
 
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -89,7 +89,7 @@ public abstract class AbstractMessageIdManagerQuotaTest {
 
     @Test
     void setInMailboxesShouldNotThrowWhenStorageQuotaNotExceeded() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(testingData.getConstantMessageSize()));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(testingData.getConstantMessageSize()));
 
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -98,7 +98,7 @@ public abstract class AbstractMessageIdManagerQuotaTest {
 
     @Test
     void setInMailboxesShouldThrowWhenStorageQuotaExceeded() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(2 * testingData.getConstantMessageSize()));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(2 * testingData.getConstantMessageSize()));
 
         testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
@@ -111,7 +111,7 @@ public abstract class AbstractMessageIdManagerQuotaTest {
 
     @Test
     void setInMailboxesShouldThrowWhenStorageQuotaExceededWhenCopiedToMultipleMailboxes() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(2 * testingData.getConstantMessageSize()));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(2 * testingData.getConstantMessageSize()));
 
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
 
@@ -123,7 +123,7 @@ public abstract class AbstractMessageIdManagerQuotaTest {
 
     @Test
     void setInMailboxesShouldThrowWhenStorageMessageExceeded() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(2));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(2));
 
         testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         MessageId messageId = testingData.persist(mailbox2.getMailboxId(), messageUid1, FLAGS, session);
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 0a87367..b850249 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
@@ -34,8 +34,10 @@ import java.util.concurrent.CountDownLatch;
 
 import javax.mail.Flags;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageIdManager;
@@ -73,13 +75,12 @@ 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 {
-    private static final Quota<QuotaCount> OVER_QUOTA = Quota.<QuotaCount>builder()
-        .used(QuotaCount.count(102))
-        .computedLimit(QuotaCount.count(100))
+    private static final Quota<QuotaCountLimit, QuotaCountUsage> OVER_QUOTA = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+        .used(QuotaCountUsage.count(102))
+        .computedLimit(QuotaCountLimit.count(100))
         .build();
     private static final MessageUid messageUid1 = MessageUid.of(111);
     private static final MessageUid messageUid2 = MessageUid.of(113);
@@ -353,10 +354,10 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
 
         when(quotaManager.getStorageQuota(any(QuotaRoot.class))).thenReturn(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(2)).computedLimit(QuotaSize.unlimited()).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(2)).computedLimit(QuotaSizeLimit.unlimited()).build());
         when(quotaManager.getMessageQuota(any(QuotaRoot.class))).thenReturn(OVER_QUOTA);
         when(quotaManager.getStorageQuota(any(QuotaRoot.class))).thenReturn(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(2)).computedLimit(QuotaSize.unlimited()).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(2)).computedLimit(QuotaSizeLimit.unlimited()).build());
 
         assertThatThrownBy(() -> messageIdManager.setInMailboxes(messageId,
                 ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()),
@@ -522,8 +523,8 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
 
     private void givenUnlimitedQuota() throws MailboxException {
         when(quotaManager.getMessageQuota(any(QuotaRoot.class))).thenReturn(
-            Quota.<QuotaCount>builder().used(QuotaCount.count(2)).computedLimit(QuotaCount.unlimited()).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(2)).computedLimit(QuotaCountLimit.unlimited()).build());
         when(quotaManager.getStorageQuota(any(QuotaRoot.class))).thenReturn(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(2)).computedLimit(QuotaSize.unlimited()).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(2)).computedLimit(QuotaSizeLimit.unlimited()).build());
     }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
index b7feb4d..6be4aad 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/event/MailboxAnnotationListenerTest.java
@@ -31,8 +31,8 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.events.Event;
@@ -89,8 +89,8 @@ public class MailboxAnnotationListenerTest {
             .mailboxId(mailboxId)
             .mailboxPath(MailboxPath.forUser(USER, "name"))
             .quotaRoot(QuotaRoot.quotaRoot("root", Optional.empty()))
-            .quotaCount(QuotaCount.count(123))
-            .quotaSize(QuotaSize.size(456))
+            .quotaCount(QuotaCountUsage.count(123))
+            .quotaSize(QuotaSizeUsage.size(456))
             .build();
 
         when(sessionProvider.createSystemSession(deleteEvent.getUsername()))
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
index 40a8adf..dbc8e49 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
@@ -24,8 +24,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Optional;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
@@ -58,66 +58,66 @@ public abstract class GenericMaxQuotaManagerTest {
 
     @Test
     void getMaxMessageShouldReturnDomainWhenNoValue() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(36));
-        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(23));
-        assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCount.count(23));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(36));
+        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCountLimit.count(23));
+        assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCountLimit.count(23));
     }
 
     @Test
     void getMaxMessageShouldReturnGlobalWhenNoValue() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(36));
-        assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCount.count(36));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(36));
+        assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCountLimit.count(36));
     }
 
     @Test
     void getMaxStorageShouldReturnGlobalWhenNoValue() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(36));
-        assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSize.size(36));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(36));
+        assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSizeLimit.size(36));
     }
 
     @Test
     void getMaxStorageShouldReturnDomainWhenNoValue() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(234));
-        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(111));
-        assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSize.size(111));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(234));
+        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSizeLimit.size(111));
+        assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSizeLimit.size(111));
     }
 
     @Test
     void getMaxMessageShouldReturnProvidedValue() throws Exception {
-        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(36));
-        assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCount.count(36));
+        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCountLimit.count(36));
+        assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).contains(QuotaCountLimit.count(36));
     }
 
     @Test
     void getMaxStorageShouldReturnProvidedValue() throws Exception {
-        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(36));
-        assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSize.size(36));
+        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSizeLimit.size(36));
+        assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).contains(QuotaSizeLimit.size(36));
     }
 
     @Test
     void deleteMaxStorageShouldRemoveCurrentValue() throws Exception {
-        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(36));
+        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSizeLimit.size(36));
         maxQuotaManager.removeMaxStorage(QUOTA_ROOT);
         assertThat(maxQuotaManager.getMaxStorage(QUOTA_ROOT)).isEmpty();
     }
 
     @Test
     void deleteMaxMessageShouldRemoveCurrentValue() throws Exception {
-        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(36));
+        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCountLimit.count(36));
         maxQuotaManager.removeMaxMessage(QUOTA_ROOT);
         assertThat(maxQuotaManager.getMaxMessage(QUOTA_ROOT)).isEmpty();
     }
 
     @Test
     void deleteGlobalMaxStorageShouldRemoveCurrentValue() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(36));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(36));
         maxQuotaManager.removeGlobalMaxStorage();
         assertThat(maxQuotaManager.getGlobalMaxStorage()).isEmpty();
     }
 
     @Test
     void deleteGlobalMaxMessageShouldRemoveCurrentValue() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(36));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(36));
         maxQuotaManager.removeGlobalMaxMessage();
         assertThat(maxQuotaManager.getGlobalMaxMessage()).isEmpty();
     }
@@ -134,94 +134,94 @@ public abstract class GenericMaxQuotaManagerTest {
 
     @Test
     void listMaxMessagesDetailsShouldReturnGlobalValueWhenDefined() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(123));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
             .hasSize(1)
-            .containsEntry(Quota.Scope.Global, QuotaCount.count(123));
+            .containsEntry(Quota.Scope.Global, QuotaCountLimit.count(123));
     }
 
     @Test
     void listMaxMessagesDetailsShouldReturnDomainValueWhenDefined() throws Exception {
-        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(123));
+        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCountLimit.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
             .hasSize(1)
-            .containsEntry(Quota.Scope.Domain, QuotaCount.count(123));
+            .containsEntry(Quota.Scope.Domain, QuotaCountLimit.count(123));
     }
 
     @Test
     void listMaxMessagesDetailsShouldReturnUserValueWhenDefined() throws Exception {
-        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(123));
+        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCountLimit.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
             .hasSize(1)
-            .containsEntry(Quota.Scope.User, QuotaCount.count(123));
+            .containsEntry(Quota.Scope.User, QuotaCountLimit.count(123));
     }
 
     @Test
     void listMaxMessagesDetailsShouldReturnBothValuesWhenGlobalAndUserDefined() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(1234));
-        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(123));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(1234));
+        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCountLimit.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
             .hasSize(2)
-            .containsEntry(Quota.Scope.Global, QuotaCount.count(1234))
-            .containsEntry(Quota.Scope.User, QuotaCount.count(123));
+            .containsEntry(Quota.Scope.Global, QuotaCountLimit.count(1234))
+            .containsEntry(Quota.Scope.User, QuotaCountLimit.count(123));
     }
 
     @Test
     void listMaxMessagesDetailsShouldReturnAllValuesWhenDefined() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(1234));
-        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(333));
-        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCount.count(123));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(1234));
+        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCountLimit.count(333));
+        maxQuotaManager.setMaxMessage(QUOTA_ROOT, QuotaCountLimit.count(123));
         assertThat(maxQuotaManager.listMaxMessagesDetails(QUOTA_ROOT))
             .hasSize(3)
-            .containsEntry(Quota.Scope.Global, QuotaCount.count(1234))
-            .containsEntry(Quota.Scope.Domain, QuotaCount.count(333))
-            .containsEntry(Quota.Scope.User, QuotaCount.count(123));
+            .containsEntry(Quota.Scope.Global, QuotaCountLimit.count(1234))
+            .containsEntry(Quota.Scope.Domain, QuotaCountLimit.count(333))
+            .containsEntry(Quota.Scope.User, QuotaCountLimit.count(123));
     }
 
     @Test
     void listMaxStorageDetailsShouldReturnGlobalValueWhenDefined() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(1111));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(1111));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
             .hasSize(1)
-            .containsEntry(Quota.Scope.Global, QuotaSize.size(1111));
+            .containsEntry(Quota.Scope.Global, QuotaSizeLimit.size(1111));
     }
 
     @Test
     void listMaxStorageDetailsShouldReturnDomainValueWhenDefined() throws Exception {
-        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(1111));
+        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSizeLimit.size(1111));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
             .hasSize(1)
-            .containsEntry(Quota.Scope.Domain, QuotaSize.size(1111));
+            .containsEntry(Quota.Scope.Domain, QuotaSizeLimit.size(1111));
     }
 
     @Test
     void listMaxStorageDetailsShouldReturnUserValueWhenDefined() throws Exception {
-        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(2222));
+        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSizeLimit.size(2222));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
             .hasSize(1)
-            .containsEntry(Quota.Scope.User, QuotaSize.size(2222));
+            .containsEntry(Quota.Scope.User, QuotaSizeLimit.size(2222));
     }
 
     @Test
     void listMaxStorageDetailsShouldReturnBothValuesWhenDefined() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(3333));
-        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(4444));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(3333));
+        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSizeLimit.size(4444));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
             .hasSize(2)
-            .containsEntry(Quota.Scope.Global, QuotaSize.size(3333))
-            .containsEntry(Quota.Scope.User, QuotaSize.size(4444));
+            .containsEntry(Quota.Scope.Global, QuotaSizeLimit.size(3333))
+            .containsEntry(Quota.Scope.User, QuotaSizeLimit.size(4444));
     }
 
     @Test
     void listMaxStorageDetailsShouldReturnAllValuesWhenDefined() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(3333));
-        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(2222));
-        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSize.size(4444));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(3333));
+        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSizeLimit.size(2222));
+        maxQuotaManager.setMaxStorage(QUOTA_ROOT, QuotaSizeLimit.size(4444));
         assertThat(maxQuotaManager.listMaxStorageDetails(QUOTA_ROOT))
             .hasSize(3)
-            .containsEntry(Quota.Scope.Global, QuotaSize.size(3333))
-            .containsEntry(Quota.Scope.Domain, QuotaSize.size(2222))
-            .containsEntry(Quota.Scope.User, QuotaSize.size(4444));
+            .containsEntry(Quota.Scope.Global, QuotaSizeLimit.size(3333))
+            .containsEntry(Quota.Scope.Domain, QuotaSizeLimit.size(2222))
+            .containsEntry(Quota.Scope.User, QuotaSizeLimit.size(4444));
     }
 
     @Test
@@ -236,33 +236,33 @@ public abstract class GenericMaxQuotaManagerTest {
 
     @Test
     void getDomainMaxMessageShouldReturnProvidedValue() throws Exception {
-        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(36));
-        assertThat(maxQuotaManager.getDomainMaxMessage(DOMAIN)).contains(QuotaCount.count(36));
+        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCountLimit.count(36));
+        assertThat(maxQuotaManager.getDomainMaxMessage(DOMAIN)).contains(QuotaCountLimit.count(36));
     }
 
     @Test
     void getDomainMaxStorageShouldReturnProvidedValue() throws Exception {
-        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(36));
-        assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN)).contains(QuotaSize.size(36));
+        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSizeLimit.size(36));
+        assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN)).contains(QuotaSizeLimit.size(36));
     }
 
     @Test
     void deleteDomainMaxStorageShouldRemoveCurrentValue() throws Exception {
-        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(36));
+        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSizeLimit.size(36));
         maxQuotaManager.removeDomainMaxStorage(DOMAIN);
         assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN)).isEmpty();
     }
 
     @Test
     void deleteDomainMaxMessageShouldRemoveCurrentValue() throws Exception {
-        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(36));
+        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCountLimit.count(36));
         maxQuotaManager.removeDomainMaxMessage(DOMAIN);
         assertThat(maxQuotaManager.getDomainMaxMessage(DOMAIN)).isEmpty();
     }
 
     @Test
     void deleteDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
-        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(36));
+        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCountLimit.count(36));
 
         maxQuotaManager.removeDomainMaxMessage(DOMAIN_CASE_VARIATION);
 
@@ -271,7 +271,7 @@ public abstract class GenericMaxQuotaManagerTest {
 
     @Test
     void deleteDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
-        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(36));
+        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSizeLimit.size(36));
 
         maxQuotaManager.removeDomainMaxStorage(DOMAIN_CASE_VARIATION);
 
@@ -280,36 +280,36 @@ public abstract class GenericMaxQuotaManagerTest {
 
     @Test
     void setDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
-        maxQuotaManager.setDomainMaxMessage(DOMAIN_CASE_VARIATION, QuotaCount.count(36));
+        maxQuotaManager.setDomainMaxMessage(DOMAIN_CASE_VARIATION, QuotaCountLimit.count(36));
 
 
         assertThat(maxQuotaManager.getDomainMaxMessage(DOMAIN))
-            .contains(QuotaCount.count(36));
+            .contains(QuotaCountLimit.count(36));
     }
 
     @Test
     void setDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
-        maxQuotaManager.setDomainMaxStorage(DOMAIN_CASE_VARIATION, QuotaSize.size(36));
+        maxQuotaManager.setDomainMaxStorage(DOMAIN_CASE_VARIATION, QuotaSizeLimit.size(36));
 
         assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN))
-            .contains(QuotaSize.size(36));
+            .contains(QuotaSizeLimit.size(36));
     }
 
     @Test
     void getDomainMaxMessageShouldNotBeCaseSensitive() throws Exception {
-        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCount.count(36));
+        maxQuotaManager.setDomainMaxMessage(DOMAIN, QuotaCountLimit.count(36));
 
 
         assertThat(maxQuotaManager.getDomainMaxMessage(DOMAIN_CASE_VARIATION))
-            .contains(QuotaCount.count(36));
+            .contains(QuotaCountLimit.count(36));
     }
 
     @Test
     void getDomainMaxStorageShouldNotBeCaseSensitive() throws Exception {
-        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSize.size(36));
+        maxQuotaManager.setDomainMaxStorage(DOMAIN, QuotaSizeLimit.size(36));
 
         assertThat(maxQuotaManager.getDomainMaxStorage(DOMAIN_CASE_VARIATION))
-            .contains(QuotaSize.size(36));
+            .contains(QuotaSizeLimit.size(36));
     }
 
 }
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 917165d..c7f8820 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
@@ -35,8 +35,8 @@ import java.util.Optional;
 import javax.mail.Flags;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+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.events.Event;
 import org.apache.james.mailbox.events.EventBus;
@@ -144,8 +144,8 @@ public class ListeningCurrentQuotaUpdaterTest {
     public void mailboxDeletionEventShouldDecreaseCurrentQuotaValues() throws Exception {
         MailboxListener.MailboxDeletion deletion = mock(MailboxListener.MailboxDeletion.class);
         when(deletion.getQuotaRoot()).thenReturn(QUOTA_ROOT);
-        when(deletion.getDeletedMessageCount()).thenReturn(QuotaCount.count(10));
-        when(deletion.getTotalDeletedSize()).thenReturn(QuotaSize.size(5));
+        when(deletion.getDeletedMessageCount()).thenReturn(QuotaCountUsage.count(10));
+        when(deletion.getTotalDeletedSize()).thenReturn(QuotaSizeUsage.size(5));
         when(deletion.getMailboxId()).thenReturn(MAILBOX_ID);
         when(deletion.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
@@ -159,8 +159,8 @@ public class ListeningCurrentQuotaUpdaterTest {
     public void mailboxDeletionEventShouldDoNothingWhenEmptyMailbox() throws Exception {
         MailboxListener.MailboxDeletion deletion = mock(MailboxListener.MailboxDeletion.class);
         when(deletion.getQuotaRoot()).thenReturn(QUOTA_ROOT);
-        when(deletion.getDeletedMessageCount()).thenReturn(QuotaCount.count(0));
-        when(deletion.getTotalDeletedSize()).thenReturn(QuotaSize.size(0));
+        when(deletion.getDeletedMessageCount()).thenReturn(QuotaCountUsage.count(0));
+        when(deletion.getTotalDeletedSize()).thenReturn(QuotaSizeUsage.size(0));
         when(deletion.getMailboxId()).thenReturn(MAILBOX_ID);
         when(deletion.getUsername()).thenReturn(USERNAME_BENWA);
         when(mockedQuotaRootResolver.getQuotaRoot(eq(MAILBOX_ID))).thenReturn(QUOTA_ROOT);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
index 81ca0d6..3d23b11 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
@@ -26,8 +26,10 @@ import static org.mockito.Mockito.when;
 import java.util.Optional;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.OverQuotaException;
 import org.apache.james.mailbox.model.Mailbox;
@@ -58,9 +60,9 @@ public class QuotaCheckerTest {
     public void quotaCheckerShouldNotThrowOnRegularQuotas() throws MailboxException {
         when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenReturn(QUOTA_ROOT);
         when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaCount>builder().used(QuotaCount.count(10)).computedLimit(QuotaCount.count(100)).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(10)).computedLimit(QuotaCountLimit.count(100)).build());
         when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(100)).computedLimit(QuotaSize.size(1000)).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(100)).computedLimit(QuotaSizeLimit.size(1000)).build());
         QuotaChecker quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
 
         quotaChecker.tryAddition(0, 0);
@@ -70,9 +72,9 @@ public class QuotaCheckerTest {
     public void quotaCheckerShouldNotThrowOnRegularModifiedQuotas() throws MailboxException {
         when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenReturn(QUOTA_ROOT);
         when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaCount>builder().used(QuotaCount.count(10)).computedLimit(QuotaCount.count(100)).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(10)).computedLimit(QuotaCountLimit.count(100)).build());
         when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(100)).computedLimit(QuotaSize.size(1000)).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(100)).computedLimit(QuotaSizeLimit.size(1000)).build());
         QuotaChecker quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
 
         quotaChecker.tryAddition(89, 899);
@@ -82,9 +84,9 @@ public class QuotaCheckerTest {
     public void quotaCheckerShouldNotThrowOnReachedMaximumQuotas() throws MailboxException {
         when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenReturn(QUOTA_ROOT);
         when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaCount>builder().used(QuotaCount.count(10)).computedLimit(QuotaCount.count(100)).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(10)).computedLimit(QuotaCountLimit.count(100)).build());
         when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(100)).computedLimit(QuotaSize.size(1000)).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(100)).computedLimit(QuotaSizeLimit.size(1000)).build());
         QuotaChecker quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
 
         quotaChecker.tryAddition(90, 900);
@@ -94,9 +96,9 @@ public class QuotaCheckerTest {
     public void quotaCheckerShouldThrowOnExceededMessages() throws MailboxException {
         when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenReturn(QUOTA_ROOT);
         when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaCount>builder().used(QuotaCount.count(10)).computedLimit(QuotaCount.count(100)).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(10)).computedLimit(QuotaCountLimit.count(100)).build());
         when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(100)).computedLimit(QuotaSize.size(1000)).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(100)).computedLimit(QuotaSizeLimit.size(1000)).build());
         QuotaChecker quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
 
         assertThatThrownBy(() -> quotaChecker.tryAddition(91, 899))
@@ -107,9 +109,9 @@ public class QuotaCheckerTest {
     public void quotaCheckerShouldThrowOnExceededStorage() throws MailboxException {
         when(mockedQuotaRootResolver.getQuotaRoot(MAILBOX_PATH)).thenReturn(QUOTA_ROOT);
         when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaCount>builder().used(QuotaCount.count(10)).computedLimit(QuotaCount.count(100)).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(10)).computedLimit(QuotaCountLimit.count(100)).build());
         when(mockedQuotaManager.getStorageQuota(QUOTA_ROOT)).thenReturn(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(100)).computedLimit(QuotaSize.size(1000)).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(100)).computedLimit(QuotaSizeLimit.size(1000)).build());
         QuotaChecker quotaChecker = new QuotaChecker(mockedQuotaManager, mockedQuotaRootResolver, MAILBOX);
 
         assertThatThrownBy(() -> quotaChecker.tryAddition(89, 901))
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
index b80322f..f6614ff 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
@@ -24,8 +24,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -44,15 +44,15 @@ public abstract class StoreCurrentQuotaManagerTest {
 
     @Test
     void getCurrentStorageShouldReturnZeroByDefault() throws Exception {
-        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSize.size(0));
+        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSizeUsage.size(0));
     }
 
     @Test
     void increaseShouldWork() throws Exception {
         testee.increase(QUOTA_ROOT, 10, 100);
 
-        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCount.count(10));
-        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSize.size(100));
+        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCountUsage.count(10));
+        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSizeUsage.size(100));
     }
 
     @Test
@@ -61,16 +61,16 @@ public abstract class StoreCurrentQuotaManagerTest {
 
         testee.decrease(QUOTA_ROOT, 10, 100);
 
-        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCount.count(10));
-        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSize.size(100));
+        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCountUsage.count(10));
+        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSizeUsage.size(100));
     }
 
     @Test
     void decreaseShouldNotFailWhenItLeadsToNegativeValues() throws Exception {
         testee.decrease(QUOTA_ROOT, 10, 100);
 
-        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCount.count(-10));
-        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSize.size(-100));
+        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT)).isEqualTo(QuotaCountUsage.count(-10));
+        assertThat(testee.getCurrentStorage(QUOTA_ROOT)).isEqualTo(QuotaSizeUsage.size(-100));
     }
 
     @Test
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
index 2fde29d..6e735df 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
@@ -27,8 +27,10 @@ import static org.mockito.Mockito.when;
 import java.util.Map;
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
@@ -54,39 +56,39 @@ public class StoreQuotaManagerTest {
     @SuppressWarnings("unchecked")
     @Test
     public void getMessageQuotaShouldWorkWithNumericValues() throws Exception {
-        when(mockedMaxQuotaManager.getMaxMessage(any(Map.class))).thenReturn(Optional.of(QuotaCount.count(360L)));
-        when(mockedCurrentQuotaManager.getCurrentMessageCount(quotaRoot)).thenReturn(QuotaCount.count(36L));
+        when(mockedMaxQuotaManager.getMaxMessage(any(Map.class))).thenReturn(Optional.of(QuotaCountLimit.count(360L)));
+        when(mockedCurrentQuotaManager.getCurrentMessageCount(quotaRoot)).thenReturn(QuotaCountUsage.count(36L));
         assertThat(testee.getMessageQuota(quotaRoot)).isEqualTo(
-            Quota.<QuotaCount>builder().used(QuotaCount.count(36)).computedLimit(QuotaCount.count(360)).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(36)).computedLimit(QuotaCountLimit.count(360)).build());
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void getStorageQuotaShouldWorkWithNumericValues() throws Exception {
-        when(mockedMaxQuotaManager.getMaxStorage(any(Map.class))).thenReturn(Optional.of(QuotaSize.size(360L)));
-        when(mockedCurrentQuotaManager.getCurrentStorage(quotaRoot)).thenReturn(QuotaSize.size(36L));
+        when(mockedMaxQuotaManager.getMaxStorage(any(Map.class))).thenReturn(Optional.of(QuotaSizeLimit.size(360L)));
+        when(mockedCurrentQuotaManager.getCurrentStorage(quotaRoot)).thenReturn(QuotaSizeUsage.size(36L));
         assertThat(testee.getStorageQuota(quotaRoot)).isEqualTo(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(36)).computedLimit(QuotaSize.size(360)).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(36)).computedLimit(QuotaSizeLimit.size(360)).build());
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void getStorageQuotaShouldCalculateCurrentQuotaWhenUnlimited() throws Exception {
-        when(mockedMaxQuotaManager.getMaxStorage(any(Map.class))).thenReturn(Optional.of(QuotaSize.unlimited()));
-        when(mockedCurrentQuotaManager.getCurrentStorage(quotaRoot)).thenReturn(QuotaSize.size(36L));
+        when(mockedMaxQuotaManager.getMaxStorage(any(Map.class))).thenReturn(Optional.of(QuotaSizeLimit.unlimited()));
+        when(mockedCurrentQuotaManager.getCurrentStorage(quotaRoot)).thenReturn(QuotaSizeUsage.size(36L));
 
         assertThat(testee.getStorageQuota(quotaRoot)).isEqualTo(
-            Quota.<QuotaSize>builder().used(QuotaSize.size(36)).computedLimit(QuotaSize.unlimited()).build());
+            Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(36)).computedLimit(QuotaSizeLimit.unlimited()).build());
     }
 
     @SuppressWarnings("unchecked")
     @Test
     public void getMessageQuotaShouldCalculateCurrentQuotaWhenUnlimited() throws Exception {
-        when(mockedMaxQuotaManager.getMaxMessage(any(Map.class))).thenReturn(Optional.of(QuotaCount.unlimited()));
-        when(mockedCurrentQuotaManager.getCurrentMessageCount(quotaRoot)).thenReturn(QuotaCount.count(36L));
+        when(mockedMaxQuotaManager.getMaxMessage(any(Map.class))).thenReturn(Optional.of(QuotaCountLimit.unlimited()));
+        when(mockedCurrentQuotaManager.getCurrentMessageCount(quotaRoot)).thenReturn(QuotaCountUsage.count(36L));
 
         assertThat(testee.getMessageQuota(quotaRoot)).isEqualTo(
-            Quota.<QuotaCount>builder().used(QuotaCount.count(36)).computedLimit(QuotaCount.unlimited()).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(36)).computedLimit(QuotaCountLimit.unlimited()).build());
     }
 
 }
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java b/mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java
index 2f6482f..44980e5 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/api/ImapHostSystem.java
@@ -19,8 +19,8 @@
 package org.apache.james.mpt.api;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
@@ -31,7 +31,7 @@ public interface ImapHostSystem extends HostSystem {
     
     void createMailbox(MailboxPath mailboxPath) throws Exception;
 
-    void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) throws Exception;
+    void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) throws Exception;
 
     void grantRights(MailboxPath mailboxPath, Username userName, MailboxACL.Rfc4314Rights rights) throws Exception;
 }
\ No newline at end of file
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java b/mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java
index 0b4e6fe..dbc1b13 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/host/ExternalHostSystem.java
@@ -21,8 +21,8 @@ package org.apache.james.mpt.host;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapFeatures;
@@ -118,7 +118,7 @@ public class ExternalHostSystem extends ExternalSessionFactory implements ImapHo
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) throws Exception {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) throws Exception {
         throw new NotImplementedException("Not implemented");
     }
 
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index bee7d68..a4b2155 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -19,8 +19,8 @@
 package org.apache.james.mpt.imapmailbox.cassandra.host;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
 import org.apache.james.imap.processor.main.DefaultImapProcessorFactory;
@@ -136,7 +136,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) {
         perUserMaxQuotaManager.setGlobalMaxMessage(maxMessageQuota);
         perUserMaxQuotaManager.setGlobalMaxStorage(maxStorageQuota);
     }
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/QuotaTest.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/QuotaTest.java
index 87603fe..c827b48 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/QuotaTest.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/QuotaTest.java
@@ -21,8 +21,8 @@ package org.apache.james.mpt.imapmailbox.suite;
 
 import java.util.Locale;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mpt.api.ImapFeatures;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.imapmailbox.ImapTestConstants;
@@ -34,8 +34,8 @@ import org.junit.Test;
 
 public abstract class QuotaTest implements ImapTestConstants {
 
-    private static final QuotaCount MAX_MESSAGE_QUOTA = QuotaCount.count(4096);
-    private static final QuotaSize MAX_STORAGE_QUOTA = QuotaSize.size(5 * 1024L * 1024L * 1024L);
+    private static final QuotaCountLimit MAX_MESSAGE_QUOTA = QuotaCountLimit.count(4096);
+    private static final QuotaSizeLimit MAX_STORAGE_QUOTA = QuotaSizeLimit.size(5 * 1024L * 1024L * 1024L);
 
     protected abstract ImapHostSystem createImapHostSystem();
     
diff --git a/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java b/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java
index c644e30..5572dcb 100644
--- a/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java
+++ b/mpt/impl/imap-mailbox/cyrus/src/test/java/org/apache/james/mpt/imapmailbox/cyrus/host/CyrusHostSystem.java
@@ -23,8 +23,8 @@ import java.util.function.Supplier;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapFeatures;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
@@ -135,7 +135,7 @@ public class CyrusHostSystem extends ExternalHostSystem implements Provider<Cont
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) throws Exception {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) throws Exception {
         throw new NotImplementedException("not implemented");
     }
 }
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index b84bc80..38e1d5c 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -27,8 +27,8 @@ import org.apache.james.backends.es.DockerElasticSearch;
 import org.apache.james.backends.es.DockerElasticSearchSingleton;
 import org.apache.james.backends.es.ElasticSearchConfiguration;
 import org.apache.james.backends.es.ElasticSearchIndexer;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
@@ -133,7 +133,7 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) {
         throw new NotImplementedException("not implemented");
     }
 
diff --git a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
index 10c6bf9..db8a5d7 100644
--- a/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
+++ b/mpt/impl/imap-mailbox/external-james/src/test/java/org/apache/james/mpt/imapmailbox/external/james/host/external/ExternalJamesImapHostSystem.java
@@ -23,8 +23,8 @@ import java.util.function.Supplier;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapFeatures;
 import org.apache.james.mpt.api.ImapFeatures.Feature;
@@ -74,7 +74,7 @@ public class ExternalJamesImapHostSystem extends ExternalHostSystem {
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) throws Exception {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) throws Exception {
         throw new NotImplementedException("Not implemented");
     }
     
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
index 3dcd5b6..d327eae 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
@@ -20,8 +20,8 @@
 
 package org.apache.james.mpt.imapmailbox.inmemory.host;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
@@ -83,7 +83,7 @@ public class InMemoryHostSystem extends JamesImapHostSystem {
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) {
         perUserMaxQuotaManager.setGlobalMaxMessage(maxMessageQuota);
         perUserMaxQuotaManager.setGlobalMaxStorage(maxStorageQuota);
     }
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index 80541b4..9c57525 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -22,8 +22,8 @@ package org.apache.james.mpt.imapmailbox.jpa.host;
 import javax.persistence.EntityManagerFactory;
 
 import org.apache.james.backends.jpa.JpaTestCluster;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
@@ -156,7 +156,7 @@ public class JPAHostSystem extends JamesImapHostSystem {
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) {
         maxQuotaManager.setGlobalMaxMessage(maxMessageQuota);
         maxQuotaManager.setGlobalMaxStorage(maxStorageQuota);
     }
diff --git a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
index 62df73f..a197599 100644
--- a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
@@ -20,8 +20,8 @@
 package org.apache.james.mpt.imapmailbox.lucenesearch.host;
 
 import org.apache.commons.lang3.NotImplementedException;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
@@ -102,7 +102,7 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem {
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) {
         throw new NotImplementedException("not implemented");
     }
 
diff --git a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
index d97a8f6..7ac5da9 100644
--- a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
+++ b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
@@ -22,8 +22,8 @@ import java.io.File;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.NotImplementedException;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
@@ -132,7 +132,7 @@ public class MaildirHostSystem extends JamesImapHostSystem {
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) {
         throw new NotImplementedException("not implemented");
     }
 
diff --git a/mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java b/mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java
index 25c3635..3c72917 100644
--- a/mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java
+++ b/mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java
@@ -25,8 +25,8 @@ import java.util.concurrent.TimeUnit;
 import org.apache.james.backends.rabbitmq.DockerRabbitMQ;
 import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.event.json.EventSerializer;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
@@ -131,7 +131,7 @@ public class RabbitMQEventBusHostSystem extends JamesImapHostSystem {
     }
 
     @Override
-    public void setQuotaLimits(QuotaCount maxMessageQuota, QuotaSize maxStorageQuota) {
+    public void setQuotaLimits(QuotaCountLimit maxMessageQuota, QuotaSizeLimit maxStorageQuota) {
         resources.getMaxQuotaManager().setGlobalMaxMessage(maxMessageQuota);
         resources.getMaxQuotaManager().setGlobalMaxStorage(maxStorageQuota);
     }
diff --git a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
index 202fa0c..b8f747a 100644
--- a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
+++ b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/JamesManageSieveHostSystem.java
@@ -20,7 +20,7 @@
 package org.apache.james.mpt.host;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.managesieve.core.CoreProcessor;
 import org.apache.james.managesieve.jsieve.Parser;
 import org.apache.james.managesieve.transcode.ArgumentParser;
@@ -60,7 +60,7 @@ public abstract class JamesManageSieveHostSystem implements ManageSieveHostSyste
 
     @Override
     public void setMaxQuota(String user, long value) throws Exception {
-        sieveRepository.setQuota(Username.of(user), QuotaSize.size(value));
+        sieveRepository.setQuota(Username.of(user), QuotaSizeLimit.size(value));
     }
 
     @Override
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
index 9cdaa2f..a803ec7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
@@ -44,7 +44,7 @@ public class QuotaResponseEncoder extends AbstractChainedImapEncoder {
         QuotaResponse quotaResponse = (QuotaResponse) acceptableMessage;
 
         String quotaRoot = quotaResponse.getQuotaRoot();
-        Quota<?> quota = quotaResponse.getQuota();
+        Quota<?, ?> quota = quotaResponse.getQuota();
 
         composer.untagged();
         composer.commandName(ImapConstants.QUOTA_RESPONSE_NAME);
@@ -66,12 +66,12 @@ public class QuotaResponseEncoder extends AbstractChainedImapEncoder {
         composer.end();
     }
 
-    private void writeMessagesSize(ImapResponseComposer composer, Quota<?> quota) throws IOException {
+    private void writeMessagesSize(ImapResponseComposer composer, Quota<?, ?> quota) throws IOException {
         composer.message(quota.getUsed().asLong() / 1024);
         composer.message(quota.getLimit().asLong() / 1024);
     }
 
-    private void writeMessagesCount(ImapResponseComposer composer, Quota<?> quota) throws IOException {
+    private void writeMessagesCount(ImapResponseComposer composer, Quota<?, ?> quota) throws IOException {
         composer.message(quota.getUsed().asLong());
         composer.message(quota.getLimit().asLong());
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/QuotaResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/QuotaResponse.java
index 07b3c7a..1cace6b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/QuotaResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/QuotaResponse.java
@@ -31,15 +31,15 @@ import com.google.common.base.Objects;
 public class QuotaResponse implements ImapResponseMessage {
     private final String resourceName;
     private final String quotaRoot;
-    private final Quota<?> quota;
+    private final Quota<?, ?> quota;
 
-    public QuotaResponse(String resource, String quotaRoot, Quota<?> quota) {
+    public QuotaResponse(String resource, String quotaRoot, Quota<?, ?> quota) {
         this.quota = quota;
         this.resourceName = resource;
         this.quotaRoot = quotaRoot;
     }
 
-    public Quota<?> getQuota() {
+    public Quota<?, ?> getQuota() {
         return quota;
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
index 6dba743..3b86940 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
@@ -22,8 +22,10 @@ package org.apache.james.imap.processor;
 import java.io.Closeable;
 import java.util.List;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
@@ -73,8 +75,8 @@ public class GetQuotaProcessor extends AbstractMailboxProcessor<GetQuotaRequest>
         try {
             QuotaRoot quotaRoot = quotaRootResolver.fromString(request.getQuotaRoot());
             if (hasRight(quotaRoot, session)) {
-                Quota<QuotaCount> messageQuota = quotaManager.getMessageQuota(quotaRoot);
-                Quota<QuotaSize> storageQuota = quotaManager.getStorageQuota(quotaRoot);
+                Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = quotaManager.getMessageQuota(quotaRoot);
+                Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = quotaManager.getStorageQuota(quotaRoot);
                 if (messageQuota.getLimit().isLimited()) {
                     responder.respond(new QuotaResponse(ImapConstants.MESSAGE_QUOTA_RESOURCE, quotaRoot.getValue(), messageQuota));
                 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java
index 2674736..8d70dcc 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaRootProcessor.java
@@ -22,8 +22,10 @@ package org.apache.james.imap.processor;
 import java.io.Closeable;
 import java.util.List;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
@@ -80,8 +82,8 @@ public class GetQuotaRootProcessor extends AbstractMailboxProcessor<GetQuotaRoot
         try {
             if (mailboxManager.hasRight(mailboxPath, MailboxACL.Right.Read, mailboxSession)) {
                 QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(mailboxPath);
-                Quota<QuotaCount> messageQuota = quotaManager.getMessageQuota(quotaRoot);
-                Quota<QuotaSize> storageQuota = quotaManager.getStorageQuota(quotaRoot);
+                Quota<QuotaCountLimit, QuotaCountUsage> messageQuota = quotaManager.getMessageQuota(quotaRoot);
+                Quota<QuotaSizeLimit, QuotaSizeUsage> storageQuota = quotaManager.getStorageQuota(quotaRoot);
                 responder.respond(new QuotaRootResponse(request.getMailboxName(), quotaRoot.getValue()));
                 if (messageQuota.getLimit().isLimited()) {
                     responder.respond(new QuotaResponse(ImapConstants.MESSAGE_QUOTA_RESOURCE, quotaRoot.getValue(), messageQuota));
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
index d4ff764..a4518c5 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
@@ -21,8 +21,10 @@ package org.apache.james.imap.encode;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.EndImapEncoder;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
@@ -38,7 +40,7 @@ public class QuotaResponseEncoderTest {
     @Test
     public void quotaMessageResponseShouldBeWellFormatted() throws Exception {
         QuotaResponse response = new QuotaResponse("MESSAGE", "root",
-            Quota.<QuotaCount>builder().used(QuotaCount.count(231)).computedLimit(QuotaCount.count(1024)).build());
+            Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(231)).computedLimit(QuotaCountLimit.count(1024)).build());
         ByteImapResponseWriter byteImapResponseWriter = new ByteImapResponseWriter();
         ImapResponseComposer composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
         QuotaResponseEncoder encoder = new QuotaResponseEncoder(new EndImapEncoder());
@@ -50,7 +52,7 @@ public class QuotaResponseEncoderTest {
     @Test
     public void quotaStorageResponseShouldBeWellFormatted() throws Exception {
         QuotaResponse response = new QuotaResponse("STORAGE", "root",
-        Quota.<QuotaSize>builder().used(QuotaSize.size(231 * 1024)).computedLimit(QuotaSize.size(1024 * 1024)).build());
+        Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(231 * 1024)).computedLimit(QuotaSizeLimit.size(1024 * 1024)).build());
         ByteImapResponseWriter byteImapResponseWriter = new ByteImapResponseWriter();
         ImapResponseComposer composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
         QuotaResponseEncoder encoder = new QuotaResponseEncoder(new EndImapEncoder());
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/message/response/QuotaResponseTest.java b/protocols/imap/src/test/java/org/apache/james/imap/message/response/QuotaResponseTest.java
index cd3ffda..e70ae80 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/message/response/QuotaResponseTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/message/response/QuotaResponseTest.java
@@ -19,7 +19,8 @@
 
 package org.apache.james.imap.message.response;
 
-import org.apache.james.core.quota.QuotaCount;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.mailbox.model.Quota;
 import org.junit.Test;
 
@@ -28,13 +29,13 @@ import nl.jqno.equalsverifier.EqualsVerifier;
 public class QuotaResponseTest {
     @Test
     public void shouldMatchBeanContract() {
-        Quota<QuotaCount> red = Quota.<QuotaCount>builder()
-            .computedLimit(QuotaCount.count(36))
-            .used(QuotaCount.count(22))
+        Quota<QuotaCountLimit, QuotaCountUsage> red = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .computedLimit(QuotaCountLimit.count(36))
+            .used(QuotaCountUsage.count(22))
             .build();
-        Quota<QuotaCount> black = Quota.<QuotaCount>builder()
-            .computedLimit(QuotaCount.count(32))
-            .used(QuotaCount.count(24))
+        Quota<QuotaCountLimit, QuotaCountUsage> black = Quota.<QuotaCountLimit, QuotaCountUsage>builder()
+            .computedLimit(QuotaCountLimit.count(32))
+            .used(QuotaCountUsage.count(24))
             .build();
 
         EqualsVerifier.forClass(QuotaResponse.class)
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
index 46ff00c..7f18494 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
@@ -31,8 +31,10 @@ import static org.mockito.Mockito.when;
 import java.util.Optional;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
@@ -65,10 +67,10 @@ public class GetQuotaProcessorTest {
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("plop", Optional.empty());
     private static final Username PLOP = Username.of("plop");
     private static final MailboxPath MAILBOX_PATH = new MailboxPath("namespace", PLOP, "INBOX");
-    private static final Quota<QuotaCount> MESSAGE_QUOTA =
-        Quota.<QuotaCount>builder().used(QuotaCount.count(24)).computedLimit(QuotaCount.count(1589)).build();
-    private static final Quota<QuotaSize> STORAGE_QUOTA =
-        Quota.<QuotaSize>builder().used(QuotaSize.size(240)).computedLimit(QuotaSize.size(15890)).build();
+    private static final Quota<QuotaCountLimit, QuotaCountUsage> MESSAGE_QUOTA =
+        Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(24)).computedLimit(QuotaCountLimit.count(1589)).build();
+    private static final Quota<QuotaSizeLimit, QuotaSizeUsage> STORAGE_QUOTA =
+        Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(240)).computedLimit(QuotaSizeLimit.size(15890)).build();
 
     private GetQuotaProcessor testee;
     private ImapSession mockedImapSession;
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
index 4ac151d..726799f 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
@@ -32,8 +32,10 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
@@ -65,10 +67,10 @@ public class GetQuotaRootProcessorTest {
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("plop", Optional.empty());
     private static final Username PLOP = Username.of("plop");
     private static final MailboxPath MAILBOX_PATH = MailboxPath.forUser(PLOP, "INBOX");
-    private static final Quota<QuotaCount> MESSAGE_QUOTA =
-        Quota.<QuotaCount>builder().used(QuotaCount.count(24)).computedLimit(QuotaCount.count(1589)).build();
-    private static final Quota<QuotaSize> STORAGE_QUOTA =
-        Quota.<QuotaSize>builder().used(QuotaSize.size(240)).computedLimit(QuotaSize.size(15890)).build();
+    private static final Quota<QuotaCountLimit, QuotaCountUsage> MESSAGE_QUOTA =
+        Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(24)).computedLimit(QuotaCountLimit.count(1589)).build();
+    private static final Quota<QuotaSizeLimit, QuotaSizeUsage> STORAGE_QUOTA =
+        Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(240)).computedLimit(QuotaSizeLimit.size(15890)).build();
 
     private GetQuotaRootProcessor testee;
     private ImapSession mockedImapSession;
diff --git a/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java b/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java
index e1e9864..ffceb09 100644
--- a/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java
+++ b/server/container/cli/src/main/java/org/apache/james/cli/ServerCmd.java
@@ -44,11 +44,13 @@ import org.apache.james.cli.probe.impl.JmxMailboxProbe;
 import org.apache.james.cli.probe.impl.JmxQuotaProbe;
 import org.apache.james.cli.probe.impl.JmxSieveProbe;
 import org.apache.james.cli.type.CmdType;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.SerializableQuota;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.mailbox.probe.QuotaProbe;
 import org.apache.james.probe.DataProbe;
@@ -339,21 +341,21 @@ public class ServerCmd {
         }
     }
 
-    private SerializableQuotaValue<QuotaSize> parseQuotaSize(String argument) throws Exception {
+    private SerializableQuotaLimitValue<QuotaSizeLimit> parseQuotaSize(String argument) throws Exception {
         long convertedValue = Size.parse(argument).asBytes();
-        return longToSerializableQuotaValue(convertedValue, QuotaSize.unlimited(), QuotaSize::size);
+        return longToSerializableQuotaValue(convertedValue, QuotaSizeLimit.unlimited(), QuotaSizeLimit::size);
     }
 
-    private SerializableQuotaValue<QuotaCount> parseQuotaCount(String argument) {
+    private SerializableQuotaLimitValue<QuotaCountLimit> parseQuotaCount(String argument) {
         long value = Long.parseLong(argument);
-        return longToSerializableQuotaValue(value, QuotaCount.unlimited(), QuotaCount::count);
+        return longToSerializableQuotaValue(value, QuotaCountLimit.unlimited(), QuotaCountLimit::count);
     }
 
-    private <T extends QuotaValue<T>> SerializableQuotaValue<T> longToSerializableQuotaValue(long value, T unlimited, Function<Long, T> factory) {
-        return SerializableQuotaValue.valueOf(Optional.of(longToQuotaValue(value, unlimited, factory)));
+    private <T extends QuotaLimitValue<T>> SerializableQuotaLimitValue<T> longToSerializableQuotaValue(long value, T unlimited, Function<Long, T> factory) {
+        return SerializableQuotaLimitValue.valueOf(Optional.of(longToQuotaValue(value, unlimited, factory)));
     }
 
-    private <T extends QuotaValue<T>> T longToQuotaValue(long value, T unlimited, Function<Long, T> factory) {
+    private <T extends QuotaLimitValue<T>> T longToQuotaValue(long value, T unlimited, Function<Long, T> factory) {
         if (value == -1) {
             return unlimited;
         }
@@ -385,14 +387,14 @@ public class ServerCmd {
                 footerBuilder.toString());
     }
 
-    private void printStorageQuota(String quotaRootString, SerializableQuota<QuotaSize> quota, PrintStream printStream) {
+    private void printStorageQuota(String quotaRootString, SerializableQuota<QuotaSizeLimit, QuotaSizeUsage> quota, PrintStream printStream) {
         printStream.println(String.format("Storage quota for %s is: %s / %s",
             quotaRootString,
             formatStorageValue(quota.getUsed()),
             formatStorageValue(quota.encodeAsLong())));
     }
 
-    private void printMessageQuota(String quotaRootString, SerializableQuota<QuotaCount> quota, PrintStream printStream) {
+    private void printMessageQuota(String quotaRootString, SerializableQuota<QuotaCountLimit, QuotaCountUsage> quota, PrintStream printStream) {
         printStream.println(String.format("MailboxMessage count quota for %s is: %s / %s",
             quotaRootString,
             formatMessageValue(quota.getUsed()),
@@ -409,9 +411,9 @@ public class ServerCmd {
         return SizeFormat.format(value);
     }
 
-    private String formatStorageValue(SerializableQuotaValue<QuotaSize> value) {
+    private String formatStorageValue(SerializableQuotaLimitValue<QuotaSizeLimit> value) {
         return value
-            .toValue(QuotaSize::size, QuotaSize.unlimited())
+            .toValue(QuotaSizeLimit::size, QuotaSizeLimit.unlimited())
             .map(size -> {
             if (size.isUnlimited()) {
                 return Size.UNLIMITED;
@@ -430,9 +432,9 @@ public class ServerCmd {
         return String.valueOf(value);
     }
 
-    private String formatMessageValue(SerializableQuotaValue<QuotaCount> value) {
+    private String formatMessageValue(SerializableQuotaLimitValue<QuotaCountLimit> value) {
         return value
-            .toValue(QuotaCount::count, QuotaCount.unlimited())
+            .toValue(QuotaCountLimit::count, QuotaCountLimit.unlimited())
             .map(count -> {
             if (count.isUnlimited()) {
                 return Size.UNLIMITED;
diff --git a/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxQuotaProbe.java b/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxQuotaProbe.java
index 53c11c5..6f73f3a 100644
--- a/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxQuotaProbe.java
+++ b/server/container/cli/src/main/java/org/apache/james/cli/probe/impl/JmxQuotaProbe.java
@@ -24,11 +24,13 @@ import java.io.IOException;
 import javax.management.MalformedObjectNameException;
 
 import org.apache.james.adapter.mailbox.QuotaManagementMBean;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.SerializableQuota;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.probe.QuotaProbe;
 
 public class JmxQuotaProbe implements QuotaProbe, JmxProbe {
@@ -52,52 +54,52 @@ public class JmxQuotaProbe implements QuotaProbe, JmxProbe {
     }
 
     @Override
-    public SerializableQuota<QuotaCount> getMessageCountQuota(String quotaRoot) throws MailboxException {
+    public SerializableQuota<QuotaCountLimit, QuotaCountUsage> getMessageCountQuota(String quotaRoot) throws MailboxException {
         return quotaManagement.getMessageCountQuota(quotaRoot);
     }
 
     @Override
-    public SerializableQuota<QuotaSize> getStorageQuota(String quotaRoot) throws MailboxException {
+    public SerializableQuota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(String quotaRoot) throws MailboxException {
         return quotaManagement.getStorageQuota(quotaRoot);
     }
 
     @Override
-    public SerializableQuotaValue<QuotaCount> getMaxMessageCount(String quotaRoot) throws MailboxException {
+    public SerializableQuotaLimitValue<QuotaCountLimit> getMaxMessageCount(String quotaRoot) throws MailboxException {
         return quotaManagement.getMaxMessageCount(quotaRoot);
     }
 
     @Override
-    public SerializableQuotaValue<QuotaSize> getMaxStorage(String quotaRoot) throws MailboxException {
+    public SerializableQuotaLimitValue<QuotaSizeLimit> getMaxStorage(String quotaRoot) throws MailboxException {
         return quotaManagement.getMaxStorage(quotaRoot);
     }
 
     @Override
-    public SerializableQuotaValue<QuotaCount> getGlobalMaxMessageCount() throws MailboxException {
+    public SerializableQuotaLimitValue<QuotaCountLimit> getGlobalMaxMessageCount() throws MailboxException {
         return quotaManagement.getGlobalMaxMessageCount();
     }
 
     @Override
-    public SerializableQuotaValue<QuotaSize> getGlobalMaxStorage() throws MailboxException {
+    public SerializableQuotaLimitValue<QuotaSizeLimit> getGlobalMaxStorage() throws MailboxException {
         return quotaManagement.getGlobalMaxStorage();
     }
 
     @Override
-    public void setMaxMessageCount(String quotaRoot, SerializableQuotaValue<QuotaCount> maxMessageCount) throws MailboxException {
+    public void setMaxMessageCount(String quotaRoot, SerializableQuotaLimitValue<QuotaCountLimit> maxMessageCount) throws MailboxException {
         quotaManagement.setMaxMessageCount(quotaRoot, maxMessageCount);
     }
 
     @Override
-    public void setMaxStorage(String quotaRoot, SerializableQuotaValue<QuotaSize> maxSize) throws MailboxException {
+    public void setMaxStorage(String quotaRoot, SerializableQuotaLimitValue<QuotaSizeLimit> maxSize) throws MailboxException {
         quotaManagement.setMaxStorage(quotaRoot, maxSize);
     }
 
     @Override
-    public void setGlobalMaxMessageCount(SerializableQuotaValue<QuotaCount> maxGlobalMessageCount) throws MailboxException {
+    public void setGlobalMaxMessageCount(SerializableQuotaLimitValue<QuotaCountLimit> maxGlobalMessageCount) throws MailboxException {
         quotaManagement.setGlobalMaxMessageCount(maxGlobalMessageCount);
     }
 
     @Override
-    public void setGlobalMaxStorage(SerializableQuotaValue<QuotaSize> maxGlobalSize) throws MailboxException {
+    public void setGlobalMaxStorage(SerializableQuotaLimitValue<QuotaSizeLimit> maxGlobalSize) throws MailboxException {
         quotaManagement.setGlobalMaxStorage(maxGlobalSize);
     }
 
diff --git a/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java b/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
index f3542f5..ce70e3b 100644
--- a/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
+++ b/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
@@ -34,11 +34,13 @@ import org.apache.james.cli.exceptions.InvalidArgumentNumberException;
 import org.apache.james.cli.exceptions.MissingCommandException;
 import org.apache.james.cli.exceptions.UnrecognizedCommandException;
 import org.apache.james.cli.type.CmdType;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.SerializableQuota;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.mailbox.probe.QuotaProbe;
 import org.apache.james.probe.DataProbe;
@@ -324,7 +326,7 @@ public class ServerCmdTest {
         String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.GETGLOBALMAXMESSAGECOUNTQUOTA.getCommand()};
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
-        when(quotaProbe.getGlobalMaxMessageCount()).thenReturn(new SerializableQuotaValue<>(QuotaCount.count(1024L * 1024L)));
+        when(quotaProbe.getGlobalMaxMessageCount()).thenReturn(new SerializableQuotaLimitValue<>(QuotaCountLimit.count(1024L * 1024L)));
 
         testee.executeCommandLine(commandLine);
     }
@@ -334,7 +336,7 @@ public class ServerCmdTest {
         String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.GETGLOBALMAXSTORAGEQUOTA.getCommand()};
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
-        when(quotaProbe.getGlobalMaxStorage()).thenReturn(new SerializableQuotaValue<>(QuotaSize.size(1024L * 1024L * 1024L)));
+        when(quotaProbe.getGlobalMaxStorage()).thenReturn(new SerializableQuotaLimitValue<>(QuotaSizeLimit.size(1024L * 1024L * 1024L)));
 
         testee.executeCommandLine(commandLine);
     }
@@ -346,7 +348,7 @@ public class ServerCmdTest {
 
         testee.executeCommandLine(commandLine);
 
-        verify(quotaProbe).setGlobalMaxMessageCount(new SerializableQuotaValue<>(QuotaCount.count(1054)));
+        verify(quotaProbe).setGlobalMaxMessageCount(new SerializableQuotaLimitValue<>(QuotaCountLimit.count(1054)));
     }
 
     @Test
@@ -356,7 +358,7 @@ public class ServerCmdTest {
 
         testee.executeCommandLine(commandLine);
 
-        verify(quotaProbe).setGlobalMaxMessageCount(new SerializableQuotaValue<>(QuotaCount.unlimited()));
+        verify(quotaProbe).setGlobalMaxMessageCount(new SerializableQuotaLimitValue<>(QuotaCountLimit.unlimited()));
     }
 
     @Test
@@ -375,7 +377,7 @@ public class ServerCmdTest {
 
         testee.executeCommandLine(commandLine);
 
-        verify(quotaProbe).setGlobalMaxStorage(new SerializableQuotaValue<>(QuotaSize.size(1024 * 1024 * 1024)));
+        verify(quotaProbe).setGlobalMaxStorage(new SerializableQuotaLimitValue<>(QuotaSizeLimit.size(1024 * 1024 * 1024)));
     }
 
     @Test
@@ -385,7 +387,7 @@ public class ServerCmdTest {
 
         testee.executeCommandLine(commandLine);
 
-        verify(quotaProbe).setGlobalMaxStorage(new SerializableQuotaValue<>(QuotaSize.unlimited()));
+        verify(quotaProbe).setGlobalMaxStorage(new SerializableQuotaLimitValue<>(QuotaSizeLimit.unlimited()));
     }
 
     @Test
@@ -405,7 +407,7 @@ public class ServerCmdTest {
 
         testee.executeCommandLine(commandLine);
 
-        verify(quotaProbe).setMaxMessageCount(quotaroot, new SerializableQuotaValue<>(QuotaCount.count(1000)));
+        verify(quotaProbe).setMaxMessageCount(quotaroot, new SerializableQuotaLimitValue<>(QuotaCountLimit.count(1000)));
     }
 
     @Test
@@ -416,7 +418,7 @@ public class ServerCmdTest {
 
         testee.executeCommandLine(commandLine);
 
-        verify(quotaProbe).setMaxMessageCount(quotaroot, new SerializableQuotaValue<>(QuotaCount.unlimited()));
+        verify(quotaProbe).setMaxMessageCount(quotaroot, new SerializableQuotaLimitValue<>(QuotaCountLimit.unlimited()));
     }
 
     @Test
@@ -437,7 +439,7 @@ public class ServerCmdTest {
 
         testee.executeCommandLine(commandLine);
 
-        verify(quotaProbe).setMaxStorage(quotaroot, new SerializableQuotaValue<>(QuotaSize.size(5 * 1024 * 1024)));
+        verify(quotaProbe).setMaxStorage(quotaroot, new SerializableQuotaLimitValue<>(QuotaSizeLimit.size(5 * 1024 * 1024)));
     }
 
     @Test
@@ -448,7 +450,7 @@ public class ServerCmdTest {
 
         testee.executeCommandLine(commandLine);
 
-        verify(quotaProbe).setMaxStorage(quotaroot, new SerializableQuotaValue<>(QuotaSize.unlimited()));
+        verify(quotaProbe).setMaxStorage(quotaroot, new SerializableQuotaLimitValue<>(QuotaSizeLimit.unlimited()));
     }
 
     @Test
@@ -467,7 +469,7 @@ public class ServerCmdTest {
         String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.GETMAXMESSAGECOUNTQUOTA.getCommand(), quotaroot};
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
-        when(quotaProbe.getMaxMessageCount(quotaroot)).thenReturn(new SerializableQuotaValue<>(QuotaCount.unlimited()));
+        when(quotaProbe.getMaxMessageCount(quotaroot)).thenReturn(new SerializableQuotaLimitValue<>(QuotaCountLimit.unlimited()));
 
         testee.executeCommandLine(commandLine);
     }
@@ -478,7 +480,7 @@ public class ServerCmdTest {
         String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.GETMAXSTORAGEQUOTA.getCommand(), quotaroot};
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
-        when(quotaProbe.getMaxStorage(quotaroot)).thenReturn(new SerializableQuotaValue<>(QuotaSize.unlimited()));
+        when(quotaProbe.getMaxStorage(quotaroot)).thenReturn(new SerializableQuotaLimitValue<>(QuotaSizeLimit.unlimited()));
 
         testee.executeCommandLine(commandLine);
     }
@@ -489,7 +491,7 @@ public class ServerCmdTest {
         String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.GETSTORAGEQUOTA.getCommand(), quotaroot};
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
-        when(quotaProbe.getStorageQuota(quotaroot)).thenReturn(SerializableQuota.newInstance(QuotaSize.unlimited(), QuotaSize.size(12)));
+        when(quotaProbe.getStorageQuota(quotaroot)).thenReturn(SerializableQuota.newInstance(QuotaSizeUsage.unlimited(), QuotaSizeLimit.size(12)));
 
         testee.executeCommandLine(commandLine);
     }
@@ -500,7 +502,7 @@ public class ServerCmdTest {
         String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.GETMESSAGECOUNTQUOTA.getCommand(), quotaroot};
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
-        when(quotaProbe.getMessageCountQuota(quotaroot)).thenReturn(SerializableQuota.newInstance(QuotaCount.unlimited(), QuotaCount.count(12)));
+        when(quotaProbe.getMessageCountQuota(quotaroot)).thenReturn(SerializableQuota.newInstance(QuotaCountUsage.unlimited(), QuotaCountLimit.count(12)));
 
         testee.executeCommandLine(commandLine);
     }
diff --git a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
index 7efb399..08edc58 100644
--- a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
+++ b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
@@ -21,8 +21,8 @@ package org.apache.james;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.james.core.quota.QuotaSize;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.modules.QuotaProbesImpl;
 import org.apache.james.modules.protocols.ImapGuiceProbe;
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
@@ -70,7 +70,7 @@ class JPAJamesServerTest implements JamesServerContract {
             .fluent()
             .addDomain(DOMAIN)
             .addUser(USER, PASSWORD);
-        jamesServer.getProbe(QuotaProbesImpl.class).setGlobalMaxStorage(new SerializableQuotaValue<>(QuotaSize.size(50 * 1024)));
+        jamesServer.getProbe(QuotaProbesImpl.class).setGlobalMaxStorage(new SerializableQuotaLimitValue<>(QuotaSizeLimit.size(50 * 1024)));
 
         // ~ 12 KB email
         int imapPort = jamesServer.getProbe(ImapGuiceProbe.class).getImapPort();
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
index 5b66e67..6b163e6 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
@@ -22,12 +22,14 @@ package org.apache.james.modules;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.SerializableQuota;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.probe.QuotaProbe;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
@@ -55,62 +57,62 @@ public class QuotaProbesImpl implements QuotaProbe, GuiceProbe {
     }
 
     @Override
-    public SerializableQuota<QuotaCount> getMessageCountQuota(String quotaRoot) throws MailboxException {
+    public SerializableQuota<QuotaCountLimit, QuotaCountUsage> getMessageCountQuota(String quotaRoot) throws MailboxException {
         return SerializableQuota.newInstance(quotaManager.getMessageQuota(quotaRootResolver.fromString(quotaRoot)));
     }
 
     @Override
-    public SerializableQuota<QuotaSize> getStorageQuota(String quotaRoot) throws MailboxException {
+    public SerializableQuota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(String quotaRoot) throws MailboxException {
         return SerializableQuota.newInstance(quotaManager.getStorageQuota(quotaRootResolver.fromString(quotaRoot)));
     }
 
     @Override
-    public SerializableQuotaValue<QuotaCount> getMaxMessageCount(String quotaRoot) throws MailboxException {
-        return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.fromString(quotaRoot)));
+    public SerializableQuotaLimitValue<QuotaCountLimit> getMaxMessageCount(String quotaRoot) throws MailboxException {
+        return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.fromString(quotaRoot)));
     }
 
     @Override
-    public SerializableQuotaValue<QuotaSize> getMaxStorage(String quotaRoot) throws MailboxException {
-        return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.fromString(quotaRoot)));
+    public SerializableQuotaLimitValue<QuotaSizeLimit> getMaxStorage(String quotaRoot) throws MailboxException {
+        return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.fromString(quotaRoot)));
     }
 
     @Override
-    public SerializableQuotaValue<QuotaCount> getGlobalMaxMessageCount() throws MailboxException {
-        return SerializableQuotaValue.valueOf(maxQuotaManager.getGlobalMaxMessage());
+    public SerializableQuotaLimitValue<QuotaCountLimit> getGlobalMaxMessageCount() throws MailboxException {
+        return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getGlobalMaxMessage());
     }
 
     @Override
-    public SerializableQuotaValue<QuotaSize> getGlobalMaxStorage() throws MailboxException {
-        return SerializableQuotaValue.valueOf(maxQuotaManager.getGlobalMaxStorage());
+    public SerializableQuotaLimitValue<QuotaSizeLimit> getGlobalMaxStorage() throws MailboxException {
+        return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getGlobalMaxStorage());
     }
 
     @Override
-    public void setMaxMessageCount(String quotaRoot, SerializableQuotaValue<QuotaCount> maxMessageCount) throws MailboxException {
-        maxMessageCount.toValue(QuotaCount::count, QuotaCount.unlimited())
+    public void setMaxMessageCount(String quotaRoot, SerializableQuotaLimitValue<QuotaCountLimit> maxMessageCount) throws MailboxException {
+        maxMessageCount.toValue(QuotaCountLimit::count, QuotaCountLimit.unlimited())
             .ifPresent(
                 Throwing.consumer(
-                    (QuotaCount value) -> maxQuotaManager.setMaxMessage(quotaRootResolver.fromString(quotaRoot), value))
+                    (QuotaCountLimit value) -> maxQuotaManager.setMaxMessage(quotaRootResolver.fromString(quotaRoot), value))
                     .sneakyThrow());
     }
 
     @Override
-    public void setMaxStorage(String quotaRoot, SerializableQuotaValue<QuotaSize> maxSize) throws MailboxException {
-        maxSize.toValue(QuotaSize::size, QuotaSize.unlimited())
+    public void setMaxStorage(String quotaRoot, SerializableQuotaLimitValue<QuotaSizeLimit> maxSize) throws MailboxException {
+        maxSize.toValue(QuotaSizeLimit::size, QuotaSizeLimit.unlimited())
             .ifPresent(
                 Throwing.consumer(
-                    (QuotaSize value) -> maxQuotaManager.setMaxStorage(quotaRootResolver.fromString(quotaRoot), value))
+                    (QuotaSizeLimit value) -> maxQuotaManager.setMaxStorage(quotaRootResolver.fromString(quotaRoot), value))
                     .sneakyThrow());
     }
 
     @Override
-    public void setGlobalMaxMessageCount(SerializableQuotaValue<QuotaCount> maxGlobalMessageCount) throws MailboxException {
-        maxGlobalMessageCount.toValue(QuotaCount::count, QuotaCount.unlimited())
+    public void setGlobalMaxMessageCount(SerializableQuotaLimitValue<QuotaCountLimit> maxGlobalMessageCount) throws MailboxException {
+        maxGlobalMessageCount.toValue(QuotaCountLimit::count, QuotaCountLimit.unlimited())
             .ifPresent(Throwing.consumer(maxQuotaManager::setGlobalMaxMessage).sneakyThrow());
     }
 
     @Override
-    public void setGlobalMaxStorage(SerializableQuotaValue<QuotaSize> maxGlobalSize) throws MailboxException {
-        maxGlobalSize.toValue(QuotaSize::size, QuotaSize.unlimited())
+    public void setGlobalMaxStorage(SerializableQuotaLimitValue<QuotaSizeLimit> maxGlobalSize) throws MailboxException {
+        maxGlobalSize.toValue(QuotaSizeLimit::size, QuotaSizeLimit.unlimited())
             .ifPresent(Throwing.consumer(maxQuotaManager::setGlobalMaxStorage).sneakyThrow());
     }
 }
diff --git a/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java b/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
index a1929ef..9a46442 100644
--- a/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
+++ b/server/container/guice/protocols/managedsieve/src/main/java/org/apache/james/modules/protocols/SieveProbeImpl.java
@@ -25,7 +25,7 @@ import javax.inject.Inject;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.probe.SieveProbe;
 import org.apache.james.sieverepository.api.ScriptContent;
 import org.apache.james.sieverepository.api.ScriptName;
@@ -49,7 +49,7 @@ public class SieveProbeImpl implements GuiceProbe, SieveProbe {
 
     @Override
     public void setSieveQuota(long quota) throws Exception {
-        sieveRepository.setDefaultQuota(QuotaSize.size(quota));
+        sieveRepository.setDefaultQuota(QuotaSizeLimit.size(quota));
     }
 
     @Override
@@ -64,7 +64,7 @@ public class SieveProbeImpl implements GuiceProbe, SieveProbe {
 
     @Override
     public void setSieveQuota(String user, long quota) throws Exception {
-        sieveRepository.setQuota(Username.of(user), QuotaSize.size(quota));
+        sieveRepository.setQuota(Username.of(user), QuotaSizeLimit.size(quota));
     }
 
     @Override
diff --git a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
index c0ff902..564b45b 100644
--- a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
+++ b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
@@ -25,12 +25,14 @@ import java.io.IOException;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.SerializableQuota;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
@@ -65,67 +67,67 @@ public class QuotaManagement implements QuotaManagementMBean {
     }
 
     @Override
-    public SerializableQuotaValue<QuotaCount> getMaxMessageCount(String quotaRoot) throws MailboxException {
+    public SerializableQuotaLimitValue<QuotaCountLimit> getMaxMessageCount(String quotaRoot) throws MailboxException {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getMaxMessageCount")
                      .build()) {
-            return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.fromString(quotaRoot)));
+            return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.fromString(quotaRoot)));
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 
     @Override
-    public SerializableQuotaValue<QuotaSize> getMaxStorage(String quotaRoot) throws MailboxException {
+    public SerializableQuotaLimitValue<QuotaSizeLimit> getMaxStorage(String quotaRoot) throws MailboxException {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getMaxStorage")
                      .build()) {
-            return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.fromString(quotaRoot)));
+            return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.fromString(quotaRoot)));
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 
     @Override
-    public SerializableQuotaValue<QuotaCount> getGlobalMaxMessageCount() throws MailboxException {
+    public SerializableQuotaLimitValue<QuotaCountLimit> getGlobalMaxMessageCount() throws MailboxException {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getGlobalMaxMessageCount")
                      .build()) {
-            return SerializableQuotaValue.valueOf(maxQuotaManager.getGlobalMaxMessage());
+            return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getGlobalMaxMessage());
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 
     @Override
-    public SerializableQuotaValue<QuotaSize> getGlobalMaxStorage() throws MailboxException {
+    public SerializableQuotaLimitValue<QuotaSizeLimit> getGlobalMaxStorage() throws MailboxException {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getGlobalMaxStorage")
                      .build()) {
-            return SerializableQuotaValue.valueOf(maxQuotaManager.getGlobalMaxStorage());
+            return SerializableQuotaLimitValue.valueOf(maxQuotaManager.getGlobalMaxStorage());
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
 
     @Override
-    public void setMaxMessageCount(String quotaRoot, SerializableQuotaValue<QuotaCount> maxMessageCount) {
+    public void setMaxMessageCount(String quotaRoot, SerializableQuotaLimitValue<QuotaCountLimit> maxMessageCount) {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "setMaxMessageCount")
                      .build()) {
-            maxMessageCount.toValue(QuotaCount::count, QuotaCount.unlimited())
+            maxMessageCount.toValue(QuotaCountLimit::count, QuotaCountLimit.unlimited())
                 .ifPresent(
-                    Throwing.consumer((QuotaCount value) ->
+                    Throwing.consumer((QuotaCountLimit value) ->
                         maxQuotaManager.setMaxMessage(quotaRootResolver.fromString(quotaRoot), value))
                         .sneakyThrow());
         } catch (IOException e) {
@@ -134,15 +136,15 @@ public class QuotaManagement implements QuotaManagementMBean {
     }
 
     @Override
-    public void setMaxStorage(String quotaRoot, SerializableQuotaValue<QuotaSize> maxSize) {
+    public void setMaxStorage(String quotaRoot, SerializableQuotaLimitValue<QuotaSizeLimit> maxSize) {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "setMaxStorage")
                      .build()) {
-            maxSize.toValue(QuotaSize::size, QuotaSize.unlimited())
+            maxSize.toValue(QuotaSizeLimit::size, QuotaSizeLimit.unlimited())
                 .ifPresent(
-                    Throwing.consumer((QuotaSize value) ->
+                    Throwing.consumer((QuotaSizeLimit value) ->
                         maxQuotaManager.setMaxStorage(quotaRootResolver.fromString(quotaRoot), value))
                         .sneakyThrow());
         } catch (IOException e) {
@@ -151,14 +153,14 @@ public class QuotaManagement implements QuotaManagementMBean {
     }
 
     @Override
-    public void setGlobalMaxMessageCount(SerializableQuotaValue<QuotaCount> maxGlobalMessageCount) {
+    public void setGlobalMaxMessageCount(SerializableQuotaLimitValue<QuotaCountLimit> maxGlobalMessageCount) {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "setGlobalMaxMessageCount")
                      .build()) {
             maxGlobalMessageCount
-                .toValue(QuotaCount::count, QuotaCount.unlimited())
+                .toValue(QuotaCountLimit::count, QuotaCountLimit.unlimited())
                 .ifPresent(Throwing.consumer(maxQuotaManager::setGlobalMaxMessage).sneakyThrow());
         } catch (IOException e) {
             throw new RuntimeException(e);
@@ -166,14 +168,14 @@ public class QuotaManagement implements QuotaManagementMBean {
     }
 
     @Override
-    public void setGlobalMaxStorage(SerializableQuotaValue<QuotaSize> maxGlobalSize) {
+    public void setGlobalMaxStorage(SerializableQuotaLimitValue<QuotaSizeLimit> maxGlobalSize) {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "setGlobalMaxStorage")
                      .build()) {
             maxGlobalSize
-                .toValue(QuotaSize::size, QuotaSize.unlimited())
+                .toValue(QuotaSizeLimit::size, QuotaSizeLimit.unlimited())
                 .ifPresent(Throwing.consumer(maxQuotaManager::setGlobalMaxStorage).sneakyThrow());
         } catch (IOException e) {
             throw new RuntimeException(e);
@@ -181,7 +183,7 @@ public class QuotaManagement implements QuotaManagementMBean {
     }
 
     @Override
-    public SerializableQuota<QuotaCount> getMessageCountQuota(String quotaRoot) throws MailboxException {
+    public SerializableQuota<QuotaCountLimit, QuotaCountUsage> getMessageCountQuota(String quotaRoot) throws MailboxException {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
@@ -194,7 +196,7 @@ public class QuotaManagement implements QuotaManagementMBean {
     }
 
     @Override
-    public SerializableQuota<QuotaSize> getStorageQuota(String quotaRoot) throws MailboxException {
+    public SerializableQuota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(String quotaRoot) throws MailboxException {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
diff --git a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagementMBean.java b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagementMBean.java
index 36ae9d1..2cc7914 100644
--- a/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagementMBean.java
+++ b/server/container/mailbox-jmx/src/main/java/org/apache/james/adapter/mailbox/QuotaManagementMBean.java
@@ -19,32 +19,34 @@
 
 package org.apache.james.adapter.mailbox;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.SerializableQuota;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 
 public interface QuotaManagementMBean {
     String getQuotaRoot(String namespace, String user, String name) throws MailboxException;
 
-    SerializableQuota<QuotaCount> getMessageCountQuota(String quotaRoot) throws MailboxException;
+    SerializableQuota<QuotaCountLimit, QuotaCountUsage> getMessageCountQuota(String quotaRoot) throws MailboxException;
 
-    SerializableQuota<QuotaSize> getStorageQuota(String quotaRoot) throws MailboxException;
+    SerializableQuota<QuotaSizeLimit, QuotaSizeUsage> getStorageQuota(String quotaRoot) throws MailboxException;
 
-    SerializableQuotaValue<QuotaCount> getMaxMessageCount(String quotaRoot) throws MailboxException;
+    SerializableQuotaLimitValue<QuotaCountLimit> getMaxMessageCount(String quotaRoot) throws MailboxException;
 
-    SerializableQuotaValue<QuotaSize> getMaxStorage(String quotaRoot) throws MailboxException;
+    SerializableQuotaLimitValue<QuotaSizeLimit> getMaxStorage(String quotaRoot) throws MailboxException;
 
-    SerializableQuotaValue<QuotaCount> getGlobalMaxMessageCount() throws MailboxException;
+    SerializableQuotaLimitValue<QuotaCountLimit> getGlobalMaxMessageCount() throws MailboxException;
 
-    SerializableQuotaValue<QuotaSize> getGlobalMaxStorage() throws MailboxException;
+    SerializableQuotaLimitValue<QuotaSizeLimit> getGlobalMaxStorage() throws MailboxException;
 
-    void setMaxMessageCount(String quotaRoot, SerializableQuotaValue<QuotaCount> maxMessageCount) throws MailboxException;
+    void setMaxMessageCount(String quotaRoot, SerializableQuotaLimitValue<QuotaCountLimit> maxMessageCount) throws MailboxException;
 
-    void setMaxStorage(String quotaRoot, SerializableQuotaValue<QuotaSize> maxSize) throws MailboxException;
+    void setMaxStorage(String quotaRoot, SerializableQuotaLimitValue<QuotaSizeLimit> maxSize) throws MailboxException;
 
-    void setGlobalMaxMessageCount(SerializableQuotaValue<QuotaCount> maxGlobalMessageCount) throws MailboxException;
+    void setGlobalMaxMessageCount(SerializableQuotaLimitValue<QuotaCountLimit> maxGlobalMessageCount) throws MailboxException;
 
-    void setGlobalMaxStorage(SerializableQuotaValue<QuotaSize> maxGlobalSize) throws MailboxException;
+    void setGlobalMaxStorage(SerializableQuotaLimitValue<QuotaSizeLimit> maxGlobalSize) throws MailboxException;
 }
diff --git a/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java b/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java
index ac548f6..ca3c1da 100644
--- a/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java
+++ b/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java
@@ -26,8 +26,8 @@ import java.util.Map;
 import org.apache.commons.configuration2.HierarchicalConfiguration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.lifecycle.api.Configurable;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -69,19 +69,19 @@ public class MaxQuotaConfigurationReader implements Configurable {
 
     private void configureGlobalValues(Long globalMaxMessage, Long globalMaxStorage) throws MailboxException {
         if (globalMaxMessage != null) {
-            maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(globalMaxMessage));
+            maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(globalMaxMessage));
         }
         if (globalMaxStorage != null) {
-            maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(globalMaxStorage));
+            maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(globalMaxStorage));
         }
     }
 
     private void configureQuotaRootSpecificValues(Map<String, Long> maxMessage, Map<String, Long> maxStorage) throws MailboxException {
         for (Map.Entry<String, Long> entry : maxMessage.entrySet()) {
-            maxQuotaManager.setMaxMessage(toQuotaRoot(entry.getKey()), QuotaCount.count(entry.getValue()));
+            maxQuotaManager.setMaxMessage(toQuotaRoot(entry.getKey()), QuotaCountLimit.count(entry.getValue()));
         }
         for (Map.Entry<String, Long> entry : maxStorage.entrySet()) {
-            maxQuotaManager.setMaxStorage(toQuotaRoot(entry.getKey()), QuotaSize.size(entry.getValue()));
+            maxQuotaManager.setMaxStorage(toQuotaRoot(entry.getKey()), QuotaSizeLimit.size(entry.getValue()));
         }
     }
 
diff --git a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java
index f712bcf..a2f316b 100644
--- a/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java
+++ b/server/data/data-api/src/main/java/org/apache/james/sieverepository/api/SieveQuotaRepository.java
@@ -21,7 +21,7 @@
 package org.apache.james.sieverepository.api;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 import org.apache.james.sieverepository.api.exception.StorageException;
 
@@ -32,17 +32,17 @@ public interface SieveQuotaRepository {
 
     boolean hasDefaultQuota() throws StorageException;
 
-    QuotaSize getDefaultQuota() throws QuotaNotFoundException, StorageException;
+    QuotaSizeLimit getDefaultQuota() throws QuotaNotFoundException, StorageException;
 
-    void setDefaultQuota(QuotaSize quota) throws StorageException;
+    void setDefaultQuota(QuotaSizeLimit quota) throws StorageException;
 
     void removeQuota() throws QuotaNotFoundException, StorageException;
 
     boolean hasQuota(Username username) throws StorageException;
 
-    QuotaSize getQuota(Username username) throws QuotaNotFoundException, StorageException;
+    QuotaSizeLimit getQuota(Username username) throws QuotaNotFoundException, StorageException;
 
-    void setQuota(Username username, QuotaSize quota) throws StorageException;
+    void setQuota(Username username, QuotaSizeLimit quota) throws StorageException;
 
     void removeQuota(Username username) throws QuotaNotFoundException, StorageException;
 }
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java
index d8b140e..54c3072 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAO.java
@@ -33,7 +33,7 @@ import javax.inject.Inject;
 
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieve.cassandra.tables.CassandraSieveClusterQuotaTable;
 import org.apache.james.sieve.cassandra.tables.CassandraSieveQuotaTable;
 import org.apache.james.sieve.cassandra.tables.CassandraSieveSpaceTable;
@@ -114,15 +114,15 @@ public class CassandraSieveQuotaDAO {
                 .setString(CassandraSieveSpaceTable.USER_NAME, username.asString()));
     }
 
-    public Mono<Optional<QuotaSize>> getQuota() {
+    public Mono<Optional<QuotaSizeLimit>> getQuota() {
         return cassandraAsyncExecutor.executeSingleRowOptional(
             selectClusterQuotaStatement.bind()
                 .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME))
             .map(optional -> optional.map(row ->
-                QuotaSize.size(row.getLong(CassandraSieveClusterQuotaTable.VALUE))));
+                QuotaSizeLimit.size(row.getLong(CassandraSieveClusterQuotaTable.VALUE))));
     }
 
-    public Mono<Void> setQuota(QuotaSize quota) {
+    public Mono<Void> setQuota(QuotaSizeLimit quota) {
         return cassandraAsyncExecutor.executeVoid(
             updateClusterQuotaStatement.bind()
                 .setLong(CassandraSieveClusterQuotaTable.VALUE, quota.asLong())
@@ -135,15 +135,15 @@ public class CassandraSieveQuotaDAO {
                 .setString(CassandraSieveClusterQuotaTable.NAME, CassandraSieveClusterQuotaTable.DEFAULT_NAME));
     }
 
-    public Mono<Optional<QuotaSize>> getQuota(Username username) {
+    public Mono<Optional<QuotaSizeLimit>> getQuota(Username username) {
         return cassandraAsyncExecutor.executeSingleRowOptional(
             selectUserQuotaStatement.bind()
                 .setString(CassandraSieveQuotaTable.USER_NAME, username.asString()))
             .map(optional -> optional.map(row ->
-                QuotaSize.size(row.getLong(CassandraSieveQuotaTable.QUOTA))));
+                QuotaSizeLimit.size(row.getLong(CassandraSieveQuotaTable.QUOTA))));
     }
 
-    public Mono<Void> setQuota(Username username, QuotaSize quota) {
+    public Mono<Void> setQuota(Username username, QuotaSizeLimit quota) {
         return cassandraAsyncExecutor.executeVoid(
             updateUserQuotaStatement.bind()
                 .setLong(CassandraSieveQuotaTable.QUOTA, quota.asLong())
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
index 7cbc029..cbb51b9 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/CassandraSieveRepository.java
@@ -30,7 +30,7 @@ import javax.inject.Inject;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieve.cassandra.model.ActiveScriptInfo;
 import org.apache.james.sieve.cassandra.model.Script;
 import org.apache.james.sieve.cassandra.model.SieveQuota;
@@ -80,15 +80,15 @@ public class CassandraSieveRepository implements SieveRepository {
     }
 
     private Mono<Void> throwOnOverQuota(Username username, Long sizeDifference) {
-        Mono<Optional<QuotaSize>> userQuotaMono = cassandraSieveQuotaDAO.getQuota(username);
-        Mono<Optional<QuotaSize>> globalQuotaMono = cassandraSieveQuotaDAO.getQuota();
+        Mono<Optional<QuotaSizeLimit>> userQuotaMono = cassandraSieveQuotaDAO.getQuota(username);
+        Mono<Optional<QuotaSizeLimit>> globalQuotaMono = cassandraSieveQuotaDAO.getQuota();
         Mono<Long> spaceUsedMono = cassandraSieveQuotaDAO.spaceUsedBy(username);
 
         return limitToUse(userQuotaMono, globalQuotaMono).zipWith(spaceUsedMono)
             .flatMap(pair -> checkOverQuotaUponModification(sizeDifference, pair.getT2(), pair.getT1()));
     }
 
-    private Mono<Void> checkOverQuotaUponModification(Long sizeDifference, Long spaceUsed, Optional<QuotaSize> limit) {
+    private Mono<Void> checkOverQuotaUponModification(Long sizeDifference, Long spaceUsed, Optional<QuotaSizeLimit> limit) {
         try {
             new SieveQuota(spaceUsed, limit)
                 .checkOverQuotaUponModification(sizeDifference);
@@ -105,7 +105,7 @@ public class CassandraSieveRepository implements SieveRepository {
             .map(sizeOfStoredScript -> scriptSize - sizeOfStoredScript);
     }
 
-    private Mono<Optional<QuotaSize>> limitToUse(Mono<Optional<QuotaSize>> userQuota, Mono<Optional<QuotaSize>> globalQuota) {
+    private Mono<Optional<QuotaSizeLimit>> limitToUse(Mono<Optional<QuotaSizeLimit>> userQuota, Mono<Optional<QuotaSizeLimit>> globalQuota) {
         return userQuota
             .filter(Optional::isPresent)
             .switchIfEmpty(globalQuota);
@@ -253,14 +253,14 @@ public class CassandraSieveRepository implements SieveRepository {
     }
 
     @Override
-    public QuotaSize getDefaultQuota() throws QuotaNotFoundException {
+    public QuotaSizeLimit getDefaultQuota() throws QuotaNotFoundException {
         return cassandraSieveQuotaDAO.getQuota()
             .block()
             .orElseThrow(QuotaNotFoundException::new);
     }
 
     @Override
-    public void setDefaultQuota(QuotaSize quota) {
+    public void setDefaultQuota(QuotaSizeLimit quota) {
         cassandraSieveQuotaDAO.setQuota(quota).block();
     }
 
@@ -279,14 +279,14 @@ public class CassandraSieveRepository implements SieveRepository {
     }
 
     @Override
-    public QuotaSize getQuota(Username username) throws QuotaNotFoundException {
+    public QuotaSizeLimit getQuota(Username username) throws QuotaNotFoundException {
         return cassandraSieveQuotaDAO.getQuota(username)
             .block()
             .orElseThrow(QuotaNotFoundException::new);
     }
 
     @Override
-    public void setQuota(Username username, QuotaSize quota) {
+    public void setQuota(Username username, QuotaSizeLimit quota) {
         cassandraSieveQuotaDAO.setQuota(username, quota).block();
     }
 
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java
index 25cdff6..0c5f2c7 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/sieve/cassandra/model/SieveQuota.java
@@ -22,7 +22,8 @@ package org.apache.james.sieve.cassandra.model;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.sieverepository.api.exception.QuotaExceededException;
 
 import com.google.common.base.Preconditions;
@@ -30,9 +31,9 @@ import com.google.common.base.Preconditions;
 public class SieveQuota {
 
     private final long currentUsage;
-    private final Optional<QuotaSize> limit;
+    private final Optional<QuotaSizeLimit> limit;
 
-    public SieveQuota(long currentUsage, Optional<QuotaSize> limit) {
+    public SieveQuota(long currentUsage, Optional<QuotaSizeLimit> limit) {
         Preconditions.checkArgument(currentUsage >= 0, "Current usage should be positive or equal to zero");
         limit.ifPresent(limitValue -> Preconditions.checkArgument(limitValue.asLong() >= 0, "Limit value should be positive or equal to zero"));
         this.currentUsage = currentUsage;
@@ -47,9 +48,9 @@ public class SieveQuota {
 
     public boolean isExceededUponModification(long sizeDifference) {
         return limit.map(limitContent ->
-            QuotaSize.size(currentUsage)
+            QuotaSizeUsage.size(currentUsage)
                 .add(sizeDifference)
-                .isGreaterThan(limitContent))
+                .exceedLimit(limitContent))
             .orElse(false);
     }
 }
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
index 895fa37..46d4469 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/CassandraSieveQuotaDAOTest.java
@@ -24,14 +24,14 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraSieveQuotaDAOTest {
     private static final Username USERNAME = Username.of("user");
-    private static final QuotaSize QUOTA_SIZE = QuotaSize.size(15L);
+    private static final QuotaSizeLimit QUOTA_SIZE = QuotaSizeLimit.size(15L);
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraSieveRepositoryModule.MODULE);
diff --git a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java
index 3ec44ce..213add4 100644
--- a/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java
+++ b/server/data/data-cassandra/src/test/java/org/apache/james/sieve/cassandra/model/SieveQuotaTest.java
@@ -21,17 +21,17 @@ package org.apache.james.sieve.cassandra.model;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieverepository.api.exception.QuotaExceededException;
 import org.junit.Test;
 
 public class SieveQuotaTest {
 
     public static final long INVALID_VALUE = -1L;
-    public static final QuotaSize LIMIT_LOW_VALUE = QuotaSize.size(10L);
+    public static final QuotaSizeLimit LIMIT_LOW_VALUE = QuotaSizeLimit.size(10L);
     public static final long SIZE_DIFFERENCE = 20L;
     public static final int CURRENT_USAGE = 0;
-    public static final QuotaSize LIMIT_HIGH_VALUE = QuotaSize.size(100L);
+    public static final QuotaSizeLimit LIMIT_HIGH_VALUE = QuotaSizeLimit.size(100L);
 
     @Test(expected = IllegalArgumentException.class)
     public void sieveQuotaShouldThrowOnNegativeCurrentValue() {
@@ -40,7 +40,7 @@ public class SieveQuotaTest {
 
     @Test(expected = IllegalArgumentException.class)
     public void sieveQuotaShouldThrowOnNegativeLimitValue() {
-        new SieveQuota(0, Optional.of(QuotaSize.size(INVALID_VALUE)));
+        new SieveQuota(0, Optional.of(QuotaSizeLimit.size(INVALID_VALUE)));
     }
 
     @Test(expected = QuotaExceededException.class)
diff --git a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
index 9089cd3..7c67504 100644
--- a/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
+++ b/server/data/data-file/src/main/java/org/apache/james/sieverepository/file/SieveFileRepository.java
@@ -42,7 +42,7 @@ import javax.inject.Inject;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.sieverepository.api.ScriptContent;
 import org.apache.james.sieverepository.api.ScriptName;
@@ -381,7 +381,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public QuotaSize getDefaultQuota() throws QuotaNotFoundException, StorageException {
+    public QuotaSizeLimit getDefaultQuota() throws QuotaNotFoundException, StorageException {
         Long quota = null;
         File file = getQuotaFile();
         if (file.exists()) {
@@ -394,7 +394,7 @@ public class SieveFileRepository implements SieveRepository {
         if (null == quota) {
             throw new QuotaNotFoundException("No default quota");
         }
-        return QuotaSize.size(quota);
+        return QuotaSizeLimit.size(quota);
     }
 
     @Override
@@ -411,7 +411,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public synchronized void setDefaultQuota(QuotaSize quota) throws StorageException {
+    public synchronized void setDefaultQuota(QuotaSizeLimit quota) throws StorageException {
         File file = getQuotaFile();
         String content = Long.toString(quota.asLong());
         toFile(file, content);
@@ -427,7 +427,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public QuotaSize getQuota(Username username) throws QuotaNotFoundException, StorageException {
+    public QuotaSizeLimit getQuota(Username username) throws QuotaNotFoundException, StorageException {
         Long quota = null;
         File file = getQuotaFile(username);
         if (file.exists()) {
@@ -440,7 +440,7 @@ public class SieveFileRepository implements SieveRepository {
         if (null == quota) {
             throw new QuotaNotFoundException("No quota for user: " + username.asString());
         }
-        return QuotaSize.size(quota);
+        return QuotaSizeLimit.size(quota);
     }
 
     @Override
@@ -459,7 +459,7 @@ public class SieveFileRepository implements SieveRepository {
     }
 
     @Override
-    public void setQuota(Username username, QuotaSize quota) throws StorageException {
+    public void setQuota(Username username, QuotaSizeLimit quota) throws StorageException {
         synchronized (lock) {
             File file = getQuotaFile(username);
             String content = Long.toString(quota.asLong());
diff --git a/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java b/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java
index c9bbb05..a293638 100644
--- a/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java
+++ b/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/JPASieveRepository.java
@@ -36,7 +36,8 @@ import javax.persistence.PersistenceException;
 import org.apache.commons.io.IOUtils;
 import org.apache.james.backends.jpa.TransactionRunner;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.sieve.jpa.model.JPASieveQuota;
 import org.apache.james.sieve.jpa.model.JPASieveScript;
 import org.apache.james.sieverepository.api.ScriptContent;
@@ -75,24 +76,24 @@ public class JPASieveRepository implements SieveRepository {
                 .mapToLong(JPASieveScript::getScriptSize)
                 .sum();
 
-        QuotaSize quota = limitToUser(username);
+        QuotaSizeLimit quota = limitToUser(username);
         if (overQuotaAfterModification(usedSpace, size, quota)) {
             throw new QuotaExceededException();
         }
     }
 
-    private QuotaSize limitToUser(Username username) throws StorageException {
+    private QuotaSizeLimit limitToUser(Username username) throws StorageException {
         return OptionalUtils.orSuppliers(
                 Throwing.supplier(() -> findQuotaForUser(username.asString())).sneakyThrow(),
                 Throwing.supplier(() -> findQuotaForUser(DEFAULT_SIEVE_QUOTA_USERNAME)).sneakyThrow())
                 .map(JPASieveQuota::toQuotaSize)
-                .orElse(QuotaSize.unlimited());
+                .orElse(QuotaSizeLimit.unlimited());
     }
 
-    private boolean overQuotaAfterModification(long usedSpace, long size, QuotaSize quota) {
-        return QuotaSize.size(usedSpace)
+    private boolean overQuotaAfterModification(long usedSpace, long size, QuotaSizeLimit quota) {
+        return QuotaSizeUsage.size(usedSpace)
                 .add(size)
-                .isGreaterThan(quota);
+                .exceedLimit(quota);
     }
 
     @Override
@@ -261,14 +262,14 @@ public class JPASieveRepository implements SieveRepository {
     }
 
     @Override
-    public QuotaSize getDefaultQuota() throws QuotaNotFoundException, StorageException {
+    public QuotaSizeLimit getDefaultQuota() throws QuotaNotFoundException, StorageException {
         JPASieveQuota jpaSieveQuota = findQuotaForUser(DEFAULT_SIEVE_QUOTA_USERNAME)
                 .orElseThrow(() -> new QuotaNotFoundException("Unable to find quota for default user"));
-        return QuotaSize.size(jpaSieveQuota.getSize());
+        return QuotaSizeLimit.size(jpaSieveQuota.getSize());
     }
 
     @Override
-    public void setDefaultQuota(QuotaSize quota) throws StorageException {
+    public void setDefaultQuota(QuotaSizeLimit quota) throws StorageException {
         setQuotaForUser(DEFAULT_SIEVE_QUOTA_USERNAME, quota);
     }
 
@@ -284,14 +285,14 @@ public class JPASieveRepository implements SieveRepository {
     }
 
     @Override
-    public QuotaSize getQuota(Username username) throws QuotaNotFoundException, StorageException {
+    public QuotaSizeLimit getQuota(Username username) throws QuotaNotFoundException, StorageException {
         JPASieveQuota jpaSieveQuota = findQuotaForUser(username.asString())
                 .orElseThrow(() -> new QuotaNotFoundException("Unable to find quota for user " + username.asString()));
-        return QuotaSize.size(jpaSieveQuota.getSize());
+        return QuotaSizeLimit.size(jpaSieveQuota.getSize());
     }
 
     @Override
-    public void setQuota(Username username, QuotaSize quota) throws StorageException {
+    public void setQuota(Username username, QuotaSizeLimit quota) throws StorageException {
         setQuotaForUser(username.asString(), quota);
     }
 
@@ -321,7 +322,7 @@ public class JPASieveRepository implements SieveRepository {
         }
     }
 
-    private void setQuotaForUser(String username, QuotaSize quota) throws StorageException {
+    private void setQuotaForUser(String username, QuotaSizeLimit quota) throws StorageException {
         transactionRunner.runAndHandleException(Throwing.consumer(entityManager -> {
             Optional<JPASieveQuota> sieveQuota = findQuotaForUser(username, entityManager);
             if (sieveQuota.isPresent()) {
diff --git a/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/model/JPASieveQuota.java b/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/model/JPASieveQuota.java
index 9c5e097..52485c1 100644
--- a/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/model/JPASieveQuota.java
+++ b/server/data/data-jpa/src/main/java/org/apache/james/sieve/jpa/model/JPASieveQuota.java
@@ -28,7 +28,7 @@ import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 
 import com.google.common.base.MoreObjects;
 
@@ -62,12 +62,12 @@ public class JPASieveQuota {
         return size;
     }
 
-    public void setSize(QuotaSize quotaSize) {
+    public void setSize(QuotaSizeLimit quotaSize) {
         this.size = quotaSize.asLong();
     }
 
-    public QuotaSize toQuotaSize() {
-        return QuotaSize.size(size);
+    public QuotaSizeLimit toQuotaSize() {
+        return QuotaSizeLimit.size(size);
     }
 
     @Override
diff --git a/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java b/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
index 6765dee..8ff2832 100644
--- a/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
+++ b/server/data/data-library/src/main/java/org/apache/james/sieverepository/lib/SieveRepositoryManagement.java
@@ -31,7 +31,7 @@ import javax.management.StandardMBean;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieverepository.api.ScriptContent;
 import org.apache.james.sieverepository.api.ScriptName;
 import org.apache.james.sieverepository.api.SieveRepository;
@@ -61,7 +61,7 @@ public class SieveRepositoryManagement extends StandardMBean implements SieveRep
 
     @Override
     public void setQuota(long quota) throws SieveRepositoryException {
-        sieveRepository.setDefaultQuota(QuotaSize.size(quota));
+        sieveRepository.setDefaultQuota(QuotaSizeLimit.size(quota));
     }
 
     @Override
@@ -76,7 +76,7 @@ public class SieveRepositoryManagement extends StandardMBean implements SieveRep
 
     @Override
     public void setQuota(String user, long quota) throws SieveRepositoryException {
-        sieveRepository.setQuota(Username.of(user), QuotaSize.size(quota));
+        sieveRepository.setQuota(Username.of(user), QuotaSizeLimit.size(quota));
     }
 
     @Override
diff --git a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
index 5e5f3fe..3f76b5a 100644
--- a/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/sieverepository/lib/AbstractSieveRepositoryTest.java
@@ -29,7 +29,7 @@ import java.time.ZonedDateTime;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieverepository.api.ScriptContent;
 import org.apache.james.sieverepository.api.ScriptName;
 import org.apache.james.sieverepository.api.ScriptSummary;
@@ -49,8 +49,8 @@ public abstract class AbstractSieveRepositoryTest {
 
     private static final ScriptName OTHER_SCRIPT_NAME = new ScriptName("other_script");
     private static final ScriptContent OTHER_SCRIPT_CONTENT = new ScriptContent("Other script content");
-    private static final QuotaSize DEFAULT_QUOTA = QuotaSize.size(Long.MAX_VALUE - 1L);
-    private static final QuotaSize USER_QUOTA = QuotaSize.size(Long.MAX_VALUE / 2);
+    private static final QuotaSizeLimit DEFAULT_QUOTA = QuotaSizeLimit.size(Long.MAX_VALUE - 1L);
+    private static final QuotaSizeLimit USER_QUOTA = QuotaSizeLimit.size(Long.MAX_VALUE / 2);
 
     protected SieveRepository sieveRepository;
 
@@ -162,15 +162,15 @@ public abstract class AbstractSieveRepositoryTest {
 
     @Test(expected = QuotaExceededException.class)
     public void putScriptShouldThrowWhenScriptTooBig() throws Exception {
-        sieveRepository.setDefaultQuota(QuotaSize.size(SCRIPT_CONTENT.length() - 1));
+        sieveRepository.setDefaultQuota(QuotaSizeLimit.size(SCRIPT_CONTENT.length() - 1));
         sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
     }
 
     @Test(expected = QuotaExceededException.class)
     public void putScriptShouldThrowWhenQuotaChangedInBetween() throws Exception {
-        sieveRepository.setDefaultQuota(QuotaSize.size(SCRIPT_CONTENT.length()));
+        sieveRepository.setDefaultQuota(QuotaSizeLimit.size(SCRIPT_CONTENT.length()));
         sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
-        sieveRepository.setDefaultQuota(QuotaSize.size(SCRIPT_CONTENT.length() - 1));
+        sieveRepository.setDefaultQuota(QuotaSizeLimit.size(SCRIPT_CONTENT.length() - 1));
         sieveRepository.putScript(USERNAME, SCRIPT_NAME, SCRIPT_CONTENT);
     }
 
@@ -348,8 +348,8 @@ public abstract class AbstractSieveRepositoryTest {
     @Test
     public void setQuotaShouldOverrideExistingQuota() throws Exception {
         sieveRepository.setQuota(USERNAME, USER_QUOTA);
-        sieveRepository.setQuota(USERNAME, QuotaSize.size(USER_QUOTA.asLong() - 1));
-        assertThat(sieveRepository.getQuota(USERNAME)).isEqualTo(QuotaSize.size(USER_QUOTA.asLong() - 1));
+        sieveRepository.setQuota(USERNAME, QuotaSizeLimit.size(USER_QUOTA.asLong() - 1));
+        assertThat(sieveRepository.getQuota(USERNAME)).isEqualTo(QuotaSizeLimit.size(USER_QUOTA.asLong() - 1));
     }
 
     protected ScriptContent getScriptContent(InputStream inputStream) throws IOException {
diff --git a/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java b/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java
index c6e51e1..939cb64 100644
--- a/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java
+++ b/server/data/data-memory/src/main/java/org/apache/james/sieverepository/memory/InMemorySieveQuotaRepository.java
@@ -24,15 +24,15 @@ import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieverepository.api.SieveQuotaRepository;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 
 public class InMemorySieveQuotaRepository implements SieveQuotaRepository {
 
-    private Optional<QuotaSize> globalQuota = Optional.empty();
+    private Optional<QuotaSizeLimit> globalQuota = Optional.empty();
 
-    private Map<Username, QuotaSize> userQuota = new ConcurrentHashMap<>();
+    private Map<Username, QuotaSizeLimit> userQuota = new ConcurrentHashMap<>();
 
     @Override
     public synchronized boolean hasDefaultQuota() {
@@ -40,12 +40,12 @@ public class InMemorySieveQuotaRepository implements SieveQuotaRepository {
     }
 
     @Override
-    public synchronized QuotaSize getDefaultQuota() throws QuotaNotFoundException {
+    public synchronized QuotaSizeLimit getDefaultQuota() throws QuotaNotFoundException {
         return globalQuota.orElseThrow(QuotaNotFoundException::new);
     }
 
     @Override
-    public synchronized void setDefaultQuota(QuotaSize quota) {
+    public synchronized void setDefaultQuota(QuotaSizeLimit quota) {
         this.globalQuota = Optional.of(quota);
     }
 
@@ -63,19 +63,19 @@ public class InMemorySieveQuotaRepository implements SieveQuotaRepository {
     }
 
     @Override
-    public QuotaSize getQuota(Username username) throws QuotaNotFoundException {
+    public QuotaSizeLimit getQuota(Username username) throws QuotaNotFoundException {
         return Optional.ofNullable(userQuota.get(username))
             .orElseThrow(QuotaNotFoundException::new);
     }
 
     @Override
-    public synchronized void setQuota(Username username, QuotaSize quota) {
+    public synchronized void setQuota(Username username, QuotaSizeLimit quota) {
         userQuota.put(username, quota);
     }
 
     @Override
     public synchronized void removeQuota(Username username) throws QuotaNotFoundException {
-        Optional<QuotaSize> quotaValue = Optional.ofNullable(userQuota.get(username));
+        Optional<QuotaSizeLimit> quotaValue = Optional.ofNullable(userQuota.get(username));
         if (!quotaValue.isPresent()) {
             throw new QuotaNotFoundException();
         }
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
index 0e1c4b9..99f8b60 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/IsOverQuotaMatcherTest.java
@@ -26,8 +26,8 @@ import static org.apache.james.mailets.configuration.Constants.awaitAtMostOneMin
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.MemoryJamesServerMain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailets.TemporaryJamesServer;
 import org.apache.james.mailets.configuration.CommonProcessors;
 import org.apache.james.mailets.configuration.MailetConfiguration;
@@ -58,10 +58,10 @@ public class IsOverQuotaMatcherTest {
     private static final String BOUNCE_SENDER = "bounce.sender@" + DEFAULT_DOMAIN;
 
     private static final String OVER_QUOTA_MESSAGE = "The recipient is over quota";
-    private static final QuotaSize SMALL_SIZE = QuotaSize.size(1);
-    private static final QuotaSize LARGE_SIZE = QuotaSize.size(10000);
-    private static final QuotaCount SMALL_COUNT = QuotaCount.count(0);
-    private static final QuotaCount LARGE_COUNT = QuotaCount.count(100);
+    private static final QuotaSizeLimit SMALL_SIZE = QuotaSizeLimit.size(1);
+    private static final QuotaSizeLimit LARGE_SIZE = QuotaSizeLimit.size(10000);
+    private static final QuotaCountLimit SMALL_COUNT = QuotaCountLimit.count(0);
+    private static final QuotaCountLimit LARGE_COUNT = QuotaCountLimit.count(100);
 
     @Rule
     public TemporaryFolder temporaryFolder = new TemporaryFolder();
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java
index 0685da9..2b9c9f4 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java
@@ -27,8 +27,8 @@ import java.util.Collection;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -80,7 +80,7 @@ public class IsOverQuotaTest {
 
     @Test
     public void matchShouldKeepAddressesWithTooBigSize() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(100));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(100));
 
         FakeMail fakeMail = FakeMail.builder()
             .name("name")
@@ -94,7 +94,7 @@ public class IsOverQuotaTest {
 
     @Test
     public void matchShouldReturnEmptyAtSizeQuotaLimit() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(1000));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(1000));
 
         FakeMail fakeMail = FakeMail.builder()
             .name("name")
@@ -108,7 +108,7 @@ public class IsOverQuotaTest {
 
     @Test
     public void matchShouldKeepAddressesWithTooMuchMessages() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(0));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(0));
 
         FakeMail fakeMail = FakeMail.builder()
             .name("name")
@@ -121,7 +121,7 @@ public class IsOverQuotaTest {
 
     @Test
     public void matchShouldReturnEmptyOnMessageLimit() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(1));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(1));
 
         FakeMail fakeMail = FakeMail.builder()
             .name("name")
@@ -136,7 +136,7 @@ public class IsOverQuotaTest {
     public void matchShouldNotIncludeRecipientNotOverQuota() throws Exception {
         Username username = Username.of(MailAddressFixture.ANY_AT_JAMES.getLocalPart());
         QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(MailboxPath.inbox(mailboxManager.createSystemSession(username)));
-        maxQuotaManager.setMaxStorage(quotaRoot, QuotaSize.size(100));
+        maxQuotaManager.setMaxStorage(quotaRoot, QuotaSizeLimit.size(100));
 
         FakeMail fakeMail = FakeMail.builder()
             .name("name")
@@ -155,7 +155,7 @@ public class IsOverQuotaTest {
         when(usersRepository.getUser(MailAddressFixture.OTHER_AT_JAMES)).thenReturn(Username.of(MailAddressFixture.OTHER_AT_JAMES.asString()));
         Username username = Username.of(MailAddressFixture.ANY_AT_JAMES.asString());
         QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(MailboxPath.inbox(mailboxManager.createSystemSession(username)));
-        maxQuotaManager.setMaxStorage(quotaRoot, QuotaSize.size(100));
+        maxQuotaManager.setMaxStorage(quotaRoot, QuotaSizeLimit.size(100));
 
         FakeMail fakeMail = FakeMail.builder()
             .name("name")
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/GetMailboxesMethodTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/GetMailboxesMethodTest.java
index ac18edf..c3f4d88 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/GetMailboxesMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/GetMailboxesMethodTest.java
@@ -55,8 +55,8 @@ import java.util.Map;
 import java.util.Optional;
 
 import org.apache.james.GuiceJamesServer;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.categories.BasicFeature;
 import org.apache.james.jmap.draft.JmapGuiceProbe;
@@ -68,7 +68,7 @@ import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.probe.ACLProbe;
 import org.apache.james.mailbox.probe.QuotaProbe;
 import org.apache.james.mime4j.dom.Message;
@@ -788,7 +788,7 @@ public abstract class GetMailboxesMethodTest {
     @Category(BasicFeature.class)
     @Test
     public void getMailboxesShouldReturnMaxStorageQuotasForInboxWhenSet() throws Exception {
-        quotaProbe.setGlobalMaxStorage(SerializableQuotaValue.valueOf(Optional.of(QuotaSize.size(42))));
+        quotaProbe.setGlobalMaxStorage(SerializableQuotaLimitValue.valueOf(Optional.of(QuotaSizeLimit.size(42))));
         String mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE.asString(), DefaultMailboxes.INBOX).serialize();
 
         given()
@@ -805,7 +805,7 @@ public abstract class GetMailboxesMethodTest {
 
     @Test
     public void getMailboxesShouldReturnMaxMessageQuotasForInboxWhenSet() throws Exception {
-        quotaProbe.setGlobalMaxMessageCount(SerializableQuotaValue.valueOf(Optional.of(QuotaCount.count(43))));
+        quotaProbe.setGlobalMaxMessageCount(SerializableQuotaLimitValue.valueOf(Optional.of(QuotaCountLimit.count(43))));
         String mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE.asString(), DefaultMailboxes.INBOX).serialize();
 
         given()
@@ -829,8 +829,8 @@ public abstract class GetMailboxesMethodTest {
         MailboxPath bobMailboxPath = MailboxPath.forUser(BOB, sharedMailboxName);
         aclProbe.replaceRights(bobMailboxPath, ALICE.asString(), new Rfc4314Rights(Right.Lookup, Right.Read));
 
-        quotaProbe.setMaxMessageCount("#private&alice@domain.tld", SerializableQuotaValue.valueOf(Optional.of(QuotaCount.count(42))));
-        quotaProbe.setMaxMessageCount("#private&bob@domain.tld", SerializableQuotaValue.valueOf(Optional.of(QuotaCount.count(43))));
+        quotaProbe.setMaxMessageCount("#private&alice@domain.tld", SerializableQuotaLimitValue.valueOf(Optional.of(QuotaCountLimit.count(42))));
+        quotaProbe.setMaxMessageCount("#private&bob@domain.tld", SerializableQuotaLimitValue.valueOf(Optional.of(QuotaCountLimit.count(43))));
 
         given()
             .header("Authorization", accessToken.serialize())
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/QuotaMailingTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/QuotaMailingTest.java
index 2cd2734..23a18b5 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/QuotaMailingTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/QuotaMailingTest.java
@@ -38,13 +38,13 @@ import java.util.List;
 
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.categories.BasicFeature;
 import org.apache.james.jmap.draft.JmapGuiceProbe;
 import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.model.MailboxConstants;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.QuotaProbesImpl;
@@ -105,7 +105,7 @@ public abstract class QuotaMailingTest {
     public void shouldSendANoticeWhenThresholdExceeded() throws Exception {
         jmapServer.getProbe(QuotaProbesImpl.class)
             .setMaxStorage(MailboxConstants.USER_NAMESPACE + "&" + HOMER.asString(),
-                new SerializableQuotaValue<>(QuotaSize.size(100 * 1000)));
+                new SerializableQuotaLimitValue<>(QuotaSizeLimit.size(100 * 1000)));
 
         bartSendMessageToHomer();
         // Homer receives a mail big enough to trigger a configured threshold
@@ -131,7 +131,7 @@ public abstract class QuotaMailingTest {
     public void configurationShouldBeWellLoaded() throws Exception {
         jmapServer.getProbe(QuotaProbesImpl.class)
             .setMaxStorage(MailboxConstants.USER_NAMESPACE + "&" + HOMER.asString(),
-                new SerializableQuotaValue<>(QuotaSize.size(100 * 1000)));
+                new SerializableQuotaLimitValue<>(QuotaSizeLimit.size(100 * 1000)));
 
         bartSendMessageToHomer();
         // Homer receives a mail big enough to trigger a 10% configured threshold
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SendMDNMethodTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SendMDNMethodTest.java
index 35f176b..d8692ee 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SendMDNMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SendMDNMethodTest.java
@@ -46,7 +46,7 @@ import java.util.Optional;
 
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.jmap.MessageAppender;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.categories.BasicFeature;
@@ -55,7 +55,7 @@ import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.mailbox.probe.QuotaProbe;
 import org.apache.james.modules.MailboxProbeImpl;
@@ -406,7 +406,7 @@ public abstract class SendMDNMethodTest {
 
         QuotaProbe quotaProbe = jmapServer.getProbe(QuotaProbesImpl.class);
         String inboxQuotaRoot = quotaProbe.getQuotaRoot("#private", HOMER.asString(), DefaultMailboxes.INBOX);
-        quotaProbe.setMaxStorage(inboxQuotaRoot, SerializableQuotaValue.valueOf(Optional.of(QuotaSize.size(100))));
+        quotaProbe.setMaxStorage(inboxQuotaRoot, SerializableQuotaLimitValue.valueOf(Optional.of(QuotaSizeLimit.size(100))));
 
         MessageAppender.fillMailbox(jmapServer.getProbe(MailboxProbeImpl.class), HOMER.asString(), MailboxConstants.INBOX);
 
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
index f9eeea2..3b7047c 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesMethodTest.java
@@ -74,7 +74,7 @@ import javax.mail.internet.MimeMessage;
 import org.apache.commons.io.IOUtils;
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.jmap.HttpJmapAuthentication;
 import org.apache.james.jmap.MessageAppender;
 import org.apache.james.jmap.api.access.AccessToken;
@@ -95,7 +95,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.MessageResult;
-import org.apache.james.mailbox.model.SerializableQuotaValue;
+import org.apache.james.mailbox.model.SerializableQuotaLimitValue;
 import org.apache.james.mailbox.probe.ACLProbe;
 import org.apache.james.mailbox.probe.MailboxProbe;
 import org.apache.james.mailbox.probe.QuotaProbe;
@@ -1326,7 +1326,7 @@ public abstract class SetMessagesMethodTest {
     public void setMessagesShouldNotAllowDraftCreationWhenOverQuota() throws MailboxException {
         QuotaProbe quotaProbe = jmapServer.getProbe(QuotaProbesImpl.class);
         String inboxQuotaRoot = quotaProbe.getQuotaRoot("#private", USERNAME.asString(), DefaultMailboxes.INBOX);
-        quotaProbe.setMaxStorage(inboxQuotaRoot, SerializableQuotaValue.valueOf(Optional.of(QuotaSize.size(100))));
+        quotaProbe.setMaxStorage(inboxQuotaRoot, SerializableQuotaLimitValue.valueOf(Optional.of(QuotaSizeLimit.size(100))));
 
         MessageAppender.fillMailbox(mailboxProbe, USERNAME.asString(), MailboxConstants.INBOX);
 
@@ -1443,7 +1443,7 @@ public abstract class SetMessagesMethodTest {
     public void setMessagesShouldNotAllowCopyWhenOverQuota() throws MailboxException {
         QuotaProbe quotaProbe = jmapServer.getProbe(QuotaProbesImpl.class);
         String inboxQuotaRoot = quotaProbe.getQuotaRoot("#private", USERNAME.asString(), DefaultMailboxes.INBOX);
-        quotaProbe.setMaxStorage(inboxQuotaRoot, SerializableQuotaValue.valueOf(Optional.of(QuotaSize.size(100))));
+        quotaProbe.setMaxStorage(inboxQuotaRoot, SerializableQuotaLimitValue.valueOf(Optional.of(QuotaSizeLimit.size(100))));
 
         List<ComposedMessageId> composedMessageIds = MessageAppender.fillMailbox(mailboxProbe, USERNAME.asString(), MailboxConstants.INBOX);
 
@@ -2773,7 +2773,7 @@ public abstract class SetMessagesMethodTest {
     public void setMessagesShouldTriggerMaxQuotaReachedWhenTryingToSendMessageAndQuotaReached() throws Exception {
         QuotaProbe quotaProbe = jmapServer.getProbe(QuotaProbesImpl.class);
         String inboxQuotaRoot = quotaProbe.getQuotaRoot("#private", USERNAME.asString(), DefaultMailboxes.INBOX);
-        quotaProbe.setMaxStorage(inboxQuotaRoot, SerializableQuotaValue.valueOf(Optional.of(QuotaSize.size(100))));
+        quotaProbe.setMaxStorage(inboxQuotaRoot, SerializableQuotaLimitValue.valueOf(Optional.of(QuotaSizeLimit.size(100))));
 
         MessageAppender.fillMailbox(mailboxProbe, USERNAME.asString(), MailboxConstants.INBOX);
 
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/Quotas.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/Quotas.java
index dd81970..d8c31a1 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/Quotas.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/Quotas.java
@@ -22,9 +22,12 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
+import org.apache.james.core.quota.QuotaUsageValue;
 import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.mailbox.model.QuotaRoot;
 
@@ -84,23 +87,23 @@ public class Quotas {
     }
 
     public static class Quota {
-        private final Map<Type, Value<?>> quota;
+        private final Map<Type, Value<?, ?>> quota;
 
-        public static Quota from(ImmutableMap<Type, Value<?>> quota) {
+        public static Quota from(ImmutableMap<Type, Value<?, ?>> quota) {
             return new Quota(quota);
         }
 
-        public static Quota from(Value<QuotaSize> storage, Value<QuotaCount> message) {
+        public static Quota from(Value<QuotaSizeLimit, QuotaSizeUsage> storage, Value<QuotaCountLimit, QuotaCountUsage> message) {
             return new Quota(ImmutableMap.of(Type.STORAGE, storage,
                 Type.MESSAGE, message));
         }
 
-        private Quota(ImmutableMap<Type, Value<?>> quota) {
+        private Quota(ImmutableMap<Type, Value<?, ?>> quota) {
             this.quota = quota;
         }
 
         @JsonValue
-        public Map<Type, Value<?>> getQuota() {
+        public Map<Type, Value<?, ?>> getQuota() {
             return quota;
         }
     }
@@ -110,7 +113,7 @@ public class Quotas {
         MESSAGE;
     }
 
-    public static class Value<T extends QuotaValue<T>> {
+    public static class Value<T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> {
         private final Number used;
         private final Optional<Number> max;
         
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/quotas/QuotaLoader.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/quotas/QuotaLoader.java
index a196df2..76bd371 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/quotas/QuotaLoader.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/utils/quotas/QuotaLoader.java
@@ -20,7 +20,8 @@ package org.apache.james.jmap.draft.utils.quotas;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaLimitValue;
+import org.apache.james.core.quota.QuotaUsageValue;
 import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.jmap.draft.model.mailbox.Quotas;
 import org.apache.james.mailbox.exception.MailboxException;
@@ -31,17 +32,21 @@ public abstract class QuotaLoader {
 
     public abstract Quotas getQuotas(MailboxPath mailboxPath) throws MailboxException;
 
-    protected <T extends QuotaValue<T>> Quotas.Value<T> quotaToValue(Quota<T> quota) {
+    protected <T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> Quotas.Value<T, U> quotaToValue(Quota<T, U> quota) {
         return new Quotas.Value<>(
-            quotaValueToNumber(quota.getUsed()),
-            quotaValueToOptionalNumber(quota.getLimit()));
+            quotaValueUsageToNumber(quota.getUsed()),
+            quotaLimitValueToOptionalNumber(quota.getLimit()));
     }
 
-    protected Number quotaValueToNumber(QuotaValue<?> value) {
+    protected Number quotaValueToNumber(QuotaLimitValue<?> value) {
         return Number.BOUND_SANITIZING_FACTORY.from(value.asLong());
     }
 
-    protected Optional<Number> quotaValueToOptionalNumber(QuotaValue<?> value) {
+    protected Number quotaValueUsageToNumber(QuotaUsageValue<?, ?> value) {
+        return Number.BOUND_SANITIZING_FACTORY.from(value.asLong());
+    }
+
+    protected Optional<Number> quotaLimitValueToOptionalNumber(QuotaLimitValue<?> value) {
         if (value.isUnlimited()) {
             return Optional.empty();
         }
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
index 82522e1..fbbb40d 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
@@ -29,7 +29,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieverepository.api.SieveQuotaRepository;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 import org.apache.james.user.api.UsersRepository;
@@ -99,7 +99,7 @@ public class SieveQuotaRoutes implements Routes {
     public void defineGetGlobalSieveQuota(Service service) {
         service.get(DEFAULT_QUOTA_PATH, (request, response) -> {
             try {
-                QuotaSize sieveQuota = sieveQuotaRepository.getDefaultQuota();
+                QuotaSizeLimit sieveQuota = sieveQuotaRepository.getDefaultQuota();
                 response.status(HttpStatus.OK_200);
                 return sieveQuota.asLong();
             } catch (QuotaNotFoundException e) {
@@ -120,7 +120,7 @@ public class SieveQuotaRoutes implements Routes {
     })
     public void defineUpdateGlobalSieveQuota(Service service) {
         service.put(DEFAULT_QUOTA_PATH, (request, response) -> {
-            QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request);
+            QuotaSizeLimit requestedSize = extractRequestedQuotaSizeFromRequest(request);
             sieveQuotaRepository.setDefaultQuota(requestedSize);
             return Responses.returnNoContent(response);
         }, jsonTransformer);
@@ -156,9 +156,9 @@ public class SieveQuotaRoutes implements Routes {
     })
     public void defineGetPerUserSieveQuota(Service service) {
         service.get(USER_SIEVE_QUOTA_PATH, (request, response) -> {
-            Username usernameId = getUsername(request.params(USER_ID));
+            Username userId = getUsername(request.params(USER_ID));
             try {
-                QuotaSize userQuota = sieveQuotaRepository.getQuota(usernameId);
+                QuotaSizeLimit userQuota = sieveQuotaRepository.getQuota(userId);
                 response.status(HttpStatus.OK_200);
                 return userQuota.asLong();
             } catch (QuotaNotFoundException e) {
@@ -182,7 +182,7 @@ public class SieveQuotaRoutes implements Routes {
     public void defineUpdatePerUserSieveQuota(Service service) {
         service.put(USER_SIEVE_QUOTA_PATH, (request, response) -> {
             Username userId = getUsername(request.params(USER_ID));
-            QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request);
+            QuotaSizeLimit requestedSize = extractRequestedQuotaSizeFromRequest(request);
             sieveQuotaRepository.setQuota(userId, requestedSize);
             return Responses.returnNoContent(response);
         }, jsonTransformer);
@@ -210,7 +210,7 @@ public class SieveQuotaRoutes implements Routes {
         });
     }
 
-    private QuotaSize extractRequestedQuotaSizeFromRequest(Request request) {
+    private QuotaSizeLimit extractRequestedQuotaSizeFromRequest(Request request) {
         long requestedSize = extractNumberFromRequestBody(request);
         if (requestedSize < 0) {
             throw ErrorResponder.builder()
@@ -219,7 +219,7 @@ public class SieveQuotaRoutes implements Routes {
                 .message("Requested quota size have to be a positive integer")
                 .haltError();
         }
-        return QuotaSize.size(requestedSize);
+        return QuotaSizeLimit.size(requestedSize);
     }
 
     private long extractNumberFromRequestBody(Request request) {
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
index cca0e2b..759b556 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
@@ -24,7 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.Matchers.is;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.sieverepository.api.SieveQuotaRepository;
 import org.apache.james.sieverepository.memory.InMemorySieveQuotaRepository;
 import org.apache.james.user.api.UsersRepositoryException;
@@ -78,7 +78,7 @@ class SieveQuotaRoutesTest {
 
     @Test
     void getGlobalSieveQuotaShouldReturnStoredValue() throws Exception {
-        QuotaSize value = QuotaSize.size(1000L);
+        QuotaSizeLimit value = QuotaSizeLimit.size(1000L);
         sieveRepository.setDefaultQuota(value);
 
         long actual =
@@ -95,7 +95,7 @@ class SieveQuotaRoutesTest {
 
     @Test
     void updateGlobalSieveQuotaShouldUpdateStoredValue() throws Exception {
-        sieveRepository.setDefaultQuota(QuotaSize.size(500L));
+        sieveRepository.setDefaultQuota(QuotaSizeLimit.size(500L));
         long requiredSize = 1024L;
 
         given()
@@ -146,7 +146,7 @@ class SieveQuotaRoutesTest {
 
     @Test
     void removeGlobalSieveQuotaShouldRemoveGlobalSieveQuota() throws Exception {
-        sieveRepository.setDefaultQuota(QuotaSize.size(1024L));
+        sieveRepository.setDefaultQuota(QuotaSizeLimit.size(1024L));
 
         given()
             .delete("/sieve/quota/default")
@@ -164,7 +164,7 @@ class SieveQuotaRoutesTest {
 
     @Test
     void getPerUserSieveQuotaShouldReturnStoredValue() throws Exception {
-        QuotaSize value = QuotaSize.size(1024L);
+        QuotaSizeLimit value = QuotaSizeLimit.size(1024L);
         sieveRepository.setQuota(USERNAME_A, value);
 
         long actual =
@@ -189,7 +189,7 @@ class SieveQuotaRoutesTest {
 
     @Test
     void updatePerUserSieveQuotaShouldUpdateStoredValue() throws Exception {
-        sieveRepository.setQuota(USERNAME_A, QuotaSize.size(500L));
+        sieveRepository.setQuota(USERNAME_A, QuotaSizeLimit.size(500L));
         long requiredSize = 1024L;
 
         given()
@@ -249,7 +249,7 @@ class SieveQuotaRoutesTest {
 
     @Test
     void removePerUserSieveQuotaShouldRemoveQuotaForUser() throws Exception {
-        sieveRepository.setQuota(USERNAME_A, QuotaSize.size(1024));
+        sieveRepository.setQuota(USERNAME_A, QuotaSizeLimit.size(1024));
 
         given()
             .delete("/sieve/quota/users/" + USER_NAME_A)
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java
index 455de1d..adc1a62 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java
@@ -19,12 +19,14 @@
 
 package org.apache.james.webadmin.dto;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 
 public class OccupationDTO {
-    public static OccupationDTO from(Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota) {
+    public static OccupationDTO from(Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Quota<QuotaCountLimit, QuotaCountUsage> countQuota) {
         return new OccupationDTO(
             sizeQuota.getUsed().asLong(),
             countQuota.getUsed().asLong(),
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java
index d3fc923..36bcd48 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java
@@ -19,14 +19,16 @@
 
 package org.apache.james.webadmin.dto;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRatio;
 
 public class OccupationRatioDTO {
 
-    public static OccupationRatioDTO from(Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota) {
+    public static OccupationRatioDTO from(Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Quota<QuotaCountLimit, QuotaCountUsage> countQuota) {
         return new OccupationRatioDTO(
             sizeQuota.getRatio(),
             countQuota.getRatio(),
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
index 7449c90..08bb9bc 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
@@ -22,8 +22,10 @@ package org.apache.james.webadmin.dto;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 
 import com.google.common.base.Preconditions;
@@ -67,7 +69,7 @@ public class QuotaDetailsDTO {
             return this;
         }
 
-        public Builder occupation(Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota) {
+        public Builder occupation(Quota<QuotaSizeLimit, QuotaSizeUsage> sizeQuota, Quota<QuotaCountLimit, QuotaCountUsage> countQuota) {
             this.occupation = OccupationDTO.from(sizeQuota, countQuota);
             return this;
         }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueDeserializer.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueDeserializer.java
index 9a2a7e8..32dc328 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueDeserializer.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueDeserializer.java
@@ -21,13 +21,13 @@ package org.apache.james.webadmin.dto;
 import java.io.IOException;
 import java.util.function.Function;
 
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaLimitValue;
 
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.DeserializationContext;
 import com.fasterxml.jackson.databind.JsonDeserializer;
 
-public class QuotaValueDeserializer<T extends QuotaValue<T>> extends JsonDeserializer<T> {
+public class QuotaValueDeserializer<T extends QuotaLimitValue<T>> extends JsonDeserializer<T> {
 
     private final T unlimited;
     private final Function<Long, T> quotaFactory;
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueSerializer.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueSerializer.java
index 3c4067b..ba62556 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueSerializer.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaValueSerializer.java
@@ -20,13 +20,13 @@ package org.apache.james.webadmin.dto;
 
 import java.io.IOException;
 
-import org.apache.james.core.quota.QuotaValue;
+import org.apache.james.core.quota.QuotaLimitValue;
 
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.JsonSerializer;
 import com.fasterxml.jackson.databind.SerializerProvider;
 
-public class QuotaValueSerializer<T extends QuotaValue<T>> extends JsonSerializer<T> {
+public class QuotaValueSerializer<T extends QuotaLimitValue<T>> extends JsonSerializer<T> {
 
     @Override
     public void serialize(T value, JsonGenerator generator, SerializerProvider serializers) throws IOException {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/ValidatedQuotaDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/ValidatedQuotaDTO.java
index 6023096..b595a81 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/ValidatedQuotaDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/ValidatedQuotaDTO.java
@@ -23,8 +23,8 @@ package org.apache.james.webadmin.dto;
 import java.util.Objects;
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
@@ -39,20 +39,20 @@ public class ValidatedQuotaDTO {
 
     @JsonPOJOBuilder(withPrefix = "")
     public static class Builder {
-        private Optional<QuotaCount> count;
-        private Optional<QuotaSize> size;
+        private Optional<QuotaCountLimit> count;
+        private Optional<QuotaSizeLimit> size;
 
         private Builder() {
             count = Optional.empty();
             size = Optional.empty();
         }
 
-        public Builder count(Optional<QuotaCount> count) {
+        public Builder count(Optional<QuotaCountLimit> count) {
             this.count = count;
             return this;
         }
 
-        public Builder size(Optional<QuotaSize> size) {
+        public Builder size(Optional<QuotaSizeLimit> size) {
             this.size = size;
             return this;
         }
@@ -63,19 +63,19 @@ public class ValidatedQuotaDTO {
     }
 
 
-    private final Optional<QuotaCount> count;
-    private final Optional<QuotaSize> size;
+    private final Optional<QuotaCountLimit> count;
+    private final Optional<QuotaSizeLimit> size;
 
-    private ValidatedQuotaDTO(Optional<QuotaCount> count, Optional<QuotaSize> size) {
+    private ValidatedQuotaDTO(Optional<QuotaCountLimit> count, Optional<QuotaSizeLimit> size) {
         this.count = count;
         this.size = size;
     }
 
-    public Optional<QuotaCount> getCount() {
+    public Optional<QuotaCountLimit> getCount() {
         return count;
     }
 
-    public Optional<QuotaSize> getSize() {
+    public Optional<QuotaSizeLimit> getSize() {
         return size;
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/jackson/QuotaModule.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/jackson/QuotaModule.java
index 003226a..de45950 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/jackson/QuotaModule.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/jackson/QuotaModule.java
@@ -18,8 +18,8 @@
  ****************************************************************/
 package org.apache.james.webadmin.jackson;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.webadmin.dto.QuotaValueDeserializer;
 import org.apache.james.webadmin.dto.QuotaValueSerializer;
 import org.apache.james.webadmin.utils.JsonTransformerModule;
@@ -33,10 +33,10 @@ public class QuotaModule implements JsonTransformerModule {
 
     public QuotaModule() {
         simpleModule = new SimpleModule()
-            .addSerializer(QuotaSize.class, new QuotaValueSerializer<>())
-            .addSerializer(QuotaCount.class, new QuotaValueSerializer<>())
-            .addDeserializer(QuotaSize.class, new QuotaValueDeserializer<>(QuotaSize.unlimited(), QuotaSize::size))
-            .addDeserializer(QuotaCount.class, new QuotaValueDeserializer<>(QuotaCount.unlimited(), QuotaCount::count));
+            .addSerializer(QuotaSizeLimit.class, new QuotaValueSerializer<>())
+            .addSerializer(QuotaCountLimit.class, new QuotaValueSerializer<>())
+            .addDeserializer(QuotaSizeLimit.class, new QuotaValueDeserializer<>(QuotaSizeLimit.unlimited(), QuotaSizeLimit::size))
+            .addDeserializer(QuotaCountLimit.class, new QuotaValueDeserializer<>(QuotaCountLimit.unlimited(), QuotaCountLimit::count));
     }
 
     @Override
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
index c080910..c5c6850 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/DomainQuotaRoutes.java
@@ -31,8 +31,8 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.user.api.UsersRepository;
@@ -201,7 +201,7 @@ public class DomainQuotaRoutes implements Routes {
     public void defineUpdateQuotaSize() {
         service.put(SIZE_ENDPOINT, (request, response) -> {
             Domain domain = checkDomainExist(request);
-            QuotaSize quotaSize = Quotas.quotaSize(request.body());
+            QuotaSizeLimit quotaSize = Quotas.quotaSize(request.body());
             domainQuotaService.setMaxSizeQuota(domain, quotaSize);
             return Responses.returnNoContent(response);
         });
@@ -220,7 +220,7 @@ public class DomainQuotaRoutes implements Routes {
     public void defineGetQuotaSize() {
         service.get(SIZE_ENDPOINT, (request, response) -> {
             Domain domain = checkDomainExist(request);
-            Optional<QuotaSize> maxSizeQuota = domainQuotaService.getMaxSizeQuota(domain);
+            Optional<QuotaSizeLimit> maxSizeQuota = domainQuotaService.getMaxSizeQuota(domain);
             if (maxSizeQuota.isPresent()) {
                 return maxSizeQuota;
             }
@@ -261,7 +261,7 @@ public class DomainQuotaRoutes implements Routes {
     public void defineUpdateQuotaCount() {
         service.put(COUNT_ENDPOINT, (request, response) -> {
             Domain domain = checkDomainExist(request);
-            QuotaCount quotaCount = Quotas.quotaCount(request.body());
+            QuotaCountLimit quotaCount = Quotas.quotaCount(request.body());
             domainQuotaService.setMaxCountQuota(domain, quotaCount);
             return Responses.returnNoContent(response);
         });
@@ -279,7 +279,7 @@ public class DomainQuotaRoutes implements Routes {
     public void defineGetQuotaCount() {
         service.get(COUNT_ENDPOINT, (request, response) -> {
             Domain domain = checkDomainExist(request);
-            Optional<QuotaCount> maxCountQuota = domainQuotaService.getMaxCountQuota(domain);
+            Optional<QuotaCountLimit> maxCountQuota = domainQuotaService.getMaxCountQuota(domain);
             if (maxCountQuota.isPresent()) {
                 return maxCountQuota;
             }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java
index a4c255f..470012b 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/GlobalQuotaRoutes.java
@@ -28,8 +28,8 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.dto.QuotaDTO;
@@ -172,7 +172,7 @@ public class GlobalQuotaRoutes implements Routes {
     })
     public void defineUpdateQuotaSize() {
         service.put(SIZE_ENDPOINT, (request, response) -> {
-            QuotaSize quotaSize = Quotas.quotaSize(request.body());
+            QuotaSizeLimit quotaSize = Quotas.quotaSize(request.body());
             globalQuotaService.defineMaxSizeQuota(quotaSize);
             return Responses.returnNoContent(response);
         });
@@ -189,8 +189,8 @@ public class GlobalQuotaRoutes implements Routes {
         service.get(SIZE_ENDPOINT, this::getQuotaSize, jsonTransformer);
     }
 
-    private QuotaSize getQuotaSize(Request request, Response response) throws MailboxException {
-        Optional<QuotaSize> maxSizeQuota = globalQuotaService.getMaxSizeQuota();
+    private QuotaSizeLimit getQuotaSize(Request request, Response response) throws MailboxException {
+        Optional<QuotaSizeLimit> maxSizeQuota = globalQuotaService.getMaxSizeQuota();
         if (maxSizeQuota.isPresent()) {
             return maxSizeQuota.get();
         }
@@ -225,7 +225,7 @@ public class GlobalQuotaRoutes implements Routes {
     })
     public void defineUpdateQuotaCount() {
         service.put(COUNT_ENDPOINT, (request, response) -> {
-            QuotaCount quotaRequest = Quotas.quotaCount(request.body());
+            QuotaCountLimit quotaRequest = Quotas.quotaCount(request.body());
             globalQuotaService.defineMaxCountQuota(quotaRequest);
             return Responses.returnNoContent(response);
         });
@@ -243,8 +243,8 @@ public class GlobalQuotaRoutes implements Routes {
         service.get(COUNT_ENDPOINT, this::getQuotaCount, jsonTransformer);
     }
 
-    private QuotaCount getQuotaCount(Request request, Response response) throws MailboxException {
-        Optional<QuotaCount> maxCountQuota = globalQuotaService.getMaxCountQuota();
+    private QuotaCountLimit getQuotaCount(Request request, Response response) throws MailboxException {
+        Optional<QuotaCountLimit> maxCountQuota = globalQuotaService.getMaxCountQuota();
         if (maxCountQuota.isPresent()) {
             return maxCountQuota.get();
         }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
index 4fbf4cc..fda1b65 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
@@ -35,8 +35,8 @@ import javax.ws.rs.Produces;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.quota.search.Limit;
 import org.apache.james.quota.search.Offset;
 import org.apache.james.quota.search.QuotaBoundary;
@@ -282,7 +282,7 @@ public class UserQuotaRoutes implements Routes {
     public void defineUpdateQuotaSize() {
         service.put(SIZE_ENDPOINT, (request, response) -> {
             Username username = checkUserExist(request);
-            QuotaSize quotaSize = Quotas.quotaSize(request.body());
+            QuotaSizeLimit quotaSize = Quotas.quotaSize(request.body());
             userQuotaService.defineMaxSizeQuota(username, quotaSize);
             return Responses.returnNoContent(response);
         });
@@ -300,7 +300,7 @@ public class UserQuotaRoutes implements Routes {
     public void defineGetQuotaSize() {
         service.get(SIZE_ENDPOINT, (request, response) -> {
             Username username = checkUserExist(request);
-            Optional<QuotaSize> maxSizeQuota = userQuotaService.getMaxSizeQuota(username);
+            Optional<QuotaSizeLimit> maxSizeQuota = userQuotaService.getMaxSizeQuota(username);
             if (maxSizeQuota.isPresent()) {
                 return maxSizeQuota;
             }
@@ -339,7 +339,7 @@ public class UserQuotaRoutes implements Routes {
     public void defineUpdateQuotaCount() {
         service.put(COUNT_ENDPOINT, (request, response) -> {
             Username username = checkUserExist(request);
-            QuotaCount quotaCount = Quotas.quotaCount(request.body());
+            QuotaCountLimit quotaCount = Quotas.quotaCount(request.body());
             userQuotaService.defineMaxCountQuota(username, quotaCount);
             return Responses.returnNoContent(response);
         });
@@ -357,7 +357,7 @@ public class UserQuotaRoutes implements Routes {
     public void defineGetQuotaCount() {
         service.get(COUNT_ENDPOINT, (request, response) -> {
             Username username = checkUserExist(request);
-            Optional<QuotaCount> maxCountQuota = userQuotaService.getMaxCountQuota(username);
+            Optional<QuotaCountLimit> maxCountQuota = userQuotaService.getMaxCountQuota(username);
             if (maxCountQuota.isPresent()) {
                 return maxCountQuota;
             }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java
index e9b7491..2d0864e 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/DomainQuotaService.java
@@ -24,8 +24,8 @@ import java.util.Optional;
 import javax.inject.Inject;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.webadmin.dto.QuotaDomainDTO;
@@ -40,11 +40,11 @@ public class DomainQuotaService {
         this.maxQuotaManager = maxQuotaManager;
     }
 
-    public Optional<QuotaCount> getMaxCountQuota(Domain domain) {
+    public Optional<QuotaCountLimit> getMaxCountQuota(Domain domain) {
         return maxQuotaManager.getDomainMaxMessage(domain);
     }
 
-    public void setMaxCountQuota(Domain domain, QuotaCount quotaCount) throws MailboxException {
+    public void setMaxCountQuota(Domain domain, QuotaCountLimit quotaCount) throws MailboxException {
         maxQuotaManager.setDomainMaxMessage(domain, quotaCount);
     }
 
@@ -52,11 +52,11 @@ public class DomainQuotaService {
         maxQuotaManager.removeDomainMaxMessage(domain);
     }
 
-    public Optional<QuotaSize> getMaxSizeQuota(Domain domain) {
+    public Optional<QuotaSizeLimit> getMaxSizeQuota(Domain domain) {
         return maxQuotaManager.getDomainMaxStorage(domain);
     }
 
-    public void setMaxSizeQuota(Domain domain, QuotaSize quotaSize) throws MailboxException {
+    public void setMaxSizeQuota(Domain domain, QuotaSizeLimit quotaSize) throws MailboxException {
         maxQuotaManager.setDomainMaxStorage(domain, quotaSize);
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java
index abd3aed..a957c4d 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/GlobalQuotaService.java
@@ -22,8 +22,8 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
@@ -38,14 +38,14 @@ public class GlobalQuotaService {
     }
 
     public void defineQuota(ValidatedQuotaDTO quota) throws MailboxException {
-        Optional<QuotaCount> count = quota.getCount();
+        Optional<QuotaCountLimit> count = quota.getCount();
         if (count.isPresent()) {
             maxQuotaManager.setGlobalMaxMessage(count.get());
         } else {
             maxQuotaManager.removeGlobalMaxMessage();
         }
 
-        Optional<QuotaSize> size = quota.getSize();
+        Optional<QuotaSizeLimit> size = quota.getSize();
         if (size.isPresent()) {
             maxQuotaManager.setGlobalMaxStorage(size.get());
         } else {
@@ -61,11 +61,11 @@ public class GlobalQuotaService {
             .build();
     }
 
-    public Optional<QuotaSize> getMaxSizeQuota() throws MailboxException {
+    public Optional<QuotaSizeLimit> getMaxSizeQuota() throws MailboxException {
         return maxQuotaManager.getGlobalMaxStorage();
     }
 
-    public void defineMaxSizeQuota(QuotaSize quotaRequest) throws MailboxException {
+    public void defineMaxSizeQuota(QuotaSizeLimit quotaRequest) throws MailboxException {
         maxQuotaManager.setGlobalMaxStorage(quotaRequest);
     }
 
@@ -73,11 +73,11 @@ public class GlobalQuotaService {
         maxQuotaManager.removeGlobalMaxStorage();
     }
 
-    public Optional<QuotaCount> getMaxCountQuota() throws MailboxException {
+    public Optional<QuotaCountLimit> getMaxCountQuota() throws MailboxException {
         return maxQuotaManager.getGlobalMaxMessage();
     }
 
-    public void defineMaxCountQuota(QuotaCount value) throws MailboxException {
+    public void defineMaxCountQuota(QuotaCountLimit value) throws MailboxException {
         maxQuotaManager.setGlobalMaxMessage(value);
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
index 1aaf012..cb42f06 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
@@ -27,8 +27,8 @@ import java.util.stream.Collectors;
 import javax.inject.Inject;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -102,7 +102,7 @@ public class UserQuotaService {
                 .build();
     }
 
-    private Map<Quota.Scope, ValidatedQuotaDTO> mergeMaps(Map<Quota.Scope, QuotaCount> counts, Map<Quota.Scope, QuotaSize> sizes) {
+    private Map<Quota.Scope, ValidatedQuotaDTO> mergeMaps(Map<Quota.Scope, QuotaCountLimit> counts, Map<Quota.Scope, QuotaSizeLimit> sizes) {
        return Sets.union(counts.keySet(), sizes.keySet())
             .stream()
             .collect(Collectors.toMap(Function.identity(),
@@ -114,11 +114,11 @@ public class UserQuotaService {
     }
 
 
-    public Optional<QuotaSize> getMaxSizeQuota(Username username) throws MailboxException {
+    public Optional<QuotaSizeLimit> getMaxSizeQuota(Username username) throws MailboxException {
         return maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(username));
     }
 
-    public void defineMaxSizeQuota(Username username, QuotaSize quotaSize) throws MailboxException {
+    public void defineMaxSizeQuota(Username username, QuotaSizeLimit quotaSize) throws MailboxException {
         maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(username), quotaSize);
     }
 
@@ -126,11 +126,11 @@ public class UserQuotaService {
         maxQuotaManager.removeMaxStorage(userQuotaRootResolver.forUser(username));
     }
 
-    public Optional<QuotaCount> getMaxCountQuota(Username username) throws MailboxException {
+    public Optional<QuotaCountLimit> getMaxCountQuota(Username username) throws MailboxException {
         return maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(username));
     }
 
-    public void defineMaxCountQuota(Username username, QuotaCount quotaCount) throws MailboxException {
+    public void defineMaxCountQuota(Username username, QuotaCountLimit quotaCount) throws MailboxException {
         maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(username), quotaCount);
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java
index 63de521..b8f5a55 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/QuotaDTOValidator.java
@@ -20,8 +20,8 @@ package org.apache.james.webadmin.validation;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.webadmin.dto.QuotaDTO;
 import org.apache.james.webadmin.dto.ValidatedQuotaDTO;
 import org.apache.james.webadmin.utils.ErrorResponder;
@@ -33,9 +33,9 @@ public class QuotaDTOValidator {
 
     public ValidatedQuotaDTO validatedQuotaDTO(QuotaDTO quotaDTO) {
         try {
-            Optional<QuotaCount> count = quotaDTO.getCount()
+            Optional<QuotaCountLimit> count = quotaDTO.getCount()
                 .map(this::getQuotaCount);
-            Optional<QuotaSize> size = quotaDTO.getSize()
+            Optional<QuotaSizeLimit> size = quotaDTO.getSize()
                 .map(this::getQuotaSize);
 
             return ValidatedQuotaDTO.builder()
@@ -52,19 +52,19 @@ public class QuotaDTOValidator {
         }
     }
 
-    private QuotaSize getQuotaSize(Long quotaValue) {
+    private QuotaSizeLimit getQuotaSize(Long quotaValue) {
         if (quotaValue == UNLIMITED) {
-            return QuotaSize.unlimited();
+            return QuotaSizeLimit.unlimited();
         } else {
-            return QuotaSize.size(quotaValue);
+            return QuotaSizeLimit.size(quotaValue);
         }
     }
 
-    private QuotaCount getQuotaCount(Long quotaValue) {
+    private QuotaCountLimit getQuotaCount(Long quotaValue) {
         if (quotaValue == UNLIMITED) {
-            return QuotaCount.unlimited();
+            return QuotaCountLimit.unlimited();
         } else {
-            return QuotaCount.count(quotaValue);
+            return QuotaCountLimit.count(quotaValue);
         }
     }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/Quotas.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/Quotas.java
index 5843082..3f79a6f 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/Quotas.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/validation/Quotas.java
@@ -21,23 +21,23 @@ package org.apache.james.webadmin.validation;
 
 import java.util.Optional;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.webadmin.utils.ErrorResponder;
 import org.eclipse.jetty.http.HttpStatus;
 
 public abstract class Quotas {
 
-    public static QuotaCount quotaCount(String serialized) {
+    public static QuotaCountLimit quotaCount(String serialized) {
         return minusOneToEmpty(parseToLong(serialized))
-                .map(QuotaCount::count)
-                .orElse(QuotaCount.unlimited());
+                .map(QuotaCountLimit::count)
+                .orElse(QuotaCountLimit.unlimited());
     }
 
-    public static QuotaSize quotaSize(String serialized) {
+    public static QuotaSizeLimit quotaSize(String serialized) {
         return minusOneToEmpty(parseToLong(serialized))
-            .map(QuotaSize::size)
-            .orElse(QuotaSize.unlimited());
+            .map(QuotaSizeLimit::size)
+            .orElse(QuotaSizeLimit.unlimited());
     }
 
     private static Optional<Long> minusOneToEmpty(long value) {
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaValueDeserializerTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaLimitValueDeserializerTest.java
similarity index 77%
rename from server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaValueDeserializerTest.java
rename to server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaLimitValueDeserializerTest.java
index fd0d679..f953b6b 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaValueDeserializerTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/QuotaLimitValueDeserializerTest.java
@@ -18,8 +18,8 @@
  ****************************************************************/
 package org.apache.james.webadmin.dto;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.webadmin.utils.JsonExtractException;
 import org.apache.james.webadmin.utils.JsonExtractor;
 import org.assertj.core.api.Assertions;
@@ -27,22 +27,22 @@ import org.junit.jupiter.api.Test;
 
 import com.fasterxml.jackson.databind.module.SimpleModule;
 
-class QuotaValueDeserializerTest {
+class QuotaLimitValueDeserializerTest {
 
     @Test
     void objectDeserializeShouldContainGivenValues() throws JsonExtractException {
         String payload = "{\"count\":52,\"size\":42}";
         ValidatedQuotaDTO actual = new JsonExtractor<>(ValidatedQuotaDTO.class,
             new SimpleModule()
-                .addDeserializer(QuotaCount.class, new QuotaValueDeserializer<>(QuotaCount.unlimited(), QuotaCount::count))
-                .addDeserializer(QuotaSize.class, new QuotaValueDeserializer<>(QuotaSize.unlimited(), QuotaSize::size))
+                .addDeserializer(QuotaCountLimit.class, new QuotaValueDeserializer<>(QuotaCountLimit.unlimited(), QuotaCountLimit::count))
+                .addDeserializer(QuotaSizeLimit.class, new QuotaValueDeserializer<>(QuotaSizeLimit.unlimited(), QuotaSizeLimit::size))
         ).parse(payload);
         Assertions.assertThat(actual)
             .isEqualTo(
                 ValidatedQuotaDTO
                     .builder()
-                    .count(java.util.Optional.of(QuotaCount.count(52)))
-                    .size(java.util.Optional.of(QuotaSize.size(42)))
+                    .count(java.util.Optional.of(QuotaCountLimit.count(52)))
+                    .size(java.util.Optional.of(QuotaSizeLimit.size(42)))
                     .build());
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java
index c22d39d..5c3f497 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/dto/UsersQuotaDetailsDTOTest.java
@@ -24,8 +24,10 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import javax.mail.internet.AddressException;
 
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.Quota;
 import org.junit.Test;
 
@@ -50,8 +52,8 @@ public class UsersQuotaDetailsDTOTest {
         Username username = Username.of("user@domain.org");
         QuotaDetailsDTO quotaDetailsDTO = QuotaDetailsDTO.builder()
                 .occupation(
-                        Quota.<QuotaSize>builder().used(QuotaSize.size(1)).computedLimit(QuotaSize.size(12)).build(),
-                        Quota.<QuotaCount>builder().used(QuotaCount.count(36)).computedLimit(QuotaCount.count(360)).build())
+                        Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(1)).computedLimit(QuotaSizeLimit.size(12)).build(),
+                        Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(36)).computedLimit(QuotaCountLimit.count(360)).build())
                 .build();
         UsersQuotaDetailsDTO usersQuotaDetailsDTO = UsersQuotaDetailsDTO.builder()
                 .user(username)
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java
index df823e3..ecba53b 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/DomainQuotaRoutesTest.java
@@ -27,8 +27,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.Map;
 
 import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.eclipse.jetty.http.HttpStatus;
@@ -80,7 +80,7 @@ class DomainQuotaRoutesTest {
     @Test
     void getCountShouldReturnStoredValue() throws Exception {
         int value = 42;
-        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCount.count(value));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(value));
 
         Long actual =
             given()
@@ -133,7 +133,7 @@ class DomainQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCount.unlimited());
+        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCountLimit.unlimited());
     }
 
     @Test
@@ -163,7 +163,7 @@ class DomainQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCount.count(42));
+        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCountLimit.count(42));
     }
 
     @Test
@@ -176,7 +176,7 @@ class DomainQuotaRoutesTest {
 
     @Test
     void deleteCountShouldSetQuotaToEmpty() throws Exception {
-        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCount.count(42));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(42));
 
         given()
             .delete(QUOTA_DOMAINS + "/" + FOUND_LOCAL.name() + "/" + COUNT)
@@ -205,7 +205,7 @@ class DomainQuotaRoutesTest {
     @Test
     void getSizeShouldReturnStoredValue() throws Exception {
         long value = 42;
-        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSize.size(value));
+        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSizeLimit.size(value));
 
         long quota =
             given()
@@ -258,7 +258,7 @@ class DomainQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSize.unlimited());
+        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSizeLimit.unlimited());
     }
 
     @Test
@@ -289,7 +289,7 @@ class DomainQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSize.size(42));
+        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSizeLimit.size(42));
     }
 
     @Test
@@ -302,7 +302,7 @@ class DomainQuotaRoutesTest {
 
     @Test
     void deleteSizeShouldSetQuotaToEmpty() throws Exception {
-        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSize.size(42));
+        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSizeLimit.size(42));
 
         given()
             .delete(QUOTA_DOMAINS + "/" + FOUND_LOCAL.name() + "/" + SIZE)
@@ -338,7 +338,7 @@ class DomainQuotaRoutesTest {
     @Test
     void getQuotaShouldReturnSizeWhenNoCount() throws Exception {
         int maxStorage = 42;
-        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSize.size(maxStorage));
+        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSizeLimit.size(maxStorage));
 
         String json =
             given()
@@ -360,7 +360,7 @@ class DomainQuotaRoutesTest {
     @Test
     void getQuotaShouldReturnBothWhenNoSize() throws Exception {
         int maxMessage = 42;
-        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCount.count(maxMessage));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(maxMessage));
 
         String json =
             given()
@@ -382,10 +382,10 @@ class DomainQuotaRoutesTest {
     @Test
     void getQuotaShouldDisplayScopesWhenUnlimited() throws Exception {
         int maxMessage = 42;
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.unlimited());
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(42));
-        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCount.count(maxMessage));
-        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSize.unlimited());
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.unlimited());
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(42));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(maxMessage));
+        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSizeLimit.unlimited());
 
         String json =
             given()
@@ -407,9 +407,9 @@ class DomainQuotaRoutesTest {
     @Test
     void getQuotaShouldDisplayScopedInformation() throws Exception {
         int maxMessage = 42;
-        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCount.count(maxMessage));
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(32));
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(36));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(maxMessage));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(32));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(36));
 
         String json =
             given()
@@ -444,17 +444,17 @@ class DomainQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCount.count(52));
-        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSize.size(42));
+        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCountLimit.count(52));
+        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSizeLimit.size(42));
     }
 
     @Test
     void putQuotaWithNegativeCountShouldFail() throws MailboxException {
-        maxQuotaManager.setDomainMaxMessage(TROUVÉ_COM, QuotaCount.count(52));
-        maxQuotaManager.setDomainMaxStorage(TROUVÉ_COM, QuotaSize.size(42));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(52));
+        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSizeLimit.size(42));
         Map<String, Object> errors = given()
             .body("{\"count\":-5,\"size\":30}")
-            .put(QUOTA_DOMAINS + "/" + TROUVÉ_COM.name())
+            .put(QUOTA_DOMAINS + "/" + FOUND_LOCAL.name())
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .contentType(ContentType.JSON)
@@ -471,26 +471,26 @@ class DomainQuotaRoutesTest {
 
     @Test
     void putQuotaWithNegativeCountShouldNotUpdatePreviousQuota() throws MailboxException {
-        maxQuotaManager.setDomainMaxMessage(TROUVÉ_COM, QuotaCount.count(52));
-        maxQuotaManager.setDomainMaxStorage(TROUVÉ_COM, QuotaSize.size(42));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(52));
+        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSizeLimit.size(42));
         given()
             .body("{\"count\":-5,\"size\":30}")
-            .put(QUOTA_DOMAINS + "/" + TROUVÉ_COM.name())
+            .put(QUOTA_DOMAINS + "/" + FOUND_LOCAL.name())
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .contentType(ContentType.JSON);
 
-        assertThat(maxQuotaManager.getDomainMaxMessage(TROUVÉ_COM)).contains(QuotaCount.count(52));
-        assertThat(maxQuotaManager.getDomainMaxStorage(TROUVÉ_COM)).contains(QuotaSize.size(42));
+        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCountLimit.count(52));
+        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSizeLimit.size(42));
     }
 
     @Test
     void putQuotaWithNegativeSizeShouldFail() throws MailboxException {
-        maxQuotaManager.setDomainMaxMessage(TROUVÉ_COM, QuotaCount.count(52));
-        maxQuotaManager.setDomainMaxStorage(TROUVÉ_COM, QuotaSize.size(42));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(52));
+        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSizeLimit.size(42));
         Map<String, Object> errors = given()
             .body("{\"count\":40,\"size\":-19}")
-            .put(QUOTA_DOMAINS + "/" + TROUVÉ_COM.name())
+            .put(QUOTA_DOMAINS + "/" + FOUND_LOCAL.name())
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .contentType(ContentType.JSON)
@@ -507,17 +507,17 @@ class DomainQuotaRoutesTest {
 
     @Test
     void putQuotaWithNegativeSizeShouldNotUpdatePreviousQuota() throws MailboxException {
-        maxQuotaManager.setDomainMaxMessage(TROUVÉ_COM, QuotaCount.count(52));
-        maxQuotaManager.setDomainMaxStorage(TROUVÉ_COM, QuotaSize.size(42));
+        maxQuotaManager.setDomainMaxMessage(FOUND_LOCAL, QuotaCountLimit.count(52));
+        maxQuotaManager.setDomainMaxStorage(FOUND_LOCAL, QuotaSizeLimit.size(42));
         given()
             .body("{\"count\":40,\"size\":-19}")
-            .put(QUOTA_DOMAINS + "/" + TROUVÉ_COM.name())
+            .put(QUOTA_DOMAINS + "/" + FOUND_LOCAL.name())
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .contentType(ContentType.JSON);
 
-        assertThat(maxQuotaManager.getDomainMaxMessage(TROUVÉ_COM)).contains(QuotaCount.count(52));
-        assertThat(maxQuotaManager.getDomainMaxStorage(TROUVÉ_COM)).contains(QuotaSize.size(42));
+        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCountLimit.count(52));
+        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSizeLimit.size(42));
     }
 
     @Test
@@ -554,7 +554,7 @@ class DomainQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSize.size(42));
+        assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).contains(QuotaSizeLimit.size(42));
         assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).isEmpty();
     }
 
@@ -574,7 +574,7 @@ class DomainQuotaRoutesTest {
             .statusCode(HttpStatus.NO_CONTENT_204);
 
         assertThat(maxQuotaManager.getDomainMaxStorage(FOUND_LOCAL)).isEmpty();
-        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCount.count(52));
+        assertThat(maxQuotaManager.getDomainMaxMessage(FOUND_LOCAL)).contains(QuotaCountLimit.count(52));
     }
 
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
index 2132646..f721f8e 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/GlobalQuotaRoutesTest.java
@@ -25,8 +25,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.Map;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.assertj.core.api.SoftAssertions;
 import org.eclipse.jetty.http.HttpStatus;
@@ -60,7 +60,7 @@ class GlobalQuotaRoutesTest {
     @Test
     void getCountShouldReturnStoredValue() throws Exception {
         int value = 42;
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(value));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(value));
 
         Long actual =
             when()
@@ -127,7 +127,7 @@ class GlobalQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCount.unlimited());
+        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCountLimit.unlimited());
     }
 
     @Test
@@ -139,12 +139,12 @@ class GlobalQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCount.count(42));
+        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCountLimit.count(42));
     }
 
     @Test
     void deleteCountShouldSetQuotaToUnlimited() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(42));
 
         when()
             .delete("/quota/count")
@@ -165,7 +165,7 @@ class GlobalQuotaRoutesTest {
     @Test
     void getSizeShouldReturnStoredValue() throws Exception {
         long value = 42;
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(value));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(value));
 
 
         long quota =
@@ -212,7 +212,7 @@ class GlobalQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSize.unlimited());
+        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSizeLimit.unlimited());
     }
 
     @Test
@@ -246,12 +246,12 @@ class GlobalQuotaRoutesTest {
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSize.size(42));
+        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSizeLimit.size(42));
     }
 
     @Test
     void deleteSizeShouldSetQuotaToUnlimited() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(42));
 
         when()
             .delete("/quota/count")
@@ -265,8 +265,8 @@ class GlobalQuotaRoutesTest {
     void getQuotaShouldReturnBothWhenValueSpecified() throws Exception {
         int maxStorage = 42;
         int maxMessage = 52;
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(maxStorage));
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(maxMessage));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(maxStorage));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(maxMessage));
 
         JsonPath jsonPath =
             when()
@@ -302,7 +302,7 @@ class GlobalQuotaRoutesTest {
 
     @Test
     void getQuotaShouldReturnOnlySizeWhenNoCount() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(42));
 
         JsonPath jsonPath =
             when()
@@ -322,7 +322,7 @@ class GlobalQuotaRoutesTest {
     @Test
     void getQuotaShouldReturnOnlyCountWhenNoSize() throws Exception {
         int maxMessage = 42;
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(maxMessage));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(maxMessage));
 
 
         JsonPath jsonPath =
@@ -350,8 +350,8 @@ class GlobalQuotaRoutesTest {
             .statusCode(HttpStatus.NO_CONTENT_204);
 
         SoftAssertions softly = new SoftAssertions();
-        softly.assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCount.count(52));
-        softly.assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSize.size(42));
+        softly.assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCountLimit.count(52));
+        softly.assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSizeLimit.size(42));
         softly.assertAll();
     }
 
@@ -365,15 +365,15 @@ class GlobalQuotaRoutesTest {
             .statusCode(HttpStatus.NO_CONTENT_204);
 
         SoftAssertions softly = new SoftAssertions();
-        softly.assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCount.unlimited());
-        softly.assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSize.unlimited());
+        softly.assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCountLimit.unlimited());
+        softly.assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSizeLimit.unlimited());
         softly.assertAll();
     }
 
     @Test
     void putQuotaWithNegativeCountShouldFail() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(43));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(43));
 
         Map<String, Object> errors = given()
             .body("{\"count\":-2,\"size\":43}")
@@ -395,8 +395,8 @@ class GlobalQuotaRoutesTest {
 
     @Test
     void putQuotaWithNegativeCountShouldNotUpdatePreviousQuota() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(43));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(43));
 
         given()
             .body("{\"count\":-2,\"size\":43}")
@@ -406,14 +406,14 @@ class GlobalQuotaRoutesTest {
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .contentType(ContentType.JSON);
 
-        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCount.count(42));
-        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSize.size(43));
+        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCountLimit.count(42));
+        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSizeLimit.size(43));
     }
 
     @Test
     void putQuotaWithNegativeSizeShouldFail() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(43));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(43));
 
         Map<String, Object> errors = given()
             .body("{\"count\":42,\"size\":-2}")
@@ -435,8 +435,8 @@ class GlobalQuotaRoutesTest {
 
     @Test
     void putQuotaWithNegativeSizeShouldNotUpdatePreviousQuota() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(43));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(42));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(43));
 
         given()
             .body("{\"count\":42,\"size\":-2}")
@@ -446,13 +446,13 @@ class GlobalQuotaRoutesTest {
             .statusCode(HttpStatus.BAD_REQUEST_400)
             .contentType(ContentType.JSON);
 
-        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCount.count(42));
-        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSize.size(43));
+        assertThat(maxQuotaManager.getGlobalMaxMessage()).contains(QuotaCountLimit.count(42));
+        assertThat(maxQuotaManager.getGlobalMaxStorage()).contains(QuotaSizeLimit.size(43));
     }
 
     @Test
     void putQuotaShouldUnsetCountWhenNull() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(42));
         given()
             .body("{\"count\":null,\"size\":43}")
         .when()
@@ -465,7 +465,7 @@ class GlobalQuotaRoutesTest {
 
     @Test
     void putQuotaShouldUnsetSizeWhenNull() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(44));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(44));
         given()
             .body("{\"count\":45,\"size\":null}")
         .when()
@@ -478,7 +478,7 @@ class GlobalQuotaRoutesTest {
 
     @Test
     void putQuotaShouldUnsetCountWhenAbsent() throws Exception {
-        maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(42));
+        maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(42));
         given()
             .body("{\"size\":43}")
         .when()
@@ -491,7 +491,7 @@ class GlobalQuotaRoutesTest {
 
     @Test
     void putQuotaShouldUnsetSizeWhenAbsent() throws Exception {
-        maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(44));
+        maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(44));
         given()
             .body("{\"count\":45}")
         .when()
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
index 8841e27..c98a4fd 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
@@ -35,8 +35,8 @@ import java.util.Map;
 
 import org.apache.james.core.Domain;
 import org.apache.james.core.Username;
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
@@ -175,7 +175,7 @@ class UserQuotaRoutesTest {
         default void getUsersQuotaShouldFilterOnMinOccupationRatio(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
 
-            maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(100));
+            maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(100));
             appendMessage(testSystem.getQuotaSearchTestSystem(), BOB, withSize(49));
             appendMessage(testSystem.getQuotaSearchTestSystem(), JACK, withSize(50));
             appendMessage(testSystem.getQuotaSearchTestSystem(), GUY_WITH_STRANGE_DOMAIN, withSize(51));
@@ -198,7 +198,7 @@ class UserQuotaRoutesTest {
         default void getUsersQuotaShouldFilterOnMaxOccupationRatio(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
 
-            maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(100));
+            maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(100));
             appendMessage(testSystem.getQuotaSearchTestSystem(), BOB, withSize(49));
             appendMessage(testSystem.getQuotaSearchTestSystem(), JACK, withSize(50));
             appendMessage(testSystem.getQuotaSearchTestSystem(), GUY_WITH_STRANGE_DOMAIN, withSize(51));
@@ -221,7 +221,7 @@ class UserQuotaRoutesTest {
         default void getUsersQuotaShouldOrderByUsername(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
 
-            maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(100));
+            maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(100));
             appendMessage(testSystem.getQuotaSearchTestSystem(), GUY_WITH_STRANGE_DOMAIN, withSize(51));
             appendMessage(testSystem.getQuotaSearchTestSystem(), JACK, withSize(50));
             appendMessage(testSystem.getQuotaSearchTestSystem(), BOB, withSize(49));
@@ -385,7 +385,7 @@ class UserQuotaRoutesTest {
         default void getUsersQuotaShouldReturnUserDetails(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
 
-            maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(100));
+            maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(100));
             appendMessage(testSystem.getQuotaSearchTestSystem(), BOB, withSize(10));
             appendMessage(testSystem.getQuotaSearchTestSystem(), JACK, withSize(11));
             appendMessage(testSystem.getQuotaSearchTestSystem(), GUY_WITH_STRANGE_DOMAIN, withSize(50));
@@ -487,7 +487,7 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(value));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(value));
 
             Long actual =
                 given()
@@ -527,7 +527,7 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(value));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(value));
 
 
             long quota =
@@ -597,7 +597,7 @@ class UserQuotaRoutesTest {
             .then()
                 .statusCode(HttpStatus.NO_CONTENT_204);
 
-            assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB))).contains(QuotaCount.unlimited());
+            assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB))).contains(QuotaCountLimit.unlimited());
         }
 
         @Test
@@ -630,7 +630,7 @@ class UserQuotaRoutesTest {
             .then()
                 .statusCode(HttpStatus.NO_CONTENT_204);
 
-            assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB))).contains(QuotaCount.count(42));
+            assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB))).contains(QuotaCountLimit.count(42));
         }
 
         @Test
@@ -704,7 +704,7 @@ class UserQuotaRoutesTest {
                 .statusCode(HttpStatus.NO_CONTENT_204);
 
             assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaSize.unlimited());
+                .contains(QuotaSizeLimit.unlimited());
         }
 
         @Test
@@ -737,7 +737,7 @@ class UserQuotaRoutesTest {
             .then()
                 .statusCode(HttpStatus.NO_CONTENT_204);
 
-            assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB))).contains(QuotaSize.size(42));
+            assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB))).contains(QuotaSizeLimit.size(42));
         }
     }
 
@@ -757,7 +757,7 @@ class UserQuotaRoutesTest {
         void deleteCountShouldSetQuotaToEmpty(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(42));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(42));
 
             with()
                 .delete(QUOTA_USERS + "/" + BOB.asString() + "/" + COUNT)
@@ -784,7 +784,7 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(42));
 
             with()
                 .delete(QUOTA_USERS + "/" + BOB.asString() + "/" + SIZE)
@@ -811,12 +811,12 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(1111));
-            maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(22));
-            maxQuotaManager.setDomainMaxStorage(Domain.of(LOST_LOCAL), QuotaSize.size(34));
-            maxQuotaManager.setDomainMaxMessage(Domain.of(LOST_LOCAL), QuotaCount.count(23));
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
+            maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(1111));
+            maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(22));
+            maxQuotaManager.setDomainMaxStorage(Domain.of(LOST_LOCAL), QuotaSizeLimit.size(34));
+            maxQuotaManager.setDomainMaxMessage(Domain.of(LOST_LOCAL), QuotaCountLimit.count(23));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(42));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(52));
 
             JsonPath jsonPath =
                 when()
@@ -845,8 +845,8 @@ class UserQuotaRoutesTest {
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
             InMemoryCurrentQuotaManager currentQuotaManager = testSystem.getQuotaSearchTestSystem().getCurrentQuotaManager();
 
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(80));
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(100));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(80));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(100));
             currentQuotaManager.increase(userQuotaRootResolver.forUser(BOB), 20, 40);
 
             JsonPath jsonPath =
@@ -873,8 +873,8 @@ class UserQuotaRoutesTest {
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
             InMemoryCurrentQuotaManager currentQuotaManager = testSystem.getQuotaSearchTestSystem().getCurrentQuotaManager();
 
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.unlimited());
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.unlimited());
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.unlimited());
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.unlimited());
             currentQuotaManager.increase(userQuotaRootResolver.forUser(BOB), 20, 40);
 
             JsonPath jsonPath =
@@ -900,9 +900,9 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(1111));
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(18));
-            maxQuotaManager.setDomainMaxMessage(Domain.of(LOST_LOCAL), QuotaCount.count(52));
+            maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(1111));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(18));
+            maxQuotaManager.setDomainMaxMessage(Domain.of(LOST_LOCAL), QuotaCountLimit.count(52));
 
             JsonPath jsonPath =
                 when()
@@ -929,8 +929,8 @@ class UserQuotaRoutesTest {
         public void getQuotaShouldReturnGlobalValuesWhenNoUserValuesDefined(WebAdminQuotaSearchTestSystem testSystem) throws Exception {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
 
-            maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(1111));
-            maxQuotaManager.setGlobalMaxMessage(QuotaCount.count(12));
+            maxQuotaManager.setGlobalMaxStorage(QuotaSizeLimit.size(1111));
+            maxQuotaManager.setGlobalMaxMessage(QuotaCountLimit.count(12));
 
             JsonPath jsonPath =
                 when()
@@ -958,8 +958,8 @@ class UserQuotaRoutesTest {
 
             int maxStorage = 42;
             int maxMessage = 52;
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(maxStorage));
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(maxMessage));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(maxStorage));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(maxMessage));
 
             JsonPath jsonPath =
                 when()
@@ -999,7 +999,7 @@ class UserQuotaRoutesTest {
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
             int maxStorage = 42;
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(maxStorage));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(maxStorage));
 
             JsonPath jsonPath =
                 when()
@@ -1022,7 +1022,7 @@ class UserQuotaRoutesTest {
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
             int maxMessage = 42;
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(maxMessage));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(maxMessage));
 
 
             JsonPath jsonPath =
@@ -1058,8 +1058,8 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(52));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(42));
 
             Map<String, Object> errors = with()
                 .body("{\"count\":-2,\"size\":42}")
@@ -1083,8 +1083,8 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(52));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(42));
 
             with()
                 .body("{\"count\":-2,\"size\":42}")
@@ -1095,9 +1095,9 @@ class UserQuotaRoutesTest {
 
             SoftAssertions softly = new SoftAssertions();
             softly.assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaCount.count(52));
+                .contains(QuotaCountLimit.count(52));
             softly.assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaSize.size(42));
+                .contains(QuotaSizeLimit.size(42));
             softly.assertAll();
         }
 
@@ -1106,8 +1106,8 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(52));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(42));
 
             Map<String, Object> errors = with()
                 .body("{\"count\":52,\"size\":-3}")
@@ -1131,8 +1131,8 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(52));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(42));
 
             with()
                 .body("{\"count\":52,\"size\":-3}")
@@ -1143,9 +1143,9 @@ class UserQuotaRoutesTest {
 
             SoftAssertions softly = new SoftAssertions();
             softly.assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaCount.count(52));
+                .contains(QuotaCountLimit.count(52));
             softly.assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaSize.size(42));
+                .contains(QuotaSizeLimit.size(42));
             softly.assertAll();
         }
 
@@ -1162,9 +1162,9 @@ class UserQuotaRoutesTest {
 
             SoftAssertions softly = new SoftAssertions();
             softly.assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaCount.count(52));
+                .contains(QuotaCountLimit.count(52));
             softly.assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaSize.size(42));
+                .contains(QuotaSizeLimit.size(42));
             softly.assertAll();
         }
 
@@ -1181,9 +1181,9 @@ class UserQuotaRoutesTest {
 
             SoftAssertions softly = new SoftAssertions();
             softly.assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaCount.count(52));
+                .contains(QuotaCountLimit.count(52));
             softly.assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaSize.size(42));
+                .contains(QuotaSizeLimit.size(42));
             softly.assertAll();
         }
 
@@ -1192,7 +1192,7 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(52));
+            maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCountLimit.count(52));
 
             with()
                 .body("{\"count\":null,\"size\":42}")
@@ -1204,7 +1204,7 @@ class UserQuotaRoutesTest {
             softly.assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
                 .isEmpty();
             softly.assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaSize.size(42));
+                .contains(QuotaSizeLimit.size(42));
             softly.assertAll();
         }
 
@@ -1213,7 +1213,7 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(42));
 
             with()
                 .body("{\"count\":52,\"size\":null}")
@@ -1223,7 +1223,7 @@ class UserQuotaRoutesTest {
 
             SoftAssertions softly = new SoftAssertions();
             softly.assertThat(maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(BOB)))
-                .contains(QuotaCount.count(52));
+                .contains(QuotaCountLimit.count(52));
             softly.assertThat(maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(BOB)))
                 .isEmpty();
             softly.assertAll();
@@ -1234,7 +1234,7 @@ class UserQuotaRoutesTest {
             MaxQuotaManager maxQuotaManager = testSystem.getQuotaSearchTestSystem().getMaxQuotaManager();
             UserQuotaRootResolver userQuotaRootResolver = testSystem.getQuotaSearchTestSystem().getQuotaRootResolver();
 
-            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(42));
+            maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSizeLimit.size(42));
 
             with()
                 .body("{\"count\":null,\"size\":null}")
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/validation/QuotaValueTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/validation/QuotaLimitValueTest.java
similarity index 92%
rename from server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/validation/QuotaValueTest.java
rename to server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/validation/QuotaLimitValueTest.java
index 23f88ce..4535f39 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/validation/QuotaValueTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/validation/QuotaLimitValueTest.java
@@ -22,13 +22,13 @@ package org.apache.james.webadmin.validation;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.core.quota.QuotaCount;
-import org.apache.james.core.quota.QuotaSize;
+import org.apache.james.core.quota.QuotaCountLimit;
+import org.apache.james.core.quota.QuotaSizeLimit;
 import org.junit.jupiter.api.Test;
 
 import spark.HaltException;
 
-class QuotaValueTest {
+class QuotaLimitValueTest {
 
     @Test
     void quotaCountShouldThrowWhenNotANumber() {
@@ -50,7 +50,7 @@ class QuotaValueTest {
 
     @Test
     void quotaCountShouldBeUnlimitedOnMinusOne() {
-        assertThat(Quotas.quotaCount("-1")).isEqualTo(QuotaCount.unlimited());
+        assertThat(Quotas.quotaCount("-1")).isEqualTo(QuotaCountLimit.unlimited());
     }
 
     @Test
@@ -79,7 +79,7 @@ class QuotaValueTest {
 
     @Test
     void quotaSizeShouldBeUnlimitedOnMinusOne() {
-        assertThat(Quotas.quotaSize("-1")).isEqualTo(QuotaSize.unlimited());
+        assertThat(Quotas.quotaSize("-1")).isEqualTo(QuotaSizeLimit.unlimited());
 
     }
 


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


[james-project] 41/43: JAMES-2964 simplify quota usage domain object to better represent the domain

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

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

commit 67e2b38fddb697f575b794fd719673b5a3c20145
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Thu Nov 7 14:11:04 2019 +0100

    JAMES-2964 simplify quota usage domain object to better represent the domain
---
 .../apache/james/core/quota/QuotaCountUsage.java   | 37 ++++----------------
 .../apache/james/core/quota/QuotaSizeUsage.java    | 39 ++++------------------
 .../apache/james/core/quota/QuotaUsageValue.java   | 14 --------
 .../james/core/quota/QuotaUsageValueTest.java      | 15 ---------
 .../mailbox/model/SerializableQuotaUsageValue.java | 24 +++----------
 .../apache/james/event/json/EventSerializer.scala  |  4 +--
 .../james/event/json/dtos/QuotaCountTest.java      | 12 -------
 .../james/event/json/dtos/QuotaSizeTest.java       | 12 -------
 .../java/org/apache/james/cli/ServerCmdTest.java   |  4 +--
 9 files changed, 21 insertions(+), 140 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java b/core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java
index 7e67f1b..10e2818 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaCountUsage.java
@@ -18,63 +18,40 @@
  ****************************************************************/
 package org.apache.james.core.quota;
 
-import java.util.Optional;
-
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 
 public class QuotaCountUsage implements QuotaUsageValue<QuotaCountUsage, QuotaCountLimit> {
 
-    public static QuotaCountUsage unlimited() {
-        return new QuotaCountUsage(Optional.empty());
-    }
-
     public static QuotaCountUsage count(long value) {
-        return count(Optional.of(value));
-    }
-
-    public static QuotaCountUsage count(Optional<Long> value) {
         return new QuotaCountUsage(value);
     }
 
-    private final Optional<Long> value;
+    private final Long value;
 
-    private QuotaCountUsage(Optional<Long> value) {
+    private QuotaCountUsage(Long value) {
         this.value = value;
     }
 
     @Override
     public long asLong() {
-        return value.orElseThrow(IllegalStateException::new);
-    }
-
-    @Override
-    public boolean isLimited() {
-        return value.isPresent();
+        return value;
     }
 
     @Override
     public QuotaCountUsage add(long additionalValue) {
-        return new QuotaCountUsage(value.map(x -> x + additionalValue));
+        return new QuotaCountUsage(value + additionalValue);
     }
 
     @Override
     public QuotaCountUsage add(QuotaCountUsage additionalValue) {
-        if (additionalValue.isUnlimited()) {
-            return unlimited();
-        }
-        return new QuotaCountUsage(value.map(x -> x + additionalValue.asLong()));
-    }
-
-    @Override
-    public boolean greaterThan(QuotaCountUsage other) {
-        return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
+        return new QuotaCountUsage(value + additionalValue.asLong());
     }
 
     @Override
     public boolean exceedLimit(QuotaCountLimit limit) {
         if (limit.isLimited()) {
-            return value.orElse(Long.MAX_VALUE) > limit.asLong();
+            return value > limit.asLong();
         } else {
             return false;
         }
@@ -83,7 +60,7 @@ public class QuotaCountUsage implements QuotaUsageValue<QuotaCountUsage, QuotaCo
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("value", value.map(String::valueOf).orElse("unlimited"))
+            .add("value", value.toString())
             .toString();
     }
 
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java b/core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java
index 7bc74fb..d3ccfc5 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaSizeUsage.java
@@ -18,65 +18,40 @@
  ****************************************************************/
 package org.apache.james.core.quota;
 
-import java.util.Optional;
-
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 
 public class QuotaSizeUsage implements QuotaUsageValue<QuotaSizeUsage, QuotaSizeLimit> {
 
-    public static final QuotaSizeUsage QUOTA_SIZE = new QuotaSizeUsage(Optional.empty());
-
-    public static QuotaSizeUsage unlimited() {
-        return QUOTA_SIZE;
-    }
-
     public static QuotaSizeUsage size(long value) {
-        return size(Optional.of(value));
-    }
-
-    public static QuotaSizeUsage size(Optional<Long> value) {
         return new QuotaSizeUsage(value);
     }
 
-    private final Optional<Long> value;
+    private final Long value;
 
-    private QuotaSizeUsage(Optional<Long> value) {
+    private QuotaSizeUsage(Long value) {
         this.value = value;
     }
 
     @Override
     public long asLong() {
-        return value.orElseThrow(IllegalStateException::new);
-    }
-
-    @Override
-    public boolean isLimited() {
-        return value.isPresent();
+        return value;
     }
 
     @Override
     public QuotaSizeUsage add(long additionalValue) {
-        return new QuotaSizeUsage(value.map(x -> x + additionalValue));
+        return new QuotaSizeUsage(value + additionalValue);
     }
 
     @Override
     public QuotaSizeUsage add(QuotaSizeUsage additionalValue) {
-        if (additionalValue.isUnlimited()) {
-            return unlimited();
-        }
-        return new QuotaSizeUsage(value.map(x -> x + additionalValue.asLong()));
-    }
-
-    @Override
-    public boolean greaterThan(QuotaSizeUsage other) {
-        return value.orElse(Long.MAX_VALUE) > other.value.orElse(Long.MAX_VALUE);
+        return new QuotaSizeUsage(value + additionalValue.asLong());
     }
 
     @Override
     public boolean exceedLimit(QuotaSizeLimit limit) {
         if (limit.isLimited()) {
-            return value.orElse(Long.MAX_VALUE) > limit.asLong();
+            return value > limit.asLong();
         } else {
             return false;
         }
@@ -85,7 +60,7 @@ public class QuotaSizeUsage implements QuotaUsageValue<QuotaSizeUsage, QuotaSize
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("value", value.map(String::valueOf).orElse("unlimited"))
+            .add("value", value.toString())
             .toString();
     }
 
diff --git a/core/src/main/java/org/apache/james/core/quota/QuotaUsageValue.java b/core/src/main/java/org/apache/james/core/quota/QuotaUsageValue.java
index d96d55d..1b28868 100644
--- a/core/src/main/java/org/apache/james/core/quota/QuotaUsageValue.java
+++ b/core/src/main/java/org/apache/james/core/quota/QuotaUsageValue.java
@@ -18,27 +18,13 @@
  ****************************************************************/
 package org.apache.james.core.quota;
 
-import java.util.Optional;
-
 public interface QuotaUsageValue<T extends QuotaUsageValue<T, U>, U extends QuotaLimitValue<U>> {
 
-    static boolean isValidValue(Optional<Long> value) {
-        return !value.isPresent() || value.get() >= -1;
-    }
-
     long asLong();
 
-    boolean isLimited();
-
-    default boolean isUnlimited() {
-        return !isLimited();
-    }
-
     T add(long additionalValue);
 
     T add(T additionalValue);
 
-    boolean greaterThan(T other);
-
     boolean exceedLimit(U limit);
 }
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java
index 8e4ddce..4deb73b 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaUsageValueTest.java
@@ -31,21 +31,6 @@ public interface QuotaUsageValueTest<T extends QuotaLimitValue<T>, U extends Quo
     T unlimited();
 
     @Test
-    default void greaterThanShouldReturnFalseWhenFirstEqualToSecond() {
-        assertThat(usageInstance(1).greaterThan(usageInstance(1))).isFalse();
-    }
-
-    @Test
-    default void greaterThanShouldReturnFalseWhenFirstSmallerThanSecond() {
-        assertThat(usageInstance(1).greaterThan(usageInstance(2))).isFalse();
-    }
-
-    @Test
-    default void greaterThanShouldReturnTrueWhenFirstGreaterThanSecond() {
-        assertThat(usageInstance(2).greaterThan(usageInstance(1))).isTrue();
-    }
-
-    @Test
     default void greaterThanShouldReturnFalseWhenUsageEqualToLimit() {
         assertThat(usageInstance(1).exceedLimit(limitInstance(1))).isFalse();
     }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaUsageValue.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaUsageValue.java
index d62bc71..eb8f444 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaUsageValue.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SerializableQuotaUsageValue.java
@@ -22,7 +22,6 @@ package org.apache.james.mailbox.model;
 import java.io.Serializable;
 import java.util.Objects;
 import java.util.Optional;
-import java.util.function.Function;
 
 import org.apache.james.core.quota.QuotaLimitValue;
 import org.apache.james.core.quota.QuotaUsageValue;
@@ -32,16 +31,11 @@ import com.google.common.base.MoreObjects;
 public class SerializableQuotaUsageValue<T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> implements Serializable {
 
     public static <T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> SerializableQuotaUsageValue<T, U> valueOf(Optional<U> input) {
-        return new SerializableQuotaUsageValue<T, U>(input.orElse(null));
+        return new SerializableQuotaUsageValue<>(input.orElse(null));
     }
 
-    public static final long UNLIMITED = -1;
-
     private static <T extends QuotaLimitValue<T>, U extends QuotaUsageValue<U, T>> Long encodeAsLong(U quota) {
-        if (quota.isLimited()) {
-            return quota.asLong();
-        }
-        return UNLIMITED;
+        return quota.asLong();
     }
 
     private final Long value;
@@ -58,21 +52,10 @@ public class SerializableQuotaUsageValue<T extends QuotaLimitValue<T>, U extends
         return value;
     }
 
-    public Optional<U> toValue(Function<Long, U> factory, U unlimited) {
-        Long longValue = encodeAsLong();
-        if (longValue == null) {
-            return Optional.empty();
-        }
-        if (longValue == UNLIMITED) {
-            return Optional.of(unlimited);
-        }
-        return Optional.of(factory.apply(longValue));
-    }
-
     @Override
     public boolean equals(Object o) {
         if (o instanceof SerializableQuotaUsageValue<?, ?>) {
-            SerializableQuotaUsageValue<?, ?> that = (SerializableQuotaUsageValue<?,?>) o;
+            SerializableQuotaUsageValue<?, ?> that = (SerializableQuotaUsageValue<?, ?>) o;
             return Objects.equals(value, that.value);
         }
         return false;
@@ -89,4 +72,5 @@ public class SerializableQuotaUsageValue<T extends QuotaLimitValue<T>, U extends
             .add("value", value)
             .toString();
     }
+
 }
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 be52b08..87b6e21 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
@@ -205,7 +205,7 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
   implicit val systemFlagsWrites: Writes[SystemFlag] = Writes.enumNameWrites
   implicit val userWriters: Writes[Username] = (user: Username) => JsString(user.asString)
   implicit val quotaRootWrites: Writes[QuotaRoot] = quotaRoot => JsString(quotaRoot.getValue)
-  implicit val quotaUsageValueWrites: Writes[QuotaUsageValue[_, _]] = value => if (value.isUnlimited) JsNull else JsNumber(value.asLong())
+  implicit val quotaUsageValueWrites: Writes[QuotaUsageValue[_, _]] = value => JsNumber(value.asLong())
   implicit val quotaLimitValueWrites: Writes[QuotaLimitValue[_]] = value => if (value.isUnlimited) JsNull else JsNumber(value.asLong())
   implicit val quotaScopeWrites: Writes[JavaQuota.Scope] = value => JsString(value.name)
   implicit val quotaCountWrites: Writes[Quota[QuotaCountLimit, QuotaCountUsage]] = Json.writes[Quota[QuotaCountLimit, QuotaCountUsage]]
@@ -246,7 +246,6 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
   }
   implicit val quotaCountUsageReads: Reads[QuotaCountUsage] = {
     case JsNumber(count) => JsSuccess(QuotaCountUsage.count(count.toLong))
-    case JsNull => JsSuccess(QuotaCountUsage.unlimited())
     case _ => JsError()
   }
   implicit val quotaRootReads: Reads[QuotaRoot] = {
@@ -264,7 +263,6 @@ class JsonSerialize(mailboxIdFactory: MailboxId.Factory, messageIdFactory: Messa
   }
   implicit val quotaSizeUsageReads: Reads[QuotaSizeUsage] = {
     case JsNumber(size) => JsSuccess(QuotaSizeUsage.size(size.toLong))
-    case JsNull => JsSuccess(QuotaSizeUsage.unlimited())
     case _ => JsError()
   }
   implicit val sessionIdReads: Reads[SessionId] = {
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java
index 80191db..43cb574 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaCountTest.java
@@ -82,18 +82,6 @@ class QuotaCountTest {
     }
 
     @Test
-    void quotaCountUsageShouldBeWellSerializedWhenUnlimited() {
-        assertThat(DTO_JSON_SERIALIZE.quotaUsageValueWrites().writes(QuotaCountUsage.unlimited()))
-            .isEqualTo(JsNull$.MODULE$);
-    }
-
-    @Test
-    void quotaCountUsageShouldBeWellDeSerializedWhenUnUnlimited() {
-        assertThat(DTO_JSON_SERIALIZE.quotaCountUsageReads().reads(JsNull$.MODULE$).get())
-            .isEqualTo(QuotaCountUsage.unlimited());
-    }
-
-    @Test
     void quotaCountUsageShouldReturnErrorWhenString() {
         assertThat(DTO_JSON_SERIALIZE.quotaCountUsageReads().reads(new JsString("18")))
             .isInstanceOf(JsError.class);
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java
index ad2d54a..cdb800b 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/QuotaSizeTest.java
@@ -81,18 +81,6 @@ class QuotaSizeTest {
     }
 
     @Test
-    void quotaSizeUsageShouldBeWellSerializedWhenUnlimited() {
-        assertThat(DTO_JSON_SERIALIZE.quotaUsageValueWrites().writes(QuotaSizeUsage.unlimited()))
-            .isEqualTo(JsNull$.MODULE$);
-    }
-
-    @Test
-    void quotaSizeUsageShouldBeWellDeSerializedWhenUnlimited() {
-        assertThat(DTO_JSON_SERIALIZE.quotaSizeUsageReads().reads(JsNull$.MODULE$).get())
-            .isEqualTo(QuotaSizeUsage.unlimited());
-    }
-
-    @Test
     void quotaSizeUsageShouldReturnErrorWhenString() {
         assertThat(DTO_JSON_SERIALIZE.quotaSizeUsageReads().reads(new JsString("18")))
             .isInstanceOf(JsError.class);
diff --git a/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java b/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
index ce70e3b..ddba90a 100644
--- a/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
+++ b/server/container/cli/src/test/java/org/apache/james/cli/ServerCmdTest.java
@@ -491,7 +491,7 @@ public class ServerCmdTest {
         String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.GETSTORAGEQUOTA.getCommand(), quotaroot};
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
-        when(quotaProbe.getStorageQuota(quotaroot)).thenReturn(SerializableQuota.newInstance(QuotaSizeUsage.unlimited(), QuotaSizeLimit.size(12)));
+        when(quotaProbe.getStorageQuota(quotaroot)).thenReturn(SerializableQuota.newInstance(QuotaSizeUsage.size(12), QuotaSizeLimit.unlimited()));
 
         testee.executeCommandLine(commandLine);
     }
@@ -502,7 +502,7 @@ public class ServerCmdTest {
         String[] arguments = { "-h", "127.0.0.1", "-p", "9999", CmdType.GETMESSAGECOUNTQUOTA.getCommand(), quotaroot};
         CommandLine commandLine = ServerCmd.parseCommandLine(arguments);
 
-        when(quotaProbe.getMessageCountQuota(quotaroot)).thenReturn(SerializableQuota.newInstance(QuotaCountUsage.unlimited(), QuotaCountLimit.count(12)));
+        when(quotaProbe.getMessageCountQuota(quotaroot)).thenReturn(SerializableQuota.newInstance(QuotaCountUsage.count(12), QuotaCountLimit.unlimited()));
 
         testee.executeCommandLine(commandLine);
     }


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


[james-project] 02/43: [Refactoring] Remove unused MailetUtil::normalizeSubject method

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

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

commit a8e68044afbbed9391ea64c6d2b037bf0f061f1b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 17 11:28:00 2019 +0700

    [Refactoring] Remove unused MailetUtil::normalizeSubject method
---
 .../java/org/apache/mailet/base/MailetUtil.java    | 62 +---------------------
 1 file changed, 1 insertion(+), 61 deletions(-)

diff --git a/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java b/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
index 238fa7b..3174215 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
@@ -17,82 +17,22 @@
  * under the License.                                           *
  ****************************************************************/
 
-
-
 package org.apache.mailet.base;
 
 import java.util.Optional;
+
 import javax.mail.MessagingException;
 
 import org.apache.mailet.MailetConfig;
 
 import com.google.common.base.Strings;
 
-
 /**
  * Collects utility methods.
  */
 public class MailetUtil {
     
     /**
-     * <p>This takes the subject string and reduces (normailzes) it.
-     * Multiple "Re:" entries are reduced to one, and capitalized.  The
-     * prefix is always moved/placed at the beginning of the line, and
-     * extra blanks are reduced, so that the output is always of the
-     * form:</p>
-     * <code>
-     * &lt;prefix&gt; + &lt;one-optional-"Re:"*gt; + &lt;remaining subject&gt;
-     * </code>
-     * <p>I have done extensive testing of this routine with a standalone
-     * driver, and am leaving the commented out debug messages so that
-     * when someone decides to enhance this method, it can be yanked it
-     * from this file, embedded it with a test driver, and the comments
-     * enabled.</p>
-     */
-    public static String normalizeSubject(String subj, String prefix) {
-        StringBuilder subject = new StringBuilder(subj);
-        int prefixLength = prefix.length();
-
-        // If the "prefix" is not at the beginning the subject line, remove it
-        int index = subject.indexOf(prefix);
-        if (index != 0) {
-
-            if (index > 0) {
-                subject.delete(index, index + prefixLength);
-            }
-            subject.insert(0, prefix); // insert prefix at the front
-        }
-
-        // Replace Re: with RE:
-        String match = "Re:";
-        index = subject.indexOf(match, prefixLength);
-
-        while (index > -1) {
-            subject.replace(index, index + match.length(), "RE:");
-            index = subject.indexOf(match, prefixLength);
-        }
-
-        // Reduce them to one at the beginning
-        match = "RE:";
-        int indexRE = subject.indexOf(match, prefixLength) + match.length();
-        index = subject.indexOf(match, indexRE);
-        while (index > 0) {
-            subject.delete(index, index + match.length());
-            index = subject.indexOf(match, indexRE);
-        }
-
-        // Reduce blanks
-        match = "  ";
-        index = subject.indexOf(match, prefixLength);
-        while (index > -1) {
-            subject.replace(index, index + match.length(), " ");
-            index = subject.indexOf(match, prefixLength);
-        }
-        return subject.toString();
-    }
-
-    
-    /**
      * <p>Gets a boolean valued init parameter.</p>
      * @param config not null
      * @param name name of the init parameter to be queried


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


[james-project] 01/43: JAMES-2983 Add MailboxId as part of MailboxResponse

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

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

commit f26059ef6abbc29d37d4f07fef74318bae91e439
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 18 11:58:48 2019 +0700

    JAMES-2983 Add MailboxId as part of MailboxResponse
    
    Currently, several webAdmin APIs relies on mailboxId in their endpoints.
    
    That is a good choice, as mailboxId is immutable and thus more predictable than mailboxPath.
    
    However, mailboxId is not directly exposed to the end user, who can get confused.
    
    Currently, using webadmin, I have no way of linking mailboxPath and mailboxId
    
    Proposal is to add mailboxId as part of the MailboxResponse object.
---
 .../apache/james/webadmin/dto/MailboxResponse.java    | 10 +++++++++-
 .../james/webadmin/service/UserMailboxesService.java  |  2 +-
 .../webadmin/routes/UserMailboxesRoutesTest.java      | 19 ++++++++++++++++---
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/MailboxResponse.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/MailboxResponse.java
index b552f45..a98a421 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/MailboxResponse.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/MailboxResponse.java
@@ -19,15 +19,23 @@
 
 package org.apache.james.webadmin.dto;
 
+import org.apache.james.mailbox.model.MailboxId;
+
 public class MailboxResponse {
 
     private final String mailboxName;
+    private final MailboxId mailboxId;
 
-    public MailboxResponse(String mailboxName) {
+    public MailboxResponse(String mailboxName, MailboxId mailboxId) {
         this.mailboxName = mailboxName;
+        this.mailboxId = mailboxId;
     }
 
     public String getMailboxName() {
         return mailboxName;
     }
+
+    public String getMailboxId() {
+        return mailboxId.serialize();
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
index b8b36dc..7b25ba1 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserMailboxesService.java
@@ -82,7 +82,7 @@ public class UserMailboxesService {
         usernamePreconditions(username);
         MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
         return listUserMailboxes(mailboxSession)
-            .map(mailboxMetaData -> new MailboxResponse(mailboxMetaData.getPath().getName()))
+            .map(mailboxMetaData -> new MailboxResponse(mailboxMetaData.getPath().getName(), mailboxMetaData.getId()))
             .collect(Guavate.toImmutableList());
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index aa08e5c..4e636ca 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -25,6 +25,7 @@ import static org.apache.james.webadmin.Constants.SEPARATOR;
 import static org.apache.james.webadmin.routes.UserMailboxesRoutes.USERS_BASE;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
@@ -495,7 +496,9 @@ class UserMailboxesRoutesTest {
                 .get()
             .then()
                 .statusCode(HttpStatus.OK_200)
-                .body(is("[{\"mailboxName\":\"myMailboxName\"}]"));
+                .body(".", hasSize(1))
+                .body("[0].mailboxName", is("myMailboxName"))
+                .body("[0].mailboxId", is("1"));
         }
 
         @Test
@@ -676,7 +679,12 @@ class UserMailboxesRoutesTest {
                     .jsonPath()
                     .getList(".");
 
-            assertThat(list).containsExactly(ImmutableMap.of("mailboxName", mailboxName));
+            assertThat(list)
+                .hasSize(1)
+                .first()
+                .satisfies(map -> assertThat(map).hasSize(2)
+                    .containsKeys("mailboxId")
+                    .containsEntry("mailboxName", mailboxName));
         }
 
         @Test
@@ -715,7 +723,12 @@ class UserMailboxesRoutesTest {
                     .jsonPath()
                     .getList(".");
 
-            assertThat(list).containsExactly(ImmutableMap.of("mailboxName", MAILBOX_NAME));
+            assertThat(list)
+                .hasSize(1)
+                .first()
+                .satisfies(map -> assertThat(map).hasSize(2)
+                    .containsKeys("mailboxId")
+                    .containsEntry("mailboxName", MAILBOX_NAME));
         }
     }
 


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


[james-project] 14/43: [Refactoring] Avoid anonymous MailboxMessage in ListMessageAssertTest

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

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

commit 0862f25869f57e41d63e1fae609b4a428d386e63
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Nov 16 12:38:23 2019 +0700

    [Refactoring] Avoid anonymous MailboxMessage in ListMessageAssertTest
---
 .../store/mail/model/ListMessageAssertTest.java    | 154 ++-------------------
 1 file changed, 8 insertions(+), 146 deletions(-)

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 516f39e..0d51755 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
@@ -22,7 +22,7 @@ package org.apache.james.mailbox.store.mail.model;
 import static org.apache.james.mailbox.store.mail.model.ListMessageAssert.assertMessages;
 
 import java.io.IOException;
-import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.Date;
 import java.util.List;
 
@@ -31,12 +31,9 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.Mailbox;
 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.MessageId;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
@@ -82,148 +79,13 @@ public class ListMessageAssertTest {
         assertMessages(actual).containOnly(createMailboxMessage(MAILBOX_ID, MESSAGE_ID, MESSAGE_UID, INTERNAL_DATE, BODY_CONTENT2, BODY_START, new PropertyBuilder()));
     }
 
-    private MailboxMessage createMailboxMessage(final MailboxId mailboxId, final MessageId messageId, final MessageUid uid,
-            final Date internalDate, final String content, final int bodyStart, final PropertyBuilder propertyBuilder) {
-        return new MailboxMessage() {
-            @Override
-            public ComposedMessageIdWithMetaData getComposedMessageIdWithMetaData() {
-                return ComposedMessageIdWithMetaData.builder()
-                    .modSeq(getModSeq())
-                    .flags(createFlags())
-                    .composedMessageId(new ComposedMessageId(mailboxId, getMessageId(), uid))
-                    .build();
-            }
-
-            @Override
-            public MailboxId getMailboxId() {
-                return mailboxId;
-            }
-
-            @Override
-            public MessageUid getUid() {
-                return uid;
-            }
-
-            @Override
-            public void setUid(MessageUid uid) {
-
-            }
-
-            @Override
-            public void setModSeq(long modSeq) {
-
-            }
-
-            @Override
-            public long getModSeq() {
-                return 0;
-            }
-
-            @Override
-            public boolean isAnswered() {
-                return false;
-            }
-
-            @Override
-            public boolean isDeleted() {
-                return false;
-            }
-
-            @Override
-            public boolean isDraft() {
-                return false;
-            }
-
-            @Override
-            public boolean isFlagged() {
-                return false;
-            }
-
-            @Override
-            public boolean isRecent() {
-                return false;
-            }
-
-            @Override
-            public boolean isSeen() {
-                return false;
-            }
-
-            @Override
-            public void setFlags(Flags flags) {
-
-            }
-
-            @Override
-            public Flags createFlags() {
-                return null;
-            }
-
-            @Override
-            public long getHeaderOctets() {
-                return bodyStart;
-            }
-
-            @Override
-            public MessageId getMessageId() {
-                return messageId;
-            }
-
-            @Override
-            public Date getInternalDate() {
-                return internalDate;
-            }
-
-            @Override
-            public InputStream getBodyContent() throws IOException {
-                return null;
-            }
-
-            @Override
-            public String getMediaType() {
-                return null;
-            }
-
-            @Override
-            public String getSubType() {
-                return null;
-            }
-
-            @Override
-            public long getBodyOctets() {
-                return content.length() - bodyStart;
-            }
-
-            @Override
-            public long getFullContentOctets() {
-                return content.length();
-            }
-
-            @Override
-            public Long getTextualLineCount() {
-                return null;
-            }
-
-            @Override
-            public InputStream getHeaderContent() throws IOException {
-                return null;
-            }
-
-            @Override
-            public InputStream getFullContent() throws IOException {
-                return new SharedByteArrayInputStream(content.getBytes());
-            }
-
-            @Override
-            public List<Property> getProperties() {
-                return null;
-            }
-
-            @Override
-            public List<MessageAttachment> getAttachments() {
-                return null;
-            }
-        };
+    private MailboxMessage createMailboxMessage(MailboxId mailboxId, MessageId messageId, MessageUid uid,
+            Date internalDate, String content, int bodyStart, PropertyBuilder propertyBuilder) {
+        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);
+        return simpleMailboxMessage;
     }
 
     private Mailbox createMailbox(MailboxPath mailboxPath) {


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


[james-project] 03/43: [Refactoring] MailetUtil::getInitParameterAsStrictlyPositiveInteger can be private

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

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

commit 3f77169d5ef132184cf3dbde3328495e79d4ed58
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 17 11:28:31 2019 +0700

    [Refactoring] MailetUtil::getInitParameterAsStrictlyPositiveInteger can be private
---
 mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java b/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
index 3174215..c6b3362 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/MailetUtil.java
@@ -60,7 +60,7 @@ public class MailetUtil {
         return getInitParameterAsStrictlyPositiveInteger(condition, Optional.empty());
     }
 
-    public static int getInitParameterAsStrictlyPositiveInteger(String condition, Optional<String> defaultValue) throws MessagingException {
+    private static int getInitParameterAsStrictlyPositiveInteger(String condition, Optional<String> defaultValue) throws MessagingException {
         String value = Optional.ofNullable(condition)
             .orElse(defaultValue.orElse(null));
 


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


[james-project] 35/43: JAMES-2982 more error messages in Username.of()

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

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

commit feb8ae3297602583bfa56a76bde90976e11fcc1f
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Nov 15 09:51:21 2019 +0700

    JAMES-2982 more error messages in Username.of()
---
 core/src/main/java/org/apache/james/core/Username.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/Username.java b/core/src/main/java/org/apache/james/core/Username.java
index b29e9b8..308bc69 100644
--- a/core/src/main/java/org/apache/james/core/Username.java
+++ b/core/src/main/java/org/apache/james/core/Username.java
@@ -36,8 +36,9 @@ public class Username {
     public static final int MAXIMUM_MAIL_ADDRESS_LENGTH = 255;
 
     public static Username of(String username) {
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(username));
-        Preconditions.checkArgument(username.length() <= MAXIMUM_MAIL_ADDRESS_LENGTH);
+        Preconditions.checkArgument(!Strings.isNullOrEmpty(username), "username should not be null or empty");
+        Preconditions.checkArgument(username.length() <= MAXIMUM_MAIL_ADDRESS_LENGTH,
+            String.format("username length should not be longer than %d characters", MAXIMUM_MAIL_ADDRESS_LENGTH));
 
         List<String> parts = ImmutableList.copyOf(Splitter.on('@').split(username));
         switch (parts.size()) {


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


[james-project] 37/43: JAMES-2982 update webadmin markdown

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

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

commit 4f17b25fe66b444962171bf0847281cb44520c28
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon Nov 18 10:51:21 2019 +0700

    JAMES-2982 update webadmin markdown
---
 src/site/markdown/server/manage-webadmin.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 886c229..c8c5750 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -299,12 +299,14 @@ Resource name usernameToBeUsed:
  - can not be null or empty
  - can not be more than 255 characters
  - can not contain '/'
+ - When virtual hosting is enabled, it should follow the format `localPart` + `@` + `domainPart`, 
+ otherwise the valid format doesn't contain `@`
+ 
 
 Response codes:
 
  - 204: The user was successfully created
  - 400: The user name or the payload is invalid
- - 409: Conflict: A concurrent modification make that query to fail
 
 Note: if the user exists already, its password will be updated.
 


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


[james-project] 15/43: [Refactoring] Fix some Java access modifiers with JUnit 5 in mailbox backup module

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

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

commit d300dd401c612aad538b420f8f2748ecec5b489d
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 15 11:01:21 2019 +0700

    [Refactoring] Fix some Java access modifiers with JUnit 5 in mailbox backup module
---
 .../mailbox/backup/DefaultMailboxBackupTest.java   |  3 +-
 .../apache/james/mailbox/backup/DirectoryTest.java |  2 +-
 .../james/mailbox/backup/FlagExtraFieldTest.java   |  4 +-
 .../mailbox/backup/InternalDateExtraFieldTest.java |  5 ++-
 .../mailbox/backup/MailboxIdExtraFieldTest.java    |  4 +-
 .../mailbox/backup/MessageIdExtraFieldTest.java    |  4 +-
 .../james/mailbox/backup/SizeExtraFieldTest.java   |  5 ++-
 .../james/mailbox/backup/UidExtraFieldTest.java    |  5 ++-
 .../mailbox/backup/UidValidityExtraFieldTest.java  |  5 ++-
 .../mailbox/backup/ZipArchivesLoaderTest.java      |  2 +-
 .../apache/james/mailbox/backup/ZipAssertTest.java | 44 +++++++++++-----------
 .../mailbox/backup/ZipEntryTypeExtraFieldTest.java |  3 +-
 12 files changed, 46 insertions(+), 40 deletions(-)

diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
index ba7869c..cf6e666 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DefaultMailboxBackupTest.java
@@ -41,11 +41,12 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import com.github.fge.lambdas.Throwing;
+
 import reactor.core.publisher.Mono;
 
 class DefaultMailboxBackupTest implements MailboxMessageFixture {
     private static final int BUFFER_SIZE = 4096;
-    public static final String EXPECTED_ANNOTATIONS_DIR = "annotations";
+    private static final String EXPECTED_ANNOTATIONS_DIR = "annotations";
 
     private final ArchiveService archiveService = new Zipper();
     private final MailArchivesLoader archiveLoader = new ZipArchivesLoader();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java
index 01620e2..dc3d69b 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/DirectoryTest.java
@@ -22,7 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.junit.jupiter.api.Test;
 
-public class DirectoryTest {
+class DirectoryTest {
 
     @Test
     void isDirectoryShouldReturnTrue() {
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/FlagExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/FlagExtraFieldTest.java
index 9b88762..6f7158a 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/FlagExtraFieldTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/FlagExtraFieldTest.java
@@ -37,10 +37,10 @@ import com.google.common.base.Charsets;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-public class FlagExtraFieldTest {
+class FlagExtraFieldTest {
 
     @Test
-    public void shouldMatchBeanContract() {
+    void shouldMatchBeanContract() {
         EqualsVerifier.forClass(FlagsExtraField.class)
             .suppress(Warning.NONFINAL_FIELDS)
             .verify();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java
index c46aaeb..969883b 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/InternalDateExtraFieldTest.java
@@ -33,10 +33,11 @@ import org.junit.jupiter.api.Test;
 
 import com.google.common.base.Charsets;
 import com.google.common.primitives.Bytes;
+
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-public class InternalDateExtraFieldTest {
+class InternalDateExtraFieldTest {
     private static final byte[] ZERO_AS_BYTE_ARRAY = {0, 0, 0, 0, 0, 0, 0, 0};
     private static final byte[] _123456789ABCDEF0_AS_LE_BYTE_ARRAY = new byte[] {(byte) 0xF0, (byte) 0xDE, (byte) 0xBC, (byte) 0x9A, 0x78, 0x56, 0x34, 0x12};
     private static final byte[] FEDCBA9876543210_AS_LE_BYTE_ARRAY = new byte[] {0x10, 0x32, 0x54, 0x76, (byte) 0x98, (byte) 0xBA, (byte) 0xDC, (byte) 0xFE};
@@ -47,7 +48,7 @@ public class InternalDateExtraFieldTest {
     private static final Date DEFAULT_DATE = new Date(DEFAULT_DATE_TIMESTAMP);
 
     @Test
-    public void shouldMatchBeanContract() {
+    void shouldMatchBeanContract() {
         EqualsVerifier.forClass(InternalDateExtraField.class)
             .suppress(Warning.NONFINAL_FIELDS)
             .verify();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxIdExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxIdExtraFieldTest.java
index 160c356..9f171a3 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxIdExtraFieldTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MailboxIdExtraFieldTest.java
@@ -35,14 +35,14 @@ import com.google.common.base.Charsets;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-public class MailboxIdExtraFieldTest {
+class MailboxIdExtraFieldTest {
 
     private static final String DEFAULT_MAILBOX_ID = "123456789ABCDEF0";
     private static final byte[] DEFAULT_MAILBOX_ID_BYTE_ARRAY = new byte[] {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30};
     private static final byte [] EMPTY_BYTE_ARRAY = {};
 
     @Test
-    public void shouldMatchBeanContract() {
+    void shouldMatchBeanContract() {
         EqualsVerifier.forClass(MailboxIdExtraField.class)
             .suppress(Warning.NONFINAL_FIELDS)
             .verify();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MessageIdExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MessageIdExtraFieldTest.java
index 758dff6..3103ae5 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MessageIdExtraFieldTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/MessageIdExtraFieldTest.java
@@ -35,14 +35,14 @@ import com.google.common.base.Charsets;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-public class MessageIdExtraFieldTest {
+class MessageIdExtraFieldTest {
 
     private static final String DEFAULT_MESSAGE_ID = "123456789ABCDEF0";
     private static final byte[] DEFAULT_MESSAGE_ID_BYTE_ARRAY = new byte[] {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x30};
     private static final byte [] EMPTY_BYTE_ARRAY = {};
 
     @Test
-    public void shouldMatchBeanContract() {
+    void shouldMatchBeanContract() {
         EqualsVerifier.forClass(MessageIdExtraField.class)
             .suppress(Warning.NONFINAL_FIELDS)
             .verify();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/SizeExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/SizeExtraFieldTest.java
index 0062183..8c01c52 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/SizeExtraFieldTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/SizeExtraFieldTest.java
@@ -31,10 +31,11 @@ import org.junit.jupiter.api.Test;
 
 import com.google.common.base.Charsets;
 import com.google.common.primitives.Bytes;
+
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-public class SizeExtraFieldTest {
+class SizeExtraFieldTest {
     private static final byte[] ZERO_AS_BYTE_ARRAY = {0, 0, 0, 0, 0, 0, 0, 0};
     private static final byte[] _123456789ABCDEF0_AS_LE_BYTE_ARRAY = new byte[] {(byte) 0xF0, (byte) 0xDE, (byte) 0xBC, (byte) 0x9A, 0x78, 0x56, 0x34, 0x12};
     private static final byte[] FEDCBA9876543210_AS_LE_BYTE_ARRAY = new byte[] {0x10, 0x32, 0x54, 0x76, (byte) 0x98, (byte) 0xBA, (byte) 0xDC, (byte) 0xFE};
@@ -48,7 +49,7 @@ public class SizeExtraFieldTest {
     }
 
     @Test
-    public void shouldMatchBeanContract() {
+    void shouldMatchBeanContract() {
         EqualsVerifier.forClass(SizeExtraField.class)
             .suppress(Warning.NONFINAL_FIELDS)
             .verify();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidExtraFieldTest.java
index 646c711..8d0137b 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidExtraFieldTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidExtraFieldTest.java
@@ -32,17 +32,18 @@ import org.junit.jupiter.api.Test;
 
 import com.google.common.base.Charsets;
 import com.google.common.primitives.Bytes;
+
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-public class UidExtraFieldTest {
+class UidExtraFieldTest {
     private static final byte[] ZERO_AS_BYTE_ARRAY = {0, 0, 0, 0, 0, 0, 0, 0};
     private static final byte[] _123456789ABCDEF0_AS_LE_BYTE_ARRAY = new byte[] {(byte) 0xF0, (byte) 0xDE, (byte) 0xBC, (byte) 0x9A, 0x78, 0x56, 0x34, 0x12};
     private static final byte[] FEDCBA9876543210_AS_LE_BYTE_ARRAY = new byte[] {0x10, 0x32, 0x54, 0x76, (byte) 0x98, (byte) 0xBA, (byte) 0xDC, (byte) 0xFE};
     private static final byte[] UNUSED = new byte[] {(byte) 0xDE, (byte) 0xAD};
 
     @Test
-    public void shouldMatchBeanContract() {
+    void shouldMatchBeanContract() {
         EqualsVerifier.forClass(UidExtraField.class)
             .suppress(Warning.NONFINAL_FIELDS)
             .verify();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidValidityExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidValidityExtraFieldTest.java
index 60d3c58..b707321 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidValidityExtraFieldTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/UidValidityExtraFieldTest.java
@@ -32,17 +32,18 @@ import org.junit.jupiter.api.Test;
 
 import com.google.common.base.Charsets;
 import com.google.common.primitives.Bytes;
+
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-public class UidValidityExtraFieldTest {
+class UidValidityExtraFieldTest {
     private static final byte[] ZERO_AS_BYTE_ARRAY = {0, 0, 0, 0, 0, 0, 0, 0};
     private static final byte[] _123456789ABCDEF0_AS_LE_BYTE_ARRAY = new byte[] {(byte) 0xF0, (byte) 0xDE, (byte) 0xBC, (byte) 0x9A, 0x78, 0x56, 0x34, 0x12};
     private static final byte[] FEDCBA9876543210_AS_LE_BYTE_ARRAY = new byte[] {0x10, 0x32, 0x54, 0x76, (byte) 0x98, (byte) 0xBA, (byte) 0xDC, (byte) 0xFE};
     private static final byte[] UNUSED = new byte[] {(byte) 0xDE, (byte) 0xAD};
 
     @Test
-    public void shouldMatchBeanContract() {
+    void shouldMatchBeanContract() {
         EqualsVerifier.forClass(UidValidityExtraField.class)
             .suppress(Warning.NONFINAL_FIELDS)
             .verify();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
index 8ac762f..13b7f74 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipArchivesLoaderTest.java
@@ -41,7 +41,7 @@ import org.junit.jupiter.api.Test;
 
 import com.github.fge.lambdas.Throwing;
 
-public class ZipArchivesLoaderTest implements MailboxMessageFixture {
+class ZipArchivesLoaderTest implements MailboxMessageFixture {
     private static final int BUFFER_SIZE = 4096;
 
     private final ArchiveService archiveService = new Zipper();
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java
index d8b1b84..a30da30 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipAssertTest.java
@@ -50,7 +50,7 @@ import org.junit.jupiter.api.extension.ExtendWith;
 import com.google.common.collect.ImmutableList;
 
 @ExtendWith(TemporaryFolderExtension.class)
-public class ZipAssertTest {
+class ZipAssertTest {
 
     static class ZipEntryWithContent {
 
@@ -158,7 +158,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void hasNoEntryShouldNotThrowWhenEmpty() throws Exception {
+    void hasNoEntryShouldNotThrowWhenEmpty() throws Exception {
         try (ZipFile zipFile = buildZipFile()) {
             assertThatCode(() -> assertThatZip(zipFile)
                 .hasNoEntry())
@@ -167,7 +167,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void hasNoEntryShouldThrowWhenNotEmpty() throws Exception {
+    void hasNoEntryShouldThrowWhenNotEmpty() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                     .hasNoEntry())
@@ -176,7 +176,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyEntriesMatchingShouldNotThrowWhenBothEmpty() throws Exception {
+    void containsOnlyEntriesMatchingShouldNotThrowWhenBothEmpty() throws Exception {
         try (ZipFile zipFile = buildZipFile()) {
             assertThatCode(() -> assertThatZip(zipFile)
                     .containsOnlyEntriesMatching())
@@ -185,7 +185,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyEntriesMatchingShouldNotThrowWhenRightOrder() throws Exception {
+    void containsOnlyEntriesMatchingShouldNotThrowWhenRightOrder() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY, ENTRY_2)) {
             assertThatCode(() -> assertThatZip(zipFile)
                     .containsOnlyEntriesMatching(
@@ -196,7 +196,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void hasNameShouldThrowWhenWrongName() throws Exception {
+    void hasNameShouldThrowWhenWrongName() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                     .containsOnlyEntriesMatching(
@@ -206,7 +206,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void isDirectoryShouldThrowWhenNotADirectory() throws Exception {
+    void isDirectoryShouldThrowWhenNotADirectory() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                     .containsOnlyEntriesMatching(
@@ -217,7 +217,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void isDirectoryShouldNotThrowWhenDirectory() throws Exception {
+    void isDirectoryShouldNotThrowWhenDirectory() throws Exception {
         try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
 
             ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new Directory("any"), DIRECTORY_NAME);
@@ -236,7 +236,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyEntriesMatchingShouldNotThrowWhenWrongOrder() throws Exception {
+    void containsOnlyEntriesMatchingShouldNotThrowWhenWrongOrder() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY, ENTRY_2)) {
             assertThatCode(() -> assertThatZip(zipFile)
                     .containsOnlyEntriesMatching(
@@ -247,7 +247,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyEntriesMatchingShouldThrowWhenExpectingMoreEntries() throws Exception {
+    void containsOnlyEntriesMatchingShouldThrowWhenExpectingMoreEntries() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY, ENTRY_2)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                     .containsOnlyEntriesMatching(
@@ -259,7 +259,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyEntriesMatchingShouldThrowWhenExpectingLessEntries() throws Exception {
+    void containsOnlyEntriesMatchingShouldThrowWhenExpectingLessEntries() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY, ENTRY_2)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                     .containsOnlyEntriesMatching(
@@ -269,7 +269,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsExactlyEntriesMatchingShouldNotThrowWhenBothEmpty() throws Exception {
+    void containsExactlyEntriesMatchingShouldNotThrowWhenBothEmpty() throws Exception {
         try (ZipFile zipFile = buildZipFile()) {
             assertThatCode(() -> assertThatZip(zipFile)
                 .containsExactlyEntriesMatching())
@@ -278,7 +278,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsExactlyEntriesMatchingShouldThrowWhenWrongOrder() throws Exception {
+    void containsExactlyEntriesMatchingShouldThrowWhenWrongOrder() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY, ENTRY_2)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                 .containsExactlyEntriesMatching(
@@ -288,7 +288,7 @@ public class ZipAssertTest {
         }
     }
     @Test
-    public void containsExactlyEntriesMatchingShouldNotThrowWhenRightOrder() throws Exception {
+    void containsExactlyEntriesMatchingShouldNotThrowWhenRightOrder() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY, ENTRY_2)) {
             assertThatCode(() -> assertThatZip(zipFile)
                 .containsExactlyEntriesMatching(
@@ -299,7 +299,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsExactlyEntriesMatchingShouldThrowWhenExpectingMoreEntries() throws Exception {
+    void containsExactlyEntriesMatchingShouldThrowWhenExpectingMoreEntries() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY, ENTRY_2)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                 .containsExactlyEntriesMatching(
@@ -311,7 +311,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsExactlyEntriesMatchingShouldThrowWhenExpectingLessEntries() throws Exception {
+    void containsExactlyEntriesMatchingShouldThrowWhenExpectingLessEntries() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY, ENTRY_2)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                 .containsExactlyEntriesMatching(
@@ -321,7 +321,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void hasStringContentShouldNotThrowWhenIdentical() throws Exception {
+    void hasStringContentShouldNotThrowWhenIdentical() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY)) {
             assertThatCode(() -> assertThatZip(zipFile)
                 .containsOnlyEntriesMatching(
@@ -332,7 +332,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void hasStringContentShouldThrowWhenDifferent() throws Exception {
+    void hasStringContentShouldThrowWhenDifferent() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                 .containsOnlyEntriesMatching(
@@ -343,7 +343,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyExtraFieldsShouldNotThrowWhenBothEmpty() throws Exception {
+    void containsOnlyExtraFieldsShouldNotThrowWhenBothEmpty() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY)) {
             assertThatCode(() -> assertThatZip(zipFile)
                 .containsOnlyEntriesMatching(
@@ -354,7 +354,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyExtraFieldsShouldThrowWhenMissingExpectedField() throws Exception {
+    void containsOnlyExtraFieldsShouldThrowWhenMissingExpectedField() throws Exception {
         try (ZipFile zipFile = buildZipFile(ENTRY)) {
             assertThatThrownBy(() -> assertThatZip(zipFile)
                 .containsOnlyEntriesMatching(
@@ -365,7 +365,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyExtraFieldsShouldNotThrowWhenUnexpectedField() throws Exception {
+    void containsOnlyExtraFieldsShouldNotThrowWhenUnexpectedField() throws Exception {
         try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
 
             ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
@@ -387,7 +387,7 @@ public class ZipAssertTest {
     }
 
     @Test
-    public void containsOnlyExtraFieldsShouldNotThrowWhenContainingExpectedExtraFields() throws Exception {
+    void containsOnlyExtraFieldsShouldNotThrowWhenContainingExpectedExtraFields() throws Exception {
         try (ZipArchiveOutputStream archiveOutputStream = new ZipArchiveOutputStream(destination)) {
 
             ZipArchiveEntry archiveEntry = (ZipArchiveEntry) archiveOutputStream.createArchiveEntry(new File("any"), ENTRY_NAME);
diff --git a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipEntryTypeExtraFieldTest.java b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipEntryTypeExtraFieldTest.java
index 87d886f..59dfe5f 100644
--- a/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipEntryTypeExtraFieldTest.java
+++ b/mailbox/backup/src/test/java/org/apache/james/mailbox/backup/ZipEntryTypeExtraFieldTest.java
@@ -32,10 +32,11 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import com.google.common.base.Charsets;
+
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
 
-public class ZipEntryTypeExtraFieldTest {
+class ZipEntryTypeExtraFieldTest {
     private static final byte[] ZERO_AS_BYTE_ARRAY = {0, 0, 0, 0, 0, 0, 0, 0};
     private static final byte[] ONE_AS_BYTE_ARRAY = {1, 0, 0, 0, 0, 0, 0, 0};
     private static final byte[] TWO_AS_BYTE_ARRAY = {2, 0, 0, 0, 0, 0, 0, 0};


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


[james-project] 30/43: [Refactoring] UIDVALIDITY retrieval without Mailbox.MetaData call

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

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

commit 62782cbc5497d0c9f78afc9127fc89f50bd722da
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 14:25:48 2019 +0700

    [Refactoring] UIDVALIDITY retrieval without Mailbox.MetaData call
    
    This further optimize IMAP APPEND command
---
 .../main/java/org/apache/james/imap/processor/AppendProcessor.java   | 5 +++--
 .../java/org/apache/james/pop3server/mailbox/MailboxAdapter.java     | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
index 983d855..5bbb43d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AppendProcessor.java
@@ -43,7 +43,6 @@ import org.apache.james.imap.message.request.AppendRequest;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
-import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.model.ComposedMessageId;
@@ -135,7 +134,9 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
             }
 
             // get folder UIDVALIDITY
-            Long uidValidity = mailboxManager.getMailbox(mailboxPath, mailboxSession).getMetaData(false, mailboxSession, FetchGroup.NO_COUNT).getUidValidity();
+            Long uidValidity = mailboxManager.getMailbox(mailboxPath, mailboxSession)
+                .getMailboxEntity()
+                .getUidValidity();
 
             unsolicitedResponses(session, responder, false);
 
diff --git a/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java b/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java
index fabeea1..b6ca3b2 100644
--- a/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java
+++ b/server/protocols/protocols-pop3/src/main/java/org/apache/james/pop3server/mailbox/MailboxAdapter.java
@@ -192,7 +192,7 @@ public class MailboxAdapter implements Mailbox {
     public String getIdentifier() throws IOException {
         try {
             mailboxManager.startProcessingRequest(session);
-            long validity = manager.getMetaData(false, session, MessageManager.MetaData.FetchGroup.NO_COUNT)
+            long validity = manager.getMailboxEntity()
                     .getUidValidity();
             return Long.toString(validity);
         } catch (MailboxException e) {


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


[james-project] 08/43: [Refactoring] Remove unused method in FakeMailet context

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

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

commit 5ff652add186852473f1e543913101b6f24c70de
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 17 11:48:55 2019 +0700

    [Refactoring] Remove unused method in FakeMailet context
    
    storeMail is not defined in the API
---
 .../src/main/java/org/apache/mailet/base/test/FakeMailContext.java    | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMailContext.java b/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMailContext.java
index 8dc8ce8..48090ec 100644
--- a/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMailContext.java
+++ b/mailet/test/src/main/java/org/apache/mailet/base/test/FakeMailContext.java
@@ -542,10 +542,6 @@ public class FakeMailContext implements MailetContext {
         attributes.put(attribute.getName(), attribute);
     }
 
-    public void storeMail(MailAddress sender, MailAddress recipient, MimeMessage msg) throws MessagingException {
-        // trivial implementation
-    }
-
     /**
      * @deprecated use the generic dnsLookup method
      */


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


[james-project] 23/43: [Refactoring] MessageRangeProcessor: adopt functional programming style

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

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

commit 7af86315d053ec654db1b27497a03e3c9aed40c1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 13:16:49 2019 +0700

    [Refactoring] MessageRangeProcessor: adopt functional programming style
---
 .../org/apache/james/imap/api/message/IdRange.java |  8 +++++
 .../processor/AbstractMessageRangeProcessor.java   | 42 +++++++++++-----------
 2 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
index 0fbf92b..0862d0a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/IdRange.java
@@ -26,6 +26,8 @@ import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Optional;
 
+import org.apache.james.mailbox.model.MessageRange;
+
 import com.google.common.collect.ImmutableList;
 
 /**
@@ -39,6 +41,12 @@ public final class IdRange implements Iterable<Long>, Comparable<IdRange> {
             .toString();
     }
 
+    public static IdRange from(MessageRange messageRange) {
+        return new IdRange(
+            messageRange.getUidFrom().asLong(),
+            messageRange.getUidTo().asLong());
+    }
+
     private long lowVal;
 
     private long highVal;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index 22fe645..1fd75cc 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -19,8 +19,10 @@
 
 package org.apache.james.imap.processor;
 
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
 
 import org.apache.james.imap.api.ImapSessionUtils;
 import org.apache.james.imap.api.display.HumanReadableText;
@@ -43,6 +45,9 @@ import org.apache.james.metrics.api.MetricFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+
 public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRangeRequest> extends AbstractMailboxProcessor<R> {
     private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMessageRangeProcessor.class);
 
@@ -86,29 +91,26 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
     private StatusResponse.ResponseCode handleRanges(R request, ImapSession session, MailboxPath targetMailbox, MailboxSession mailboxSession) throws MailboxException {
         MessageManager mailbox = getMailboxManager().getMailbox(targetMailbox, mailboxSession);
 
-        List<IdRange> resultRanges = new ArrayList<>();
-        for (IdRange range : request.getIdSet()) {
-            MessageRange messageSet = messageRange(session.getSelected(), range, request.isUseUids());
-            if (messageSet != null) {
-                List<MessageRange> processedUids = process(targetMailbox, session.getSelected(), mailboxSession, messageSet);
-                for (MessageRange mr : processedUids) {
-                    // Set recent flag on copied message as this SHOULD be
-                    // done.
-                    // See RFC 3501 6.4.7. COPY Command
-                    // See IMAP-287
-                    //
-                    // Disable this as this is now done directly in the scope of the copy operation.
-                    // See MAILBOX-85
-                    //mailbox.setFlags(new Flags(Flags.Flag.RECENT), true, false, mr, mailboxSession);
-                    resultRanges.add(new IdRange(mr.getUidFrom().asLong(), mr.getUidTo().asLong()));
-                }
-            }
-        }
-        IdRange[] resultUids = IdRange.mergeRanges(resultRanges).toArray(new IdRange[0]);
+        IdRange[] resultUids = IdRange.mergeRanges(Arrays.stream(request.getIdSet())
+            .map(Throwing.<IdRange, MessageRange>function(
+                range -> messageRange(session.getSelected(), range, request.isUseUids()))
+                .sneakyThrow())
+            .filter(Objects::nonNull)
+            .flatMap(Throwing.<MessageRange, Stream<IdRange>>function(
+                range -> handleRange(session, targetMailbox, mailboxSession, range))
+                .sneakyThrow())
+            .collect(Guavate.toImmutableList()))
+            .toArray(new IdRange[0]);
 
         // get folder UIDVALIDITY
         Long uidValidity = mailbox.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN).getUidValidity();
 
         return StatusResponse.ResponseCode.copyUid(uidValidity, request.getIdSet(), resultUids);
     }
+
+    private Stream<IdRange> handleRange(ImapSession session, MailboxPath targetMailbox, MailboxSession mailboxSession, MessageRange range) throws MailboxException {
+        return process(targetMailbox, session.getSelected(), mailboxSession, range)
+            .stream()
+            .map(IdRange::from);
+    }
 }


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


[james-project] 20/43: [Refactoring] Extract method in MessageRangeProcessor

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

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

commit dfb7b23750ff92c236732ece4cc3edbfa051e863
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 11:02:55 2019 +0700

    [Refactoring] Extract method in MessageRangeProcessor
---
 .../processor/AbstractMessageRangeProcessor.java   | 76 +++++++++++-----------
 1 file changed, 38 insertions(+), 38 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
index f339d38..64c52a0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMessageRangeProcessor.java
@@ -62,56 +62,56 @@ public abstract class AbstractMessageRangeProcessor<R extends AbstractMessageRan
     @Override
     protected void processRequest(R request, ImapSession session, Responder responder) {
         final MailboxPath targetMailbox = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
-        final IdRange[] idSet = request.getIdSet();
-        final boolean useUids = request.isUseUids();
-        final SelectedMailbox currentMailbox = session.getSelected();
+
         try {
             final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
-            final MailboxManager mailboxManager = getMailboxManager();
-            final boolean mailboxExists = mailboxManager.mailboxExists(targetMailbox, mailboxSession);
 
-            if (!mailboxExists) {
+            if (!getMailboxManager().mailboxExists(targetMailbox, mailboxSession)) {
                 no(request, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
             } else {
-
-                final MessageManager mailbox = mailboxManager.getMailbox(targetMailbox, mailboxSession);
-
-                List<IdRange> resultRanges = new ArrayList<>();
-                for (IdRange range : idSet) {
-                    MessageRange messageSet = messageRange(currentMailbox, range, useUids);
-                    if (messageSet != null) {
-                        List<MessageRange> processedUids = process(
-                            targetMailbox, currentMailbox, mailboxSession,
-                            mailboxManager, messageSet);
-                        for (MessageRange mr : processedUids) {
-                            // Set recent flag on copied message as this SHOULD be
-                            // done.
-                            // See RFC 3501 6.4.7. COPY Command
-                            // See IMAP-287
-                            //
-                            // Disable this as this is now done directly in the scope of the copy operation.
-                            // See MAILBOX-85
-                            //mailbox.setFlags(new Flags(Flags.Flag.RECENT), true, false, mr, mailboxSession);
-                            resultRanges.add(new IdRange(mr.getUidFrom().asLong(), mr.getUidTo().asLong()));
-                        }
-                    }
-                }
-                IdRange[] resultUids = IdRange.mergeRanges(resultRanges).toArray(new IdRange[0]);
-
-                // get folder UIDVALIDITY
-                Long uidValidity = mailbox.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN).getUidValidity();
-
-                unsolicitedResponses(session, responder, useUids);
-                okComplete(request, StatusResponse.ResponseCode.copyUid(uidValidity, idSet, resultUids), responder);
+                StatusResponse.ResponseCode code = handleRanges(request, session, targetMailbox, mailboxSession);
+                unsolicitedResponses(session, responder, request.isUseUids());
+                okComplete(request, code, responder);
             }
         } catch (MessageRangeException e) {
             LOGGER.debug("{} failed from mailbox {} to {} for invalid sequence-set {}",
-                    getOperationName(), currentMailbox.getMailboxId(), targetMailbox, idSet, e);
+                    getOperationName(), session.getSelected().getMailboxId(), targetMailbox, request.getIdSet(), e);
             taggedBad(request, responder, HumanReadableText.INVALID_MESSAGESET);
         } catch (MailboxException e) {
             LOGGER.error("{} failed from mailbox {} to {} for sequence-set {}",
-                    getOperationName(), currentMailbox.getMailboxId(), targetMailbox, idSet, e);
+                    getOperationName(), session.getSelected().getMailboxId(), targetMailbox, request.getIdSet(), e);
             no(request, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
+
+    private StatusResponse.ResponseCode handleRanges(R request, ImapSession session, MailboxPath targetMailbox, MailboxSession mailboxSession) throws MailboxException {
+        final MessageManager mailbox = getMailboxManager().getMailbox(targetMailbox, mailboxSession);
+
+        List<IdRange> resultRanges = new ArrayList<>();
+        for (IdRange range : request.getIdSet()) {
+            MessageRange messageSet = messageRange(session.getSelected(), range, request.isUseUids());
+            if (messageSet != null) {
+                List<MessageRange> processedUids = process(
+                    targetMailbox, session.getSelected(), mailboxSession,
+                    getMailboxManager(), messageSet);
+                for (MessageRange mr : processedUids) {
+                    // Set recent flag on copied message as this SHOULD be
+                    // done.
+                    // See RFC 3501 6.4.7. COPY Command
+                    // See IMAP-287
+                    //
+                    // Disable this as this is now done directly in the scope of the copy operation.
+                    // See MAILBOX-85
+                    //mailbox.setFlags(new Flags(Flags.Flag.RECENT), true, false, mr, mailboxSession);
+                    resultRanges.add(new IdRange(mr.getUidFrom().asLong(), mr.getUidTo().asLong()));
+                }
+            }
+        }
+        IdRange[] resultUids = IdRange.mergeRanges(resultRanges).toArray(new IdRange[0]);
+
+        // get folder UIDVALIDITY
+        Long uidValidity = mailbox.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN).getUidValidity();
+
+        return StatusResponse.ResponseCode.copyUid(uidValidity, request.getIdSet(), resultUids);
+    }
 }


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


[james-project] 32/43: JAMES-2949 Remove CassandraSubscriptionManager

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

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

commit 11b953b2913c98711f6f85b5781bb03f92aa1a37
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 14 14:47:59 2019 +0700

    JAMES-2949 Remove CassandraSubscriptionManager
    
    This class did not add any behaviour and can be dropped in replaced by StoreSubscriptionManager
---
 .../cassandra/CassandraSubscriptionManager.java    | 44 ----------------------
 .../CassandraSubscriptionManagerTest.java          |  3 +-
 .../modules/mailbox/CassandraMailboxModule.java    |  8 ++--
 3 files changed, 7 insertions(+), 48 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManager.java
deleted file mode 100644
index c1da5cd..0000000
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManager.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/****************************************************************
- * 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.cassandra;
-
-import javax.inject.Inject;
-
-import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.store.StoreSubscriptionManager;
-import org.apache.james.mailbox.store.user.model.Subscription;
-import org.apache.james.mailbox.store.user.model.impl.SimpleSubscription;
-
-/**
- * Cassandra implementation of {@link StoreSubscriptionManager}
- * 
- */
-public class CassandraSubscriptionManager extends StoreSubscriptionManager {
-
-    @Inject
-    public CassandraSubscriptionManager(CassandraMailboxSessionMapperFactory mapperFactory) {
-        super(mapperFactory);
-    }
-
-    @Override
-    protected Subscription createSubscription(MailboxSession session, String mailbox) {
-        return new SimpleSubscription(session.getUser().asString(), mailbox);
-    }
-}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
index 80a0ac6..8dc2ad8 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
@@ -46,6 +46,7 @@ import org.apache.james.mailbox.cassandra.mail.CassandraModSeqProvider;
 import org.apache.james.mailbox.cassandra.mail.CassandraUidProvider;
 import org.apache.james.mailbox.cassandra.mail.CassandraUserMailboxRightsDAO;
 import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
+import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -80,7 +81,7 @@ class CassandraSubscriptionManagerTest extends AbstractSubscriptionManagerTest {
         BlobStore blobStore = null;
         CassandraUidProvider uidProvider = null;
         CassandraModSeqProvider modSeqProvider = null;
-        return new CassandraSubscriptionManager(
+        return new StoreSubscriptionManager(
             new CassandraMailboxSessionMapperFactory(
                 uidProvider,
                 modSeqProvider,
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index d621194..81d0ca3 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -34,7 +34,6 @@ import org.apache.james.mailbox.RightManager;
 import org.apache.james.mailbox.SubscriptionManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
-import org.apache.james.mailbox.cassandra.CassandraSubscriptionManager;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.mail.CassandraACLMapper;
@@ -83,12 +82,14 @@ import org.apache.james.mailbox.store.StoreBlobManager;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageIdManager;
 import org.apache.james.mailbox.store.StoreRightManager;
+import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.event.MailboxAnnotationListener;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
 import org.apache.james.mailbox.store.mail.MailboxMapperFactory;
 import org.apache.james.mailbox.store.mail.MessageMapperFactory;
 import org.apache.james.mailbox.store.mail.ModSeqProvider;
 import org.apache.james.mailbox.store.mail.UidProvider;
+import org.apache.james.mailbox.store.user.SubscriptionMapperFactory;
 import org.apache.james.utils.MailboxManagerDefinition;
 import org.apache.mailbox.tools.indexer.MessageIdReIndexerImpl;
 import org.apache.mailbox.tools.indexer.ReIndexerImpl;
@@ -125,7 +126,7 @@ public class CassandraMailboxModule extends AbstractModule {
         bind(CassandraUserMailboxRightsDAO.class).in(Scopes.SINGLETON);
 
         bind(CassandraMailboxManager.class).in(Scopes.SINGLETON);
-        bind(CassandraSubscriptionManager.class).in(Scopes.SINGLETON);
+        bind(StoreSubscriptionManager.class).in(Scopes.SINGLETON);
         bind(StoreAttachmentManager.class).in(Scopes.SINGLETON);
         bind(StoreBlobManager.class).in(Scopes.SINGLETON);
         bind(StoreMessageIdManager.class).in(Scopes.SINGLETON);
@@ -151,10 +152,11 @@ public class CassandraMailboxModule extends AbstractModule {
         bind(MailboxMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         bind(AttachmentMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
         bind(MailboxSessionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
+        bind(SubscriptionMapperFactory.class).to(CassandraMailboxSessionMapperFactory.class);
 
         bind(ModSeqProvider.class).to(CassandraModSeqProvider.class);
         bind(UidProvider.class).to(CassandraUidProvider.class);
-        bind(SubscriptionManager.class).to(CassandraSubscriptionManager.class);
+        bind(SubscriptionManager.class).to(StoreSubscriptionManager.class);
         bind(MailboxPathLocker.class).to(NoMailboxPathLocker.class);
         bind(Authenticator.class).to(UserRepositoryAuthenticator.class);
         bind(Authorizator.class).to(UserRepositoryAuthorizator.class);


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


[james-project] 39/43: JAMES-2964 sanitize negative quota value when reading them from a DAO

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

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

commit 68b658431f7d0784ec8e564bf8fc048e5a71a467
Author: Rémi KOWALSKI <rk...@linagora.com>
AuthorDate: Wed Nov 6 15:10:04 2019 +0100

    JAMES-2964 sanitize negative quota value when reading them from a DAO
---
 .../java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java
index 85470cd..d68d104 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java
@@ -28,6 +28,7 @@ import org.apache.james.core.quota.QuotaValue;
 public class QuotaCodec {
 
     private static final long INFINITE = -1;
+    private static final long NO_RIGHT = 0L;
 
     static Long quotaValueToLong(QuotaValue<?> value) {
         if (value.isUnlimited()) {
@@ -51,6 +52,13 @@ public class QuotaCodec {
         if (value == INFINITE) {
             return Optional.of(infiniteValue);
         }
+        if (isInvalid(value)) {
+            return Optional.of(quotaFactory.apply(NO_RIGHT));
+        }
         return Optional.of(quotaFactory.apply(value));
     }
+
+    private static boolean isInvalid(Long value) {
+        return value < -1;
+    }
 }


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


[james-project] 07/43: [Refactoring] mailet-base DataContentHandlers are not used

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

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

commit a4b1716bba877e70af77e6af0311ae17dbcf89b1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 17 11:39:59 2019 +0700

    [Refactoring] mailet-base DataContentHandlers are not used
---
 .../base/mail/AbstractDataContentHandler.java      | 125 -------------------
 .../base/mail/MessageDispositionNotification.java  | 133 ---------------------
 .../apache/mailet/base/mail/MultipartReport.java   |  72 -----------
 .../java/org/apache/mailet/base/mail/package.html  |  56 ---------
 4 files changed, 386 deletions(-)

diff --git a/mailet/base/src/main/java/org/apache/mailet/base/mail/AbstractDataContentHandler.java b/mailet/base/src/main/java/org/apache/mailet/base/mail/AbstractDataContentHandler.java
deleted file mode 100644
index 16c7b5c..0000000
--- a/mailet/base/src/main/java/org/apache/mailet/base/mail/AbstractDataContentHandler.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/****************************************************************
- * 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.mailet.base.mail;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.io.IOException;
-
-import javax.activation.ActivationDataFlavor;
-import javax.activation.DataContentHandler;
-import javax.activation.DataSource;
-import javax.mail.MessagingException;
-
-
-/**
- * Abstract class providing common Data Handler behavior.
- */
-public abstract class AbstractDataContentHandler implements DataContentHandler {
-
-    private ActivationDataFlavor fieldDataFlavor;
-
-    /**
-     * Default Constructor
-     */
-    public AbstractDataContentHandler() {
-        super();
-    }
-
-    /**
-     * Update the current DataFlavor.
-     * 
-     */    
-    protected void updateDataFlavor() {
-        setDataFlavor(computeDataFlavor());
-    }
-
-    /**
-     * Compute an ActivationDataFlavor.
-     * 
-     * @return A new ActivationDataFlavor
-     */
-    protected abstract ActivationDataFlavor computeDataFlavor();
-
-    protected void setDataFlavor(ActivationDataFlavor aDataFlavor) {
-        fieldDataFlavor = aDataFlavor;
-    }
-
-    @Override
-    public Object getContent(DataSource aDataSource) throws IOException {
-        Object content = null;
-        try {
-            content = computeContent(aDataSource);
-        } catch (MessagingException e) {
-            // No-op
-        }
-        return content;
-    }
-
-    /**
-     * Compute the content from aDataSource.
-     * 
-     * @param aDataSource
-     * @return new Content built from the DataSource
-     * @throws MessagingException
-     */
-    protected abstract Object computeContent(DataSource aDataSource)
-            throws MessagingException;
-
-    @Override
-    public Object getTransferData(DataFlavor aDataFlavor, DataSource aDataSource)
-            throws UnsupportedFlavorException, IOException {
-        Object content = null;
-        if (getDataFlavor().equals(aDataFlavor)) {
-            content = getContent(aDataSource);
-        }
-        return content;
-    }
-
-    @Override
-    public DataFlavor[] getTransferDataFlavors() {
-        return new DataFlavor[]{getDataFlavor()};
-    }
-
-    /**
-     * Get the DataFlavor, lazily initialised if required.
-     * 
-     * @return Returns the dataFlavor, lazily initialised.
-     */
-    protected ActivationDataFlavor getDataFlavor() {
-        ActivationDataFlavor dataFlavor;
-        if (null == (dataFlavor = getDataFlavorBasic())) {
-            updateDataFlavor();
-            return getDataFlavor();
-        }
-        return dataFlavor;
-    }
-
-    /**
-     * Get the DataFlavor.
-     * 
-     * @return Returns the dataFlavor.
-     */
-    private ActivationDataFlavor getDataFlavorBasic() {
-        return fieldDataFlavor;
-    }
-
-}
diff --git a/mailet/base/src/main/java/org/apache/mailet/base/mail/MessageDispositionNotification.java b/mailet/base/src/main/java/org/apache/mailet/base/mail/MessageDispositionNotification.java
deleted file mode 100644
index 49177b3..0000000
--- a/mailet/base/src/main/java/org/apache/mailet/base/mail/MessageDispositionNotification.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/****************************************************************
- * 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.mailet.base.mail;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-
-import javax.activation.ActivationDataFlavor;
-import javax.activation.DataSource;
-import javax.mail.MessagingException;
-import javax.mail.internet.ContentType;
-import javax.mail.internet.MimeUtility;
-import javax.mail.internet.ParseException;
-
-/**
- * <p>Data Content Handler for...</p>
- * <dl>
- * <dt>MIME type name</dt><dd>message</dd>
- * <dt>MIME subtype name</dt><dd>disposition-notification</dd>
- * </dl>
- */
-public class MessageDispositionNotification extends AbstractDataContentHandler {
-
-    /**
-     * Default Constructor.
-     */
-    public MessageDispositionNotification() {
-        super();
-    }
-
-    @Override
-    protected ActivationDataFlavor computeDataFlavor() {
-        return new ActivationDataFlavor(String.class,
-                "message/disposition-notification", "Message String");
-    }
-
-    @Override
-    protected Object computeContent(DataSource aDataSource)
-            throws MessagingException {
-        String encoding = getCharacterSet(aDataSource.getContentType());
-        Reader reader = null;
-        Writer writer = new StringWriter(2048);
-        String content = null;
-        try {
-            reader = new BufferedReader(new InputStreamReader(aDataSource
-                    .getInputStream(), encoding), 2048);
-            while (reader.ready()) {
-                writer.write(reader.read());
-            }
-            writer.flush();
-            content = writer.toString();
-        } catch (IllegalArgumentException e) {
-            throw new MessagingException("Encoding = \"" + encoding + "\"", e);
-        } catch (IOException e) {
-            throw new MessagingException(
-                    "Exception obtaining content from DataSource", e);
-        } finally {
-            try {
-                writer.close();
-            } catch (IOException e1) {
-                // No-op
-            }
-            try {
-                if (reader != null) {
-                    reader.close();
-                }
-            } catch (IOException e1) {
-                // No-op
-            }
-        }
-        return content;
-    }
-
-    @Override
-    public void writeTo(Object aPart, String aMimeType, OutputStream aStream)
-            throws IOException {
-        if (!(aPart instanceof String)) {
-            throw new IOException("Type \"" + aPart.getClass().getName()
-                + "\" is not supported.");
-        }
-
-        String encoding = getCharacterSet(getDataFlavor().getMimeType());
-        Writer writer;
-        try {
-            writer = new BufferedWriter(new OutputStreamWriter(aStream,
-                    encoding), 2048);
-        } catch (IllegalArgumentException e) {
-            throw new UnsupportedEncodingException(encoding);
-        }
-        writer.write((String) aPart);
-        writer.flush();
-    }
-
-    protected String getCharacterSet(String aType) {
-        String characterSet = null;
-        try {
-            characterSet = new ContentType(aType).getParameter("charset");
-        } catch (ParseException e) {
-            // no-op
-        } finally {
-            if (null == characterSet) {
-                characterSet = "us-ascii";
-            }
-        }
-        return MimeUtility.javaCharset(characterSet);
-    }
-
-}
diff --git a/mailet/base/src/main/java/org/apache/mailet/base/mail/MultipartReport.java b/mailet/base/src/main/java/org/apache/mailet/base/mail/MultipartReport.java
deleted file mode 100644
index a65690d..0000000
--- a/mailet/base/src/main/java/org/apache/mailet/base/mail/MultipartReport.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/****************************************************************
- * 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.mailet.base.mail;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.activation.ActivationDataFlavor;
-import javax.activation.DataSource;
-import javax.mail.MessagingException;
-
-import org.apache.james.javax.MimeMultipartReport;
-
-
-/**
- * <p>Data Content Handler for...</p>
- * <dl>
- * <dt>MIME type name</dt><dd>multipart</dd>
- * <dt>MIME subtype name</dt><dd>report</dd>
- * </dl>
- */
-public class MultipartReport extends AbstractDataContentHandler {
-    /**
-     * Default constructor.
-     */
-    public MultipartReport() {
-        super();
-    }
-
-    @Override
-    protected ActivationDataFlavor computeDataFlavor() {
-        return new ActivationDataFlavor(MimeMultipartReport.class,
-                "multipart/report", "Multipart Report");
-    }
-
-    @Override
-    public void writeTo(Object aPart, String aMimeType, OutputStream aStream)
-            throws IOException {
-        if (!(aPart instanceof MimeMultipartReport)) {
-            throw new IOException("Type \"" + aPart.getClass().getName()
-                + "\" is not supported.");
-        }
-        try {
-            ((MimeMultipartReport) aPart).writeTo(aStream);
-        } catch (MessagingException e) {
-            throw new IOException(e.getMessage());
-        }
-    }
-
-    @Override
-    protected Object computeContent(DataSource aDataSource)
-            throws MessagingException {
-        return new MimeMultipartReport(aDataSource);
-    }
-}
diff --git a/mailet/base/src/main/java/org/apache/mailet/base/mail/package.html b/mailet/base/src/main/java/org/apache/mailet/base/mail/package.html
deleted file mode 100644
index 4bf22c5..0000000
--- a/mailet/base/src/main/java/org/apache/mailet/base/mail/package.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
-<!--
-  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.    
--->
-<HTML>
-<HEAD>
-<!--
-
-  @(#)package.html
-
-  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.
-
--->
-
-</HEAD>
-<BODY>
-
-<p>This package and its sub-packages extend and provide utilities for use with
-<code>javax.mail</code>, its sub-packages and its implementations.
-</p>
-<p>The intent is to mirror the related package structures where possible.
-So, <code>org.apache.utils.mail</code> is a mirror of <code>javax.mail</code> and
-<code>org.apache.utils.mail.handlers</code> is a mirror of <code>com.sun.mail.handlers</code>.
-</p>
-</BODY>
-</HTML>


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


[james-project] 33/43: JAMES-2949 Username strong typing for subscriptions

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

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

commit 11ed2708cbe6faacae4dfb67baa1ca77a6d96f93
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Nov 14 14:58:21 2019 +0700

    JAMES-2949 Username strong typing for subscriptions
---
 .../cassandra/user/CassandraSubscriptionMapper.java       | 15 ++++++++-------
 .../apache/james/mailbox/jpa/JPASubscriptionManager.java  |  2 +-
 .../james/mailbox/jpa/user/JPASubscriptionMapper.java     | 13 +++++++++----
 .../james/mailbox/jpa/user/model/JPASubscription.java     |  9 +++++----
 .../mailbox/maildir/user/MaildirSubscriptionMapper.java   | 14 +++++++-------
 .../mailbox/inmemory/user/InMemorySubscriptionMapper.java |  7 ++++---
 .../james/mailbox/store/StoreSubscriptionManager.java     |  8 ++++----
 .../james/mailbox/store/user/SubscriptionMapper.java      |  6 +++---
 .../james/mailbox/store/user/model/Subscription.java      |  4 +++-
 .../mailbox/store/user/model/impl/SimpleSubscription.java |  7 ++++---
 .../james/mailbox/store/user/SubscriptionMapperTest.java  |  5 +++--
 11 files changed, 51 insertions(+), 39 deletions(-)

diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java
index a1ce340..bc9e7ff 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapper.java
@@ -31,6 +31,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.model.Subscription;
@@ -53,25 +54,25 @@ public class CassandraSubscriptionMapper extends NonTransactionalMapper implemen
     public synchronized void delete(Subscription subscription) {
         session.execute(QueryBuilder.delete()
             .from(TABLE_NAME)
-            .where(eq(USER, subscription.getUser()))
+            .where(eq(USER, subscription.getUser().asString()))
             .and(eq(MAILBOX, subscription.getMailbox())));
     }
 
     @Override
-    public Subscription findMailboxSubscriptionForUser(String user, String mailbox) {
+    public Subscription findMailboxSubscriptionForUser(Username user, String mailbox) {
         ResultSet results = session.execute(select(MAILBOX)
             .from(TABLE_NAME)
-            .where(eq(USER, user))
+            .where(eq(USER, user.asString()))
             .and(eq(MAILBOX, mailbox)));
         return !results.isExhausted() ? new SimpleSubscription(user, mailbox) : null;
     }
 
     @Override
-    public List<Subscription> findSubscriptionsForUser(String user) {
+    public List<Subscription> findSubscriptionsForUser(Username user) {
         return cassandraUtils.convertToStream(
             session.execute(select(MAILBOX)
                 .from(TABLE_NAME)
-                .where(eq(USER, user))))
+                .where(eq(USER, user.asString()))))
             .map((row) -> new SimpleSubscription(user, row.getString(MAILBOX)))
             .collect(Collectors.toList());
     }
@@ -79,7 +80,7 @@ public class CassandraSubscriptionMapper extends NonTransactionalMapper implemen
     @Override
     public synchronized void save(Subscription subscription) {
         session.execute(insertInto(TABLE_NAME)
-            .value(USER, subscription.getUser())
+            .value(USER, subscription.getUser().asString())
             .value(MAILBOX, subscription.getMailbox()));
     }
 
@@ -87,7 +88,7 @@ public class CassandraSubscriptionMapper extends NonTransactionalMapper implemen
         return cassandraUtils.convertToStream(
             session.execute(select(FIELDS)
                 .from(TABLE_NAME)))
-            .map((row) -> new SimpleSubscription(row.getString(USER), row.getString(MAILBOX)))
+            .map((row) -> new SimpleSubscription(Username.of(row.getString(USER)), row.getString(MAILBOX)))
             .collect(Collectors.toList());
     }
 
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPASubscriptionManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPASubscriptionManager.java
index fae41ba..7fb342e 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPASubscriptionManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPASubscriptionManager.java
@@ -38,6 +38,6 @@ public class JPASubscriptionManager extends StoreSubscriptionManager {
     
     @Override
     protected Subscription createSubscription(MailboxSession session, String mailbox) {
-        return new JPASubscription(session.getUser().asString(), mailbox);
+        return new JPASubscription(session.getUser(), mailbox);
     }
 }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java
index 7d41117..a096632 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/JPASubscriptionMapper.java
@@ -24,6 +24,7 @@ import javax.persistence.EntityManagerFactory;
 import javax.persistence.NoResultException;
 import javax.persistence.PersistenceException;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.jpa.JPATransactionalMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
@@ -40,10 +41,12 @@ public class JPASubscriptionMapper extends JPATransactionalMapper implements Sub
 
     
     @Override
-    public Subscription findMailboxSubscriptionForUser(String user, String mailbox) throws SubscriptionException {
+    public Subscription findMailboxSubscriptionForUser(Username user, String mailbox) throws SubscriptionException {
         try {
             return (Subscription) getEntityManager().createNamedQuery("findFindMailboxSubscriptionForUser")
-            .setParameter("userParam", user).setParameter("mailboxParam", mailbox).getSingleResult();
+            .setParameter("userParam", user.asString())
+                .setParameter("mailboxParam", mailbox)
+                .getSingleResult();
         } catch (NoResultException e) {
             return null;
         } catch (PersistenceException e) {
@@ -62,9 +65,11 @@ public class JPASubscriptionMapper extends JPATransactionalMapper implements Sub
 
     @Override
     @SuppressWarnings("unchecked")
-    public List<Subscription> findSubscriptionsForUser(String user) throws SubscriptionException {
+    public List<Subscription> findSubscriptionsForUser(Username user) throws SubscriptionException {
         try {
-            return (List<Subscription>) getEntityManager().createNamedQuery("findSubscriptionsForUser").setParameter("userParam", user).getResultList();
+            return (List<Subscription>) getEntityManager().createNamedQuery("findSubscriptionsForUser")
+                .setParameter("userParam", user.asString())
+                .getResultList();
         } catch (PersistenceException e) {
             throw new SubscriptionException(e);
         }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java
index 5cb4a52..785ce13 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/user/model/JPASubscription.java
@@ -28,6 +28,7 @@ import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.user.model.Subscription;
 
 /**
@@ -81,9 +82,9 @@ public class JPASubscription implements Subscription {
      * @param username not null
      * @param mailbox not null
      */
-    public JPASubscription(String username, String mailbox) {
+    public JPASubscription(Username username, String mailbox) {
         super();
-        this.username = username;
+        this.username = username.asString();
         this.mailbox = mailbox;
     }
 
@@ -93,8 +94,8 @@ public class JPASubscription implements Subscription {
     }
     
     @Override
-    public String getUser() {
-        return username;
+    public Username getUser() {
+        return Username.of(username);
     }
 
     @Override
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
index 55fceb3..dee6ac7 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/user/MaildirSubscriptionMapper.java
@@ -58,7 +58,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
         boolean changed = subscriptionNames.size() != newSubscriptions.size();
         if (changed) {
             try {
-                writeSubscriptions(new File(store.userRoot(Username.of(subscription.getUser()))), newSubscriptions);
+                writeSubscriptions(new File(store.userRoot(subscription.getUser())), newSubscriptions);
             } catch (IOException e) {
                 throw new SubscriptionException(e);
             }
@@ -66,7 +66,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
     }
 
     @Override
-    public List<Subscription> findSubscriptionsForUser(String user) throws SubscriptionException {
+    public List<Subscription> findSubscriptionsForUser(Username user) throws SubscriptionException {
         Set<String> subscriptionNames = readSubscriptionsForUser(user);
         return subscriptionNames.stream()
             .map(subscription -> new SimpleSubscription(user, subscription))
@@ -74,8 +74,8 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
     }
 
     @Override
-    public Subscription findMailboxSubscriptionForUser(String user, String mailbox) throws SubscriptionException {
-        File userRoot = new File(store.userRoot(Username.of(user)));
+    public Subscription findMailboxSubscriptionForUser(Username user, String mailbox) throws SubscriptionException {
+        File userRoot = new File(store.userRoot(user));
         Set<String> subscriptionNames;
         try {
             subscriptionNames = readSubscriptions(userRoot);
@@ -99,7 +99,7 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
         boolean changed = subscriptionNames.size() != newSubscriptions.size();
         if (changed) {
             try {
-                writeSubscriptions(new File(store.userRoot(Username.of(subscription.getUser()))), newSubscriptions);
+                writeSubscriptions(new File(store.userRoot(subscription.getUser())), newSubscriptions);
             } catch (IOException e) {
                 throw new SubscriptionException(e);
             }
@@ -117,8 +117,8 @@ public class MaildirSubscriptionMapper extends NonTransactionalMapper implements
      * @param user The user to get the subscriptions for
      * @return A Set of names of subscribed mailboxes of the user
      */
-    private Set<String> readSubscriptionsForUser(String user) throws SubscriptionException { 
-        File userRoot = new File(store.userRoot(Username.of(user)));
+    private Set<String> readSubscriptionsForUser(Username user) throws SubscriptionException {
+        File userRoot = new File(store.userRoot(user));
         try {
             return readSubscriptions(userRoot);
         } catch (IOException e) {
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java
index d0c8336..a94de8c 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/user/InMemorySubscriptionMapper.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.inmemory.user;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.model.Subscription;
@@ -31,7 +32,7 @@ import com.google.common.collect.Multimaps;
 
 public class InMemorySubscriptionMapper extends NonTransactionalMapper implements SubscriptionMapper {
     
-    private final ListMultimap<String, Subscription> subscriptionsByUser;
+    private final ListMultimap<Username, Subscription> subscriptionsByUser;
     
     public InMemorySubscriptionMapper() {
         subscriptionsByUser = Multimaps.synchronizedListMultimap(ArrayListMultimap.create());
@@ -43,7 +44,7 @@ public class InMemorySubscriptionMapper extends NonTransactionalMapper implement
     }
 
     @Override
-    public Subscription findMailboxSubscriptionForUser(String user, String mailbox) {
+    public Subscription findMailboxSubscriptionForUser(Username user, String mailbox) {
         final List<Subscription> subscriptions = ImmutableList.copyOf(subscriptionsByUser.get(user));
         if (subscriptions != null) {
             return subscriptions.stream()
@@ -55,7 +56,7 @@ public class InMemorySubscriptionMapper extends NonTransactionalMapper implement
     }
 
     @Override
-    public List<Subscription> findSubscriptionsForUser(String user) {
+    public List<Subscription> findSubscriptionsForUser(Username user) {
         final List<Subscription> subcriptions = subscriptionsByUser.get(user);
         if (subcriptions == null) {
             return ImmutableList.of();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java
index 4533368..f678ff1 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreSubscriptionManager.java
@@ -54,7 +54,7 @@ public class StoreSubscriptionManager implements SubscriptionManager {
         final SubscriptionMapper mapper = mapperFactory.getSubscriptionMapper(session);
         try {
             mapper.execute(Mapper.toTransaction(() -> {
-                Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser().asString(), mailbox);
+                Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser(), mailbox);
                 if (subscription == null) {
                     Subscription newSubscription = createSubscription(session, mailbox);
                     mapper.save(newSubscription);
@@ -71,13 +71,13 @@ public class StoreSubscriptionManager implements SubscriptionManager {
      * If you need something more special just override this method
      */
     protected Subscription createSubscription(MailboxSession session, String mailbox) {
-        return new SimpleSubscription(session.getUser().asString(), mailbox);
+        return new SimpleSubscription(session.getUser(), mailbox);
     }
 
     @Override
     public Collection<String> subscriptions(MailboxSession session) throws SubscriptionException {
         return mapperFactory.getSubscriptionMapper(session)
-            .findSubscriptionsForUser(session.getUser().asString())
+            .findSubscriptionsForUser(session.getUser())
             .stream()
             .map(Subscription::getMailbox)
             .collect(Collectors.toCollection(() -> new HashSet<>(INITIAL_SIZE)));
@@ -88,7 +88,7 @@ public class StoreSubscriptionManager implements SubscriptionManager {
         final SubscriptionMapper mapper = mapperFactory.getSubscriptionMapper(session);
         try {
             mapper.execute(Mapper.toTransaction(() -> {
-                Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser().asString(), mailbox);
+                Subscription subscription = mapper.findMailboxSubscriptionForUser(session.getUser(), mailbox);
                 if (subscription != null) {
                     mapper.delete(subscription);
                 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java
index 48ee42f..0b10e5c 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/SubscriptionMapper.java
@@ -20,6 +20,7 @@ package org.apache.james.mailbox.store.user;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.store.transaction.Mapper;
 import org.apache.james.mailbox.store.user.model.Subscription;
@@ -38,8 +39,7 @@ public interface SubscriptionMapper extends Mapper {
      * @return <code>Subscription</code>, 
      * or null when the user is not subscribed to the given mailbox
      */
-    Subscription findMailboxSubscriptionForUser(
-        final String user, String mailbox) throws SubscriptionException;
+    Subscription findMailboxSubscriptionForUser(Username user, String mailbox) throws SubscriptionException;
 
     /**
      * Saves the given subscription.
@@ -52,7 +52,7 @@ public interface SubscriptionMapper extends Mapper {
      * @param user not null
      * @return not null
      */
-    List<Subscription> findSubscriptionsForUser(String user) throws SubscriptionException;
+    List<Subscription> findSubscriptionsForUser(Username user) throws SubscriptionException;
 
     /**
      * Deletes the given subscription.
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java
index a967b58..c2ad141 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/Subscription.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.user.model;
 
+import org.apache.james.core.Username;
+
 /**
  * 
  * Subscription of a mailbox to a user
@@ -40,6 +42,6 @@ public interface Subscription {
      * 
      * @return not null
      */
-    String getUser();
+    Username getUser();
 
 }
\ No newline at end of file
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/impl/SimpleSubscription.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/impl/SimpleSubscription.java
index 7b34615..2d01c99 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/impl/SimpleSubscription.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/user/model/impl/SimpleSubscription.java
@@ -18,16 +18,17 @@
  ****************************************************************/
 package org.apache.james.mailbox.store.user.model.impl;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.store.user.model.Subscription;
 
 import com.google.common.base.Objects;
 
 public class SimpleSubscription implements Subscription {
 
-    private final String user;
+    private final Username user;
     private final String mailbox;
     
-    public SimpleSubscription(String user, String mailbox) {
+    public SimpleSubscription(Username user, String mailbox) {
         this.user = user;
         this.mailbox = mailbox;
     }
@@ -38,7 +39,7 @@ public class SimpleSubscription implements Subscription {
     }
 
     @Override
-    public String getUser() {
+    public Username getUser() {
         return user;
     }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
index f085ff8..81a5286 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/user/SubscriptionMapperTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.List;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.exception.SubscriptionException;
 import org.apache.james.mailbox.store.user.model.Subscription;
 import org.apache.james.mailbox.store.user.model.impl.SimpleSubscription;
@@ -30,8 +31,8 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 public abstract class SubscriptionMapperTest {
-    private static final String USER_1 = "user1";
-    private static final String USER_2 = "user2";
+    private static final Username USER_1 = Username.of("user1");
+    private static final Username USER_2 = Username.of("user2");
     private static final String MAILBOX_1 = "mailbox1";
     private static final String MAILBOX_2 = "mailbox2";
 


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


[james-project] 36/43: JAMES-2982 UserRoutes + UserService improve error messages and tests

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

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

commit b22ceab4e191359e94bafb3c11dc3767a64c3ee8
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon Nov 18 10:51:05 2019 +0700

    JAMES-2982 UserRoutes + UserService improve error messages and tests
    
     - Tests now includes nonVirtualHosting repository
     - Rely some generic exception on common error handling
---
 server/protocols/webadmin/webadmin-data/pom.xml    |   6 +
 .../apache/james/webadmin/routes/UserRoutes.java   |  59 +-
 .../apache/james/webadmin/service/UserService.java |  40 +-
 .../james/webadmin/routes/UserRoutesTest.java      | 620 +++++++++++++++++++++
 .../james/webadmin/routes/UsersRoutesTest.java     | 464 ---------------
 5 files changed, 653 insertions(+), 536 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/pom.xml b/server/protocols/webadmin/webadmin-data/pom.xml
index 8694906..fedd3c4 100644
--- a/server/protocols/webadmin/webadmin-data/pom.xml
+++ b/server/protocols/webadmin/webadmin-data/pom.xml
@@ -56,6 +56,12 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-data-library</artifactId>
+            <scope>test</scope>
+            <type>test-jar</type>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-data-memory</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java
index 9006e96..6d3b641 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java
@@ -20,6 +20,7 @@
 package org.apache.james.webadmin.routes;
 
 import static org.apache.james.webadmin.Constants.SEPARATOR;
+import static spark.Spark.halt;
 
 import javax.inject.Inject;
 import javax.ws.rs.DELETE;
@@ -28,6 +29,8 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.apache.james.core.Username;
+import org.apache.james.user.api.InvalidUsernameException;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.dto.AddUserRequest;
@@ -49,6 +52,7 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
+import spark.HaltException;
 import spark.Request;
 import spark.Response;
 import spark.Service;
@@ -139,7 +143,7 @@ public class UserRoutes implements Routes {
     }
 
     private String removeUser(Request request, Response response) {
-        String username = request.params(USER_NAME);
+        Username username = extractUsername(request);
         try {
             userService.removeUser(username);
             return Responses.returnNoContent(response);
@@ -150,54 +154,37 @@ public class UserRoutes implements Routes {
                 .message("The user " + username + " does not exists")
                 .cause(e)
                 .haltError();
-        } catch (UserService.InvalidUsername e) {
-            LOGGER.info("Invalid username", e);
-            throw ErrorResponder.builder()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid username: it should be between 1 and 255 long without '/'")
-                .cause(e)
-                .haltError();
-        } catch (IllegalArgumentException e) {
-            LOGGER.info("Invalid user path", e);
-            throw ErrorResponder.builder()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid user path")
-                .cause(e)
-                .haltError();
         }
     }
 
-    private String upsertUser(Request request, Response response) throws UsersRepositoryException {
+    private HaltException upsertUser(Request request, Response response) throws JsonExtractException {
+        Username username = extractUsername(request);
         try {
-            return userService.upsertUser(request.params(USER_NAME),
-                jsonExtractor.parse(request.body()).getPassword(),
-                response);
-        } catch (JsonExtractException e) {
-            LOGGER.info("Error while deserializing addUser request", e);
-            throw ErrorResponder.builder()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .type(ErrorType.INVALID_ARGUMENT)
-                .message("Error while deserializing addUser request")
-                .cause(e)
-                .haltError();
-        } catch (UserService.InvalidUsername e) {
+            userService.upsertUser(username,
+                jsonExtractor.parse(request.body()).getPassword());
+
+            return halt(HttpStatus.NO_CONTENT_204);
+        } catch (InvalidUsernameException e) {
             LOGGER.info("Invalid username", e);
             throw ErrorResponder.builder()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid username: it should be between 1 and 255 long without '/'")
+                .message("Username supplied is invalid")
                 .cause(e)
                 .haltError();
-        } catch (IllegalArgumentException e) {
-            LOGGER.info("Invalid user path", e);
+        } catch (UsersRepositoryException e) {
+            String errorMessage = String.format("Error while upserting user '%s'", username);
+            LOGGER.info(errorMessage, e);
             throw ErrorResponder.builder()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .type(ErrorType.INVALID_ARGUMENT)
-                .message("Invalid user path")
+                .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500)
+                .type(ErrorType.SERVER_ERROR)
+                .message(errorMessage)
                 .cause(e)
                 .haltError();
         }
     }
+
+    private Username extractUsername(Request request) {
+        return Username.of(request.params(USER_NAME));
+    }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
index b215803..78501da 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
@@ -31,26 +31,11 @@ import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.user.api.model.User;
 import org.apache.james.util.streams.Iterators;
 import org.apache.james.webadmin.dto.UserResponse;
-import org.apache.james.webadmin.utils.Responses;
-import org.eclipse.jetty.http.HttpStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.github.steveash.guavate.Guavate;
 
-import spark.Response;
-
 public class UserService {
 
-    public static class InvalidUsername extends RuntimeException {
-        InvalidUsername(Exception e) {
-            super("Username invariants violation", e);
-        }
-    }
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(UserService.class);
-    private static final String EMPTY_BODY = "";
-
     private final UsersRepository usersRepository;
 
     @Inject
@@ -67,32 +52,15 @@ public class UserService {
             .collect(Guavate.toImmutableList());
     }
 
-    public void removeUser(String username) throws UsersRepositoryException {
-        usernamePreconditions(username);
-        usersRepository.removeUser(Username.of(username));
+    public void removeUser(Username username) throws UsersRepositoryException {
+        usersRepository.removeUser(username);
     }
 
-    public String upsertUser(String rawUsername, char[] password, Response response) throws UsersRepositoryException {
-        usernamePreconditions(rawUsername);
-        Username username = Username.of(rawUsername);
+    public void upsertUser(Username username, char[] password) throws UsersRepositoryException {
         User user = usersRepository.getUserByName(username);
-        try {
-            upsert(user, username, password);
-            return Responses.returnNoContent(response);
-        } catch (UsersRepositoryException e) {
-            LOGGER.info("Error creating or updating user : {}", e.getMessage());
-            response.status(HttpStatus.CONFLICT_409);
-        }
-        return EMPTY_BODY;
+        upsert(user, username, password);
     }
 
-    private void usernamePreconditions(String username) {
-        try {
-            Username.of(username);
-        } catch (IllegalArgumentException e) {
-            throw new InvalidUsername(e);
-        }
-    }
 
     private void upsert(User user, Username username, char[] password) throws UsersRepositoryException {
         if (user == null) {
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java
new file mode 100644
index 0000000..34a59a2
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UserRoutesTest.java
@@ -0,0 +1,620 @@
+/****************************************************************
+ * 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.webadmin.routes;
+
+import static io.restassured.RestAssured.given;
+import static io.restassured.RestAssured.when;
+import static io.restassured.RestAssured.with;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.james.core.Domain;
+import org.apache.james.core.Username;
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.domainlist.api.mock.SimpleDomainList;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.apache.james.user.api.model.User;
+import org.apache.james.user.memory.MemoryUsersRepository;
+import org.apache.james.webadmin.WebAdminServer;
+import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.service.UserService;
+import org.apache.james.webadmin.utils.ErrorResponder;
+import org.apache.james.webadmin.utils.JsonTransformer;
+import org.eclipse.jetty.http.HttpStatus;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.AfterEachCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ParameterContext;
+import org.junit.jupiter.api.extension.ParameterResolutionException;
+import org.junit.jupiter.api.extension.ParameterResolver;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import com.google.common.collect.ImmutableMap;
+
+import io.restassured.RestAssured;
+import io.restassured.http.ContentType;
+
+class UserRoutesTest {
+
+    private static class UserRoutesExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver {
+
+        static UserRoutesExtension withVirtualHosting() {
+            return new UserRoutesExtension(MemoryUsersRepository.withVirtualHosting());
+        }
+        static UserRoutesExtension withoutVirtualHosting() {
+            return new UserRoutesExtension(MemoryUsersRepository.withoutVirtualHosting());
+        }
+
+        final MemoryUsersRepository usersRepository;
+
+        WebAdminServer webAdminServer;
+
+        UserRoutesExtension(MemoryUsersRepository usersRepository) {
+            this.usersRepository = spy(usersRepository);
+        }
+
+        @Override
+        public void beforeEach(ExtensionContext extensionContext) throws Exception {
+            DomainList domainList = new SimpleDomainList();
+            domainList.addDomain(DOMAIN);
+            usersRepository.setDomainList(domainList);
+
+            webAdminServer = startServer(usersRepository);
+        }
+
+        @Override
+        public void afterEach(ExtensionContext extensionContext) throws Exception {
+            webAdminServer.destroy();
+        }
+
+        @Override
+        public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
+            return parameterContext.getParameter()
+                .getType()
+                .isAssignableFrom(UsersRepository.class);
+        }
+
+        @Override
+        public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
+            return usersRepository;
+        }
+
+        private WebAdminServer startServer(UsersRepository usersRepository) {
+            WebAdminServer server = WebAdminUtils.createWebAdminServer(new UserRoutes(new UserService(usersRepository), new JsonTransformer()))
+                .start();
+
+            RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(server)
+                .setBasePath(UserRoutes.USERS)
+                .build();
+
+            return server;
+        }
+    }
+
+    interface UserRoutesContract {
+        interface AllContracts extends NormalBehaviourContract, MockBehaviorErrorHandlingContract {
+        }
+
+        interface NormalBehaviourContract {
+
+            @Test
+            default void getUsersShouldBeEmptyByDefault() {
+                List<Map<String, String>> users =
+                    when()
+                        .get()
+                    .then()
+                        .statusCode(HttpStatus.OK_200)
+                        .contentType(ContentType.JSON)
+                        .extract()
+                        .body()
+                        .jsonPath()
+                        .getList(".");
+
+                assertThat(users).isEmpty();
+            }
+
+            @Test
+            default void putShouldReturnUserErrorWhenNoBody() {
+                when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                    .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                    .body("message", is("JSON payload of the request is not valid"));
+            }
+
+            @Test
+            default void postShouldReturnUserErrorWhenEmptyJsonBody() {
+                given()
+                    .body("{}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                    .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                    .body("message", is("JSON payload of the request is not valid"));
+            }
+
+            @Test
+            default void putShouldReturnUserErrorWhenWrongJsonBody() {
+                given()
+                    .body("{\"bad\":\"any\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                    .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                    .body("message", is("JSON payload of the request is not valid"));
+            }
+
+            @Test
+            default void putShouldReturnRequireNonNullPassword() {
+                given()
+                    .body("{\"password\":null}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                    .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                    .body("message", is("JSON payload of the request is not valid"));
+            }
+
+            @Test
+            default void deleteShouldReturnOk() {
+                when()
+                    .delete(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.NO_CONTENT_204);
+            }
+
+            @Test
+            default void deleteShouldReturnBadRequestWhenEmptyUserName() {
+                when()
+                    .delete("/")
+                .then()
+                    .statusCode(HttpStatus.NOT_FOUND_404);
+            }
+
+            @Test
+            default void deleteShouldReturnBadRequestWhenUsernameIsTooLong() {
+                when()
+                    .delete(USERNAME_WITH_DOMAIN.asString() + "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
+                        "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
+                        "0123456789.0123456789.0123456789.")
+                .then()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                    .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                    .body("message", is("Invalid arguments supplied in the user request"))
+                    .body("details", is("username length should not be longer than 255 characters"));
+            }
+
+            @Test
+            default void deleteShouldReturnNotFoundWhenUsernameContainsSlash() {
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString() + "/" + USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.NOT_FOUND_404);
+            }
+
+            @Test
+            default void putShouldReturnBadRequestWhenEmptyUserName() {
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put("/")
+                .then()
+                    .statusCode(HttpStatus.NOT_FOUND_404);
+            }
+
+            @Test
+            default void putShouldReturnBadRequestWhenUsernameIsTooLong() {
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString() + "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
+                        "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
+                        "0123456789.0123456789.0123456789.")
+                .then()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                    .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                    .body("message", is("Invalid arguments supplied in the user request"))
+                    .body("details", is("username length should not be longer than 255 characters"));
+            }
+
+            @Test
+            default void putShouldReturnNotFoundWhenUsernameContainsSlash() {
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString() + "/" + USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.NOT_FOUND_404);
+            }
+
+            @Test
+            default void deleteShouldRemoveAssociatedUser() {
+                // Given
+                with()
+                    .body("{\"password\":\"password\"}")
+                    .put(USERNAME_WITH_DOMAIN.asString());
+
+                // When
+                when()
+                    .delete(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.NO_CONTENT_204);
+
+                // Then
+                List<Map<String, String>> users =
+                    when()
+                        .get()
+                    .then()
+                        .statusCode(HttpStatus.OK_200)
+                        .contentType(ContentType.JSON)
+                        .extract()
+                        .body()
+                        .jsonPath()
+                        .getList(".");
+
+                assertThat(users).isEmpty();
+            }
+
+            @Test
+            default void deleteShouldStillBeValidWithExtraBody() {
+                given()
+                    .body("{\"bad\":\"any\"}")
+                .when()
+                    .delete(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.NO_CONTENT_204);
+            }
+        }
+
+        interface MockBehaviorErrorHandlingContract {
+
+            @Test
+            default void deleteShouldStillBeOkWhenNoUser(UsersRepository usersRepository) throws Exception {
+                doThrow(new UsersRepositoryException("message")).when(usersRepository).removeUser(USERNAME_WITH_DOMAIN);
+
+                when()
+                    .delete(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.NO_CONTENT_204);
+            }
+
+            @Test
+            default void getShouldFailOnRepositoryException(UsersRepository usersRepository) throws Exception {
+                when(usersRepository.list()).thenThrow(new UsersRepositoryException("message"));
+
+                when()
+                    .get()
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+
+            @Test
+            default void putShouldFailOnRepositoryExceptionOnGetUserByName(UsersRepository usersRepository) throws Exception {
+                when(usersRepository.getUserByName(USERNAME_WITH_DOMAIN)).thenThrow(new UsersRepositoryException("message"));
+
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+
+            @Test
+            default void putShouldReturnInternalServerErrorWhenUserRepositoryAddingUserError(UsersRepository usersRepository) throws Exception {
+                when(usersRepository.getUserByName(USERNAME_WITH_DOMAIN)).thenReturn(null);
+                doThrow(new UsersRepositoryException("message")).when(usersRepository).addUser(USERNAME_WITH_DOMAIN, PASSWORD);
+
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+
+            @Test
+            default void putShouldReturnInternalServerErrorWhenUserRepositoryUpdatingUserError(UsersRepository usersRepository) throws Exception {
+                when(usersRepository.getUserByName(USERNAME_WITH_DOMAIN)).thenReturn(mock(User.class));
+                doThrow(new UsersRepositoryException("message")).when(usersRepository).updateUser(any());
+
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+
+
+            @Test
+            default void deleteShouldFailOnUnknownException(UsersRepository usersRepository) throws Exception {
+                doThrow(new RuntimeException()).when(usersRepository).removeUser(USERNAME_WITH_DOMAIN);
+
+                when()
+                    .delete(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+
+            @Test
+            default void getShouldFailOnUnknownException(UsersRepository usersRepository) throws Exception {
+                when(usersRepository.list()).thenThrow(new RuntimeException());
+
+                when()
+                    .get()
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+
+            @Test
+            default void putShouldFailOnUnknownExceptionOnGetUserByName(UsersRepository usersRepository) throws Exception {
+                when(usersRepository.getUserByName(USERNAME_WITH_DOMAIN)).thenThrow(new RuntimeException());
+
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+
+            @Test
+            default void putShouldFailOnUnknownExceptionOnAddUser(UsersRepository usersRepository) throws Exception {
+                when(usersRepository.getUserByName(USERNAME_WITH_DOMAIN)).thenReturn(null);
+                doThrow(new RuntimeException()).when(usersRepository).addUser(USERNAME_WITH_DOMAIN, PASSWORD);
+
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+
+            @Test
+            default void putShouldFailOnUnknownExceptionOnGetUpdateUser(UsersRepository usersRepository) throws Exception {
+                when(usersRepository.getUserByName(USERNAME_WITH_DOMAIN)).thenReturn(mock(User.class));
+                doThrow(new RuntimeException()).when(usersRepository).updateUser(any());
+
+                given()
+                    .body("{\"password\":\"password\"}")
+                .when()
+                    .put(USERNAME_WITH_DOMAIN.asString())
+                .then()
+                    .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
+            }
+        }
+    }
+
+    private static final Domain DOMAIN = Domain.of("domain");
+    private static final Username USERNAME_WITHOUT_DOMAIN = Username.of("username");
+    private static final Username USERNAME_WITH_DOMAIN =
+        Username.fromLocalPartWithDomain(USERNAME_WITHOUT_DOMAIN.asString(), DOMAIN);
+    private static final String PASSWORD = "password";
+
+    @Nested
+    class WithVirtualHosting implements UserRoutesContract.AllContracts {
+
+        @RegisterExtension
+        UserRoutesExtension extension = UserRoutesExtension.withVirtualHosting();
+
+        @Test
+        void puttingWithDomainPartInUsernameTwoTimesShouldBeAllowed() {
+            // Given
+            with()
+                .body("{\"password\":\"password\"}")
+                .put(USERNAME_WITH_DOMAIN.asString());
+
+            // When
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put(USERNAME_WITH_DOMAIN.asString())
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+
+            // Then
+            List<Map<String, String>> users =
+                when()
+                    .get()
+                .then()
+                    .statusCode(HttpStatus.OK_200)
+                    .contentType(ContentType.JSON)
+                    .extract()
+                    .body()
+                    .jsonPath()
+                    .getList(".");
+
+            assertThat(users).containsExactly(ImmutableMap.of("username", USERNAME_WITH_DOMAIN.asString()));
+        }
+
+        @Test
+        void putWithDomainPartInUsernameShouldReturnOkWhenWithA255LongUsername() {
+            String usernameTail = "@" + DOMAIN.name();
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put(StringUtils.repeat('j', 255 - usernameTail.length()) + usernameTail)
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+
+        @Test
+        void putWithDomainPartInUsernameShouldAddTheUser() {
+            with()
+                .body("{\"password\":\"password\"}")
+                .put(USERNAME_WITH_DOMAIN.asString());
+
+            List<Map<String, String>> users =
+                when()
+                    .get()
+                .then()
+                    .statusCode(HttpStatus.OK_200)
+                    .contentType(ContentType.JSON)
+                    .extract()
+                    .body()
+                    .jsonPath()
+                    .getList(".");
+
+            assertThat(users).containsExactly(ImmutableMap.of("username", USERNAME_WITH_DOMAIN.asString()));
+        }
+
+        @Test
+        void putShouldReturnBadRequestWhenUsernameDoesNotHaveDomainPart() {
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put("justLocalPart")
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is("Username supplied is invalid"))
+                .body("details", is("Given Username needs to contain a @domainpart"));
+        }
+
+        @Test
+        void putWithDomainPartInUsernameShouldReturnOkWhenValidJsonBody() {
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put(USERNAME_WITH_DOMAIN.asString())
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+    }
+
+    @Nested
+    class WithoutVirtualHosting implements UserRoutesContract.AllContracts {
+
+        @RegisterExtension
+        UserRoutesExtension extension = UserRoutesExtension.withoutVirtualHosting();
+
+        @Test
+        void puttingWithoutDomainPartInUsernameTwoTimesShouldBeAllowed() {
+            // Given
+            with()
+                .body("{\"password\":\"password\"}")
+                .put(USERNAME_WITHOUT_DOMAIN.asString());
+
+            // When
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put(USERNAME_WITHOUT_DOMAIN.asString())
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+
+            // Then
+            List<Map<String, String>> users =
+                when()
+                    .get()
+                .then()
+                    .statusCode(HttpStatus.OK_200)
+                    .contentType(ContentType.JSON)
+                    .extract()
+                    .body()
+                    .jsonPath()
+                    .getList(".");
+
+            assertThat(users).containsExactly(ImmutableMap.of("username", USERNAME_WITHOUT_DOMAIN.asString()));
+        }
+
+        @Test
+        void putWithoutDomainPartInUsernameShouldReturnOkWhenWithA255LongUsername() {
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put(StringUtils.repeat('j',
+                    255 - USERNAME_WITHOUT_DOMAIN.asString().length()) + USERNAME_WITHOUT_DOMAIN.asString())
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+
+        @Test
+        void putWithoutDomainPartInUsernameShouldAddTheUser() {
+            with()
+                .body("{\"password\":\"password\"}")
+                .put(USERNAME_WITHOUT_DOMAIN.asString());
+
+            List<Map<String, String>> users =
+                when()
+                    .get()
+                .then()
+                    .statusCode(HttpStatus.OK_200)
+                    .contentType(ContentType.JSON)
+                    .extract()
+                    .body()
+                    .jsonPath()
+                    .getList(".");
+
+            assertThat(users).containsExactly(ImmutableMap.of("username", USERNAME_WITHOUT_DOMAIN.asString()));
+        }
+
+        @Test
+        void putShouldReturnBadRequestWhenUsernameHasDomainPart() {
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put(USERNAME_WITH_DOMAIN.asString())
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is("Username supplied is invalid"))
+                .body("details", is("Given Username contains a @domainpart but virtualhosting support is disabled"));
+        }
+
+        @Test
+        void putWithoutDomainPartInUsernameShouldReturnOkWhenValidJsonBody() {
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put(USERNAME_WITHOUT_DOMAIN.asString())
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+    }
+}
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
deleted file mode 100644
index a2fe544..0000000
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/****************************************************************
- * 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.webadmin.routes;
-
-import static io.restassured.RestAssured.given;
-import static io.restassured.RestAssured.when;
-import static io.restassured.RestAssured.with;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.hamcrest.Matchers.is;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.james.core.Domain;
-import org.apache.james.core.Username;
-import org.apache.james.domainlist.api.DomainList;
-import org.apache.james.user.api.UsersRepository;
-import org.apache.james.user.api.UsersRepositoryException;
-import org.apache.james.user.api.model.User;
-import org.apache.james.user.memory.MemoryUsersRepository;
-import org.apache.james.webadmin.WebAdminServer;
-import org.apache.james.webadmin.WebAdminUtils;
-import org.apache.james.webadmin.service.UserService;
-import org.apache.james.webadmin.utils.ErrorResponder;
-import org.apache.james.webadmin.utils.JsonTransformer;
-import org.eclipse.jetty.http.HttpStatus;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
-
-import com.google.common.collect.ImmutableMap;
-
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-
-class UsersRoutesTest {
-
-    private static final Domain DOMAIN = Domain.of("domain");
-    private static final String USERNAME = "username@" + DOMAIN.name();
-    private WebAdminServer webAdminServer;
-
-    private void createServer(UsersRepository usersRepository) {
-        webAdminServer = WebAdminUtils.createWebAdminServer(new UserRoutes(new UserService(usersRepository), new JsonTransformer()))
-            .start();
-
-        RestAssured.requestSpecification = WebAdminUtils.buildRequestSpecification(webAdminServer)
-            .setBasePath(UserRoutes.USERS)
-            .build();
-    }
-
-    @AfterEach
-    void stop() {
-        webAdminServer.destroy();
-    }
-
-    @Nested
-    class NormalBehaviour {
-
-        @BeforeEach
-        void setUp() throws Exception {
-            DomainList domainList = mock(DomainList.class);
-            when(domainList.containsDomain(DOMAIN)).thenReturn(true);
-
-            MemoryUsersRepository usersRepository = MemoryUsersRepository.withVirtualHosting();
-            usersRepository.setDomainList(domainList);
-
-            createServer(usersRepository);
-        }
-
-        @Test
-        void getUsersShouldBeEmptyByDefault() {
-            List<Map<String, String>> users =
-                when()
-                    .get()
-                .then()
-                    .statusCode(HttpStatus.OK_200)
-                    .contentType(ContentType.JSON)
-                    .extract()
-                    .body()
-                    .jsonPath()
-                    .getList(".");
-
-            assertThat(users).isEmpty();
-        }
-
-        @Test
-        void putShouldReturnUserErrorWhenNoBody() {
-            when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400);
-        }
-
-        @Test
-        void postShouldReturnUserErrorWhenEmptyJsonBody() {
-            given()
-                .body("{}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400);
-        }
-
-        @Test
-        void putShouldReturnUserErrorWhenWrongJsonBody() {
-            given()
-                .body("{\"bad\":\"any\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400);
-        }
-
-        @Test
-        void putShouldReturnOkWhenValidJsonBody() {
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.NO_CONTENT_204);
-        }
-
-        @Test
-        void putShouldReturnOkWhenWithA255LongUsername() {
-            String usernameTail = "@" + DOMAIN.name();
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(StringUtils.repeat('j', 255 - usernameTail.length()) + usernameTail)
-            .then()
-                .statusCode(HttpStatus.NO_CONTENT_204);
-        }
-
-        @Test
-        void putShouldReturnRequireNonNullPassword() {
-            given()
-                .body("{\"password\":null}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400);
-        }
-
-        @Test
-        void putShouldAddTheUser() {
-            with()
-                .body("{\"password\":\"password\"}")
-                .put(USERNAME);
-
-            List<Map<String, String>> users =
-                when()
-                    .get()
-                .then()
-                    .statusCode(HttpStatus.OK_200)
-                    .contentType(ContentType.JSON)
-                    .extract()
-                    .body()
-                    .jsonPath()
-                    .getList(".");
-
-            assertThat(users).containsExactly(ImmutableMap.of("username", USERNAME));
-        }
-
-        @Test
-        void puttingTwoTimesShouldBeAllowed() {
-            // Given
-            with()
-                .body("{\"password\":\"password\"}")
-            .put(USERNAME);
-
-            // When
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.NO_CONTENT_204);
-
-            // Then
-            List<Map<String, String>> users =
-                when()
-                    .get()
-                .then()
-                    .statusCode(HttpStatus.OK_200)
-                    .contentType(ContentType.JSON)
-                    .extract()
-                    .body()
-                    .jsonPath()
-                    .getList(".");
-
-            assertThat(users).containsExactly(ImmutableMap.of("username", USERNAME));
-        }
-
-        @Test
-        void deleteShouldReturnOk() {
-            when()
-                .delete(USERNAME)
-            .then()
-                .statusCode(HttpStatus.NO_CONTENT_204);
-        }
-
-        @Test
-        void deleteShouldReturnBadRequestWhenEmptyUserName() {
-            when()
-                .delete("/")
-            .then()
-                .statusCode(HttpStatus.NOT_FOUND_404);
-        }
-
-        @Test
-        void deleteShouldReturnBadRequestWhenUsernameIsTooLong() {
-            when()
-                .delete(USERNAME + "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
-                    "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
-                    "0123456789.0123456789.0123456789.")
-            .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .body("statusCode", is(400))
-                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
-                .body("message", is("Invalid username: it should be between 1 and 255 long without '/'"));
-        }
-
-        @Test
-        void deleteShouldReturnNotFoundWhenUsernameContainsSlash() {
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME + "/" + USERNAME)
-            .then()
-                .statusCode(HttpStatus.NOT_FOUND_404);
-        }
-
-        @Test
-        void putShouldReturnBadRequestWhenEmptyUserName() {
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put("/")
-            .then()
-                .statusCode(HttpStatus.NOT_FOUND_404);
-        }
-
-        @Test
-        void putShouldReturnBadRequestWhenUsernameIsTooLong() {
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME + "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
-                    "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
-                    "0123456789.0123456789.0123456789.")
-            .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .body("statusCode", is(400))
-                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
-                .body("message", is("Invalid username: it should be between 1 and 255 long without '/'"));
-        }
-
-        @Test
-        void putShouldReturnNotFoundWhenUsernameContainsSlash() {
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME + "/" + USERNAME)
-            .then()
-                .statusCode(HttpStatus.NOT_FOUND_404);
-        }
-
-        @Test
-        void deleteShouldRemoveAssociatedUser() {
-            // Given
-            with()
-                .body("{\"password\":\"password\"}")
-            .put(USERNAME);
-
-            // When
-            when()
-                .delete(USERNAME)
-            .then()
-                .statusCode(HttpStatus.NO_CONTENT_204);
-
-            // Then
-            List<Map<String, String>> users =
-                when()
-                    .get()
-                .then()
-                    .statusCode(HttpStatus.OK_200)
-                    .contentType(ContentType.JSON)
-                    .extract()
-                    .body()
-                    .jsonPath()
-                    .getList(".");
-
-            assertThat(users).isEmpty();
-        }
-
-        @Test
-        void deleteShouldStillBeValidWithExtraBody() {
-            given()
-                .body("{\"bad\":\"any\"}")
-            .when()
-                .delete(USERNAME)
-            .then()
-                .statusCode(HttpStatus.NO_CONTENT_204);
-        }
-    }
-
-    @Nested
-    class ErrorHandling {
-
-        private UsersRepository usersRepository;
-        private Username username;
-        private String password;
-
-        @BeforeEach
-        void setUp() throws Exception {
-            usersRepository = mock(UsersRepository.class);
-            createServer(usersRepository);
-            username = Username.of("username@domain");
-            password = "password";
-        }
-
-        @Test
-        void deleteShouldStillBeOkWhenNoUser() throws Exception {
-            doThrow(new UsersRepositoryException("message")).when(usersRepository).removeUser(username);
-
-            when()
-                .delete(USERNAME)
-            .then()
-                .statusCode(HttpStatus.NO_CONTENT_204);
-        }
-
-        @Test
-        void getShouldFailOnRepositoryException() throws Exception {
-            when(usersRepository.list()).thenThrow(new UsersRepositoryException("message"));
-
-            when()
-                .get()
-            .then()
-                .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
-        }
-
-        @Test
-        void putShouldFailOnRepositoryExceptionOnGetUserByName() throws Exception {
-            when(usersRepository.getUserByName(username)).thenThrow(new UsersRepositoryException("message"));
-
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
-        }
-
-        @Test
-        void putShouldNotFailOnRepositoryExceptionOnAddUser() throws Exception {
-            when(usersRepository.getUserByName(username)).thenReturn(null);
-            doThrow(new UsersRepositoryException("message")).when(usersRepository).addUser(username, password);
-
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.CONFLICT_409);
-        }
-
-        @Test
-        void putShouldFailOnRepositoryExceptionOnUpdateUser() throws Exception {
-            when(usersRepository.getUserByName(username)).thenReturn(mock(User.class));
-            doThrow(new UsersRepositoryException("message")).when(usersRepository).updateUser(any());
-
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.CONFLICT_409);
-        }
-
-
-        @Test
-        void deleteShouldFailOnUnknownException() throws Exception {
-            doThrow(new RuntimeException()).when(usersRepository).removeUser(username);
-
-            when()
-                .delete(USERNAME)
-            .then()
-                .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
-        }
-
-        @Test
-        void getShouldFailOnUnknownException() throws Exception {
-            when(usersRepository.list()).thenThrow(new RuntimeException());
-
-            when()
-                .get()
-            .then()
-                .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
-        }
-
-        @Test
-        void putShouldFailOnUnknownExceptionOnGetUserByName() throws Exception {
-            when(usersRepository.getUserByName(username)).thenThrow(new RuntimeException());
-
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
-        }
-
-        @Test
-        void putShouldFailOnUnknownExceptionOnAddUser() throws Exception {
-            when(usersRepository.getUserByName(username)).thenReturn(null);
-            doThrow(new RuntimeException()).when(usersRepository).addUser(username, password);
-
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
-        }
-
-        @Test
-        void putShouldFailOnUnknownExceptionOnGetUpdateUser() throws Exception {
-            when(usersRepository.getUserByName(username)).thenReturn(mock(User.class));
-            doThrow(new RuntimeException()).when(usersRepository).updateUser(any());
-
-            given()
-                .body("{\"password\":\"password\"}")
-            .when()
-                .put(USERNAME)
-            .then()
-                .statusCode(HttpStatus.INTERNAL_SERVER_ERROR_500);
-        }
-    }
-
-}


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


[james-project] 12/43: [Refactoring] Delete SimpleMailboxMembership

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

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

commit ae57f3390c295ee1f688d8b780b076be2337d6ef
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Nov 16 12:08:24 2019 +0700

    [Refactoring] Delete SimpleMailboxMembership
---
 .../mailbox/store/SimpleMailboxMembership.java     | 309 ---------------------
 1 file changed, 309 deletions(-)

diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java
deleted file mode 100644
index a0118ee..0000000
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SimpleMailboxMembership.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/****************************************************************
- * 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.store;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.io.SequenceInputStream;
-import java.io.Writer;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.mail.Flags;
-
-import org.apache.commons.lang3.NotImplementedException;
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.model.ComposedMessageId;
-import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
-import org.apache.james.mailbox.model.MessageAttachment;
-import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.model.TestId;
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-import org.apache.james.mailbox.store.mail.model.Property;
-
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-
-public class SimpleMailboxMembership implements MailboxMessage {
-    
-    private static final String TOSTRING_SEPARATOR = " ";
-    
-    public TestId mailboxId;
-    public MessageUid uid;
-    public Date internalDate;
-    public boolean recent = false;
-    public boolean answered = false;
-    public boolean deleted = false;
-    public boolean draft = false;
-    public boolean flagged = false;
-    public boolean seen = false;
-
-    private MessageId messageId;
-
-    public SimpleMailboxMembership(MessageId messageId, TestId mailboxId, MessageUid uid, long modSeq, Date internalDate, int size, 
-            Flags flags, byte[] body, Map<String, String> headers) throws Exception {
-        super();
-        this.messageId = messageId;
-        this.mailboxId = mailboxId;
-        this.uid = uid;
-        this.internalDate = internalDate;
-        this.size = size;
-        this.body = body;
-        if (headers == null) {
-            this.headers = new HashMap<>();
-        } else {
-            this.headers = headers;
-        }
-        
-        this.body =  body;
-        setFlags(flags);
-    }
-
-    @Override
-    public ComposedMessageIdWithMetaData getComposedMessageIdWithMetaData() {
-        return ComposedMessageIdWithMetaData.builder()
-            .modSeq(modSeq)
-            .flags(createFlags())
-            .composedMessageId(new ComposedMessageId(mailboxId, getMessageId(), uid))
-            .build();
-    }
-
-    @Override
-    public Date getInternalDate() {
-        return internalDate;
-    }
-
-    @Override
-    public TestId getMailboxId() {
-        return mailboxId;
-    }
-    
-    @Override
-    public MessageUid getUid() {
-        return uid;
-    }
-
-    @Override
-    public boolean isAnswered() {
-        return answered;
-    }
-
-    @Override
-    public boolean isDeleted() {
-        return deleted;
-    }
-
-    @Override
-    public boolean isDraft() {
-        return draft;
-    }
-
-    @Override
-    public boolean isFlagged() {
-        return flagged;
-    }
-
-    @Override
-    public boolean isRecent() {
-        return recent;
-    }
-
-    @Override
-    public boolean isSeen() {
-        return seen;
-    }
-
-    @Override
-    public long getHeaderOctets() {
-        return size - body.length;
-    }
-
-    @Override
-    public void setFlags(Flags flags) {
-        answered = flags.contains(Flags.Flag.ANSWERED);
-        deleted = flags.contains(Flags.Flag.DELETED);
-        draft = flags.contains(Flags.Flag.DRAFT);
-        flagged = flags.contains(Flags.Flag.FLAGGED);
-        recent = flags.contains(Flags.Flag.RECENT);
-        seen = flags.contains(Flags.Flag.SEEN);
-    }
-
-    @Override
-    public Flags createFlags() {
-        final Flags flags = new Flags();
-
-        if (isAnswered()) {
-            flags.add(Flags.Flag.ANSWERED);
-        }
-        if (isDeleted()) {
-            flags.add(Flags.Flag.DELETED);
-        }
-        if (isDraft()) {
-            flags.add(Flags.Flag.DRAFT);
-        }
-        if (isFlagged()) {
-            flags.add(Flags.Flag.FLAGGED);
-        }
-        if (isRecent()) {
-            flags.add(Flags.Flag.RECENT);
-        }
-        if (isSeen()) {
-            flags.add(Flags.Flag.SEEN);
-        }
-        return flags;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(mailboxId.id, uid);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof SimpleMailboxMembership) {
-            SimpleMailboxMembership other = (SimpleMailboxMembership) obj;
-            return Objects.equal(this.mailboxId.id, other.mailboxId.id)
-                    && Objects.equal(this.uid, other.uid);
-        }
-        return false;
-    }
-
-    public String toString() {
-        return "mailbox("
-        + "mailboxId = " + this.mailboxId + TOSTRING_SEPARATOR
-        + "uid = " + this.uid + TOSTRING_SEPARATOR
-        + "internalDate = " + this.internalDate + TOSTRING_SEPARATOR
-        + "size = " + this.size + TOSTRING_SEPARATOR
-        + "answered = " + this.answered + TOSTRING_SEPARATOR
-        + "deleted = " + this.deleted + TOSTRING_SEPARATOR
-        + "draft = " + this.draft + TOSTRING_SEPARATOR
-        + "flagged = " + this.flagged + TOSTRING_SEPARATOR
-        + "recent = " + this.recent + TOSTRING_SEPARATOR
-        + "seen = " + this.seen + TOSTRING_SEPARATOR
-        + " )";
-    }
-
-    
-    public static final char[] NEW_LINE = { 0x0D, 0x0A };
-    
-    public byte[] body;
-    public Map<String, String> headers;
-    public List<SimpleProperty> properties;
-    public String subType = null;
-    public String mediaType = null;
-    public Long textualLineCount = null;
-
-    private final int size;
-
-    private long modSeq;
-    
-
-    @Override
-    public InputStream getBodyContent() throws IOException {
-        return new ByteArrayInputStream(body);
-    }
-
-    @Override
-    public InputStream getHeaderContent() throws IOException {
-        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        final Writer writer = new OutputStreamWriter(baos, "us-ascii");
-
-        for (Entry<String, String> header : headers.entrySet()) {
-            writer.write(header.getKey());
-            writer.write(": ");
-            writer.write(header.getValue());
-            writer.write(NEW_LINE);
-        }
-        writer.write(NEW_LINE);
-        writer.flush();
-        return new ByteArrayInputStream(baos.toByteArray());
-
-    }
-
-    @Override
-    public long getBodyOctets() {
-        return body.length;
-    }
-
-    @Override
-    public String getSubType() {
-        return subType;
-    }
-
-    @Override
-    public String getMediaType() {
-        return mediaType;
-    }
-
-    @Override
-    public List<Property> getProperties() {
-        if (properties != null) {
-            return ImmutableList.<Property>copyOf(properties);
-        } else {
-            return ImmutableList.of();
-        }
-    }
-
-    @Override
-    public Long getTextualLineCount() {
-        return textualLineCount;
-    }
-
-    @Override
-    public long getFullContentOctets() {
-        return size;
-    }
-
-    @Override
-    public long getModSeq() {
-        return modSeq;
-    }
-
-    @Override
-    public void setModSeq(long modSeq) {
-        this.modSeq = modSeq;
-    }
-
-    @Override
-    public void setUid(MessageUid uid) {
-        this.uid = uid;
-    }
-
-    @Override
-    public InputStream getFullContent() throws IOException {
-        return new SequenceInputStream(getHeaderContent(), getBodyContent());
-    }
-
-    @Override
-    public MessageId getMessageId() {
-        return messageId;
-    }
-
-    @Override
-    public List<MessageAttachment> getAttachments() {
-        throw new NotImplementedException("Attachments Ids not implemented");
-    }
-    
-}


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


[james-project] 04/43: [Refactoring] Switch RFC2822Headers to an interface

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

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

commit 0adcf291c68ca32798d7a4a192b0594dd8642c09
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sun Nov 17 11:30:04 2019 +0700

    [Refactoring] Switch RFC2822Headers to an interface
---
 .../org/apache/mailet/base/RFC2822Headers.java     | 59 +++++++++-------------
 1 file changed, 25 insertions(+), 34 deletions(-)

diff --git a/mailet/base/src/main/java/org/apache/mailet/base/RFC2822Headers.java b/mailet/base/src/main/java/org/apache/mailet/base/RFC2822Headers.java
index 304e1c2..70a0409 100644
--- a/mailet/base/src/main/java/org/apache/mailet/base/RFC2822Headers.java
+++ b/mailet/base/src/main/java/org/apache/mailet/base/RFC2822Headers.java
@@ -17,166 +17,157 @@
  * under the License.                                           *
  ****************************************************************/
 
-
 package org.apache.mailet.base;
 
 /**
  * This utility class provides the set of header names explicitly defined in RFC 2822
  *
  */
-public class RFC2822Headers  {
+public interface RFC2822Headers  {
 
     // See Section 3.6.1 of RFC 2822
 
     /**
      * The name of the RFC 2822 header that stores the mail date.
      */
-    public static final String DATE = "Date";
+    String DATE = "Date";
 
     // See Section 3.6.2 of RFC 2822
 
     /**
      * The name of the RFC 2822 header that stores the mail author(s).
      */
-    public static final String FROM = "From";
+    String FROM = "From";
 
     /**
      * The name of the RFC 2822 header that stores the actual mail transmission agent,
      * if this differs from the author of the message.
      */
-    public static final String SENDER = "Sender";
+    String SENDER = "Sender";
 
     /**
      * The name of the RFC 2822 header that stores the reply-to address.
      */
-    public static final String REPLY_TO = "Reply-To";
+    String REPLY_TO = "Reply-To";
 
     // See Section 3.6.3 of RFC 2822
 
     /**
      * The name of the RFC 2822 header that stores the primary mail recipients.
      */
-    public static final String TO = "To";
+    String TO = "To";
 
     /**
      * The name of the RFC 2822 header that stores the carbon copied mail recipients.
      */
-    public static final String CC = "Cc";
+    String CC = "Cc";
 
     /**
      * The name of the RFC 2822 header that stores the blind carbon copied mail recipients.
      */
-    public static final String BCC = "Bcc";
+    String BCC = "Bcc";
 
     // See Section 3.6.4 of RFC 2822
 
     /**
      * The name of the RFC 2822 header that stores the message id.
      */
-    public static final String MESSAGE_ID = "Message-ID";
+    String MESSAGE_ID = "Message-ID";
 
     /**
      * A common variation on the name of the RFC 2822 header that
      * stores the message id.  This is needed for certain filters and
      * processing of incoming mail.
      */
-    public static final String MESSAGE_ID_VARIATION = "Message-Id";
+    String MESSAGE_ID_VARIATION = "Message-Id";
 
     /**
      * The name of the RFC 2822 header that stores the message id of the message
      * that to which this email is a reply.
      */
-    public static final String IN_REPLY_TO = "In-Reply-To";
+    String IN_REPLY_TO = "In-Reply-To";
 
     /**
      * The name of the RFC 2822 header that is used to identify the thread to
      * which this message refers.
      */
-    public static final String REFERENCES = "References";
+    String REFERENCES = "References";
 
     // See Section 3.6.5 of RFC 2822
 
     /**
      * The name of the RFC 2822 header that stores the subject.
      */
-    public static final String SUBJECT = "Subject";
+    String SUBJECT = "Subject";
 
     /**
      * The name of the RFC 2822 header that stores human-readable comments.
      */
-    public static final String COMMENTS = "Comments";
+    String COMMENTS = "Comments";
 
     /**
      * The name of the RFC 2822 header that stores human-readable keywords.
      */
-    public static final String KEYWORDS = "Keywords";
+    String KEYWORDS = "Keywords";
 
     // See Section 3.6.6 of RFC 2822
 
     /**
      * The name of the RFC 2822 header that stores the date the message was resent.
      */
-    public static final String RESENT_DATE = "Resent-Date";
+    String RESENT_DATE = "Resent-Date";
 
     /**
      * The name of the RFC 2822 header that stores the originator of the resent message.
      */
-    public static final String RESENT_FROM = "Resent-From";
+    String RESENT_FROM = "Resent-From";
 
     /**
      * The name of the RFC 2822 header that stores the transmission agent
      * of the resent message.
      */
-    public static final String RESENT_SENDER = "Resent-Sender";
+    String RESENT_SENDER = "Resent-Sender";
 
     /**
      * The name of the RFC 2822 header that stores the recipients
      * of the resent message.
      */
-    public static final String RESENT_TO = "Resent-To";
+    String RESENT_TO = "Resent-To";
 
     /**
      * The name of the RFC 2822 header that stores the carbon copied recipients
      * of the resent message.
      */
-    public static final String RESENT_CC = "Resent-Cc";
+    String RESENT_CC = "Resent-Cc";
 
     /**
      * The name of the RFC 2822 header that stores the blind carbon copied recipients
      * of the resent message.
      */
-    public static final String RESENT_BCC = "Resent-Bcc";
+    String RESENT_BCC = "Resent-Bcc";
 
     /**
      * The name of the RFC 2822 header that stores the message id
      * of the resent message.
      */
-    public static final String RESENT_MESSAGE_ID = "Resent-Message-ID";
+    String RESENT_MESSAGE_ID = "Resent-Message-ID";
 
     // See Section 3.6.7 of RFC 2822
 
     /**
      * The name of the RFC 2822 headers that store the tracing data for the return path.
      */
-    public static final String RETURN_PATH = "Return-Path";
+    String RETURN_PATH = "Return-Path";
 
     /**
      * The name of the RFC 2822 headers that store additional tracing data.
      */
-    public static final String RECEIVED = "Received";
+    String RECEIVED = "Received";
 
     // MIME headers
 
     /**
      * The name of the MIME header that stores the content type.
      */
-    public static final String CONTENT_TYPE = "Content-Type";
-
-    /**
-     * Private constructor to prevent instantiation
-     */
-    private RFC2822Headers() {
-
-    }
-
+    String CONTENT_TYPE = "Content-Type";
 }


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


[james-project] 31/43: [Refactroing] IMAP mocked test fixes

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

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

commit 5aa886c98ab4e56fbc6ab8ca44c4b651b06ae6a8
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 15 15:27:39 2019 +0700

    [Refactroing] IMAP mocked test fixes
---
 .../apache/james/imap/processor/CopyProcessorTest.java    | 14 +++++++++-----
 .../apache/james/imap/processor/MoveProcessorTest.java    | 15 +++++++++------
 2 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
index c4ff836..daaa386 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/CopyProcessorTest.java
@@ -49,9 +49,9 @@ import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
-import org.apache.james.mailbox.store.MailboxMetaData;
 import org.apache.james.metrics.api.NoopMetricFactory;
 import org.junit.Before;
 import org.junit.Test;
@@ -97,7 +97,9 @@ public class CopyProcessorTest {
         when(mockMailboxManager.mailboxExists(inbox, mailboxSession)).thenReturn(true);
         MessageManager targetMessageManager = mock(MessageManager.class);
         when(mockMailboxManager.getMailbox(inbox, mailboxSession)).thenReturn(targetMessageManager);
-        when(targetMessageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN)).thenReturn(new MailboxMetaData(null, null, 58L, MessageUid.of(18), 8L, 8L, 8L, MessageUid.of(8), true, true, null));
+        Mailbox mailbox = mock(Mailbox.class);
+        when(mailbox.getUidValidity()).thenReturn(58L);
+        when(targetMessageManager.getMailboxEntity()).thenReturn(mailbox);
         StatusResponse okResponse = mock(StatusResponse.class);
         when(mockStatusResponseFactory.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
         when(mockMailboxManager.moveMessages(MessageRange.range(MessageUid.of(4), MessageUid.of(6)), selected, inbox, mailboxSession)).thenReturn(Lists.<MessageRange>newArrayList(MessageRange.range(MessageUid.of(4), MessageUid.of(6))));
@@ -109,7 +111,7 @@ public class CopyProcessorTest {
         verify(mockMailboxManager).mailboxExists(inbox, mailboxSession);
         verify(mockMailboxManager).getMailbox(inbox, mailboxSession);
         verify(mockMailboxManager).copyMessages(MessageRange.range(MessageUid.of(4), MessageUid.of(6)), selected, inbox, mailboxSession);
-        verify(targetMessageManager).getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN);
+        verify(targetMessageManager).getMailboxEntity();
         verify(mockResponder).respond(okResponse);
         verifyNoMoreInteractions(mockMailboxManager, targetMessageManager, mockResponder, mockNextProcessor);
     }
@@ -131,7 +133,9 @@ public class CopyProcessorTest {
         when(mockMailboxManager.mailboxExists(inbox, mailboxSession)).thenReturn(true);
         MessageManager targetMessageManager = mock(MessageManager.class);
         when(mockMailboxManager.getMailbox(inbox, mailboxSession)).thenReturn(targetMessageManager);
-        when(targetMessageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN)).thenReturn(new MailboxMetaData(null, null, 58L, MessageUid.of(18), 8L, 8L, 8L, MessageUid.of(8), true, true, null));
+        Mailbox mailbox = mock(Mailbox.class);
+        when(mailbox.getUidValidity()).thenReturn(58L);
+        when(targetMessageManager.getMailboxEntity()).thenReturn(mailbox);
         StatusResponse okResponse = mock(StatusResponse.class);
         when(mockStatusResponseFactory.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
 
@@ -143,7 +147,7 @@ public class CopyProcessorTest {
         verify(mockMailboxManager).getMailbox(inbox, mailboxSession);
         verify(mockMailboxManager).copyMessages(MessageRange.range(MessageUid.of(5), MessageUid.of(6)), selected, inbox, mailboxSession);
         verify(mockMailboxManager).copyMessages(MessageRange.range(MessageUid.of(1), MessageUid.of(3)), selected, inbox, mailboxSession);
-        verify(targetMessageManager).getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN);
+        verify(targetMessageManager).getMailboxEntity();
         verify(mockResponder).respond(okResponse);
         verifyNoMoreInteractions(mockMailboxManager, targetMessageManager, mockResponder, mockNextProcessor);
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
index 22296e8..d24ac86 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/MoveProcessorTest.java
@@ -52,6 +52,7 @@ import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.store.MailboxMetaData;
@@ -114,8 +115,9 @@ public class MoveProcessorTest {
         when(mockMailboxManager.mailboxExists(inbox, mailboxSession)).thenReturn(true);
         MessageManager targetMessageManager = mock(MessageManager.class);
         when(mockMailboxManager.getMailbox(inbox, mailboxSession)).thenReturn(targetMessageManager);
-        when(targetMessageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN))
-            .thenReturn(new MailboxMetaData(null, null, 58L, MessageUid.of(18), 8L, 8L, 8L, MessageUid.of(8), true, true, null));
+        Mailbox mailbox = mock(Mailbox.class);
+        when(mailbox.getUidValidity()).thenReturn(58L);
+        when(targetMessageManager.getMailboxEntity()).thenReturn(mailbox);
         StatusResponse okResponse = mock(StatusResponse.class);
         when(mockStatusResponseFactory.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
         when(mockMailboxManager.moveMessages(MessageRange.range(MessageUid.of(4), MessageUid.of(6)), selected, inbox, mailboxSession))
@@ -128,7 +130,7 @@ public class MoveProcessorTest {
         verify(mockMailboxManager).mailboxExists(inbox, mailboxSession);
         verify(mockMailboxManager).getMailbox(inbox, mailboxSession);
         verify(mockMailboxManager).moveMessages(MessageRange.range(MessageUid.of(4), MessageUid.of(6)), selected, inbox, mailboxSession);
-        verify(targetMessageManager).getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN);
+        verify(targetMessageManager).getMailboxEntity();
         verify(mockResponder).respond(okResponse);
         verifyNoMoreInteractions(mockMailboxManager, targetMessageManager, mockResponder, mockNextProcessor);
     }
@@ -150,8 +152,9 @@ public class MoveProcessorTest {
         when(mockMailboxManager.mailboxExists(inbox, mailboxSession)).thenReturn(true);
         MessageManager targetMessageManager = mock(MessageManager.class);
         when(mockMailboxManager.getMailbox(inbox, mailboxSession)).thenReturn(targetMessageManager);
-        when(targetMessageManager.getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN))
-            .thenReturn(new MailboxMetaData(null, null, 58L, MessageUid.of(18), 8L, 8L, 8L, MessageUid.of(8), true, true, null));
+        Mailbox mailbox = mock(Mailbox.class);
+        when(mailbox.getUidValidity()).thenReturn(58L);
+        when(targetMessageManager.getMailboxEntity()).thenReturn(mailbox);
         StatusResponse okResponse = mock(StatusResponse.class);
         when(mockStatusResponseFactory.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
 
@@ -163,7 +166,7 @@ public class MoveProcessorTest {
         verify(mockMailboxManager).getMailbox(inbox, mailboxSession);
         verify(mockMailboxManager).moveMessages(MessageRange.range(MessageUid.of(5), MessageUid.of(6)), selected, inbox, mailboxSession);
         verify(mockMailboxManager).moveMessages(MessageRange.range(MessageUid.of(1), MessageUid.of(3)), selected, inbox, mailboxSession);
-        verify(targetMessageManager).getMetaData(false, mailboxSession, MessageManager.MetaData.FetchGroup.NO_UNSEEN);
+        verify(targetMessageManager).getMailboxEntity();
         verify(mockResponder).respond(okResponse);
         verifyNoMoreInteractions(mockMailboxManager, targetMessageManager, mockResponder, mockNextProcessor);
     }


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


[james-project] 11/43: [Refactoring] LuceneMailboxMessageSearchIndexTest use only messageBuilder

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

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

commit 756dfecd64b70cca348aaec76ce8f43dc0c10324
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Sat Nov 16 12:07:45 2019 +0700

    [Refactoring] LuceneMailboxMessageSearchIndexTest use only messageBuilder
---
 .../LuceneMailboxMessageSearchIndexTest.java       | 61 ++++++++++++++++------
 1 file changed, 45 insertions(+), 16 deletions(-)

diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
index 69e28c6..5b54c2b 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMailboxMessageSearchIndexTest.java
@@ -20,7 +20,7 @@ package org.apache.james.mailbox.lucene.search;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
@@ -48,7 +48,6 @@ import org.apache.james.mailbox.model.SearchQuery.Sort.SortClause;
 import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.MessageBuilder;
-import org.apache.james.mailbox.store.SimpleMailboxMembership;
 import org.apache.lucene.store.RAMDirectory;
 import org.junit.Before;
 import org.junit.Test;
@@ -56,14 +55,16 @@ import org.junit.Test;
 import com.google.common.collect.ImmutableList;
 
 public class LuceneMailboxMessageSearchIndexTest {
+    private static final long LIMIT = 100L;
+    private static final TestId TEST_ID_1 = TestId.of(0);
+    private static final TestId TEST_ID_2 = TestId.of(1);
+    private static final TestId TEST_ID_3 = TestId.of(2);
 
-    public static final long LIMIT = 100L;
     private static final Username BOB = Username.of("bob");
+    private Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, "box"), 18, TEST_ID_1);
+    private Mailbox mailbox2 = new Mailbox(MailboxPath.forUser(BOB, "box"), 19, TEST_ID_2);
+    private Mailbox mailbox3 = new Mailbox(MailboxPath.forUser(BOB, "box"), 12, TEST_ID_3);
     private LuceneMessageSearchIndex index;
-    
-    private Mailbox mailbox = new Mailbox(MailboxPath.forUser(BOB, "box"), 18, TestId.of(0));
-    private Mailbox mailbox2 = new Mailbox(MailboxPath.forUser(BOB, "box"), 19, TestId.of(1));
-    private Mailbox mailbox3 = new Mailbox(MailboxPath.forUser(BOB, "box"), 12, TestId.of(2));
     private MailboxSession session;
 
     private static final String FROM_ADDRESS = "Harry <ha...@example.org>";
@@ -123,24 +124,52 @@ public class LuceneMailboxMessageSearchIndexTest {
         headersTestSubject.put("Cc", "test211 <te...@localhost>, test6 <te...@foobar>");
         
         uid1 = MessageUid.of(1);
-        SimpleMailboxMembership m = new SimpleMailboxMembership(id1, (TestId) mailbox.getMailboxId(), uid1, 0, new Date(), 200, new Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject);
-        index.add(session, mailbox, m);
+        MessageBuilder builder1 = new MessageBuilder()
+            .headers(headersSubject)
+            .flags(new Flags(Flag.ANSWERED));
+        builder1.body = "My Body".getBytes(StandardCharsets.UTF_8);
+        builder1.size = 200;
+        builder1.internalDate = new Date();
+        builder1.mailboxId = TEST_ID_1;
+        builder1.uid = uid1;
+        index.add(session, mailbox, builder1.build(id1));
 
         uid2 = MessageUid.of(1);
-        SimpleMailboxMembership m2 = new SimpleMailboxMembership(id2, (TestId) mailbox2.getMailboxId(), uid2, 0, new Date(), 20, new Flags(Flag.ANSWERED), "My Body".getBytes(), headersSubject);
-        index.add(session, mailbox2, m2);
+        MessageBuilder builder2 = new MessageBuilder()
+            .headers(headersSubject)
+            .flags(new Flags(Flag.ANSWERED));
+        builder2.body = "My Body".getBytes(StandardCharsets.UTF_8);
+        builder2.size = 20;
+        builder2.internalDate = new Date();
+        builder2.mailboxId = TEST_ID_2;
+        builder2.uid = uid2;
+        index.add(session, mailbox2, builder2.build(id2));
         
         uid3 = MessageUid.of(2);
         Calendar cal = Calendar.getInstance();
         cal.set(1980, 2, 10);
-        SimpleMailboxMembership m3 = new SimpleMailboxMembership(id3, (TestId) mailbox.getMailboxId(), uid3, 0, cal.getTime(), 20, new Flags(Flag.DELETED), "My Otherbody".getBytes(), headersTest);
-        index.add(session, mailbox, m3);
+        MessageBuilder builder3 = new MessageBuilder()
+            .headers(headersTest)
+            .flags(new Flags(Flag.DELETED));
+        builder3.body = "My Otherbody".getBytes(StandardCharsets.UTF_8);
+        builder3.size = 20;
+        builder3.internalDate = cal.getTime();
+        builder3.mailboxId = TEST_ID_1;
+        builder3.uid = uid3;
+        index.add(session, mailbox, builder3.build(id3));
         
         uid4 = MessageUid.of(3);
         Calendar cal2 = Calendar.getInstance();
         cal2.set(8000, 2, 10);
-        SimpleMailboxMembership m4 = new SimpleMailboxMembership(id4, (TestId) mailbox.getMailboxId(), uid4, 0, cal2.getTime(), 20, new Flags(Flag.DELETED), "My Otherbody2".getBytes(), headersTestSubject);
-        index.add(session, mailbox, m4);
+        MessageBuilder builder4 = new MessageBuilder()
+            .headers(headersTestSubject)
+            .flags(new Flags(Flag.DELETED));
+        builder4.body = "My Otherbody2".getBytes(StandardCharsets.UTF_8);
+        builder4.size = 20;
+        builder4.internalDate = cal2.getTime();
+        builder4.mailboxId = TEST_ID_1;
+        builder4.uid = uid4;
+        index.add(session, mailbox, builder4.build(id4));
         
         uid5 = MessageUid.of(10);
         MessageBuilder builder = new MessageBuilder();
@@ -148,7 +177,7 @@ public class LuceneMailboxMessageSearchIndexTest {
         builder.header("To", FROM_ADDRESS);
         builder.header("Subject", "A " + SUBJECT_PART + " Multipart Mail");
         builder.header("Date", "Thu, 14 Feb 2008 12:00:00 +0000 (GMT)");
-        builder.body = Charset.forName("us-ascii").encode(BODY).array();
+        builder.body = StandardCharsets.US_ASCII.encode(BODY).array();
         builder.uid = uid5;
         builder.mailboxId = (TestId) mailbox3.getMailboxId();
         


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