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/14 02:09:17 UTC

[james-project] branch master updated (2877c47 -> 52bf917)

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 2877c47  Merge remote-tracking branch 'mine/one-fix-per-day-4'
     new e48fb81  [Refactoring] Strong type for IMAP Tag
     new bb31c76  [Refactoring] StatusProcessor: Avoid variable reallocation
     new 141faa5  [Refactoring] StatusProcessor: Avoid final variables
     new 6cc7b18  [Refactoring] StatusProcessor: Remove never thrown exceptions
     new 80a34d3  [Refactoring] StatusProcessor: Extract FetchGroup computation
     new 1e8480b  [Refactoring] StatusProcessor: Extract response computation
     new f07f878  [Refactoring] StatusProcessor: Inline MailboxManager
     new db0248d  [Refactoring] StatusProcessor: Extract metadata retrieval
     new 105edc9  [Refactoring] StatusCommandParser: statusDataItems can be private
     new 9c0287f  [Refactoring] StatusDataItems should be immutable
     new 798f24b  [Refactoring] StatusCommandParser should not use final variable
     new 4bbc170  [Refactoring] StatusCommandParser: uncorrelate word splitting from item parsing
     new ac7e71f  [Refactoring] StatusCommandParser: reorder methods by visibility
     new 70696f7  [Refactoring] StatusCommandParser: char validator can be a constant
     new c01dabc  MAILBOX-391 Simplify some quota related code
     new 8531c0a  MAILBOX-391 MailboxQuery constructor is actually private
     new 623bdb9  MAILBOX-391 DefaultMailboxBackup omitted namespace when querying user mailboxes
     new 3376061  Remove pseudo-support for shared mailboxes (mailboxes with null user)
     new 86044a3  MAILBOX-391  MailboxMapper::findMailboxWithPathLike should use MailboxQuery.UserBound
     new 42769f5  MAILBOX-391 MailboxQuery should implement Equals & HashCode
     new 09a02ce  MAILBOX-391 MailboxMapper::findMailboxWithPathLike should be also queried for child mailboxes
     new 9a0ae79  [Refactoring] Allow a mailboxQuery to fluently match mailboxes
     new 83f4e82  [REFACTORING] Search comparators should rely on Java 8
     new a858a96  [REFACTORING] JPA should not depend on search comparators
     new f9850ee  [REFACTORING] StandardMailboxMetaDataComparator should rely on Java 8
     new 60242ff  [REFACTORING] MXRecordComparator should rely on Java 8
     new 0794c5b  [Refactoring] Use a default method for MailboxMessage::compareTo
     new 3d386b7  [Refactoring] Move test classes in James Core to JUnit 5
     new 47ed141  [Refactoring] JAMES-2950 Move UsernameTest to JUnit 5
     new 61cbd46  [Refactoring] Parameterized MailAddress creation tests
     new 49be939  [Refactoring] Remove useless test in MailAddressTest
     new 52bf917  [Refactoring] Simplify MailAddressTest by fully using the power of assertj

The 32 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:
 core/pom.xml                                       |   5 +
 .../org/apache/james/core/MailAddressTest.java     | 252 ++++++++-------------
 .../java/org/apache/james/core/UsernameTest.java   |  73 +++---
 .../james/core/builder/MimeMessageBuilderTest.java |  15 +-
 .../james/core/builder/MimeMessageWrapperTest.java |  10 +-
 .../james/core/healthcheck/ResultStatusTest.java   |  10 +-
 .../apache/james/core/quota/QuotaCountTest.java    |   2 +-
 .../org/apache/james/core/quota/QuotaSizeTest.java |   2 +-
 .../mailbox/StandardMailboxMetaDataComparator.java |  66 ------
 .../james/mailbox/model/MailboxMetaData.java       |   9 +-
 .../apache/james/mailbox/model/MailboxPath.java    |   3 +-
 .../james/mailbox/model/search/ExactName.java      |  22 ++
 .../model/search/MailboxNameExpression.java        |   2 +
 .../james/mailbox/model/search/MailboxQuery.java   |  53 ++++-
 .../james/mailbox/model/search/PrefixedRegex.java  |  23 ++
 .../mailbox/model/search/PrefixedWildcard.java     |  22 ++
 .../james/mailbox/model/search/Wildcard.java       |   5 +
 .../james/mailbox/quota/QuotaRootResolver.java     |   3 +-
 .../james/mailbox/model/search/ExactNameTest.java  |   9 +-
 .../mailbox/model/search/MailboxQueryTest.java     |  50 +---
 .../mailbox/model/search/PrefixedRegexTest.java    |   9 +
 .../mailbox/model/search/PrefixedWildcardTest.java |   8 +
 .../james/mailbox/backup/DefaultMailboxBackup.java |   2 +
 .../cassandra/mail/CassandraMailboxMapper.java     |  13 +-
 .../cassandra/mail/CassandraMailboxMapperTest.java |  33 ++-
 .../james/event/json/dtos/MailboxPathTest.java     |  32 ---
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   |  32 ++-
 .../model/openjpa/AbstractJPAMailboxMessage.java   |   9 -
 .../jpa/mail/TransactionalMailboxMapper.java       |   5 +-
 .../mailbox/maildir/mail/MaildirMailboxMapper.java |  31 ++-
 .../inmemory/mail/InMemoryMailboxMapper.java       |  12 +-
 ...=> MailboxExpressionBackwardCompatibility.java} |  25 +-
 .../james/mailbox/store/StoreMailboxManager.java   |  49 ++--
 .../james/mailbox/store/mail/MailboxMapper.java    |   3 +-
 .../store/mail/model/DelegatingMailboxMessage.java |   5 -
 .../mailbox/store/mail/model/MailboxMessage.java   |   9 +-
 .../store/quota/CurrentQuotaCalculator.java        |  18 +-
 .../store/quota/DefaultUserQuotaRootResolver.java  |  14 +-
 .../search/comparator/CombinedComparator.java      |  10 +-
 .../search/comparator/InternalDateComparator.java  |  36 ---
 ...SizeComparator.java => MessageComparators.java} |  18 +-
 .../search/comparator/MessageIdComparator.java     |  35 ---
 .../store/search/comparator/ReverseComparator.java |  56 -----
 .../store/search/comparator/UidComparator.java     |  36 ---
 .../mailbox/store/SimpleMailboxMembership.java     |   5 -
 .../mailbox/store/StoreMailboxManagerTest.java     |  23 +-
 .../store/mail/model/ListMessageAssertTest.java    |   5 -
 .../store/mail/model/MailboxMapperTest.java        | 117 +++-------
 .../quota/DefaultUserQuotaRootResolverTest.java    |   4 +-
 .../store/search/CombinedComparatorTest.java       |  30 ++-
 .../main/java/org/apache/james/imap/api/Tag.java   |  14 +-
 .../james/imap/api/message/StatusDataItems.java    |  71 +++---
 .../imap/api/message/request/ImapRequest.java      |   3 +-
 .../imap/api/message/response/StatusResponse.java  |   3 +-
 .../message/response/StatusResponseFactory.java    |  13 +-
 .../james/imap/decode/ImapCommandParser.java       |   3 +-
 .../james/imap/decode/ImapRequestLineReader.java   |   5 +-
 .../decode/base/AbstractImapCommandParser.java     |   5 +-
 .../james/imap/decode/main/DefaultImapDecoder.java |   9 +-
 .../parser/AbstractMessageRangeCommandParser.java  |   5 +-
 .../parser/AbstractSelectionCommandParser.java     |   5 +-
 .../decode/parser/AbstractUidCommandParser.java    |   7 +-
 .../imap/decode/parser/AppendCommandParser.java    |   3 +-
 .../decode/parser/AuthenticateCommandParser.java   |   3 +-
 .../decode/parser/CapabilityCommandParser.java     |   3 +-
 .../imap/decode/parser/CheckCommandParser.java     |   3 +-
 .../imap/decode/parser/CloseCommandParser.java     |   3 +-
 .../imap/decode/parser/CompressCommandParser.java  |   3 +-
 .../imap/decode/parser/CopyCommandParser.java      |   3 +-
 .../imap/decode/parser/CreateCommandParser.java    |   3 +-
 .../imap/decode/parser/DeleteACLCommandParser.java |   3 +-
 .../imap/decode/parser/DeleteCommandParser.java    |   3 +-
 .../imap/decode/parser/EnableCommandParser.java    |   3 +-
 .../imap/decode/parser/ExamineCommandParser.java   |   3 +-
 .../imap/decode/parser/ExpungeCommandParser.java   |   3 +-
 .../imap/decode/parser/FetchCommandParser.java     |   3 +-
 .../imap/decode/parser/GetACLCommandParser.java    |   3 +-
 .../decode/parser/GetAnnotationCommandParser.java  |   5 +-
 .../imap/decode/parser/GetQuotaCommandParser.java  |   3 +-
 .../decode/parser/GetQuotaRootCommandParser.java   |   3 +-
 .../imap/decode/parser/IdleCommandParser.java      |   3 +-
 .../imap/decode/parser/ListCommandParser.java      |   5 +-
 .../decode/parser/ListRightsCommandParser.java     |   3 +-
 .../imap/decode/parser/LoginCommandParser.java     |   3 +-
 .../imap/decode/parser/LogoutCommandParser.java    |   3 +-
 .../imap/decode/parser/LsubCommandParser.java      |   3 +-
 .../imap/decode/parser/MoveCommandParser.java      |   3 +-
 .../imap/decode/parser/MyRightsCommandParser.java  |   3 +-
 .../imap/decode/parser/NamespaceCommandParser.java |   3 +-
 .../imap/decode/parser/NoopCommandParser.java      |   3 +-
 .../imap/decode/parser/RenameCommandParser.java    |   3 +-
 .../imap/decode/parser/SearchCommandParser.java    |   5 +-
 .../imap/decode/parser/SelectCommandParser.java    |   3 +-
 .../imap/decode/parser/SetACLCommandParser.java    |   3 +-
 .../decode/parser/SetAnnotationCommandParser.java  |   3 +-
 .../imap/decode/parser/SetQuotaCommandParser.java  |   3 +-
 .../imap/decode/parser/StartTLSCommandParser.java  |   3 +-
 .../imap/decode/parser/StatusCommandParser.java    |  66 ++++--
 .../imap/decode/parser/StoreCommandParser.java     |   3 +-
 .../imap/decode/parser/SubscribeCommandParser.java |   3 +-
 .../james/imap/decode/parser/UidCommandParser.java |   3 +-
 .../imap/decode/parser/UnselectCommandParser.java  |   3 +-
 .../decode/parser/UnsubscribeCommandParser.java    |   3 +-
 .../imap/decode/parser/XListCommandParser.java     |   3 +-
 .../james/imap/encode/ESearchResponseEncoder.java  |   5 +-
 .../james/imap/encode/ImapResponseComposer.java    |   3 +-
 .../james/imap/encode/StatusResponseEncoder.java   |   3 +-
 .../imap/encode/base/ImapResponseComposerImpl.java |   5 +-
 .../org/apache/james/imap/main/PathConverter.java  |   8 +-
 .../imap/message/request/AbstractImapRequest.java  |   7 +-
 .../request/AbstractMailboxSelectionRequest.java   |   3 +-
 .../request/AbstractMessageRangeRequest.java       |   3 +-
 .../james/imap/message/request/AppendRequest.java  |   3 +-
 .../imap/message/request/AuthenticateRequest.java  |   3 +-
 .../imap/message/request/CapabilityRequest.java    |   3 +-
 .../james/imap/message/request/CheckRequest.java   |   3 +-
 .../james/imap/message/request/CloseRequest.java   |   3 +-
 .../imap/message/request/CompressRequest.java      |   3 +-
 .../james/imap/message/request/CopyRequest.java    |   3 +-
 .../james/imap/message/request/CreateRequest.java  |   3 +-
 .../imap/message/request/DeleteACLRequest.java     |   3 +-
 .../james/imap/message/request/DeleteRequest.java  |   3 +-
 .../james/imap/message/request/EnableRequest.java  |   3 +-
 .../james/imap/message/request/ExamineRequest.java |   3 +-
 .../james/imap/message/request/ExpungeRequest.java |   3 +-
 .../james/imap/message/request/FetchRequest.java   |   3 +-
 .../james/imap/message/request/GetACLRequest.java  |   3 +-
 .../imap/message/request/GetAnnotationRequest.java |   5 +-
 .../imap/message/request/GetQuotaRequest.java      |   3 +-
 .../imap/message/request/GetQuotaRootRequest.java  |   3 +-
 .../message/request/IRAuthenticateRequest.java     |   3 +-
 .../james/imap/message/request/IdleRequest.java    |   3 +-
 .../james/imap/message/request/ListRequest.java    |   3 +-
 .../imap/message/request/ListRightsRequest.java    |   3 +-
 .../james/imap/message/request/LoginRequest.java   |   3 +-
 .../james/imap/message/request/LogoutRequest.java  |   3 +-
 .../james/imap/message/request/LsubRequest.java    |   3 +-
 .../james/imap/message/request/MoveRequest.java    |   3 +-
 .../imap/message/request/MyRightsRequest.java      |   3 +-
 .../imap/message/request/NamespaceRequest.java     |   3 +-
 .../james/imap/message/request/NoopRequest.java    |   3 +-
 .../james/imap/message/request/RenameRequest.java  |   3 +-
 .../james/imap/message/request/SearchRequest.java  |   3 +-
 .../james/imap/message/request/SelectRequest.java  |   3 +-
 .../james/imap/message/request/SetACLRequest.java  |   3 +-
 .../imap/message/request/SetAnnotationRequest.java |   3 +-
 .../imap/message/request/SetQuotaRequest.java      |   3 +-
 .../imap/message/request/StartTLSRequest.java      |   3 +-
 .../james/imap/message/request/StatusRequest.java  |   3 +-
 .../james/imap/message/request/StoreRequest.java   |   3 +-
 .../imap/message/request/SubscribeRequest.java     |   3 +-
 .../imap/message/request/UnselectRequest.java      |   3 +-
 .../imap/message/request/UnsubscribeRequest.java   |   3 +-
 .../james/imap/message/request/XListRequest.java   |   3 +-
 .../response/AbstractStatusResponseFactory.java    |  15 +-
 .../imap/message/response/ESearchResponse.java     |   7 +-
 .../message/response/ImmutableStatusResponse.java  |   7 +-
 .../response/UnpooledStatusResponseFactory.java    |   3 +-
 .../imap/processor/AbstractAuthProcessor.java      |   7 +-
 .../imap/processor/AbstractMailboxProcessor.java   |  17 +-
 .../processor/AbstractMessageRangeProcessor.java   |   3 +-
 .../imap/processor/AbstractSelectionProcessor.java |   7 +-
 .../processor/AbstractSubscriptionProcessor.java   |   5 +-
 .../james/imap/processor/AppendProcessor.java      |   7 +-
 .../imap/processor/AuthenticateProcessor.java      |   5 +-
 .../james/imap/processor/CapabilityProcessor.java  |   3 +-
 .../james/imap/processor/CheckProcessor.java       |   3 +-
 .../james/imap/processor/CloseProcessor.java       |   3 +-
 .../james/imap/processor/CreateProcessor.java      |   3 +-
 .../james/imap/processor/DeleteACLProcessor.java   |   3 +-
 .../james/imap/processor/DeleteProcessor.java      |   3 +-
 .../james/imap/processor/EnableProcessor.java      |   3 +-
 .../james/imap/processor/ExpungeProcessor.java     |   3 +-
 .../james/imap/processor/GetACLProcessor.java      |   3 +-
 .../imap/processor/GetAnnotationProcessor.java     |   7 +-
 .../james/imap/processor/GetQuotaProcessor.java    |  11 +-
 .../imap/processor/GetQuotaRootProcessor.java      |   3 +-
 .../apache/james/imap/processor/IdleProcessor.java |   3 +-
 .../apache/james/imap/processor/LSubProcessor.java |   3 +-
 .../apache/james/imap/processor/ListProcessor.java |   3 +-
 .../james/imap/processor/ListRightsProcessor.java  |   3 +-
 .../james/imap/processor/LoginProcessor.java       |   3 +-
 .../james/imap/processor/LogoutProcessor.java      |   3 +-
 .../james/imap/processor/MyRightsProcessor.java    |   3 +-
 .../james/imap/processor/NamespaceProcessor.java   |   3 +-
 .../apache/james/imap/processor/NoopProcessor.java |   3 +-
 .../james/imap/processor/RenameProcessor.java      |   3 +-
 .../james/imap/processor/SearchProcessor.java      |   3 +-
 .../james/imap/processor/SetACLProcessor.java      |   3 +-
 .../imap/processor/SetAnnotationProcessor.java     |   3 +-
 .../james/imap/processor/SetQuotaProcessor.java    |   3 +-
 .../james/imap/processor/StatusProcessor.java      | 107 +++++----
 .../james/imap/processor/StoreProcessor.java       |  19 +-
 .../james/imap/processor/SubscribeProcessor.java   |   3 +-
 .../james/imap/processor/UnselectProcessor.java    |   3 +-
 .../james/imap/processor/UnsubscribeProcessor.java |   3 +-
 .../processor/base/UnknownRequestProcessor.java    |   3 +-
 .../james/imap/processor/fetch/FetchProcessor.java |   3 +-
 .../java/org/apache/james/imap/ImapFixture.java    |   7 +-
 .../java/org/apache/james/imap/api/TagTest.java    |   9 +-
 .../AbstractStatusResponseFactoryTest.java         |   3 +-
 .../james/imap/decode/parser/CopyParserTest.java   |   5 +-
 .../decode/parser/CreateCommandParserTest.java     |   2 +-
 .../parser/FetchCommandParserPartialFetchTest.java |  10 +-
 .../parser/GetAnnotationCommandParserTest.java     |   3 +-
 .../imap/decode/parser/GetQuotaParserTest.java     |   5 +-
 .../imap/decode/parser/GetQuotaRootParserTest.java |   9 +-
 .../james/imap/decode/parser/MoveParserTest.java   |   5 +-
 .../parser/SearchCommandParserCharsetTest.java     |   3 +-
 .../SearchCommandParserQuotedCharsetTest.java      |   4 +-
 .../parser/SetAnnotationCommandParserTest.java     |   2 +-
 .../decode/parser/SetQuotaCommandParserTest.java   |   3 +-
 .../imap/decode/parser/StoreCommandParserTest.java |   8 +-
 .../apache/james/imap/main/PathConverterTest.java  |  46 +---
 .../james/imap/processor/CopyProcessorTest.java    |  11 +-
 .../imap/processor/DeleteACLProcessorTest.java     |   3 +-
 .../james/imap/processor/GetACLProcessorTest.java  |   3 +-
 .../imap/processor/GetAnnotationProcessorTest.java |  31 +--
 .../imap/processor/GetQuotaProcessorTest.java      |  17 +-
 .../imap/processor/GetQuotaRootProcessorTest.java  |   7 +-
 .../james/imap/processor/LSubProcessorTest.java    |   2 +-
 .../imap/processor/ListRightsProcessorTest.java    |   3 +-
 .../james/imap/processor/MoveProcessorTest.java    |  11 +-
 .../imap/processor/NamespaceProcessorTest.java     |   9 +-
 .../james/imap/processor/SearchProcessorTest.java  |   3 +-
 .../james/imap/processor/SetACLProcessorTest.java  |   7 +-
 .../imap/processor/SetAnnotationProcessorTest.java |  14 +-
 .../imap/processor/SetQuotaProcessorTest.java      |   3 +-
 .../james/dnsservice/dnsjava/DNSJavaService.java   |  22 +-
 .../jmap/draft/model/mailbox/MailboxNamespace.java |   1 +
 230 files changed, 1110 insertions(+), 1298 deletions(-)
 delete mode 100644 mailbox/api/src/main/java/org/apache/james/mailbox/StandardMailboxMetaDataComparator.java
 copy mailbox/store/src/main/java/org/apache/james/mailbox/store/{Authenticator.java => MailboxExpressionBackwardCompatibility.java} (67%)
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java
 rename mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/{SizeComparator.java => MessageComparators.java} (71%)
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/MessageIdComparator.java
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java
 copy server/mailrepository/mailrepository-api/src/main/java/org/apache/james/mailrepository/api/Protocol.java => protocols/imap/src/main/java/org/apache/james/imap/api/Tag.java (86%)
 copy mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/json/SerializableMessage.java => protocols/imap/src/test/java/org/apache/james/imap/ImapFixture.java (90%)
 copy third-party/linshare/src/test/java/org/apache/james/linshare/client/UserTest.java => protocols/imap/src/test/java/org/apache/james/imap/api/TagTest.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] 01/32: [Refactoring] Strong type for IMAP Tag

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 e48fb81e89504f340a5dd5db61799e41e47b428a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 11 11:11:51 2019 +0700

    [Refactoring] Strong type for IMAP Tag
---
 .../AbstractImapRequest.java => api/Tag.java}      | 50 ++++++++++++----------
 .../imap/api/message/request/ImapRequest.java      |  3 +-
 .../imap/api/message/response/StatusResponse.java  |  3 +-
 .../message/response/StatusResponseFactory.java    | 13 +++---
 .../james/imap/decode/ImapCommandParser.java       |  3 +-
 .../james/imap/decode/ImapRequestLineReader.java   |  5 ++-
 .../decode/base/AbstractImapCommandParser.java     |  5 ++-
 .../james/imap/decode/main/DefaultImapDecoder.java |  9 ++--
 .../parser/AbstractMessageRangeCommandParser.java  |  5 ++-
 .../parser/AbstractSelectionCommandParser.java     |  5 ++-
 .../decode/parser/AbstractUidCommandParser.java    |  7 +--
 .../imap/decode/parser/AppendCommandParser.java    |  3 +-
 .../decode/parser/AuthenticateCommandParser.java   |  3 +-
 .../decode/parser/CapabilityCommandParser.java     |  3 +-
 .../imap/decode/parser/CheckCommandParser.java     |  3 +-
 .../imap/decode/parser/CloseCommandParser.java     |  3 +-
 .../imap/decode/parser/CompressCommandParser.java  |  3 +-
 .../imap/decode/parser/CopyCommandParser.java      |  3 +-
 .../imap/decode/parser/CreateCommandParser.java    |  3 +-
 .../imap/decode/parser/DeleteACLCommandParser.java |  3 +-
 .../imap/decode/parser/DeleteCommandParser.java    |  3 +-
 .../imap/decode/parser/EnableCommandParser.java    |  3 +-
 .../imap/decode/parser/ExamineCommandParser.java   |  3 +-
 .../imap/decode/parser/ExpungeCommandParser.java   |  3 +-
 .../imap/decode/parser/FetchCommandParser.java     |  3 +-
 .../imap/decode/parser/GetACLCommandParser.java    |  3 +-
 .../decode/parser/GetAnnotationCommandParser.java  |  5 ++-
 .../imap/decode/parser/GetQuotaCommandParser.java  |  3 +-
 .../decode/parser/GetQuotaRootCommandParser.java   |  3 +-
 .../imap/decode/parser/IdleCommandParser.java      |  3 +-
 .../imap/decode/parser/ListCommandParser.java      |  5 ++-
 .../decode/parser/ListRightsCommandParser.java     |  3 +-
 .../imap/decode/parser/LoginCommandParser.java     |  3 +-
 .../imap/decode/parser/LogoutCommandParser.java    |  3 +-
 .../imap/decode/parser/LsubCommandParser.java      |  3 +-
 .../imap/decode/parser/MoveCommandParser.java      |  3 +-
 .../imap/decode/parser/MyRightsCommandParser.java  |  3 +-
 .../imap/decode/parser/NamespaceCommandParser.java |  3 +-
 .../imap/decode/parser/NoopCommandParser.java      |  3 +-
 .../imap/decode/parser/RenameCommandParser.java    |  3 +-
 .../imap/decode/parser/SearchCommandParser.java    |  5 ++-
 .../imap/decode/parser/SelectCommandParser.java    |  3 +-
 .../imap/decode/parser/SetACLCommandParser.java    |  3 +-
 .../decode/parser/SetAnnotationCommandParser.java  |  3 +-
 .../imap/decode/parser/SetQuotaCommandParser.java  |  3 +-
 .../imap/decode/parser/StartTLSCommandParser.java  |  3 +-
 .../imap/decode/parser/StatusCommandParser.java    |  3 +-
 .../imap/decode/parser/StoreCommandParser.java     |  3 +-
 .../imap/decode/parser/SubscribeCommandParser.java |  3 +-
 .../james/imap/decode/parser/UidCommandParser.java |  3 +-
 .../imap/decode/parser/UnselectCommandParser.java  |  3 +-
 .../decode/parser/UnsubscribeCommandParser.java    |  3 +-
 .../imap/decode/parser/XListCommandParser.java     |  3 +-
 .../james/imap/encode/ESearchResponseEncoder.java  |  5 ++-
 .../james/imap/encode/ImapResponseComposer.java    |  3 +-
 .../james/imap/encode/StatusResponseEncoder.java   |  3 +-
 .../imap/encode/base/ImapResponseComposerImpl.java |  5 ++-
 .../imap/message/request/AbstractImapRequest.java  |  7 +--
 .../request/AbstractMailboxSelectionRequest.java   |  3 +-
 .../request/AbstractMessageRangeRequest.java       |  3 +-
 .../james/imap/message/request/AppendRequest.java  |  3 +-
 .../imap/message/request/AuthenticateRequest.java  |  3 +-
 .../imap/message/request/CapabilityRequest.java    |  3 +-
 .../james/imap/message/request/CheckRequest.java   |  3 +-
 .../james/imap/message/request/CloseRequest.java   |  3 +-
 .../imap/message/request/CompressRequest.java      |  3 +-
 .../james/imap/message/request/CopyRequest.java    |  3 +-
 .../james/imap/message/request/CreateRequest.java  |  3 +-
 .../imap/message/request/DeleteACLRequest.java     |  3 +-
 .../james/imap/message/request/DeleteRequest.java  |  3 +-
 .../james/imap/message/request/EnableRequest.java  |  3 +-
 .../james/imap/message/request/ExamineRequest.java |  3 +-
 .../james/imap/message/request/ExpungeRequest.java |  3 +-
 .../james/imap/message/request/FetchRequest.java   |  3 +-
 .../james/imap/message/request/GetACLRequest.java  |  3 +-
 .../imap/message/request/GetAnnotationRequest.java |  5 ++-
 .../imap/message/request/GetQuotaRequest.java      |  3 +-
 .../imap/message/request/GetQuotaRootRequest.java  |  3 +-
 .../message/request/IRAuthenticateRequest.java     |  3 +-
 .../james/imap/message/request/IdleRequest.java    |  3 +-
 .../james/imap/message/request/ListRequest.java    |  3 +-
 .../imap/message/request/ListRightsRequest.java    |  3 +-
 .../james/imap/message/request/LoginRequest.java   |  3 +-
 .../james/imap/message/request/LogoutRequest.java  |  3 +-
 .../james/imap/message/request/LsubRequest.java    |  3 +-
 .../james/imap/message/request/MoveRequest.java    |  3 +-
 .../imap/message/request/MyRightsRequest.java      |  3 +-
 .../imap/message/request/NamespaceRequest.java     |  3 +-
 .../james/imap/message/request/NoopRequest.java    |  3 +-
 .../james/imap/message/request/RenameRequest.java  |  3 +-
 .../james/imap/message/request/SearchRequest.java  |  3 +-
 .../james/imap/message/request/SelectRequest.java  |  3 +-
 .../james/imap/message/request/SetACLRequest.java  |  3 +-
 .../imap/message/request/SetAnnotationRequest.java |  3 +-
 .../imap/message/request/SetQuotaRequest.java      |  3 +-
 .../imap/message/request/StartTLSRequest.java      |  3 +-
 .../james/imap/message/request/StatusRequest.java  |  3 +-
 .../james/imap/message/request/StoreRequest.java   |  3 +-
 .../imap/message/request/SubscribeRequest.java     |  3 +-
 .../imap/message/request/UnselectRequest.java      |  3 +-
 .../imap/message/request/UnsubscribeRequest.java   |  3 +-
 .../james/imap/message/request/XListRequest.java   |  3 +-
 .../response/AbstractStatusResponseFactory.java    | 15 ++++---
 .../imap/message/response/ESearchResponse.java     |  7 +--
 .../message/response/ImmutableStatusResponse.java  |  7 +--
 .../response/UnpooledStatusResponseFactory.java    |  3 +-
 .../imap/processor/AbstractAuthProcessor.java      |  7 +--
 .../imap/processor/AbstractMailboxProcessor.java   | 17 ++++----
 .../processor/AbstractMessageRangeProcessor.java   |  3 +-
 .../imap/processor/AbstractSelectionProcessor.java |  7 +--
 .../processor/AbstractSubscriptionProcessor.java   |  5 ++-
 .../james/imap/processor/AppendProcessor.java      |  7 +--
 .../imap/processor/AuthenticateProcessor.java      |  5 ++-
 .../james/imap/processor/CapabilityProcessor.java  |  3 +-
 .../james/imap/processor/CheckProcessor.java       |  3 +-
 .../james/imap/processor/CloseProcessor.java       |  3 +-
 .../james/imap/processor/CreateProcessor.java      |  3 +-
 .../james/imap/processor/DeleteACLProcessor.java   |  3 +-
 .../james/imap/processor/DeleteProcessor.java      |  3 +-
 .../james/imap/processor/EnableProcessor.java      |  3 +-
 .../james/imap/processor/ExpungeProcessor.java     |  3 +-
 .../james/imap/processor/GetACLProcessor.java      |  3 +-
 .../imap/processor/GetAnnotationProcessor.java     |  7 +--
 .../james/imap/processor/GetQuotaProcessor.java    |  3 +-
 .../imap/processor/GetQuotaRootProcessor.java      |  3 +-
 .../apache/james/imap/processor/IdleProcessor.java |  3 +-
 .../apache/james/imap/processor/LSubProcessor.java |  3 +-
 .../apache/james/imap/processor/ListProcessor.java |  3 +-
 .../james/imap/processor/ListRightsProcessor.java  |  3 +-
 .../james/imap/processor/LoginProcessor.java       |  3 +-
 .../james/imap/processor/LogoutProcessor.java      |  3 +-
 .../james/imap/processor/MyRightsProcessor.java    |  3 +-
 .../james/imap/processor/NamespaceProcessor.java   |  3 +-
 .../apache/james/imap/processor/NoopProcessor.java |  3 +-
 .../james/imap/processor/RenameProcessor.java      |  3 +-
 .../james/imap/processor/SearchProcessor.java      |  3 +-
 .../james/imap/processor/SetACLProcessor.java      |  3 +-
 .../imap/processor/SetAnnotationProcessor.java     |  3 +-
 .../james/imap/processor/SetQuotaProcessor.java    |  3 +-
 .../james/imap/processor/StatusProcessor.java      |  3 +-
 .../james/imap/processor/StoreProcessor.java       | 19 +++-----
 .../james/imap/processor/SubscribeProcessor.java   |  3 +-
 .../james/imap/processor/UnselectProcessor.java    |  3 +-
 .../james/imap/processor/UnsubscribeProcessor.java |  3 +-
 .../processor/base/UnknownRequestProcessor.java    |  3 +-
 .../james/imap/processor/fetch/FetchProcessor.java |  3 +-
 .../java/org/apache/james/imap/ImapFixture.java}   | 10 ++---
 .../java/org/apache/james/imap/api/TagTest.java}   | 17 +++++---
 .../AbstractStatusResponseFactoryTest.java         |  3 +-
 .../james/imap/decode/parser/CopyParserTest.java   |  5 ++-
 .../decode/parser/CreateCommandParserTest.java     |  2 +-
 .../parser/FetchCommandParserPartialFetchTest.java | 10 +++--
 .../parser/GetAnnotationCommandParserTest.java     |  3 +-
 .../imap/decode/parser/GetQuotaParserTest.java     |  5 ++-
 .../imap/decode/parser/GetQuotaRootParserTest.java |  9 ++--
 .../james/imap/decode/parser/MoveParserTest.java   |  5 ++-
 .../parser/SearchCommandParserCharsetTest.java     |  3 +-
 .../SearchCommandParserQuotedCharsetTest.java      |  4 +-
 .../parser/SetAnnotationCommandParserTest.java     |  2 +-
 .../decode/parser/SetQuotaCommandParserTest.java   |  3 +-
 .../imap/decode/parser/StoreCommandParserTest.java |  8 ++--
 .../james/imap/processor/CopyProcessorTest.java    | 11 ++---
 .../imap/processor/DeleteACLProcessorTest.java     |  3 +-
 .../james/imap/processor/GetACLProcessorTest.java  |  3 +-
 .../imap/processor/GetAnnotationProcessorTest.java | 31 +++++++-------
 .../imap/processor/GetQuotaProcessorTest.java      |  7 +--
 .../imap/processor/GetQuotaRootProcessorTest.java  |  7 +--
 .../james/imap/processor/LSubProcessorTest.java    |  2 +-
 .../imap/processor/ListRightsProcessorTest.java    |  3 +-
 .../james/imap/processor/MoveProcessorTest.java    | 11 ++---
 .../imap/processor/NamespaceProcessorTest.java     |  9 ++--
 .../james/imap/processor/SearchProcessorTest.java  |  3 +-
 .../james/imap/processor/SetACLProcessorTest.java  |  7 +--
 .../imap/processor/SetAnnotationProcessorTest.java | 14 +++---
 .../imap/processor/SetQuotaProcessorTest.java      |  3 +-
 175 files changed, 479 insertions(+), 323 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/api/Tag.java
similarity index 61%
copy from protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java
copy to protocols/imap/src/main/java/org/apache/james/imap/api/Tag.java
index da0474a..b11238f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/Tag.java
@@ -16,39 +16,45 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.imap.message.request;
 
-import org.apache.james.imap.api.ImapCommand;
-import org.apache.james.imap.api.message.request.ImapRequest;
+package org.apache.james.imap.api;
 
-/**
- * Abstract base class for {@link ImapRequest} implementations
- */
-public abstract class AbstractImapRequest implements ImapRequest {
+import java.util.Objects;
 
-    private final String tag;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
 
-    private final ImapCommand command;
+public class Tag {
+    private final String value;
 
-    public AbstractImapRequest(String tag, ImapCommand command) {
-        this.tag = tag;
-        this.command = command;
+    public Tag(String value) {
+        Preconditions.checkNotNull(value);
+        this.value = value;
+    }
+
+    public String asString() {
+        return value;
     }
 
-    /**
-     * Gets the IMAP command whose execution is requested by the client.
-     */
     @Override
-    public final ImapCommand getCommand() {
-        return command;
+    public final boolean equals(Object o) {
+        if (o instanceof Tag) {
+            Tag tag = (Tag) o;
+
+            return Objects.equals(this.value, tag.value);
+        }
+        return false;
     }
 
-    /**
-     * Gets the prefix tag identifying this request.
-     */
     @Override
-    public final String getTag() {
-        return tag;
+    public final int hashCode() {
+        return Objects.hash(value);
     }
 
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("value", value)
+            .toString();
+    }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/request/ImapRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/request/ImapRequest.java
index 8fb5d89..c9d1a6d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/request/ImapRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/request/ImapRequest.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.api.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 
 /**
  * The actual Imap request
@@ -39,6 +40,6 @@ public interface ImapRequest extends ImapMessage {
      * 
      * @return the tag identifying the client request, not null
      */
-    String getTag();
+    Tag getTag();
 
 }
\ No newline at end of file
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
index 15f9931..3c700fe 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponse.java
@@ -29,6 +29,7 @@ import java.util.stream.Stream;
 import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.MessageFlags;
@@ -70,7 +71,7 @@ public interface StatusResponse extends ImapResponseMessage {
      * 
      * @return if tagged response, the tag. Otherwise null.
      */
-    String getTag();
+    Tag getTag();
 
     /**
      * Gets the command.
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponseFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponseFactory.java
index 4c36821..26f8671 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponseFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/response/StatusResponseFactory.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.api.message.response;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 
 /**
@@ -41,7 +42,7 @@ public interface StatusResponseFactory {
      *            <code>ResponseCode</code>, not null
      * @return <code>StatusResponse</code>, not null
      */
-    StatusResponse taggedOk(String tag, ImapCommand command, HumanReadableText displayTextKey, StatusResponse.ResponseCode code);
+    StatusResponse taggedOk(Tag tag, ImapCommand command, HumanReadableText displayTextKey, StatusResponse.ResponseCode code);
 
     /**
      * Creates a tagged NO status response.
@@ -56,7 +57,7 @@ public interface StatusResponseFactory {
      *            <code>ResponseCode</code>, not null
      * @return <code>StatusResponse</code>, not null
      */
-    StatusResponse taggedNo(String tag, ImapCommand command, HumanReadableText displayTextKey, StatusResponse.ResponseCode code);
+    StatusResponse taggedNo(Tag tag, ImapCommand command, HumanReadableText displayTextKey, StatusResponse.ResponseCode code);
 
     /**
      * Creates a tagged BAD status response.
@@ -71,7 +72,7 @@ public interface StatusResponseFactory {
      *            <code>ResponseCode</code>, not null
      * @return <code>StatusResponse</code>, not null
      */
-    StatusResponse taggedBad(String tag, ImapCommand command, HumanReadableText displayTextKey, StatusResponse.ResponseCode code);
+    StatusResponse taggedBad(Tag tag, ImapCommand command, HumanReadableText displayTextKey, StatusResponse.ResponseCode code);
 
     /**
      * Creates a untagged OK status response.
@@ -139,7 +140,7 @@ public interface StatusResponseFactory {
      *            key to the human readable code to be displayed
      * @return <code>StatusResponse</code>, not null
      */
-    StatusResponse taggedOk(String tag, ImapCommand command, HumanReadableText displayTextKey);
+    StatusResponse taggedOk(Tag tag, ImapCommand command, HumanReadableText displayTextKey);
 
     /**
      * Creates a tagged NO status response.
@@ -152,7 +153,7 @@ public interface StatusResponseFactory {
      *            key to the human readable code to be displayed
      * @return <code>StatusResponse</code>, not null
      */
-    StatusResponse taggedNo(String tag, ImapCommand command, HumanReadableText displayTextKey);
+    StatusResponse taggedNo(Tag tag, ImapCommand command, HumanReadableText displayTextKey);
 
     /**
      * Creates a tagged BAD status response.
@@ -165,7 +166,7 @@ public interface StatusResponseFactory {
      *            key to the human readable code to be displayed
      * @return <code>StatusResponse</code>, not null
      */
-    StatusResponse taggedBad(String tag, ImapCommand command, HumanReadableText displayTextKey);
+    StatusResponse taggedBad(Tag tag, ImapCommand command, HumanReadableText displayTextKey);
 
     /**
      * Creates a untagged OK status response.
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapCommandParser.java
index 129c9ec..181ba7d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapCommandParser.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.decode;
 
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 
 /**
@@ -42,5 +43,5 @@ public interface ImapCommandParser {
      *            the {@link ImapSession}
      * @return <code>ImapCommandMessage</code>
      */
-    ImapMessage parse(ImapRequestLineReader request, String tag, ImapSession session);
+    ImapMessage parse(ImapRequestLineReader request, Tag tag, ImapSession session);
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
index 0981fa0..9c86626 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/ImapRequestLineReader.java
@@ -35,6 +35,7 @@ import java.util.List;
 import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.display.ModifiedUtf7;
 import org.apache.james.imap.api.message.IdRange;
@@ -191,9 +192,9 @@ public abstract class ImapRequestLineReader {
     /**
      * Reads a command "tag" from the request.
      */
-    public String tag() throws DecodingException {
+    public Tag tag() throws DecodingException {
         CharacterValidator validator = new TagCharValidator();
-        return consumeWord(validator);
+        return new Tag(consumeWord(validator));
     }
 
     /**
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
index a89f023..ac880d6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/base/AbstractImapCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.base;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
@@ -70,7 +71,7 @@ public abstract class AbstractImapCommandParser implements MessagingImapCommandP
      * @return <code>ImapCommandMessage</code>, not null
      */
     @Override
-    public final ImapMessage parse(ImapRequestLineReader request, String tag, ImapSession session) {
+    public final ImapMessage parse(ImapRequestLineReader request, Tag tag, ImapSession session) {
         ImapMessage result;
         if (!command.validForState(session.getState())) {
             result = statusResponseFactory.taggedNo(tag, command, HumanReadableText.INVALID_COMMAND);
@@ -101,6 +102,6 @@ public abstract class AbstractImapCommandParser implements MessagingImapCommandP
      * @throws DecodingException
      *             if the request cannot be parsed
      */
-    protected abstract ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException;
+    protected abstract ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException;
 
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java
index b8095d7..05d7192 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/main/DefaultImapDecoder.java
@@ -20,6 +20,7 @@ package org.apache.james.imap.decode.main;
 
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.ImapSessionState;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
@@ -62,7 +63,7 @@ public class DefaultImapDecoder implements ImapDecoder {
     public ImapMessage decode(ImapRequestLineReader request, ImapSession session) {
         ImapMessage message;
         try {
-            final String tag = request.tag();
+            final Tag tag = request.tag();
             message = decodeCommandTagged(request, tag, session);
         } catch (DecodingException e) {
             LOGGER.debug("Cannot parse tag", e);
@@ -71,7 +72,7 @@ public class DefaultImapDecoder implements ImapDecoder {
         return message;
     }
 
-    private ImapMessage decodeCommandTagged(ImapRequestLineReader request, String tag, ImapSession session) {
+    private ImapMessage decodeCommandTagged(ImapRequestLineReader request, Tag tag, ImapSession session) {
         ImapMessage message;
         LOGGER.debug("Got <tag>: {}", tag);
         try {
@@ -84,7 +85,7 @@ public class DefaultImapDecoder implements ImapDecoder {
         return message;
     }
 
-    private ImapMessage unknownCommand(String tag, ImapSession session) {
+    private ImapMessage unknownCommand(Tag tag, ImapSession session) {
         ImapMessage message;
         Object c = session.getAttribute(INVALID_COMMAND_COUNT);
         int count = 0;
@@ -108,7 +109,7 @@ public class DefaultImapDecoder implements ImapDecoder {
         return message;
     }
 
-    private ImapMessage decodeCommandNamed(ImapRequestLineReader request, String tag, String commandName, ImapSession session) {
+    private ImapMessage decodeCommandNamed(ImapRequestLineReader request, Tag tag, String commandName, ImapSession session) {
         ImapMessage message;
         LOGGER.debug("Got <command>: {}", commandName);
         final ImapCommandParser command = imapCommands.getParser(commandName);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java
index 11642c8..1a364c0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractMessageRangeCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
@@ -34,13 +35,13 @@ public abstract class AbstractMessageRangeCommandParser extends AbstractUidComma
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         IdRange[] idSet = request.parseIdRange(session);
         String mailboxName = request.mailbox();
         request.eol();
         return createRequest(command, tag, useUids, idSet, mailboxName);
     }
 
-    protected abstract AbstractMessageRangeRequest createRequest(ImapCommand command, String tag, boolean useUids, IdRange[] idSet, String mailboxName);
+    protected abstract AbstractMessageRangeRequest createRequest(ImapCommand command, Tag tag, boolean useUids, IdRange[] idSet, String mailboxName);
 
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java
index 59bf7aa..4376179 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractSelectionCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
@@ -44,7 +45,7 @@ public abstract class AbstractSelectionCommandParser extends AbstractImapCommand
 
     
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         boolean condstore = false;
         Long lastKnownUidValidity = null;
@@ -223,5 +224,5 @@ public abstract class AbstractSelectionCommandParser extends AbstractImapCommand
     /**
      * Create a new {@link AbstractMailboxSelectionRequest} for the given arguments
      */
-    protected abstract AbstractMailboxSelectionRequest createRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, String tag);
+    protected abstract AbstractMailboxSelectionRequest createRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, Tag tag);
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractUidCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractUidCommandParser.java
index cf48876..82d94a6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractUidCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AbstractUidCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,14 +34,14 @@ abstract class AbstractUidCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         return decode(command, request, tag, false, session);
     }
 
-    public ImapMessage decode(ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException {
+    public ImapMessage decode(ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         final ImapCommand command = getCommand();
         return decode(command, request, tag, useUids, session);
     }
 
-    protected abstract ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException;
+    protected abstract ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException;
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
index 52a09c2..468fa87 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AppendCommandParser.java
@@ -25,6 +25,7 @@ import javax.mail.Flags;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -68,7 +69,7 @@ public class AppendCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         String mailboxName = request.mailbox();
         Flags flags = optionalAppendFlags(request);
         if (flags == null) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AuthenticateCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AuthenticateCommandParser.java
index dcaa3ca..0f79b95 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AuthenticateCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/AuthenticateCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class AuthenticateCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         ImapMessage result;
         String authType = request.astring();
         try {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CapabilityCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CapabilityCommandParser.java
index 69f9378..0dc4e3f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CapabilityCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CapabilityCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class CapabilityCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         request.eol();
         return new CapabilityRequest(command, tag);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CheckCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CheckCommandParser.java
index 3b249b4..6cd6238 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CheckCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CheckCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class CheckCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         request.eol();
         return new CheckRequest(command, tag);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CloseCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CloseCommandParser.java
index a130a23..b5bd60c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CloseCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CloseCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ class CloseCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         request.eol();
         return new CloseRequest(command, tag);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CompressCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CompressCommandParser.java
index c9681f3..9809182 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CompressCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CompressCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,7 +35,7 @@ public class CompressCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         String algorithm = request.atom();
         request.eol();
         return new CompressRequest(tag, command, algorithm);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CopyCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CopyCommandParser.java
index 331898c..9431a07 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CopyCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CopyCommandParser.java
@@ -20,6 +20,7 @@ package org.apache.james.imap.decode.parser;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.message.request.CopyRequest;
 
@@ -33,7 +34,7 @@ public class CopyCommandParser extends AbstractMessageRangeCommandParser {
     }
 
     @Override
-    protected CopyRequest createRequest(ImapCommand command, String tag, boolean useUids, IdRange[] idSet, String mailboxName) {
+    protected CopyRequest createRequest(ImapCommand command, Tag tag, boolean useUids, IdRange[] idSet, String mailboxName) {
         return new CopyRequest(command, idSet, mailboxName, useUids, tag);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java
index 9752423..89c679a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/CreateCommandParser.java
@@ -22,6 +22,7 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
@@ -43,7 +44,7 @@ public class CreateCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         String mailboxName = request.mailbox();
 
         MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteACLCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteACLCommandParser.java
index f5fa22e..9d4497d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteACLCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteACLCommandParser.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class DeleteACLCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         final String identifier = request.astring();
         request.eol();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteCommandParser.java
index a0a99cd..3adac5f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/DeleteCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class DeleteCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         String mailboxName = request.mailbox();
         request.eol();
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/EnableCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/EnableCommandParser.java
index dca83f3..b4a9880 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/EnableCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/EnableCommandParser.java
@@ -25,6 +25,7 @@ import java.util.Locale;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class EnableCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         List<String> caps = new ArrayList<>();
         String cap = request.astring();
         caps.add(cap.toUpperCase(Locale.US));
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExamineCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExamineCommandParser.java
index 3a9e06b..233b488 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExamineCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExamineCommandParser.java
@@ -20,6 +20,7 @@ package org.apache.james.imap.decode.parser;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.message.request.AbstractMailboxSelectionRequest;
@@ -35,7 +36,7 @@ public class ExamineCommandParser extends AbstractSelectionCommandParser {
     }
 
     @Override
-    protected AbstractMailboxSelectionRequest createRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, String tag) {
+    protected AbstractMailboxSelectionRequest createRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, Tag tag) {
         return new ExamineRequest(command, mailboxName, condstore, lastKnownUidValidity, knownModSeq, uidSet, knownUidSet, knownSequenceSet, tag);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java
index afbc48c..a506e35 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ExpungeCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
@@ -37,7 +38,7 @@ public class ExpungeCommandParser extends AbstractUidCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         IdRange[] uidSet = null;
         if (useUids) {
             uidSet = request.parseIdRange(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
index 65c5929..9f4d33a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/FetchCommandParser.java
@@ -23,6 +23,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
@@ -268,7 +269,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         IdRange[] idSet = request.parseIdRange(session);
         FetchData fetch = fetchRequest(request);
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java
index da5e3f1..b84777e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class GetACLCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         request.eol();
         return new GetACLRequest(tag, command, mailboxName);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetAnnotationCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetAnnotationCommandParser.java
index 153b7a3..2e462d5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetAnnotationCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetAnnotationCommandParser.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
@@ -48,7 +49,7 @@ public class GetAnnotationCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader requestReader, String tag, ImapSession session)
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader requestReader, Tag tag, ImapSession session)
         throws DecodingException {
         try {
             return buildAnnotationRequest(command, requestReader, tag);
@@ -57,7 +58,7 @@ public class GetAnnotationCommandParser extends AbstractImapCommandParser {
         }
     }
 
-    private ImapMessage buildAnnotationRequest(ImapCommand command, ImapRequestLineReader requestReader, String tag) throws DecodingException {
+    private ImapMessage buildAnnotationRequest(ImapCommand command, ImapRequestLineReader requestReader, Tag tag) throws DecodingException {
         GetAnnotationRequest.Builder builder = GetAnnotationRequest.builder().tag(tag).command(command);
         builder.mailboxName(requestReader.mailbox());
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaCommandParser.java
index a216561..8a240bb 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaCommandParser.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class GetQuotaCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String quotaRoot = request.atom();
         request.eol();
         return new GetQuotaRequest(tag, command, quotaRoot);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaRootCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaRootCommandParser.java
index 9c051ca..64d3a99 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaRootCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/GetQuotaRootCommandParser.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class GetQuotaRootCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         request.eol();
         return new GetQuotaRootRequest(tag, command, mailboxName);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/IdleCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/IdleCommandParser.java
index 91d33c8..4171059 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/IdleCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/IdleCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class IdleCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         request.eol();
         return new IdleRequest(command, tag);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java
index 569a815..93025c6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -70,14 +71,14 @@ public class ListCommandParser extends AbstractUidCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         String referenceName = request.mailbox();
         String mailboxPattern = listMailbox(request);
         request.eol();
         return createMessage(command, referenceName, mailboxPattern, tag);
     }
 
-    protected ImapMessage createMessage(ImapCommand command, String referenceName, String mailboxPattern, String tag) {
+    protected ImapMessage createMessage(ImapCommand command, String referenceName, String mailboxPattern, Tag tag) {
         return new ListRequest(command, referenceName, mailboxPattern, tag);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListRightsCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListRightsCommandParser.java
index ef1437b..88b0d13 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListRightsCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ListRightsCommandParser.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class ListRightsCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         final String identifier = request.astring();
         request.eol();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LoginCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LoginCommandParser.java
index fd9de6d..4c4246f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LoginCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LoginCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class LoginCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String userid = request.astring();
         final String password = request.astring();
         request.eol();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LogoutCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LogoutCommandParser.java
index 23b94fd..7a489aa 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LogoutCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LogoutCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class LogoutCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         request.eol();
         return new LogoutRequest(command, tag);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LsubCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LsubCommandParser.java
index 36064dc..51676e2 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LsubCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/LsubCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.message.request.LsubRequest;
 
 /**
@@ -33,7 +34,7 @@ public class LsubCommandParser extends ListCommandParser {
     }
 
     @Override
-    protected ImapMessage createMessage(ImapCommand command, String referenceName, String mailboxPattern, String tag) {
+    protected ImapMessage createMessage(ImapCommand command, String referenceName, String mailboxPattern, Tag tag) {
         return new LsubRequest(command, referenceName, mailboxPattern, tag);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MoveCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MoveCommandParser.java
index 006337e..63a5024 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MoveCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MoveCommandParser.java
@@ -2,6 +2,7 @@ package org.apache.james.imap.decode.parser;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.message.request.MoveRequest;
 
@@ -15,7 +16,7 @@ public class MoveCommandParser extends AbstractMessageRangeCommandParser {
     }
 
     @Override
-    protected MoveRequest createRequest(ImapCommand command, String tag,
+    protected MoveRequest createRequest(ImapCommand command, Tag tag,
             boolean useUids, IdRange[] idSet, String mailboxName) {
         return new MoveRequest(command, idSet, mailboxName, useUids, tag);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MyRightsCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MyRightsCommandParser.java
index c52ebfe..69e818a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MyRightsCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/MyRightsCommandParser.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class MyRightsCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         request.eol();
         return new MyRightsRequest(tag, command, mailboxName);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java
index 2901173..b59e63d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NamespaceCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class NamespaceCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         return new NamespaceRequest(command, tag);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java
index d79cded..1bfb55b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/NoopCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class NoopCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         request.eol();
         return new NoopRequest(command, tag);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/RenameCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/RenameCommandParser.java
index 39cba01..feeef9d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/RenameCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/RenameCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class RenameCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String existingName = request.mailbox();
         final String newName = request.mailbox();
         request.eol();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SearchCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SearchCommandParser.java
index 546f671..68614da 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SearchCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SearchCommandParser.java
@@ -28,6 +28,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
@@ -901,7 +902,7 @@ public class SearchCommandParser extends AbstractUidCommandParser {
         return result;
     }
 
-    private ImapMessage unsupportedCharset(String tag, ImapCommand command) {
+    private ImapMessage unsupportedCharset(Tag tag, ImapCommand command) {
         final StatusResponseFactory factory = getStatusResponseFactory();
         final ResponseCode badCharset = StatusResponse.ResponseCode.badCharset();
         return factory.taggedNo(tag, command, HumanReadableText.BAD_CHARSET, badCharset);
@@ -968,7 +969,7 @@ public class SearchCommandParser extends AbstractUidCommandParser {
     }
     
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         try {
             SearchKey recent = null;
             List<SearchResultOption> options = null;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SelectCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SelectCommandParser.java
index e2dba16..253b853 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SelectCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SelectCommandParser.java
@@ -20,6 +20,7 @@ package org.apache.james.imap.decode.parser;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.message.request.AbstractMailboxSelectionRequest;
@@ -35,7 +36,7 @@ public class SelectCommandParser extends AbstractSelectionCommandParser {
     }
 
     @Override
-    protected AbstractMailboxSelectionRequest createRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, String tag) {
+    protected AbstractMailboxSelectionRequest createRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, Tag tag) {
         return new SelectRequest(command, mailboxName, condstore, lastKnownUidValidity, knownModSeq, uidSet, knownUidSet, knownSequenceSet, tag);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java
index bb692cf..4cfc4da 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class SetACLCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         final String identifier = request.astring();
         final String rights = request.astring();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java
index 1de124d..0c24420 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParser.java
@@ -25,6 +25,7 @@ import java.util.function.Function;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
@@ -42,7 +43,7 @@ public class SetAnnotationCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session)
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session)
             throws DecodingException {
         String mailboxName = request.mailbox();
         ImmutableList.Builder<MailboxAnnotation> listMailboxAnnotations = ImmutableList.<MailboxAnnotation>builder();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetQuotaCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetQuotaCommandParser.java
index 42f5e6a..f38a554 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetQuotaCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetQuotaCommandParser.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,7 +39,7 @@ public class SetQuotaCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String quotaRoot = request.atom();
         SetQuotaRequest setQuotaRequest = new SetQuotaRequest(tag, command, quotaRoot);
         // We now parse resource limit declaration
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StartTLSCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StartTLSCommandParser.java
index 990ac5b..c5d2743 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StartTLSCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StartTLSCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class StartTLSCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         request.eol();
         return new StartTLSRequest(tag, command);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
index 6157c97..75ae4ae 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.StatusDataItems;
 import org.apache.james.imap.api.process.ImapSession;
@@ -80,7 +81,7 @@ public class StatusCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         final StatusDataItems statusDataItems = statusDataItems(request);
         request.eol();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java
index b5c7460..07f924f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StoreCommandParser.java
@@ -23,6 +23,7 @@ import javax.mail.Flags;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.process.ImapSession;
@@ -43,7 +44,7 @@ public class StoreCommandParser extends AbstractUidCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, boolean useUids, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         final IdRange[] idSet = request.parseIdRange(session);
         final Boolean sign;
         boolean silent = false;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SubscribeCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SubscribeCommandParser.java
index f3829de..3934019 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SubscribeCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SubscribeCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class SubscribeCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         request.eol();
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java
index 8865bf5..0ae7885 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UidCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
@@ -55,7 +56,7 @@ public class UidCommandParser extends AbstractImapCommandParser implements Deleg
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         // TODO: check the logic against the specification:
         // TODO: suspect that it is now bust
         // TODO: the command written may be wrong
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnselectCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnselectCommandParser.java
index b0dcc7f..4ee9a15 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnselectCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnselectCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -43,7 +44,7 @@ public class UnselectCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         request.eol();
         return new UnselectRequest(tag, command);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnsubscribeCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnsubscribeCommandParser.java
index 7f69bbd..1070ef9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnsubscribeCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/UnsubscribeCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,7 +38,7 @@ public class UnsubscribeCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, String tag, ImapSession session) throws DecodingException {
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
         final String mailboxName = request.mailbox();
         request.eol();
         return new UnsubscribeRequest(command, mailboxName, tag);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java
index 4d07e44..9b056e9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/XListCommandParser.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.message.request.XListRequest;
 
 /**
@@ -33,7 +34,7 @@ public class XListCommandParser extends ListCommandParser {
     }
 
     @Override
-    protected ImapMessage createMessage(ImapCommand command, String referenceName, String mailboxPattern, String tag) {
+    protected ImapMessage createMessage(ImapCommand command, String referenceName, String mailboxPattern, Tag tag) {
         return new XListRequest(command, referenceName, mailboxPattern, tag);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
index 37f349f..487ad07 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ESearchResponseEncoder.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.SearchResultOption;
@@ -41,7 +42,7 @@ public class ESearchResponseEncoder extends AbstractChainedImapEncoder {
     @Override
     protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
         ESearchResponse response = (ESearchResponse) acceptableMessage;
-        String tag = response.getTag();
+        Tag tag = response.getTag();
         long min = response.getMinUid();
         long max = response.getMaxUid();
         long count = response.getCount();
@@ -51,7 +52,7 @@ public class ESearchResponseEncoder extends AbstractChainedImapEncoder {
         Long highestModSeq = response.getHighestModSeq();
         List<SearchResultOption> options = response.getSearchResultOptions();
         
-        composer.untagged().message("ESEARCH").openParen().message("TAG").quote(tag).closeParen();
+        composer.untagged().message("ESEARCH").openParen().message("TAG").quote(tag.asString()).closeParen();
         if (useUid) {
             composer.message("UID");
         }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseComposer.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseComposer.java
index d76e5f7..60df2b2 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseComposer.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseComposer.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 
 import javax.mail.Flags;
 
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.ModifiedUtf7;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
@@ -128,7 +129,7 @@ public interface ImapResponseComposer {
      * @return composer
      * @throws IOException
      */
-    ImapResponseComposer tag(String tag) throws IOException;
+    ImapResponseComposer tag(Tag tag) throws IOException;
 
     /**
      * Write a quoted message
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/StatusResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/StatusResponseEncoder.java
index 92b0a25..7afafea 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/StatusResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/StatusResponseEncoder.java
@@ -25,6 +25,7 @@ import java.util.Collection;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.display.Locales;
 import org.apache.james.imap.api.display.Localizer;
@@ -50,7 +51,7 @@ public class StatusResponseEncoder extends AbstractChainedImapEncoder {
         final String type = asString(serverResponseType);
         final ResponseCode responseCode = response.getResponseCode();
         final String code = asString(responseCode);
-        final String tag = response.getTag();
+        final Tag tag = response.getTag();
         final ImapCommand command = response.getCommand();
         final HumanReadableText textKey = response.getTextKey();
         final String text = asString(textKey, session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
index 33d2be9..950123f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/base/ImapResponseComposerImpl.java
@@ -25,6 +25,7 @@ import java.nio.charset.Charset;
 import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.ModifiedUtf7;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
@@ -127,8 +128,8 @@ public class ImapResponseComposerImpl implements ImapConstants, ImapResponseComp
     }
 
     @Override
-    public ImapResponseComposer tag(String tag) throws IOException {
-        writeASCII(tag);
+    public ImapResponseComposer tag(Tag tag) throws IOException {
+        writeASCII(tag.asString());
         return this;
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java
index da0474a..cff0123 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractImapRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
 /**
@@ -26,11 +27,11 @@ import org.apache.james.imap.api.message.request.ImapRequest;
  */
 public abstract class AbstractImapRequest implements ImapRequest {
 
-    private final String tag;
+    private final Tag tag;
 
     private final ImapCommand command;
 
-    public AbstractImapRequest(String tag, ImapCommand command) {
+    public AbstractImapRequest(Tag tag, ImapCommand command) {
         this.tag = tag;
         this.command = command;
     }
@@ -47,7 +48,7 @@ public abstract class AbstractImapRequest implements ImapRequest {
      * Gets the prefix tag identifying this request.
      */
     @Override
-    public final String getTag() {
+    public final Tag getTag() {
         return tag;
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMailboxSelectionRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMailboxSelectionRequest.java
index 34202fa..137c17e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMailboxSelectionRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMailboxSelectionRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.ImapRequest;
@@ -40,7 +41,7 @@ public abstract class AbstractMailboxSelectionRequest extends AbstractImapReques
     private final UidRange[] knownUidSet;
     private final IdRange[] knownSequenceSet;
 
-    public AbstractMailboxSelectionRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, String tag) {
+    public AbstractMailboxSelectionRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, Tag tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.condstore = condstore;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java
index 269c1ca..8632240 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AbstractMessageRangeRequest.java
@@ -23,6 +23,7 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 
 import com.google.common.base.Objects;
@@ -33,7 +34,7 @@ public abstract class AbstractMessageRangeRequest extends AbstractImapRequest {
     private final String mailboxName;
     private final boolean useUids;
 
-    public AbstractMessageRangeRequest(ImapCommand command, IdRange[] idSet, String mailboxName, boolean useUids, String tag) {
+    public AbstractMessageRangeRequest(ImapCommand command, IdRange[] idSet, String mailboxName, boolean useUids, Tag tag) {
         super(tag, command);
         this.idSet = idSet;
         this.mailboxName = mailboxName;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AppendRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AppendRequest.java
index 927a1b9..cefe6b2 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AppendRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AppendRequest.java
@@ -24,6 +24,7 @@ import java.util.Date;
 import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
 /**
@@ -38,7 +39,7 @@ public class AppendRequest extends AbstractImapRequest {
 
     private final InputStream message;
 
-    public AppendRequest(ImapCommand command, String mailboxName, Flags flags, Date datetime, InputStream message, String tag) {
+    public AppendRequest(ImapCommand command, String mailboxName, Flags flags, Date datetime, InputStream message, Tag tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.flags = flags;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AuthenticateRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AuthenticateRequest.java
index da2c46d..b0b2a6a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/AuthenticateRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/AuthenticateRequest.java
@@ -19,12 +19,13 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class AuthenticateRequest extends AbstractImapRequest {
 
     private final String authType;
 
-    public AuthenticateRequest(ImapCommand command, String authType, String tag) {
+    public AuthenticateRequest(ImapCommand command, String authType, Tag tag) {
         super(tag, command);
         this.authType = authType;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CapabilityRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CapabilityRequest.java
index 234833a..4bf8cf5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CapabilityRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CapabilityRequest.java
@@ -19,10 +19,11 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class CapabilityRequest extends AbstractImapRequest {
 
-    public CapabilityRequest(ImapCommand command, String tag) {
+    public CapabilityRequest(ImapCommand command, Tag tag) {
         super(tag, command);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CheckRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CheckRequest.java
index bae0f63..54cd8b6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CheckRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CheckRequest.java
@@ -19,10 +19,11 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class CheckRequest extends AbstractImapRequest {
 
-    public CheckRequest(ImapCommand command, String tag) {
+    public CheckRequest(ImapCommand command, Tag tag) {
         super(tag, command);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CloseRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CloseRequest.java
index 6b4f4d8..0d076bb 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CloseRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CloseRequest.java
@@ -19,10 +19,11 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class CloseRequest extends AbstractImapRequest {
 
-    public CloseRequest(ImapCommand command, String tag) {
+    public CloseRequest(ImapCommand command, Tag tag) {
         super(tag, command);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CompressRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CompressRequest.java
index 333cf93..c193068 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CompressRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CompressRequest.java
@@ -19,12 +19,13 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class CompressRequest extends AbstractImapRequest {
 
     private final String algorithm;
 
-    public CompressRequest(String tag, ImapCommand command, String algorithm) {
+    public CompressRequest(Tag tag, ImapCommand command, String algorithm) {
         super(tag, command);
         this.algorithm = algorithm;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CopyRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CopyRequest.java
index 8408a24..ef28ee6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CopyRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CopyRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
@@ -27,7 +28,7 @@ import org.apache.james.imap.api.message.request.ImapRequest;
  */
 public class CopyRequest extends AbstractMessageRangeRequest {
 
-    public CopyRequest(ImapCommand command, IdRange[] idSet, String mailboxName, boolean useUids, String tag) {
+    public CopyRequest(ImapCommand command, IdRange[] idSet, String mailboxName, boolean useUids, Tag tag) {
         super(command, idSet, mailboxName, useUids, tag);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CreateRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CreateRequest.java
index 8fe9f4e..b7df81d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/CreateRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/CreateRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
 /**
@@ -27,7 +28,7 @@ import org.apache.james.imap.api.message.request.ImapRequest;
 public class CreateRequest extends AbstractImapRequest {
     private final String mailboxName;
 
-    public CreateRequest(ImapCommand command, String mailboxName, String tag) {
+    public CreateRequest(ImapCommand command, String mailboxName, Tag tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteACLRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteACLRequest.java
index 5d73f45..26b6d90 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteACLRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteACLRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * DELETEACL Request.
@@ -28,7 +29,7 @@ public class DeleteACLRequest extends AbstractImapRequest {
     private final String identifier;
     private final String mailboxName;
 
-    public DeleteACLRequest(String tag, ImapCommand command, String mailboxName, String identifier) {
+    public DeleteACLRequest(Tag tag, ImapCommand command, String mailboxName, String identifier) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.identifier = identifier;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteRequest.java
index f3ca830..8ccf9cc 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/DeleteRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
 /**
@@ -27,7 +28,7 @@ import org.apache.james.imap.api.message.request.ImapRequest;
 public class DeleteRequest extends AbstractImapRequest {
     private final String mailboxName;
 
-    public DeleteRequest(ImapCommand command, String mailboxName, String tag) {
+    public DeleteRequest(ImapCommand command, String mailboxName, Tag tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/EnableRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/EnableRequest.java
index ddb6b49..e285d27 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/EnableRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/EnableRequest.java
@@ -21,12 +21,13 @@ package org.apache.james.imap.message.request;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class EnableRequest extends AbstractImapRequest {
 
     private final List<String> capabilities;
 
-    public EnableRequest(String tag, ImapCommand command, List<String> capabilities) {
+    public EnableRequest(Tag tag, ImapCommand command, List<String> capabilities) {
         super(tag, command);
         this.capabilities = capabilities;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/ExamineRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/ExamineRequest.java
index d47e69c..5776d48 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/ExamineRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/ExamineRequest.java
@@ -19,11 +19,12 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 
 public class ExamineRequest extends AbstractMailboxSelectionRequest {
-    public ExamineRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, String tag) {
+    public ExamineRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, Tag tag) {
         super(command, mailboxName, condstore, lastKnownUidValidity, knownModSeq, uidSet, knownUidSet, knownSequenceSet, tag);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java
index 9ec39d1..1f85390 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/ExpungeRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
@@ -28,7 +29,7 @@ import org.apache.james.imap.api.message.request.ImapRequest;
 public class ExpungeRequest extends AbstractImapRequest {
     private final IdRange[] uidRange;
 
-    public ExpungeRequest(ImapCommand command, String tag, IdRange[] uidRange) {
+    public ExpungeRequest(ImapCommand command, Tag tag, IdRange[] uidRange) {
         super(tag, command);
         this.uidRange = uidRange;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java
index c42339f..61e8758 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/FetchRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.FetchData;
 import org.apache.james.imap.api.message.IdRange;
 
@@ -29,7 +30,7 @@ public class FetchRequest extends AbstractImapRequest {
 
     private final FetchData fetch;
 
-    public FetchRequest(ImapCommand command, boolean useUids, IdRange[] idSet, FetchData fetch, String tag) {
+    public FetchRequest(ImapCommand command, boolean useUids, IdRange[] idSet, FetchData fetch, Tag tag) {
         super(tag, command);
         this.useUids = useUids;
         this.idSet = idSet;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java
index 8d8f9c6..df14fdf 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * GETACL Request.
@@ -27,7 +28,7 @@ import org.apache.james.imap.api.ImapCommand;
 public class GetACLRequest extends AbstractImapRequest {
     private final String mailboxName;
 
-    public GetACLRequest(String tag, ImapCommand command, String mailboxName) {
+    public GetACLRequest(Tag tag, ImapCommand command, String mailboxName) {
         super(tag, command);
         this.mailboxName = mailboxName;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetAnnotationRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetAnnotationRequest.java
index efde30e..43bfae8 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetAnnotationRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetAnnotationRequest.java
@@ -23,6 +23,7 @@ import java.util.Optional;
 import java.util.Set;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.mailbox.model.MailboxAnnotationKey;
 
 import com.google.common.base.Preconditions;
@@ -30,7 +31,7 @@ import com.google.common.collect.ImmutableSet;
 
 public class GetAnnotationRequest extends AbstractImapRequest {
     public static class Builder {
-        private String tag;
+        private Tag tag;
         private ImapCommand command;
         private String mailboxName;
         private Set<MailboxAnnotationKey> keys;
@@ -43,7 +44,7 @@ public class GetAnnotationRequest extends AbstractImapRequest {
             keys = ImmutableSet.of();
         }
 
-        public Builder tag(String tag) {
+        public Builder tag(Tag tag) {
             this.tag = tag;
             return this;
         }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRequest.java
index 3d34c66..6e07b96 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * GETQUOTA Request
@@ -27,7 +28,7 @@ import org.apache.james.imap.api.ImapCommand;
 public class GetQuotaRequest extends AbstractImapRequest {
     private final String quotaRoot;
 
-    public GetQuotaRequest(String tag, ImapCommand command, String quotaRoot) {
+    public GetQuotaRequest(Tag tag, ImapCommand command, String quotaRoot) {
         super(tag, command);
         this.quotaRoot = quotaRoot;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRootRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRootRequest.java
index 59d13f4..fd0faff 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRootRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/GetQuotaRootRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * GETQUOTAROOT Request
@@ -27,7 +28,7 @@ import org.apache.james.imap.api.ImapCommand;
 public class GetQuotaRootRequest extends AbstractImapRequest {
     private final String mailboxName;
 
-    public GetQuotaRootRequest(String tag, ImapCommand command, String mailboxName) {
+    public GetQuotaRootRequest(Tag tag, ImapCommand command, String mailboxName) {
         super(tag, command);
         this.mailboxName = mailboxName;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/IRAuthenticateRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/IRAuthenticateRequest.java
index 3f04c67..9958b09 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/IRAuthenticateRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/IRAuthenticateRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * A {@link AuthenticateRequest} which also contains the initialClientResponse as stated in RFC4959
@@ -28,7 +29,7 @@ public class IRAuthenticateRequest extends AuthenticateRequest {
 
     private final String initialClientResponse;
 
-    public IRAuthenticateRequest(ImapCommand command, String authType, String tag, String initialClientResponse) {
+    public IRAuthenticateRequest(ImapCommand command, String authType, Tag tag, String initialClientResponse) {
         super(command, authType, tag);
         this.initialClientResponse = initialClientResponse;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/IdleRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/IdleRequest.java
index 944856f..eeb194f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/IdleRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/IdleRequest.java
@@ -19,10 +19,11 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class IdleRequest extends AbstractImapRequest {
 
-    public IdleRequest(ImapCommand command, String tag) {
+    public IdleRequest(ImapCommand command, Tag tag) {
         super(tag, command);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRequest.java
index 4896549..bed357b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRequest.java
@@ -19,13 +19,14 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class ListRequest extends AbstractImapRequest {
     private final String baseReferenceName;
 
     private final String mailboxPattern;
 
-    public ListRequest(ImapCommand command, String referenceName, String mailboxPattern, String tag) {
+    public ListRequest(ImapCommand command, String referenceName, String mailboxPattern, Tag tag) {
         super(tag, command);
         this.baseReferenceName = referenceName;
         this.mailboxPattern = mailboxPattern;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRightsRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRightsRequest.java
index 6f22b63..4c659d5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRightsRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/ListRightsRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * LISTRIGHTS Request.
@@ -28,7 +29,7 @@ public class ListRightsRequest extends AbstractImapRequest {
     private final String identifier;
     private final String mailboxName;
 
-    public ListRightsRequest(String tag, ImapCommand command, String mailboxName, String identifier) {
+    public ListRightsRequest(Tag tag, ImapCommand command, String mailboxName, String identifier) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.identifier = identifier;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/LoginRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/LoginRequest.java
index 3cf545d..df18fef 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/LoginRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/LoginRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
 /**
@@ -29,7 +30,7 @@ public class LoginRequest extends AbstractImapRequest {
 
     private final String password;
 
-    public LoginRequest(ImapCommand command, String userid, String password, String tag) {
+    public LoginRequest(ImapCommand command, String userid, String password, Tag tag) {
         super(tag, command);
         this.userid = userid;
         this.password = password;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/LogoutRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/LogoutRequest.java
index 6b4d951..2010d5c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/LogoutRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/LogoutRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
 /**
@@ -26,7 +27,7 @@ import org.apache.james.imap.api.message.request.ImapRequest;
  */
 public class LogoutRequest extends AbstractImapRequest {
 
-    public LogoutRequest(ImapCommand command, String tag) {
+    public LogoutRequest(ImapCommand command, Tag tag) {
         super(tag, command);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/LsubRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/LsubRequest.java
index c4ec656..7a04d8c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/LsubRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/LsubRequest.java
@@ -19,13 +19,14 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class LsubRequest extends AbstractImapRequest {
     private final String baseReferenceName;
 
     private final String mailboxPattern;
 
-    public LsubRequest(ImapCommand command, String referenceName, String mailboxPattern, String tag) {
+    public LsubRequest(ImapCommand command, String referenceName, String mailboxPattern, Tag tag) {
         super(tag, command);
         this.baseReferenceName = referenceName;
         this.mailboxPattern = mailboxPattern;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java
index 7c92fec..cc26386 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/MoveRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.request.ImapRequest;
 
@@ -28,7 +29,7 @@ import org.apache.james.imap.api.message.request.ImapRequest;
  */
 public class MoveRequest extends AbstractMessageRangeRequest {
 
-    public MoveRequest(ImapCommand command, IdRange[] idSet, String mailboxName, boolean useUids, String tag) {
+    public MoveRequest(ImapCommand command, IdRange[] idSet, String mailboxName, boolean useUids, Tag tag) {
         super(command, idSet, mailboxName, useUids, tag);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/MyRightsRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/MyRightsRequest.java
index 19fd74a..3cb4123 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/MyRightsRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/MyRightsRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * MYRIGHTS Request.
@@ -27,7 +28,7 @@ import org.apache.james.imap.api.ImapCommand;
 public class MyRightsRequest extends AbstractImapRequest {
     private final String mailboxName;
 
-    public MyRightsRequest(String tag, ImapCommand command, String mailboxName) {
+    public MyRightsRequest(Tag tag, ImapCommand command, String mailboxName) {
         super(tag, command);
         this.mailboxName = mailboxName;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java
index f9ac385..149cbb4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/NamespaceRequest.java
@@ -19,13 +19,14 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * Describes a NAMESPACE command.
  */
 public class NamespaceRequest extends AbstractImapRequest {
 
-    public NamespaceRequest(ImapCommand command, String tag) {
+    public NamespaceRequest(ImapCommand command, Tag tag) {
         super(tag, command);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/NoopRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/NoopRequest.java
index d663bf3..412c594 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/NoopRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/NoopRequest.java
@@ -19,10 +19,11 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class NoopRequest extends AbstractImapRequest {
 
-    public NoopRequest(ImapCommand command, String tag) {
+    public NoopRequest(ImapCommand command, Tag tag) {
         super(tag, command);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/RenameRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/RenameRequest.java
index 77b9e0a..2ff6bd9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/RenameRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/RenameRequest.java
@@ -19,13 +19,14 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class RenameRequest extends AbstractImapRequest {
     private final String existingName;
 
     private final String newName;
 
-    public RenameRequest(ImapCommand command, String existingName, String newName, String tag) {
+    public RenameRequest(ImapCommand command, String existingName, String newName, Tag tag) {
         super(tag, command);
         this.existingName = existingName;
         this.newName = newName;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SearchRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SearchRequest.java
index 4e254ec..79cfcfa 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SearchRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SearchRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.request.SearchOperation;
 
 public class SearchRequest extends AbstractImapRequest {
@@ -27,7 +28,7 @@ public class SearchRequest extends AbstractImapRequest {
 
     private final boolean useUids;
 
-    public SearchRequest(ImapCommand command, SearchOperation operation, boolean useUids, String tag) {
+    public SearchRequest(ImapCommand command, SearchOperation operation, boolean useUids, Tag tag) {
         super(tag, command);
         this.operation = operation;
         this.useUids = useUids;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SelectRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SelectRequest.java
index 451e2e3..3d5519c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SelectRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SelectRequest.java
@@ -19,12 +19,13 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 
 public class SelectRequest extends AbstractMailboxSelectionRequest {
 
-    public SelectRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, String tag) {
+    public SelectRequest(ImapCommand command, String mailboxName, boolean condstore, Long lastKnownUidValidity, Long knownModSeq, UidRange[] uidSet, UidRange[] knownUidSet, IdRange[] knownSequenceSet, Tag tag) {
         super(command, mailboxName, condstore, lastKnownUidValidity, knownModSeq, uidSet, knownUidSet, knownSequenceSet, tag);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java
index cadf2f0..05a70f7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * SETACL Request.
@@ -29,7 +30,7 @@ public class SetACLRequest extends AbstractImapRequest {
     private final String mailboxName;
     private final String rights;
 
-    public SetACLRequest(String tag, ImapCommand command, String mailboxName, String identifier, String rights) {
+    public SetACLRequest(Tag tag, ImapCommand command, String mailboxName, String identifier, String rights) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.identifier = identifier;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetAnnotationRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetAnnotationRequest.java
index fdd82b0..b88e849 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetAnnotationRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetAnnotationRequest.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.message.request;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 
 import com.google.common.collect.ImmutableList;
@@ -30,7 +31,7 @@ public class SetAnnotationRequest extends AbstractImapRequest {
     private final String mailboxName;
     private final List<MailboxAnnotation> mailboxAnnotations;
 
-    public SetAnnotationRequest(String tag, ImapCommand command, String mailboxName, List<MailboxAnnotation> mailboxAnnotations) {
+    public SetAnnotationRequest(Tag tag, ImapCommand command, String mailboxName, List<MailboxAnnotation> mailboxAnnotations) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.mailboxAnnotations = ImmutableList.copyOf(mailboxAnnotations);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetQuotaRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetQuotaRequest.java
index 33ed681..32ba642 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetQuotaRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetQuotaRequest.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableList;
@@ -61,7 +62,7 @@ public class SetQuotaRequest extends AbstractImapRequest {
     private final String quotaRoot;
     private final List<ResourceLimit> resourceLimits;
 
-    public SetQuotaRequest(String tag, ImapCommand command, String quotaRoot) {
+    public SetQuotaRequest(Tag tag, ImapCommand command, String quotaRoot) {
         super(tag, command);
         this.quotaRoot = quotaRoot;
         this.resourceLimits = new ArrayList<>();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java
index 2c6e7e7..6057d5a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/StartTLSRequest.java
@@ -19,13 +19,14 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * Request for STARTTLS
  */
 public class StartTLSRequest extends AbstractImapRequest {
 
-    public StartTLSRequest(String tag, ImapCommand command) {
+    public StartTLSRequest(Tag tag, ImapCommand command) {
         super(tag, command);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/StatusRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/StatusRequest.java
index 28aba3c..4266bcf 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/StatusRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/StatusRequest.java
@@ -19,6 +19,7 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.StatusDataItems;
 
 public class StatusRequest extends AbstractImapRequest {
@@ -26,7 +27,7 @@ public class StatusRequest extends AbstractImapRequest {
 
     private final StatusDataItems statusDataItems;
 
-    public StatusRequest(ImapCommand command, String mailboxName, StatusDataItems statusDataItems, String tag) {
+    public StatusRequest(ImapCommand command, String mailboxName, StatusDataItems statusDataItems, Tag tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
         this.statusDataItems = statusDataItems;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/StoreRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/StoreRequest.java
index ebc43d9..53f3bc4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/StoreRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/StoreRequest.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.message.request;
 import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 
 public class StoreRequest extends AbstractImapRequest {
@@ -39,7 +40,7 @@ public class StoreRequest extends AbstractImapRequest {
 
     private final long unchangedSince;
 
-    public StoreRequest(ImapCommand command, IdRange[] idSet, boolean silent, Flags flags, boolean useUids, String tag, Boolean sign, long unchangedSince) {
+    public StoreRequest(ImapCommand command, IdRange[] idSet, boolean silent, Flags flags, boolean useUids, Tag tag, Boolean sign, long unchangedSince) {
         super(tag, command);
         this.idSet = idSet;
         this.silent = silent;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SubscribeRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SubscribeRequest.java
index d305cfc..61f22b7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SubscribeRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SubscribeRequest.java
@@ -19,11 +19,12 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class SubscribeRequest extends AbstractImapRequest {
     private final String mailboxName;
 
-    public SubscribeRequest(ImapCommand command, String mailboxName, String tag) {
+    public SubscribeRequest(ImapCommand command, String mailboxName, Tag tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnselectRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnselectRequest.java
index bcac558..bcbbd3d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnselectRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnselectRequest.java
@@ -19,10 +19,11 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class UnselectRequest extends AbstractImapRequest {
 
-    public UnselectRequest(String tag, ImapCommand command) {
+    public UnselectRequest(Tag tag, ImapCommand command) {
         super(tag, command);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnsubscribeRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnsubscribeRequest.java
index b5c6242..073a07a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnsubscribeRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnsubscribeRequest.java
@@ -19,11 +19,12 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 public class UnsubscribeRequest extends AbstractImapRequest {
     private final String mailboxName;
 
-    public UnsubscribeRequest(ImapCommand command, String mailboxName, String tag) {
+    public UnsubscribeRequest(ImapCommand command, String mailboxName, Tag tag) {
         super(tag, command);
         this.mailboxName = mailboxName;
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/XListRequest.java b/protocols/imap/src/main/java/org/apache/james/imap/message/request/XListRequest.java
index 5583601..8a2e718 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/XListRequest.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/request/XListRequest.java
@@ -19,13 +19,14 @@
 package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 
 /**
  * XLIST command request
  */
 public class XListRequest extends ListRequest {
 
-    public XListRequest(ImapCommand command, String referenceName, String mailboxPattern, String tag) {
+    public XListRequest(ImapCommand command, String referenceName, String mailboxPattern, Tag tag) {
         super(command, referenceName, mailboxPattern, tag);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/AbstractStatusResponseFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/AbstractStatusResponseFactory.java
index 41b685e..6a44d4b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/AbstractStatusResponseFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/AbstractStatusResponseFactory.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.response;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
@@ -30,7 +31,7 @@ public abstract class AbstractStatusResponseFactory implements StatusResponseFac
     AbstractStatusResponseFactory() {
     }
 
-    protected abstract StatusResponse createResponse(StatusResponse.Type type, String tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code);
+    protected abstract StatusResponse createResponse(StatusResponse.Type type, Tag tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code);
 
     @Override
     public StatusResponse bye(HumanReadableText displayTextKey, ResponseCode code) {
@@ -53,32 +54,32 @@ public abstract class AbstractStatusResponseFactory implements StatusResponseFac
     }
 
     @Override
-    public StatusResponse taggedBad(String tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code) {
+    public StatusResponse taggedBad(Tag tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code) {
         return createResponse(StatusResponse.Type.BAD, tag, command, displayTextKey, code);
     }
 
     @Override
-    public StatusResponse taggedBad(String tag, ImapCommand command, HumanReadableText displayTextKey) {
+    public StatusResponse taggedBad(Tag tag, ImapCommand command, HumanReadableText displayTextKey) {
         return taggedBad(tag, command, displayTextKey, null);
     }
 
     @Override
-    public StatusResponse taggedNo(String tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code) {
+    public StatusResponse taggedNo(Tag tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code) {
         return createResponse(StatusResponse.Type.NO, tag, command, displayTextKey, code);
     }
 
     @Override
-    public StatusResponse taggedNo(String tag, ImapCommand command, HumanReadableText displayTextKey) {
+    public StatusResponse taggedNo(Tag tag, ImapCommand command, HumanReadableText displayTextKey) {
         return taggedNo(tag, command, displayTextKey, null);
     }
 
     @Override
-    public StatusResponse taggedOk(String tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code) {
+    public StatusResponse taggedOk(Tag tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code) {
         return createResponse(StatusResponse.Type.OK, tag, command, displayTextKey, code);
     }
 
     @Override
-    public StatusResponse taggedOk(String tag, ImapCommand command, HumanReadableText displayTextKey) {
+    public StatusResponse taggedOk(Tag tag, ImapCommand command, HumanReadableText displayTextKey) {
         return taggedOk(tag, command, displayTextKey, null);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
index af7772a..414a5d9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ESearchResponse.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.message.response;
 
 import java.util.List;
 
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.SearchResultOption;
@@ -32,13 +33,13 @@ public class ESearchResponse implements ImapResponseMessage {
     private final long maxUid;
     private final long count;
     private final IdRange[] all;
-    private final String tag;
+    private final Tag tag;
     private final boolean useUid;
     private final List<SearchResultOption> options;
     private final Long highestModSeq;
     private UidRange[] allUids;
 
-    public ESearchResponse(long minUid, long maxUid, long count, IdRange[] all, UidRange[] allUids, Long highestModSeq, String tag, boolean useUid, List<SearchResultOption> options) {
+    public ESearchResponse(long minUid, long maxUid, long count, IdRange[] all, UidRange[] allUids, Long highestModSeq, Tag tag, boolean useUid, List<SearchResultOption> options) {
         super();
         this.options = options;
         this.minUid = minUid;
@@ -71,7 +72,7 @@ public class ESearchResponse implements ImapResponseMessage {
         return allUids;
     }
     
-    public String getTag() {
+    public Tag getTag() {
         return tag;
     }
     
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java
index fcfbe29..e502348 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.response;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 
@@ -34,13 +35,13 @@ public class ImmutableStatusResponse implements StatusResponse {
 
     private final Type serverResponseType;
 
-    private final String tag;
+    private final Tag tag;
 
     private final HumanReadableText textKey;
 
     private final ImapCommand command;
 
-    public ImmutableStatusResponse(Type serverResponseType, String tag, ImapCommand command, HumanReadableText textKey, ResponseCode responseCode) {
+    public ImmutableStatusResponse(Type serverResponseType, Tag tag, ImapCommand command, HumanReadableText textKey, ResponseCode responseCode) {
         super();
         this.responseCode = responseCode;
         this.serverResponseType = serverResponseType;
@@ -60,7 +61,7 @@ public class ImmutableStatusResponse implements StatusResponse {
     }
 
     @Override
-    public String getTag() {
+    public Tag getTag() {
         return tag;
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/UnpooledStatusResponseFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/UnpooledStatusResponseFactory.java
index 6ef6a42..25e2566 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/UnpooledStatusResponseFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/UnpooledStatusResponseFactory.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.message.response;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
@@ -29,7 +30,7 @@ import org.apache.james.imap.api.message.response.StatusResponseFactory;
 public class UnpooledStatusResponseFactory extends AbstractStatusResponseFactory implements StatusResponseFactory {
 
     @Override
-    protected StatusResponse createResponse(Type type, String tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code) {
+    protected StatusResponse createResponse(Type type, Tag tag, ImapCommand command, HumanReadableText displayTextKey, ResponseCode code) {
         return new ImmutableStatusResponse(type, tag, command, displayTextKey, code);
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
index 459f9d9..58a430b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
@@ -22,6 +22,7 @@ import java.util.Optional;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -58,7 +59,7 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
         super(acceptableClass, next, mailboxManager, factory, metricFactory);
     }
 
-    protected void doAuth(AuthenticationAttempt authenticationAttempt, ImapSession session, String tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+    protected void doAuth(AuthenticationAttempt authenticationAttempt, ImapSession session, Tag tag, ImapCommand command, Responder responder, HumanReadableText failed) {
         Preconditions.checkArgument(!authenticationAttempt.isDelegation());
         try {
             boolean authFailure = false;
@@ -87,7 +88,7 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
         }
     }
 
-    protected void doAuthWithDelegation(AuthenticationAttempt authenticationAttempt, ImapSession session, String tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+    protected void doAuthWithDelegation(AuthenticationAttempt authenticationAttempt, ImapSession session, Tag tag, ImapCommand command, Responder responder, HumanReadableText failed) {
         Preconditions.checkArgument(authenticationAttempt.isDelegation());
         try {
             boolean authFailure = false;
@@ -138,7 +139,7 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
         }
     }
 
-    protected void manageFailureCount(ImapSession session, String tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+    protected void manageFailureCount(ImapSession session, Tag tag, ImapCommand command, Responder responder, HumanReadableText failed) {
         final Integer currentNumberOfFailures = (Integer) session.getAttribute(ATTRIBUTE_NUMBER_OF_FAILURES);
         final int failures;
         if (currentNumberOfFailures == null) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
index 435f67a..9134494 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractMailboxProcessor.java
@@ -31,6 +31,7 @@ import javax.mail.Flags;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
@@ -92,14 +93,14 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
 
     protected final void process(M message, Responder responder, ImapSession session) {
         ImapCommand command = message.getCommand();
-        String tag = message.getTag();
+        Tag tag = message.getTag();
 
         TimeMetric timeMetric = metricFactory.timer(IMAP_PREFIX + command.getName());
         doProcess(message, command, tag, responder, session);
         timeMetric.stopAndPublish();
     }
 
-    final void doProcess(M message, ImapCommand command, String tag, Responder responder, ImapSession session) {
+    final void doProcess(M message, ImapCommand command, Tag tag, Responder responder, ImapSession session) {
         try {
             if (!command.validForState(session.getState())) {
                 ImapResponseMessage response = factory.taggedNo(tag, command, HumanReadableText.INVALID_COMMAND);
@@ -333,27 +334,27 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
         responder.respond(response);
     }
 
-    protected void okComplete(ImapCommand command, String tag, ImapProcessor.Responder responder) {
+    protected void okComplete(ImapCommand command, Tag tag, ImapProcessor.Responder responder) {
         final StatusResponse response = factory.taggedOk(tag, command, HumanReadableText.COMPLETED);
         responder.respond(response);
     }
 
-    protected void okComplete(ImapCommand command, String tag, ResponseCode code, ImapProcessor.Responder responder) {
+    protected void okComplete(ImapCommand command, Tag tag, ResponseCode code, ImapProcessor.Responder responder) {
         final StatusResponse response = factory.taggedOk(tag, command, HumanReadableText.COMPLETED, code);
         responder.respond(response);
     }
 
-    protected void no(ImapCommand command, String tag, ImapProcessor.Responder responder, HumanReadableText displayTextKey) {
+    protected void no(ImapCommand command, Tag tag, ImapProcessor.Responder responder, HumanReadableText displayTextKey) {
         final StatusResponse response = factory.taggedNo(tag, command, displayTextKey);
         responder.respond(response);
     }
 
-    protected void no(ImapCommand command, String tag, ImapProcessor.Responder responder, HumanReadableText displayTextKey, StatusResponse.ResponseCode responseCode) {
+    protected void no(ImapCommand command, Tag tag, ImapProcessor.Responder responder, HumanReadableText displayTextKey, StatusResponse.ResponseCode responseCode) {
         final StatusResponse response = factory.taggedNo(tag, command, displayTextKey, responseCode);
         responder.respond(response);
     }
 
-    protected void taggedBad(ImapCommand command, String tag, ImapProcessor.Responder responder, HumanReadableText e) {
+    protected void taggedBad(ImapCommand command, Tag tag, ImapProcessor.Responder responder, HumanReadableText e) {
         StatusResponse response = factory.taggedBad(tag, command, e);
 
         responder.respond(response);
@@ -369,7 +370,7 @@ public abstract class AbstractMailboxProcessor<M extends ImapRequest> extends Ab
         responder.respond(response);
     }
 
-    protected abstract void doProcess(M message, ImapSession session, String tag, ImapCommand command, Responder responder);
+    protected abstract void doProcess(M message, ImapSession session, Tag tag, ImapCommand command, Responder responder);
 
     /**
      * Joins the elements of a mailboxPath together and returns them as a string
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 b3ec4d7..919999e 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
@@ -24,6 +24,7 @@ import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.response.StatusResponse;
@@ -61,7 +62,7 @@ public abstract class AbstractMessageRangeProcessor<M extends AbstractMessageRan
     protected abstract String getOperationName();
 
     @Override
-    protected void doProcess(M request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(M request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final MailboxPath targetMailbox = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
         final IdRange[] idSet = request.getIdSet();
         final boolean useUids = request.isUseUids();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
index 0f55716..af7d916 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSelectionProcessor.java
@@ -26,6 +26,7 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
@@ -77,7 +78,7 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
     }
 
     @Override
-    protected void doProcess(M request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(M request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final String mailboxName = request.getMailboxName();
         try {
             final MailboxPath fullMailboxPath = PathConverter.forSession(session).buildFullPath(mailboxName);
@@ -94,7 +95,7 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
         } 
     }
 
-    private void respond(String tag, ImapCommand command, ImapSession session, MailboxPath fullMailboxPath, AbstractMailboxSelectionRequest request, Responder responder) throws MailboxException, MessageRangeException {
+    private void respond(Tag tag, ImapCommand command, ImapSession session, MailboxPath fullMailboxPath, AbstractMailboxSelectionRequest request, Responder responder) throws MailboxException, MessageRangeException {
         
         Long lastKnownUidValidity = request.getLastKnownUidValidity();
         Long modSeq = request.getKnownModSeq();
@@ -331,7 +332,7 @@ abstract class AbstractSelectionProcessor<M extends AbstractMailboxSelectionRequ
         responder.respond(untaggedOk);
     }
 
-    private void taggedOk(Responder responder, String tag, ImapCommand command, MetaData metaData, HumanReadableText text) {
+    private void taggedOk(Responder responder, Tag tag, ImapCommand command, MetaData metaData, HumanReadableText text) {
         final boolean writeable = metaData.isWriteable() && !openReadOnly;
         final ResponseCode code;
         if (writeable) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSubscriptionProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSubscriptionProcessor.java
index cc53283..f105d33 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSubscriptionProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractSubscriptionProcessor.java
@@ -20,6 +20,7 @@ package org.apache.james.imap.processor;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -53,7 +54,7 @@ public abstract class AbstractSubscriptionProcessor<M extends ImapRequest> exten
     }
 
     @Override
-    protected final void doProcess(M message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected final void doProcess(M message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
 
         // take care of calling the start/end processing
         MailboxSession mSession = ImapSessionUtils.getMailboxSession(session);
@@ -71,6 +72,6 @@ public abstract class AbstractSubscriptionProcessor<M extends ImapRequest> exten
      * @param command
      * @param responder
      */
-    protected abstract void doProcessRequest(M message, ImapSession session, String tag, ImapCommand command, Responder responder);
+    protected abstract void doProcessRequest(M message, ImapSession session, Tag tag, ImapCommand command, Responder responder);
 
 }
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 31951fe..ccd6047 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
@@ -31,6 +31,7 @@ import javax.mail.Flags;
 import org.apache.commons.io.IOUtils;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.response.StatusResponse;
@@ -63,7 +64,7 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
     }
 
     @Override
-    protected void doProcess(AppendRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(AppendRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final String mailboxName = request.getMailboxName();
         final InputStream messageIn = request.getMessage();
         final Date datetime = request.getDatetime();
@@ -122,13 +123,13 @@ public class AppendProcessor extends AbstractMailboxProcessor<AppendRequest> {
      * @param e
      *            not null
      */
-    private void tryCreate(ImapSession session, String tag, ImapCommand command, Responder responder, MailboxNotFoundException e) {
+    private void tryCreate(ImapSession session, Tag tag, ImapCommand command, Responder responder, MailboxNotFoundException e) {
         LOGGER.debug("Cannot open mailbox: ", e);
 
         no(command, tag, responder, HumanReadableText.FAILURE_NO_SUCH_MAILBOX, StatusResponse.ResponseCode.tryCreate());
     }
 
-    private void appendToMailbox(InputStream message, Date datetime, Flags flagsToBeSet, ImapSession session, String tag, ImapCommand command, MessageManager mailbox, Responder responder, MailboxPath mailboxPath) {
+    private void appendToMailbox(InputStream message, Date datetime, Flags flagsToBeSet, ImapSession session, Tag tag, ImapCommand command, MessageManager mailbox, Responder responder, MailboxPath mailboxPath) {
         try {
             final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
             final SelectedMailbox selectedMailbox = session.getSelected();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
index 04cc360..2752674 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.StringTokenizer;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -55,7 +56,7 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
     }
 
     @Override
-    protected void doProcess(AuthenticateRequest request, ImapSession session, final String tag, final ImapCommand command, final Responder responder) {
+    protected void doProcess(AuthenticateRequest request, ImapSession session, final Tag tag, final ImapCommand command, final Responder responder) {
         final String authType = request.getAuthType();
         if (authType.equalsIgnoreCase(PLAIN)) {
             // See if AUTH=PLAIN is allowed. See IMAP-304
@@ -87,7 +88,7 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
     /**
      * Parse the initialClientResponse and do a PLAIN AUTH with it
      */
-    protected void doPlainAuth(String initialClientResponse, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doPlainAuth(String initialClientResponse, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         AuthenticationAttempt authenticationAttempt = parseDelegationAttempt(initialClientResponse);
         if (authenticationAttempt.isDelegation()) {
             doAuthWithDelegation(authenticationAttempt, session, tag, command, responder, HumanReadableText.AUTHENTICATION_FAILED);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java
index 1133ed3..5054009 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CapabilityProcessor.java
@@ -33,6 +33,7 @@ import java.util.Set;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConfiguration;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.api.process.ImapSession;
@@ -79,7 +80,7 @@ public class CapabilityProcessor extends AbstractMailboxProcessor<CapabilityRequ
     }
 
     @Override
-    protected void doProcess(CapabilityRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(CapabilityRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final CapabilityResponse result = new CapabilityResponse(getSupportedCapabilities(session));        
         responder.respond(result);
         unsolicitedResponses(session, responder, false);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java
index c0d3824..12089b6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CheckProcessor.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.processor;
 import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.api.process.ImapSession;
@@ -38,7 +39,7 @@ public class CheckProcessor extends AbstractMailboxProcessor<CheckRequest> {
     }
 
     @Override
-    protected void doProcess(CheckRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(CheckRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         unsolicitedResponses(session, responder, false);
         okComplete(command, tag, responder);
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
index 19fa829..07cb7d7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CloseProcessor.java
@@ -23,6 +23,7 @@ import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -48,7 +49,7 @@ public class CloseProcessor extends AbstractMailboxProcessor<CloseRequest> {
     }
 
     @Override
-    protected void doProcess(CloseRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(CloseRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         try {
             MessageManager mailbox = getSelectedMailbox(session);
             final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java
index a056bdd..6d77247 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/CreateProcessor.java
@@ -23,6 +23,7 @@ import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -48,7 +49,7 @@ public class CreateProcessor extends AbstractMailboxProcessor<CreateRequest> {
     }
 
     @Override
-    protected void doProcess(CreateRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(CreateRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final MailboxPath mailboxPath = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
         try {
             final MailboxManager mailboxManager = getMailboxManager();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java
index 9717219..04ff93e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteACLProcessor.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -60,7 +61,7 @@ public class DeleteACLProcessor extends AbstractMailboxProcessor<DeleteACLReques
     }
 
     @Override
-    protected void doProcess(DeleteACLRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(DeleteACLRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
 
         final MailboxManager mailboxManager = getMailboxManager();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java
index aeecfb5..a80c1ff 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/DeleteProcessor.java
@@ -23,6 +23,7 @@ import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -50,7 +51,7 @@ public class DeleteProcessor extends AbstractMailboxProcessor<DeleteRequest> {
     }
 
     @Override
-    protected void doProcess(DeleteRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(DeleteRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final MailboxPath mailboxPath = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
         try {
             final SelectedMailbox selected = session.getSelected();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java
index 0a25ac3..98c283c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/EnableProcessor.java
@@ -29,6 +29,7 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -68,7 +69,7 @@ public class EnableProcessor extends AbstractMailboxProcessor<EnableRequest> imp
 
 
     @Override
-    protected void doProcess(EnableRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(EnableRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         try {
 
             List<String> caps = request.getCapabilities();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
index a0ab2fa..1f1e6b7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ExpungeProcessor.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
@@ -61,7 +62,7 @@ public class ExpungeProcessor extends AbstractMailboxProcessor<ExpungeRequest> i
     }
 
     @Override
-    protected void doProcess(ExpungeRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(ExpungeRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         try {
             final MessageManager mailbox = getSelectedMailbox(session);
             final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
index 988b383..abdfeb7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -62,7 +63,7 @@ public class GetACLProcessor extends AbstractMailboxProcessor<GetACLRequest> imp
     }
 
     @Override
-    protected void doProcess(GetACLRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(GetACLRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
 
         final MailboxManager mailboxManager = getMailboxManager();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetAnnotationProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetAnnotationProcessor.java
index 85e71d7..dcd843d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetAnnotationProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetAnnotationProcessor.java
@@ -30,6 +30,7 @@ import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -68,7 +69,7 @@ public class GetAnnotationProcessor extends AbstractMailboxProcessor<GetAnnotati
     }
 
     @Override
-    protected void doProcess(GetAnnotationRequest message, ImapSession session, String tag, ImapCommand command,
+    protected void doProcess(GetAnnotationRequest message, ImapSession session, Tag tag, ImapCommand command,
                              Responder responder) {
         try {
             proceed(message, session, tag, command, responder);
@@ -81,7 +82,7 @@ public class GetAnnotationProcessor extends AbstractMailboxProcessor<GetAnnotati
         }
     }
 
-    private void proceed(GetAnnotationRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) throws MailboxException {
+    private void proceed(GetAnnotationRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) throws MailboxException {
         String mailboxName = message.getMailboxName();
         Optional<Integer> maxsize = message.getMaxsize();
         MailboxPath mailboxPath = PathConverter.forSession(session).buildFullPath(mailboxName);
@@ -92,7 +93,7 @@ public class GetAnnotationProcessor extends AbstractMailboxProcessor<GetAnnotati
         respond(tag, command, responder, mailboxName, mailboxAnnotations, maxsize, maximumOversizedSize);
     }
 
-    private void respond(String tag, ImapCommand command, Responder responder, String mailboxName,
+    private void respond(Tag tag, ImapCommand command, Responder responder, String mailboxName,
                          List<MailboxAnnotation> mailboxAnnotations, Optional<Integer> maxsize, Optional<Integer> maximumOversizedSize) {
         if (maximumOversizedSize.isPresent()) {
             responder.respond(new AnnotationResponse(mailboxName, filterItemsBySize(mailboxAnnotations, maxsize)));
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 463c507..2213deb 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
@@ -27,6 +27,7 @@ import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -70,7 +71,7 @@ public class GetQuotaProcessor extends AbstractMailboxProcessor<GetQuotaRequest>
     }
 
     @Override
-    protected void doProcess(GetQuotaRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(GetQuotaRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         try {
             QuotaRoot quotaRoot = quotaRootResolver.fromString(message.getQuotaRoot());
             if (hasRight(quotaRoot, session)) {
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 022b898..c7a2db2 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
@@ -27,6 +27,7 @@ import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -71,7 +72,7 @@ public class GetQuotaRootProcessor extends AbstractMailboxProcessor<GetQuotaRoot
     }
 
     @Override
-    protected void doProcess(GetQuotaRootRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(GetQuotaRootRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
         final MailboxManager mailboxManager = getMailboxManager();
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
index 6569fa1..a26dde5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/IdleProcessor.java
@@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConfiguration;
 import org.apache.james.imap.api.ImapSessionState;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -85,7 +86,7 @@ public class IdleProcessor extends AbstractMailboxProcessor<IdleRequest> impleme
     }
 
     @Override
-    protected void doProcess(IdleRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(IdleRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         SelectedMailbox sm = session.getSelected();
         Registration registration;
         if (sm != null) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
index a7a6115..6a138c7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/LSubProcessor.java
@@ -25,6 +25,7 @@ import java.util.Collection;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.display.ModifiedUtf7;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -53,7 +54,7 @@ public class LSubProcessor extends AbstractSubscriptionProcessor<LsubRequest> {
     }
 
     @Override
-    protected void doProcessRequest(LsubRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcessRequest(LsubRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         String referenceName = request.getBaseReferenceName();
         String mailboxPattern = request.getMailboxPattern();
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
index 11c933c..eb6ad4d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListProcessor.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.display.ModifiedUtf7;
 import org.apache.james.imap.api.message.response.ImapResponseMessage;
@@ -69,7 +70,7 @@ public class ListProcessor extends AbstractMailboxProcessor<ListRequest> {
      * reference is non-rooted or is an empty string.
      */
     @Override
-    protected void doProcess(ListRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(ListRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         String baseReferenceName = request.getBaseReferenceName();
         String mailboxPatternString = request.getMailboxPattern();
         MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java
index a0d56c5..f889fc9 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/ListRightsProcessor.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -61,7 +62,7 @@ public class ListRightsProcessor extends AbstractMailboxProcessor<ListRightsRequ
     }
 
     @Override
-    protected void doProcess(ListRightsRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(ListRightsRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
 
         final MailboxManager mailboxManager = getMailboxManager();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
index d36ef95..e7f960b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -48,7 +49,7 @@ public class LoginProcessor extends AbstractAuthProcessor<LoginRequest> implemen
     }
 
     @Override
-    protected void doProcess(LoginRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(LoginRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
             // check if the login is allowed with LOGIN command. See IMAP-304
             if (session.isPlainAuthDisallowed() && session.isTLSActive() == false) {
                 no(command, tag, responder, HumanReadableText.DISABLED_LOGIN);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java
index 46e3364..8fcc486 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/LogoutProcessor.java
@@ -23,6 +23,7 @@ import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -45,7 +46,7 @@ public class LogoutProcessor extends AbstractMailboxProcessor<LogoutRequest> {
     }
 
     @Override
-    protected void doProcess(LogoutRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(LogoutRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
         try {
             getMailboxManager().logout(mailboxSession, false);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
index f01a1a1..3eedf3b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/MyRightsProcessor.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -59,7 +60,7 @@ public class MyRightsProcessor extends AbstractMailboxProcessor<MyRightsRequest>
     }
 
     @Override
-    protected void doProcess(MyRightsRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(MyRightsRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
 
         final MailboxManager mailboxManager = getMailboxManager();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java
index cdccf3f..30cac09 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/NamespaceProcessor.java
@@ -29,6 +29,7 @@ import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.api.process.ImapSession;
@@ -52,7 +53,7 @@ public class NamespaceProcessor extends AbstractMailboxProcessor<NamespaceReques
     }
 
     @Override
-    protected void doProcess(NamespaceRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(NamespaceRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
         final List<NamespaceResponse.Namespace> personalNamespaces = buildPersonalNamespaces(mailboxSession, session);
         final List<NamespaceResponse.Namespace> otherUsersNamespaces = buildOtherUsersSpaces(mailboxSession, session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java
index 084ba89..ff8b404 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/NoopProcessor.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.processor;
 import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.api.process.ImapSession;
@@ -38,7 +39,7 @@ public class NoopProcessor extends AbstractMailboxProcessor<NoopRequest> {
     }
 
     @Override
-    protected void doProcess(NoopRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(NoopRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         // So, unsolicated responses are returned to check for new mail
         unsolicitedResponses(session, responder, false);
         okComplete(command, tag, responder);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
index e580d64..62c932c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/RenameProcessor.java
@@ -24,6 +24,7 @@ import java.io.Closeable;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -51,7 +52,7 @@ public class RenameProcessor extends AbstractMailboxProcessor<RenameRequest> {
     }
 
     @Override
-    protected void doProcess(RenameRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(RenameRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         PathConverter pathConverter = PathConverter.forSession(session);
         MailboxPath existingPath = pathConverter.buildFullPath(request.getExistingName());
         MailboxPath newPath = pathConverter.buildFullPath(request.getNewName());
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
index c01bd31..77a71ad 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SearchProcessor.java
@@ -32,6 +32,7 @@ import javax.mail.Flags.Flag;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
@@ -82,7 +83,7 @@ public class SearchProcessor extends AbstractMailboxProcessor<SearchRequest> imp
     }
 
     @Override
-    protected void doProcess(SearchRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(SearchRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final SearchOperation operation = request.getSearchOperation();
         final SearchKey searchKey = operation.getSearchKey();
         final boolean useUids = request.isUseUids();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
index 2ff8c9b..ec4bdd7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -61,7 +62,7 @@ public class SetACLProcessor extends AbstractMailboxProcessor<SetACLRequest> imp
     }
 
     @Override
-    protected void doProcess(SetACLRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(SetACLRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
 
         final MailboxManager mailboxManager = getMailboxManager();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetAnnotationProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetAnnotationProcessor.java
index c0787c4..1665e98 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetAnnotationProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetAnnotationProcessor.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -59,7 +60,7 @@ public class SetAnnotationProcessor extends AbstractMailboxProcessor<SetAnnotati
     }
 
     @Override
-    protected void doProcess(SetAnnotationRequest message, ImapSession session, String tag, ImapCommand command,
+    protected void doProcess(SetAnnotationRequest message, ImapSession session, Tag tag, ImapCommand command,
                              Responder responder) {
         final MailboxManager mailboxManager = getMailboxManager();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java
index b0a4dbc..a871919 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetQuotaProcessor.java
@@ -25,6 +25,7 @@ import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -51,7 +52,7 @@ public class SetQuotaProcessor extends AbstractMailboxProcessor<SetQuotaRequest>
     }
 
     @Override
-    protected void doProcess(SetQuotaRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(SetQuotaRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         Object[] params = new Object[]{
             "Full admin rights",
             command.getName(),
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 138c1d8..d761d57 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -23,6 +23,7 @@ import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.StatusDataItems;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -51,7 +52,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
     }
 
     @Override
-    protected void doProcess(StatusRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(StatusRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final MailboxPath mailboxPath = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
         final StatusDataItems statusDataItems = request.getStatusDataItems();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
index 9802293..1e09e48 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StoreProcessor.java
@@ -32,6 +32,7 @@ import javax.mail.Flags;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
@@ -75,7 +76,7 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
     }
 
     @Override
-    protected void doProcess(StoreRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(StoreRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final IdRange[] idSet = request.getIdSet();
         final boolean useUids = request.isUseUids();
         final long unchangedSince = request.getUnchangedSince();
@@ -163,10 +164,10 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
                         }
                         List<MessageRange> mRanges = MessageRange.toRanges(uids);
                         for (MessageRange mRange : mRanges) {
-                            setFlags(request, mailboxSession, mailbox, mRange, session, tag, imapCommand, responder);
+                            setFlags(request, mailboxSession, mailbox, mRange, session, responder);
                         }
                     } else {
-                        setFlags(request, mailboxSession, mailbox, messageSet, session, tag, imapCommand, responder);
+                        setFlags(request, mailboxSession, mailbox, messageSet, session, responder);
                     }
 
                 }
@@ -219,18 +220,8 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
     
     /**
      * Set the flags for given messages
-     * 
-     * @param request
-     * @param mailboxSession
-     * @param mailbox
-     * @param messageSet
-     * @param selected
-     * @param tag
-     * @param command
-     * @param responder
-     * @throws MailboxException
      */
-    private void setFlags(StoreRequest request, MailboxSession mailboxSession, MessageManager mailbox, MessageRange messageSet, ImapSession session, String tag, ImapCommand command, Responder responder) throws MailboxException {
+    private void setFlags(StoreRequest request, MailboxSession mailboxSession, MessageManager mailbox, MessageRange messageSet, ImapSession session, Responder responder) throws MailboxException {
         
         final Flags flags = request.getFlags();
         final boolean useUids = request.isUseUids();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java
index 8f875b5..7c53735 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/SubscribeProcessor.java
@@ -23,6 +23,7 @@ import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -46,7 +47,7 @@ public class SubscribeProcessor extends AbstractSubscriptionProcessor<SubscribeR
     }
 
     @Override
-    protected void doProcessRequest(SubscribeRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcessRequest(SubscribeRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final String mailboxName = request.getMailboxName();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
         try {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java
index ab861d2..19dd80e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/UnselectProcessor.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -48,7 +49,7 @@ public class UnselectProcessor extends AbstractMailboxProcessor<UnselectRequest>
     }
 
     @Override
-    protected void doProcess(UnselectRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(UnselectRequest message, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         if (session.getSelected() != null) {
             session.deselect();
             okComplete(command, tag, responder);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java
index 7c7c80f..853ff7f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/UnsubscribeProcessor.java
@@ -23,6 +23,7 @@ import java.io.Closeable;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -46,7 +47,7 @@ public class UnsubscribeProcessor extends AbstractSubscriptionProcessor<Unsubscr
     }
 
     @Override
-    protected void doProcessRequest(UnsubscribeRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcessRequest(UnsubscribeRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final String mailboxName = request.getMailboxName();
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
         try {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UnknownRequestProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UnknownRequestProcessor.java
index d327bdd..ba6a3f5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UnknownRequestProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/base/UnknownRequestProcessor.java
@@ -22,6 +22,7 @@ package org.apache.james.imap.processor.base;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConfiguration;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.request.ImapRequest;
 import org.apache.james.imap.api.message.response.ImapResponseMessage;
@@ -46,7 +47,7 @@ public class UnknownRequestProcessor implements ImapProcessor {
         final ImapResponseMessage result;
         if (message instanceof ImapRequest) {
             ImapRequest request = (ImapRequest) message;
-            final String tag = request.getTag();
+            final Tag tag = request.getTag();
             final ImapCommand command = request.getCommand();
             result = factory.taggedBad(tag, command, HumanReadableText.UNKNOWN_COMMAND);
         } else {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
index 0a32dc3..fa26006 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchProcessor.java
@@ -27,6 +27,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
@@ -64,7 +65,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
     }
 
     @Override
-    protected void doProcess(FetchRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
+    protected void doProcess(FetchRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
         final boolean useUids = request.isUseUids();
         final IdRange[] idSet = request.getIdSet();
         final FetchData fetch = request.getFetch();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/NoopRequest.java b/protocols/imap/src/test/java/org/apache/james/imap/ImapFixture.java
similarity index 83%
copy from protocols/imap/src/main/java/org/apache/james/imap/message/request/NoopRequest.java
copy to protocols/imap/src/test/java/org/apache/james/imap/ImapFixture.java
index d663bf3..e8db893 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/NoopRequest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/ImapFixture.java
@@ -16,13 +16,11 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.imap.message.request;
 
-import org.apache.james.imap.api.ImapCommand;
+package org.apache.james.imap;
 
-public class NoopRequest extends AbstractImapRequest {
+import org.apache.james.imap.api.Tag;
 
-    public NoopRequest(ImapCommand command, String tag) {
-        super(tag, command);
-    }
+public interface ImapFixture {
+    Tag TAG = new Tag("A1");
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnselectRequest.java b/protocols/imap/src/test/java/org/apache/james/imap/api/TagTest.java
similarity index 82%
copy from protocols/imap/src/main/java/org/apache/james/imap/message/request/UnselectRequest.java
copy to protocols/imap/src/test/java/org/apache/james/imap/api/TagTest.java
index bcac558..458e3ea 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/request/UnselectRequest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/api/TagTest.java
@@ -16,14 +16,17 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
-package org.apache.james.imap.message.request;
 
-import org.apache.james.imap.api.ImapCommand;
+package org.apache.james.imap.api;
 
-public class UnselectRequest extends AbstractImapRequest {
+import org.junit.jupiter.api.Test;
 
-    public UnselectRequest(String tag, ImapCommand command) {
-        super(tag, command);
-    }
+import nl.jqno.equalsverifier.EqualsVerifier;
 
-}
+class TagTest {
+    @Test
+    void shouldMatchBeanContract() {
+        EqualsVerifier.forClass(Tag.class)
+            .verify();
+    }
+}
\ No newline at end of file
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/api/message/response/AbstractStatusResponseFactoryTest.java b/protocols/imap/src/test/java/org/apache/james/imap/api/message/response/AbstractStatusResponseFactoryTest.java
index 22fd26c..b4395ed 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/api/message/response/AbstractStatusResponseFactoryTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/api/message/response/AbstractStatusResponseFactoryTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.api.message.response;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.imap.api.ImapCommand;
@@ -26,8 +27,6 @@ import org.apache.james.imap.api.display.HumanReadableText;
 import org.junit.jupiter.api.Test;
 
 public interface AbstractStatusResponseFactoryTest {
-
-    String TAG = "ATAG";
     HumanReadableText KEY = new HumanReadableText("KEY", "TEXT");
     StatusResponse.ResponseCode CODE = StatusResponse.ResponseCode.alert();
     ImapCommand COMMAND = ImapCommand.anyStateCommand("Command");
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java
index 79b08fd..5a87531 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CopyParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -41,8 +42,8 @@ public class CopyParserTest {
 
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
         ImapRequestStreamLineReader lineReader = new ImapRequestStreamLineReader(inputStream, null);
-        CopyRequest request = (CopyRequest) parser.decode(command, lineReader, "A003", null);
-        CopyRequest expected = new CopyRequest(command, new IdRange[] {new IdRange(42, 69)}, "foo", false, "A003");
+        CopyRequest request = (CopyRequest) parser.decode(command, lineReader, TAG, null);
+        CopyRequest expected = new CopyRequest(command, new IdRange[] {new IdRange(42, 69)}, "foo", false, TAG);
 
         assertThat(request).isEqualTo(expected);
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java
index 9305a89..526cf28 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/CreateCommandParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
@@ -43,7 +44,6 @@ import org.junit.Test;
 public class CreateCommandParserTest {
     private static final OutputStream outputStream = null;
     private static final ImapCommand command = ImapCommand.anyStateCommand("Command");
-    private static final String TAG = "A1";
 
     private ImapSession mockImapSession;
     private MailboxSession mailboxSession;
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java
index cc8a589..4f78aff 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/FetchCommandParserPartialFetchTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
 
@@ -27,6 +28,7 @@ import java.io.ByteArrayOutputStream;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
 import org.apache.james.imap.api.message.IdRange;
@@ -56,7 +58,7 @@ public class FetchCommandParserPartialFetchTest  {
         FetchData data = new FetchData();
         data.add(new BodyFetchElement("BODY[]", BodyFetchElement.CONTENT, null,
                 null, 0L, 100L), false);
-        check("1 (BODY[]<0.100>)\r\n", ranges, false, data, "A01");
+        check("1 (BODY[]<0.100>)\r\n", ranges, false, data, TAG);
     }
 
     @Test
@@ -65,7 +67,7 @@ public class FetchCommandParserPartialFetchTest  {
         FetchData data = new FetchData();
         data.add(new BodyFetchElement("BODY[]", BodyFetchElement.CONTENT, null,
                 null, 20L, 12342348L), false);
-        check("1 (BODY[]<20.12342348>)\r\n", ranges, false, data, "A01");
+        check("1 (BODY[]<20.12342348>)\r\n", ranges, false, data, TAG);
     }
 
     @Test
@@ -74,12 +76,12 @@ public class FetchCommandParserPartialFetchTest  {
                 new ByteArrayInputStream("1 (BODY[]<20.0>)\r\n"
                         .getBytes(StandardCharsets.US_ASCII)), new ByteArrayOutputStream());
 
-        assertThatThrownBy(() -> parser.decode(command, reader, "A01", false, session))
+        assertThatThrownBy(() -> parser.decode(command, reader, TAG, false, session))
             .isInstanceOf(DecodingException.class);
     }
 
     private void check(String input, IdRange[] idSet,
-            boolean useUids, FetchData data, String tag) throws Exception {
+            boolean useUids, FetchData data, Tag tag) throws Exception {
         ImapRequestLineReader reader = new ImapRequestStreamLineReader(
                 new ByteArrayInputStream(input.getBytes(StandardCharsets.US_ASCII)),
                 new ByteArrayOutputStream());
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetAnnotationCommandParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetAnnotationCommandParserTest.java
index e14b816..838bec4 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetAnnotationCommandParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetAnnotationCommandParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -37,9 +38,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 public class GetAnnotationCommandParserTest {
-
     private static final String INBOX = "anyInboxName";
-    private static final String TAG = "A1";
     private static final MailboxAnnotationKey PRIVATE_KEY = new MailboxAnnotationKey("/private/comment");
     private static final MailboxAnnotationKey SHARED_KEY = new MailboxAnnotationKey("/shared/comment");
     private static final ImapCommand command = ImapCommand.anyStateCommand("Command");
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaParserTest.java
index fb3bf35..9e6fff3 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -42,8 +43,8 @@ public class GetQuotaParserTest {
         String commandString = "quotaRoot \n";
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
         ImapRequestStreamLineReader lineReader = new ImapRequestStreamLineReader(inputStream, null);
-        GetQuotaRequest request = (GetQuotaRequest) parser.decode(command, lineReader, "A003", null);
-        GetQuotaRequest expected = new GetQuotaRequest("A003", command, "quotaRoot");
+        GetQuotaRequest request = (GetQuotaRequest) parser.decode(command, lineReader, TAG, null);
+        GetQuotaRequest expected = new GetQuotaRequest(TAG, command, "quotaRoot");
         assertThat(request.getQuotaRoot()).isEqualTo(expected.getQuotaRoot());
     }
 }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaRootParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaRootParserTest.java
index 56d2db0..6e82484 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaRootParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/GetQuotaRootParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -42,8 +43,8 @@ public class GetQuotaRootParserTest {
         String commandString = "INBOX\n";
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
         ImapRequestStreamLineReader lineReader = new ImapRequestStreamLineReader(inputStream, null);
-        GetQuotaRootRequest request = (GetQuotaRootRequest) parser.decode(command, lineReader, "A003", null);
-        GetQuotaRootRequest expected = new GetQuotaRootRequest("A003", command, "INBOX");
+        GetQuotaRootRequest request = (GetQuotaRootRequest) parser.decode(command, lineReader, TAG, null);
+        GetQuotaRootRequest expected = new GetQuotaRootRequest(TAG, command, "INBOX");
         assertThat(request.getMailboxName()).isEqualTo(expected.getMailboxName());
     }
 
@@ -54,8 +55,8 @@ public class GetQuotaRootParserTest {
         String commandString = "\"INBOX\" \n";
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
         ImapRequestStreamLineReader lineReader = new ImapRequestStreamLineReader(inputStream, null);
-        GetQuotaRootRequest request = (GetQuotaRootRequest) parser.decode(command, lineReader, "A003", null);
-        GetQuotaRootRequest expected = new GetQuotaRootRequest("A003", command, "INBOX");
+        GetQuotaRootRequest request = (GetQuotaRootRequest) parser.decode(command, lineReader, TAG, null);
+        GetQuotaRootRequest expected = new GetQuotaRootRequest(TAG, command, "INBOX");
         assertThat(request.getMailboxName()).isEqualTo(expected.getMailboxName());
     }
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/MoveParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/MoveParserTest.java
index 3157314..1cb617a 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/MoveParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/MoveParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -41,8 +42,8 @@ public class MoveParserTest {
 
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
         ImapRequestStreamLineReader lineReader = new ImapRequestStreamLineReader(inputStream, null);
-        MoveRequest request = (MoveRequest) parser.decode(command, lineReader, "A003", null);
-        MoveRequest expected = new MoveRequest(command, new IdRange[] {new IdRange(42, 69)}, "foo", false, "A003");
+        MoveRequest request = (MoveRequest) parser.decode(command, lineReader, TAG, null);
+        MoveRequest expected = new MoveRequest(command, new IdRange[] {new IdRange(42, 69)}, "foo", false, TAG);
 
         assertThat(request).isEqualTo(expected);
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserCharsetTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserCharsetTest.java
index 7255c28..4191aa2 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserCharsetTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserCharsetTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.same;
@@ -50,8 +51,6 @@ public class SearchCommandParserCharsetTest {
 
     private static final Charset ASCII = Charset.forName("US-ASCII");
 
-    private static final String TAG = "A1";
-
     private static final String ASCII_SEARCH_TERM = "A Search Term";
 
     private static final String NON_ASCII_SEARCH_TERM = "как Дела?";
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserQuotedCharsetTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserQuotedCharsetTest.java
index a819196..fe8f0f8 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserQuotedCharsetTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserQuotedCharsetTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Fail.fail;
 import static org.mockito.ArgumentMatchers.eq;
@@ -47,9 +48,6 @@ import org.junit.Before;
 import org.junit.Test;
 
 public class SearchCommandParserQuotedCharsetTest {
-
-    private static final String TAG = "A1";
-
     private static final String ASCII_SEARCH_TERM = "A Search Term";
 
     private static final String NON_ASCII_SEARCH_TERM = "как Дела?";
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java
index c6e6e7c..a79162a 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetAnnotationCommandParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -36,7 +37,6 @@ import org.junit.Test;
 public class SetAnnotationCommandParserTest {
 
     private static final String INBOX = "anyMailboxName";
-    private static final String TAG = "A1";
     private static final MailboxAnnotationKey PRIVATE_KEY = new MailboxAnnotationKey("/private/comment");
     private static final MailboxAnnotationKey SHARED_KEY = new MailboxAnnotationKey("/shared/comment");
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetQuotaCommandParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetQuotaCommandParserTest.java
index 2d2adaa..1be99d9 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetQuotaCommandParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SetQuotaCommandParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -43,7 +44,7 @@ public class SetQuotaCommandParserTest {
         String commandString = "quotaRoot (STORAGE 512) ( MESSAGE  1024  ) \n";
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
         ImapRequestStreamLineReader lineReader = new ImapRequestStreamLineReader(inputStream, null);
-        SetQuotaRequest request = (SetQuotaRequest) parser.decode(command, lineReader, "A003", null);
+        SetQuotaRequest request = (SetQuotaRequest) parser.decode(command, lineReader, TAG, null);
         assertThat(request.getQuotaRoot()).isEqualTo("quotaRoot");
         List<SetQuotaRequest.ResourceLimit> list = request.getResourceLimits();
         assertThat(list.get(0).getResource()).isEqualTo("STORAGE");
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/StoreCommandParserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/StoreCommandParserTest.java
index 5e07a19..a670c76 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/StoreCommandParserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/StoreCommandParserTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
@@ -29,6 +30,7 @@ import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -58,7 +60,7 @@ public class StoreCommandParserTest {
         flags.add(Flags.Flag.DRAFT);
         flags.add(Flags.Flag.FLAGGED);
         check("1 FLAGS.SILENT (\\Draft \\Flagged)\r\n", ranges, true, null,
-                flags, false, "A01");
+                flags, false, TAG);
     }
 
 
@@ -69,11 +71,11 @@ public class StoreCommandParserTest {
         flags.add(Flags.Flag.DRAFT);
         flags.add(Flags.Flag.FLAGGED);
         check("1 (UNCHANGEDSINCE 100) FLAGS.SILENT (\\Draft \\Flagged)\r\n", ranges, true, null,
-                flags, false, "A01");
+                flags, false, TAG);
     }
     
     private void check(String input, IdRange[] idSet, boolean silent,
-            final Boolean sign, Flags flags, boolean useUids, String tag)
+            final Boolean sign, Flags flags, boolean useUids, Tag tag)
             throws Exception {
         ImapRequestLineReader reader = new ImapRequestStreamLineReader(
                 new ByteArrayInputStream(input.getBytes(StandardCharsets.US_ASCII)),
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 1fa4868..d9714a8 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
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -32,6 +33,7 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.response.StatusResponse;
@@ -57,7 +59,6 @@ import org.junit.Test;
 import com.google.common.collect.Lists;
 
 public class CopyProcessorTest {
-    public static final String TAG = "TAG";
     private static final Username USERNAME = Username.of("username");
 
     private CopyProcessor testee;
@@ -98,7 +99,7 @@ public class CopyProcessorTest {
         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));
         StatusResponse okResponse = mock(StatusResponse.class);
-        when(mockStatusResponseFactory.taggedOk(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
+        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))));
 
         testee.process(copyRequest, mockResponder, mockImapSession);
@@ -132,7 +133,7 @@ public class CopyProcessorTest {
         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));
         StatusResponse okResponse = mock(StatusResponse.class);
-        when(mockStatusResponseFactory.taggedOk(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
+        when(mockStatusResponseFactory.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
 
         testee.process(copyRequest, mockResponder, mockImapSession);
 
@@ -163,7 +164,7 @@ public class CopyProcessorTest {
         when(mockMailboxManager.mailboxExists(inbox, mailboxSession)).thenReturn(false);
 
         StatusResponse noResponse = mock(StatusResponse.class);
-        when(mockStatusResponseFactory.taggedNo(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(noResponse);
+        when(mockStatusResponseFactory.taggedNo(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(noResponse);
 
         testee.process(copyRequest, mockResponder, mockImapSession);
 
@@ -190,7 +191,7 @@ public class CopyProcessorTest {
         when(mockMailboxManager.mailboxExists(inbox, mailboxSession)).thenThrow(new MailboxException());
 
         StatusResponse noResponse = mock(StatusResponse.class);
-        when(mockStatusResponseFactory.taggedNo(any(String.class), any(ImapCommand.class), any(HumanReadableText.class))).thenReturn(noResponse);
+        when(mockStatusResponseFactory.taggedNo(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class))).thenReturn(noResponse);
 
         testee.process(copyRequest, mockResponder, mockImapSession);
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
index 7c77c82..84c637e 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/DeleteACLProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -95,7 +96,7 @@ public class DeleteACLProcessorTest {
         when(mailboxManager.getMailbox(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(messageManager);
 
-        deleteACLRequest = new DeleteACLRequest("TAG",
+        deleteACLRequest = new DeleteACLRequest(TAG,
             ImapCommand.anyStateCommand("Name"),
             MAILBOX_NAME,
             USER_1);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
index b9241a0..381b18d 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -84,7 +85,7 @@ public class GetACLProcessorTest {
         metaData = mock(MetaData.class);
         responder = mock(Responder.class);
 
-        getACLRequest = new GetACLRequest("TAG", ImapCommand.anyStateCommand("Name"), MAILBOX_NAME);
+        getACLRequest = new GetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME);
 
         when(imapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
             .thenReturn(mailboxSession);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java
index df6821f..8e5e7e0 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetAnnotationProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
@@ -36,6 +37,7 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
@@ -64,7 +66,6 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
 public class GetAnnotationProcessorTest {
-    private static final String TAG = "TAG";
     private static final int FIRST_ELEMENT_INDEX = 0;
 
     private static final MailboxAnnotationKey PRIVATE_KEY = new MailboxAnnotationKey("/private/comment");
@@ -134,12 +135,12 @@ public class GetAnnotationProcessorTest {
     @Test
     public void processShouldResponseNoWithFailureWhenMailboxDoesNotExist() throws Exception {
         doThrow(MailboxNotFoundException.class).when(mockMailboxManager).getAllAnnotations(eq(inbox), eq(mailboxSession));
-        when(mockStatusResponseFactory.taggedNo(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(ResponseCode.class)))
+        when(mockStatusResponseFactory.taggedNo(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(ResponseCode.class)))
             .thenReturn(statusResponse);
 
         processor.process(annotationRequestBuilder.build(), mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedNo(any(String.class), any(ImapCommand.class), humanTextCaptor.capture(), captorResponsecode.capture());
+        verify(mockStatusResponseFactory, times(1)).taggedNo(any(Tag.class), any(ImapCommand.class), humanTextCaptor.capture(), captorResponsecode.capture());
         verify(mockResponder).respond(statusResponse);
         verifyNoMoreInteractions(mockResponder);
 
@@ -150,12 +151,12 @@ public class GetAnnotationProcessorTest {
     @Test
     public void processShouldResponseNoWithGenericFailureWhenManagerThrowMailboxException() throws Exception {
         doThrow(MailboxException.class).when(mockMailboxManager).getAllAnnotations(eq(inbox), eq(mailboxSession));
-        when(mockStatusResponseFactory.taggedNo(any(String.class), any(ImapCommand.class), any(HumanReadableText.class)))
+        when(mockStatusResponseFactory.taggedNo(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class)))
             .thenReturn(statusResponse);
 
         processor.process(annotationRequestBuilder.build(), mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedNo(any(String.class), any(ImapCommand.class), humanTextCaptor.capture());
+        verify(mockStatusResponseFactory, times(1)).taggedNo(any(Tag.class), any(ImapCommand.class), humanTextCaptor.capture());
         verify(mockResponder).respond(statusResponse);
         verifyNoMoreInteractions(mockResponder);
 
@@ -167,7 +168,7 @@ public class GetAnnotationProcessorTest {
         processor.process(annotationRequestBuilder.build(), mockResponder, mockImapSession);
 
         verify(mockMailboxManager, times(1)).getAllAnnotations(inbox, mailboxSession);
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class), any(ImapCommand.class), humanTextCaptor.capture());
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class), any(ImapCommand.class), humanTextCaptor.capture());
         verify(mockResponder, times(2)).respond(captorAnnotationResponse.capture());
 
         verifyNoMoreInteractions(mockResponder);
@@ -180,7 +181,7 @@ public class GetAnnotationProcessorTest {
         processor.process(annotationRequestBuilder.keys(keys).build(), mockResponder, mockImapSession);
 
         verify(mockMailboxManager, times(1)).getAnnotationsByKeys(eq(inbox), eq(mailboxSession), eq(keys));
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class), any(ImapCommand.class), humanTextCaptor.capture());
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class), any(ImapCommand.class), humanTextCaptor.capture());
         verify(mockResponder, times(2)).respond(captorAnnotationResponse.capture());
         verifyNoMoreInteractions(mockResponder);
 
@@ -193,7 +194,7 @@ public class GetAnnotationProcessorTest {
 
         processor.process(annotationRequestBuilder.maxsize(Optional.of(10)).build(), mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class),
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class),
                 any(ImapCommand.class),
                 humanTextCaptor.capture(),
                 captorResponsecode.capture());
@@ -210,7 +211,7 @@ public class GetAnnotationProcessorTest {
 
         processor.process(annotationRequestBuilder.maxsize(Optional.of(100)).build(), mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class),
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class),
                 any(ImapCommand.class),
                 humanTextCaptor.capture());
         verify(mockResponder, times(2)).respond(captorAnnotationResponse.capture());
@@ -225,7 +226,7 @@ public class GetAnnotationProcessorTest {
 
         processor.process(annotationRequestBuilder.maxsize(Optional.of(15)).build(), mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class),
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class),
             any(ImapCommand.class),
             humanTextCaptor.capture(),
             any(ResponseCode.class));
@@ -242,7 +243,7 @@ public class GetAnnotationProcessorTest {
 
         processor.process(annotationRequestBuilder.maxsize(Optional.of(100)).build(), mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class),
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class),
             any(ImapCommand.class),
             humanTextCaptor.capture());
         verify(mockResponder, times(2)).respond(captorAnnotationResponse.capture());
@@ -259,7 +260,7 @@ public class GetAnnotationProcessorTest {
         processor.process(annotationRequestBuilder.maxsize(Optional.of(14)).depth(Depth.ONE).keys(keys).build(), mockResponder, mockImapSession);
 
         verify(mockMailboxManager, times(1)).getAnnotationsByKeysWithOneDepth(eq(inbox), eq(mailboxSession), eq(keys));
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class),
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class),
             any(ImapCommand.class),
             humanTextCaptor.capture(),
             any(ResponseCode.class));
@@ -277,7 +278,7 @@ public class GetAnnotationProcessorTest {
         processor.process(annotationRequestBuilder.maxsize(Optional.of(15)).build(), mockResponder, mockImapSession);
 
         verify(mockMailboxManager, times(1)).getAllAnnotations(eq(inbox), eq(mailboxSession));
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class),
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class),
             any(ImapCommand.class),
             humanTextCaptor.capture());
 
@@ -295,7 +296,7 @@ public class GetAnnotationProcessorTest {
         processor.process(annotationRequestBuilder.maxsize(Optional.of(14)).depth(Depth.INFINITY).keys(keys).build(), mockResponder, mockImapSession);
 
         verify(mockMailboxManager, times(1)).getAnnotationsByKeysWithAllDepth(eq(inbox), eq(mailboxSession), eq(keys));
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class),
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class),
             any(ImapCommand.class),
             humanTextCaptor.capture(),
             any(ResponseCode.class));
@@ -313,7 +314,7 @@ public class GetAnnotationProcessorTest {
 
         processor.process(annotationRequestBuilder.depth(Depth.INFINITY).keys(keys).build(), mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class),
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class),
             any(ImapCommand.class),
             humanTextCaptor.capture());
         verify(mockResponder, times(2)).respond(captorAnnotationResponse.capture());
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 dfca8d0..3df2da8 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
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
@@ -90,7 +91,7 @@ public class GetQuotaProcessorTest {
 
     @Test
     public void processorShouldWorkOnValidRights() throws Exception {
-        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
+        GetQuotaRequest getQuotaRequest = new GetQuotaRequest(TAG, ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
@@ -120,7 +121,7 @@ public class GetQuotaProcessorTest {
 
     @Test
     public void processorShouldWorkOnExceptionThrown() throws Exception {
-        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
+        GetQuotaRequest getQuotaRequest = new GetQuotaRequest(TAG, ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
@@ -145,7 +146,7 @@ public class GetQuotaProcessorTest {
 
     @Test
     public void processorShouldWorkOnNoRights() throws Exception {
-        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
+        GetQuotaRequest getQuotaRequest = new GetQuotaRequest(TAG, ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
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 5c478e6..4510fa6 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
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.apache.james.imap.api.message.response.StatusResponse.Type.OK;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
@@ -90,7 +91,7 @@ public class GetQuotaRootProcessorTest {
 
     @Test
     public void processorShouldWorkOnValidRights() throws Exception {
-        GetQuotaRootRequest getQuotaRootRequest = new GetQuotaRootRequest("A004", ImapCommand.anyStateCommand("Name"), "INBOX");
+        GetQuotaRootRequest getQuotaRootRequest = new GetQuotaRootRequest(TAG, ImapCommand.anyStateCommand("Name"), "INBOX");
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY)).thenReturn(mailboxSession);
@@ -120,7 +121,7 @@ public class GetQuotaRootProcessorTest {
 
     @Test
     public void processorShouldWorkOnErrorThrown() throws Exception {
-        GetQuotaRootRequest getQuotaRootRequest = new GetQuotaRootRequest("A004", ImapCommand.anyStateCommand("Name"), "INBOX");
+        GetQuotaRootRequest getQuotaRootRequest = new GetQuotaRootRequest(TAG, ImapCommand.anyStateCommand("Name"), "INBOX");
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY)).thenReturn(mailboxSession);
@@ -141,7 +142,7 @@ public class GetQuotaRootProcessorTest {
 
     @Test
     public void processorShouldWorkOnNonValidRights() throws Exception {
-        GetQuotaRootRequest getQuotaRootRequest = new GetQuotaRootRequest("A004", ImapCommand.anyStateCommand("Name"), "INBOX");
+        GetQuotaRootRequest getQuotaRootRequest = new GetQuotaRootRequest(TAG, ImapCommand.anyStateCommand("Name"), "INBOX");
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY)).thenReturn(mailboxSession);
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
index acb122c..81bcc2d 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/LSubProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.same;
 import static org.mockito.Mockito.mock;
@@ -67,7 +68,6 @@ public class LSubProcessorTest {
 
     private static final String MAILBOX_A = "A.MAILBOX";
 
-    private static final String TAG = "TAG";
     public static final String USER = "test";
 
     LSubProcessor processor;
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
index cb1d3bb..375256a 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/ListRightsProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -98,7 +99,7 @@ public class ListRightsProcessorTest {
         when(mailboxManager.getMailbox(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(messageManager);
 
-        listRightsRequest = new ListRightsRequest("TAG", ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1);
+        listRightsRequest = new ListRightsRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1);
 
         user1Key = EntryKey.deserialize(USER_1);
         listRights = new Rfc4314Rights[] {Rfc4314Rights.fromSerializedRfc4314Rights("ae"), Rfc4314Rights.fromSerializedRfc4314Rights("i"), Rfc4314Rights.fromSerializedRfc4314Rights("k")};
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 b8bd59e..34f96a4 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
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
@@ -34,6 +35,7 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.response.StatusResponse;
@@ -60,7 +62,6 @@ import org.junit.Test;
 import com.google.common.collect.Lists;
 
 public class MoveProcessorTest {
-    public static final String TAG = "TAG";
     private static final Username USERNAME = Username.of("username");
 
     private MoveProcessor testee;
@@ -116,7 +117,7 @@ public class MoveProcessorTest {
         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));
         StatusResponse okResponse = mock(StatusResponse.class);
-        when(mockStatusResponseFactory.taggedOk(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
+        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))));
 
@@ -152,7 +153,7 @@ public class MoveProcessorTest {
         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));
         StatusResponse okResponse = mock(StatusResponse.class);
-        when(mockStatusResponseFactory.taggedOk(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
+        when(mockStatusResponseFactory.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(okResponse);
 
         testee.process(moveRequest, mockResponder, mockImapSession);
 
@@ -183,7 +184,7 @@ public class MoveProcessorTest {
         when(mockMailboxManager.mailboxExists(inbox, mailboxSession)).thenReturn(false);
 
         StatusResponse noResponse = mock(StatusResponse.class);
-        when(mockStatusResponseFactory.taggedNo(any(String.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(noResponse);
+        when(mockStatusResponseFactory.taggedNo(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class), any(StatusResponse.ResponseCode.class))).thenReturn(noResponse);
 
         testee.process(moveRequest, mockResponder, mockImapSession);
 
@@ -210,7 +211,7 @@ public class MoveProcessorTest {
         when(mockMailboxManager.mailboxExists(inbox, mailboxSession)).thenThrow(new MailboxException());
 
         StatusResponse noResponse = mock(StatusResponse.class);
-        when(mockStatusResponseFactory.taggedNo(any(String.class), any(ImapCommand.class), any(HumanReadableText.class))).thenReturn(noResponse);
+        when(mockStatusResponseFactory.taggedNo(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class))).thenReturn(noResponse);
 
         testee.process(moveRequest, mockResponder, mockImapSession);
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java
index 85bef10..06cfb79 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/NamespaceProcessorTest.java
@@ -18,8 +18,8 @@
  ****************************************************************/
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -34,6 +34,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -73,7 +74,7 @@ public class NamespaceProcessorTest {
         imapSessionStub = mock(ImapSession.class);
         mailboxSession = mock(MailboxSession.class);
      
-        namespaceRequest = new NamespaceRequest(ImapCommand.anyStateCommand("Name"), "TAG");
+        namespaceRequest = new NamespaceRequest(ImapCommand.anyStateCommand("Name"), TAG);
        
     }
 
@@ -89,7 +90,7 @@ public class NamespaceProcessorTest {
         when(mailboxSession.getPathDelimiter()).thenReturn(MailboxConstants.DEFAULT_DELIMITER);
 
         when(imapSessionStub.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
-        when(statusResponseStub.taggedOk(anyString(), any(ImapCommand.class), any(HumanReadableText.class)))
+        when(statusResponseStub.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class)))
             .thenReturn(mock(StatusResponse.class));
 
         final NamespaceResponse response = buildResponse(null);
@@ -114,7 +115,7 @@ public class NamespaceProcessorTest {
         when(mailboxSession.getPathDelimiter()).thenReturn(MailboxConstants.DEFAULT_DELIMITER);
 
         when(imapSessionStub.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
-        when(statusResponseStub.taggedOk(anyString(), any(ImapCommand.class), any(HumanReadableText.class)))
+        when(statusResponseStub.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class)))
             .thenReturn(mock(StatusResponse.class));
         
         final List<NamespaceResponse.Namespace> sharedSpaces = new ArrayList<>();
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
index a6c34e8..e0b8cc0 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SearchProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.ArgumentMatchers.same;
 import static org.mockito.Mockito.mock;
@@ -87,8 +88,6 @@ public class SearchProcessorTest {
 
     private static final long[] EMPTY = {};
 
-    private static final String TAG = "TAG";
-
     private static final String ADDRESS = "John Smith <jo...@example.org>";
 
     private static final String SUBJECT = "Myriad Harbour";
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
index 2c89007..25e2b79 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -100,7 +101,7 @@ public class SetACLProcessorTest {
         when(mailboxManager.getMailbox(any(MailboxPath.class), any(MailboxSession.class)))
             .thenReturn(messageManager);
 
-        replaceAclRequest = new SetACLRequest("TAG", ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, SET_RIGHTS);
+        replaceAclRequest = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, SET_RIGHTS);
 
         user1Key = EntryKey.deserialize(USER_1);
         setRights = Rfc4314Rights.fromSerializedRfc4314Rights(SET_RIGHTS);
@@ -108,7 +109,7 @@ public class SetACLProcessorTest {
     
     @Test
     public void testUnsupportedRight() throws Exception {
-        SetACLRequest setACLRequest = new SetACLRequest("TAG", ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, UNSUPPORTED_RIGHT);
+        SetACLRequest setACLRequest = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, UNSUPPORTED_RIGHT);
 
         when(mailboxManager.hasRight(path, MailboxACL.Right.Lookup, mailboxSession))
             .thenReturn(false);
@@ -180,7 +181,7 @@ public class SetACLProcessorTest {
             .thenReturn(true);
 
 
-        SetACLRequest r = new SetACLRequest("TAG", ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, prefix + SET_RIGHTS);
+        SetACLRequest r = new SetACLRequest(TAG, ImapCommand.anyStateCommand("Name"), MAILBOX_NAME, USER_1, prefix + SET_RIGHTS);
         subject.doProcess(r, responder, imapSession);
 
         verify(mailboxManager).applyRightsCommand(path,
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
index d7afcfd..63b1bb6 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetAnnotationProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
@@ -34,6 +35,7 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.Tag;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
@@ -61,8 +63,6 @@ import org.mockito.MockitoAnnotations;
 import com.google.common.collect.ImmutableList;
 
 public class SetAnnotationProcessorTest {
-
-    private static final String TAG = "TAG";
     private static final int FIRST_ELEMENT_INDEX = 0;
 
     @InjectMocks
@@ -125,7 +125,7 @@ public class SetAnnotationProcessorTest {
 
         processor.process(request, mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedNo(any(String.class), any(ImapCommand.class),
+        verify(mockStatusResponseFactory, times(1)).taggedNo(any(Tag.class), any(ImapCommand.class),
                 humanTextCaptor.capture(), any(StatusResponse.ResponseCode.class));
 
         assertThat(humanTextCaptor.getAllValues()).containsOnly(HumanReadableText.FAILURE_NO_SUCH_MAILBOX);
@@ -137,21 +137,21 @@ public class SetAnnotationProcessorTest {
 
         processor.process(request, mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedNo(any(String.class), any(ImapCommand.class), humanTextCaptor.capture());
+        verify(mockStatusResponseFactory, times(1)).taggedNo(any(Tag.class), any(ImapCommand.class), humanTextCaptor.capture());
 
         assertThat(humanTextCaptor.getAllValues()).containsOnly(HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
     }
 
     @Test
     public void processShouldWorkWithCompleteResponse() throws Exception {
-        when(mockStatusResponseFactory.taggedOk(any(String.class), any(ImapCommand.class), any(HumanReadableText.class)))
+        when(mockStatusResponseFactory.taggedOk(any(Tag.class), any(ImapCommand.class), any(HumanReadableText.class)))
             .thenReturn(okResponse);
 
         processor.process(request, mockResponder, mockImapSession);
 
         verify(mockMailboxManager).updateAnnotations(inbox, mockMailboxSession, mailboxAnnotations);
         verify(mockResponder).respond(okResponse);
-        verify(mockStatusResponseFactory, times(1)).taggedOk(any(String.class), any(ImapCommand.class), humanTextCaptor.capture());
+        verify(mockStatusResponseFactory, times(1)).taggedOk(any(Tag.class), any(ImapCommand.class), humanTextCaptor.capture());
 
         assertThat(humanTextCaptor.getAllValues()).containsOnly(HumanReadableText.COMPLETED);
     }
@@ -162,7 +162,7 @@ public class SetAnnotationProcessorTest {
 
         processor.process(request, mockResponder, mockImapSession);
 
-        verify(mockStatusResponseFactory, times(1)).taggedNo(any(String.class), any(ImapCommand.class), humanTextCaptor.capture());
+        verify(mockStatusResponseFactory, times(1)).taggedNo(any(Tag.class), any(ImapCommand.class), humanTextCaptor.capture());
 
         assertThat(humanTextCaptor.getAllValues().get(FIRST_ELEMENT_INDEX).getKey()).isEqualTo(HumanReadableText.MAILBOX_ANNOTATION_KEY);
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java
index b03bbfd..62b80c5 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetQuotaProcessorTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.imap.processor;
 
+import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
@@ -61,7 +62,7 @@ public class SetQuotaProcessorTest {
 
     @Test
     public void processorShouldWorkOnNoRights() {
-        SetQuotaRequest setQuotaRequest = new SetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), "quotaRoot");
+        SetQuotaRequest setQuotaRequest = new SetQuotaRequest(TAG, ImapCommand.anyStateCommand("Name"), "quotaRoot");
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))


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


[james-project] 29/32: [Refactoring] JAMES-2950 Move UsernameTest 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 47ed14103f487e5da07ddc0a63c711aa43b84be9
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Oct 31 15:28:10 2019 +0700

    [Refactoring] JAMES-2950 Move UsernameTest to JUnit 5
---
 .../java/org/apache/james/core/UsernameTest.java   | 73 +++++++++++-----------
 1 file changed, 36 insertions(+), 37 deletions(-)

diff --git a/core/src/test/java/org/apache/james/core/UsernameTest.java b/core/src/test/java/org/apache/james/core/UsernameTest.java
index 9a8a3a2..8fe63d1 100644
--- a/core/src/test/java/org/apache/james/core/UsernameTest.java
+++ b/core/src/test/java/org/apache/james/core/UsernameTest.java
@@ -25,220 +25,219 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import java.util.Optional;
 
 import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.Test;
 
-import org.junit.Test;
-
-public class UsernameTest {
+class UsernameTest {
 
     @Test
-    public void fromShouldThrowOnEmptyLocalPart() {
+    void fromShouldThrowOnEmptyLocalPart() {
         assertThatThrownBy(() -> Username.from("", Optional.empty()))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromShouldThrowOnNullDomainPart() {
+    void fromShouldThrowOnNullDomainPart() {
         assertThatThrownBy(() -> Username.from(null, Optional.empty()))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
-    public void fromShouldThrowOnLocalPartWithDomainDelimiter() {
+    void fromShouldThrowOnLocalPartWithDomainDelimiter() {
         assertThatThrownBy(() -> Username.from("aa@bb", Optional.empty()))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromShouldThrowOnEmptyDomain() {
+    void fromShouldThrowOnEmptyDomain() {
         assertThatThrownBy(() -> Username.from("aa", Optional.of("")))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromShouldThrowWhenDomainContainsDomainDelimiter() {
+    void fromShouldThrowWhenDomainContainsDomainDelimiter() {
         assertThatThrownBy(() -> Username.from("aa", Optional.of("bb@cc")))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromLocalPartWithDomainStringVersionShouldThrowOnNullLocalPart() {
+    void fromLocalPartWithDomainStringVersionShouldThrowOnNullLocalPart() {
         assertThatThrownBy(() -> Username.fromLocalPartWithDomain(null, "domain"))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
-    public void fromLocalPartWithDomainStringVersionShouldThrowOnEmptyLocalPart() {
+    void fromLocalPartWithDomainStringVersionShouldThrowOnEmptyLocalPart() {
         assertThatThrownBy(() -> Username.fromLocalPartWithDomain("", "domain"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromLocalPartWithDomainStringVersionShouldThrowOnLocalPartThatContainsDomainDelimiter() {
+    void fromLocalPartWithDomainStringVersionShouldThrowOnLocalPartThatContainsDomainDelimiter() {
         assertThatThrownBy(() -> Username.fromLocalPartWithDomain("aa@bb", "domain"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromLocalPartWithDomainStringVersionShouldThrowOnNullDomainPart() {
+    void fromLocalPartWithDomainStringVersionShouldThrowOnNullDomainPart() {
         String domain = null;
         assertThatThrownBy(() -> Username.fromLocalPartWithDomain("local", domain))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
-    public void fromLocalPartWithDomainStringVersionShouldThrowOnEmptyDomainPart() {
+    void fromLocalPartWithDomainStringVersionShouldThrowOnEmptyDomainPart() {
         assertThatThrownBy(() -> Username.fromLocalPartWithDomain("local", ""))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromLocalPartWithDomainStringVersionShouldThrowOnDomainPartThatContainsDomainDelimiter() {
+    void fromLocalPartWithDomainStringVersionShouldThrowOnDomainPartThatContainsDomainDelimiter() {
         assertThatThrownBy(() -> Username.fromLocalPartWithDomain("local", "aa@bb"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromLocalPartWithoutDomainShouldThrowOnEmpty() {
+    void fromLocalPartWithoutDomainShouldThrowOnEmpty() {
         assertThatThrownBy(() -> Username.fromLocalPartWithoutDomain(""))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromLocalPartWithoutDomainShouldThrowOnNull() {
+    void fromLocalPartWithoutDomainShouldThrowOnNull() {
         assertThatThrownBy(() -> Username.fromLocalPartWithoutDomain(null))
             .isInstanceOf(NullPointerException.class);
     }
 
     @Test
-    public void fromLocalPartWithoutDomainShouldThrowOnUsernameThatContainsDomainDelimiter() {
+    void fromLocalPartWithoutDomainShouldThrowOnUsernameThatContainsDomainDelimiter() {
         assertThatThrownBy(() -> Username.fromLocalPartWithoutDomain("aa@bb"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromUsernameShouldThrowOnNull() {
+    void fromUsernameShouldThrowOnNull() {
         assertThatThrownBy(() -> Username.of(null))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromUsernameShouldThrowOnEmpty() {
+    void fromUsernameShouldThrowOnEmpty() {
         assertThatThrownBy(() -> Username.of(""))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromUsernameShouldAllow255LongUsername() {
+    void fromUsernameShouldAllow255LongUsername() {
         String tail = "@a";
         assertThat(Username.of(StringUtils.repeat('j', 255 - tail.length()) + tail).asString())
             .hasSize(255);
     }
 
     @Test
-    public void fromUsernameShouldThrowWhenTooLong() {
+    void fromUsernameShouldThrowWhenTooLong() {
         String tail = "@a";
         assertThatThrownBy(() -> Username.of(StringUtils.repeat('j', 255 - tail.length() + 1) + tail))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromUsernameShouldThrowWhenMultipleDomainDelimiter() {
+    void fromUsernameShouldThrowWhenMultipleDomainDelimiter() {
         assertThatThrownBy(() -> Username.of("aa@aa@aa"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromUsernameShouldThrowWhenEndsWithDomainDelimiter() {
+    void fromUsernameShouldThrowWhenEndsWithDomainDelimiter() {
         assertThatThrownBy(() -> Username.of("aa@"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromUsernameShouldThrowWhenStartsWithDomainDelimiter() {
+    void fromUsernameShouldThrowWhenStartsWithDomainDelimiter() {
         assertThatThrownBy(() -> Username.of("@aa"))
             .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void fromUsernameShouldParseUsernameWithDomain() {
+    void fromUsernameShouldParseUsernameWithDomain() {
         assertThat(Username.of("aa@bb"))
             .isEqualTo(Username.from("aa", Optional.of("bb")));
     }
 
     @Test
-    public void fromUsernameShouldParseUsernameWithoutDomain() {
+    void fromUsernameShouldParseUsernameWithoutDomain() {
         assertThat(Username.of("aa"))
             .isEqualTo(Username.from("aa", Optional.empty()));
     }
 
     @Test
-    public void fromLocalPartWithDomainShouldReturnAValidUser() {
+    void fromLocalPartWithDomainShouldReturnAValidUser() {
         assertThat(Username.fromLocalPartWithDomain("aa", "bb"))
             .isEqualTo(Username.from("aa", Optional.of("bb")));
     }
 
     @Test
-    public void fromLocalPartWithoutDomainShouldReturnAValidUser() {
+    void fromLocalPartWithoutDomainShouldReturnAValidUser() {
         assertThat(Username.fromLocalPartWithoutDomain("aa"))
             .isEqualTo(Username.from("aa", Optional.empty()));
     }
 
     @Test
-    public void hasDomainPartShouldReturnFalseWhenNoDomain() {
+    void hasDomainPartShouldReturnFalseWhenNoDomain() {
         assertThat(Username.fromLocalPartWithoutDomain("aa").hasDomainPart())
             .isFalse();
     }
 
     @Test
-    public void hasDomainPartShouldReturnTrueWhenHasADomain() {
+    void hasDomainPartShouldReturnTrueWhenHasADomain() {
         assertThat(Username.fromLocalPartWithDomain("aa", "domain").hasDomainPart())
             .isTrue();
     }
 
     @Test
-    public void withDefaultDomainShouldAppendDefaultDomainWhenNone() {
+    void withDefaultDomainShouldAppendDefaultDomainWhenNone() {
         assertThat(Username.of("user")
             .withDefaultDomain(Domain.LOCALHOST))
             .isEqualTo(Username.fromLocalPartWithDomain("user", Domain.LOCALHOST));
     }
 
     @Test
-    public void withDefaultDomainShouldNotAppendDefaultDomainWhenDomainIsPresent() {
+    void withDefaultDomainShouldNotAppendDefaultDomainWhenDomainIsPresent() {
         assertThat(Username.of("user@domain")
             .withDefaultDomain(Domain.LOCALHOST))
             .isEqualTo(Username.of("user@domain"));
     }
 
     @Test
-    public void withDefaultDomainShouldNotThrowUponEmptyDomain() {
+    void withDefaultDomainShouldNotThrowUponEmptyDomain() {
         assertThat(Username.of("user")
             .withDefaultDomain(Optional.empty()))
             .isEqualTo(Username.of("user"));
     }
 
     @Test
-    public void withDefaultDomainShouldNotThrowUponEmptyDomainWhenUsersHadADomain() {
+    void withDefaultDomainShouldNotThrowUponEmptyDomainWhenUsersHadADomain() {
         assertThat(Username.of("user@domain")
             .withDefaultDomain(Optional.empty()))
             .isEqualTo(Username.of("user@domain"));
     }
 
     @Test
-    public void withDefaultDomainFromUserShouldPreserveUserWhenAlreadyHasADomain() {
+    void withDefaultDomainFromUserShouldPreserveUserWhenAlreadyHasADomain() {
         assertThat(Username.of("user@domain")
             .withDefaultDomainFromUser(Username.of("bob@tld")))
             .isEqualTo(Username.of("user@domain"));
     }
 
     @Test
-    public void withDefaultDomainFromUserShouldAppendOtherUserDomainWhenNone() {
+    void withDefaultDomainFromUserShouldAppendOtherUserDomainWhenNone() {
         assertThat(Username.of("user")
             .withDefaultDomainFromUser(Username.of("bob@tld")))
             .isEqualTo(Username.of("user@tld"));
     }
 
     @Test
-    public void withDefaultDomainFromUserShouldNotThrowUponNoDomain() {
+    void withDefaultDomainFromUserShouldNotThrowUponNoDomain() {
         assertThat(Username.of("user")
             .withDefaultDomainFromUser(Username.of("bob")))
             .isEqualTo(Username.of("user"));


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


[james-project] 08/32: [Refactoring] StatusProcessor: Extract metadata retrieval

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 db0248d927bf56997a095d3a16fb7a54079ea1e3
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:30:22 2019 +0700

    [Refactoring] StatusProcessor: Extract metadata retrieval
---
 .../java/org/apache/james/imap/processor/StatusProcessor.java  | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 00cddea..0486f36 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -60,9 +60,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         try {
             LOGGER.debug("Status called on mailbox named {}", mailboxPath);
 
-            MessageManager mailbox = getMailboxManager().getMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
-            MessageManager.MetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
-            MessageManager.MetaData metaData = mailbox.getMetaData(false, mailboxSession, fetchGroup);
+            MessageManager.MetaData metaData = retrieveMetadata(mailboxPath, statusDataItems, mailboxSession);
             MailboxStatusResponse response = computeStatusResponse(request, statusDataItems, metaData);
 
             // Enable CONDSTORE as this is a CONDSTORE enabling command
@@ -78,6 +76,12 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
+    private MessageManager.MetaData retrieveMetadata(MailboxPath mailboxPath, StatusDataItems statusDataItems, MailboxSession mailboxSession) throws MailboxException {
+        MessageManager mailbox = getMailboxManager().getMailbox(mailboxPath, mailboxSession);
+        MessageManager.MetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
+        return mailbox.getMetaData(false, mailboxSession, fetchGroup);
+    }
+
     private MailboxStatusResponse computeStatusResponse(StatusRequest request, StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         Long messages = messages(statusDataItems, metaData);
         Long recent = recent(statusDataItems, metaData);


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


[james-project] 14/32: [Refactoring] StatusCommandParser: char validator can be a constant

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 70696f752aa7e71497f75a10e70dec1839404f9e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:58:13 2019 +0700

    [Refactoring] StatusCommandParser: char validator can be a constant
---
 .../org/apache/james/imap/decode/parser/StatusCommandParser.java  | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
index 03262f4..660256d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
@@ -29,7 +29,6 @@ import org.apache.james.imap.api.message.StatusDataItems;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
-import org.apache.james.imap.decode.ImapRequestLineReader.CharacterValidator;
 import org.apache.james.imap.decode.base.AbstractImapCommandParser;
 import org.apache.james.imap.message.request.StatusRequest;
 
@@ -41,6 +40,8 @@ import com.google.common.collect.ImmutableList;
  * Parse STATUS commands
  */
 public class StatusCommandParser extends AbstractImapCommandParser {
+    private static final ImapRequestLineReader.NoopCharValidator NOOP_CHAR_VALIDATOR = new ImapRequestLineReader.NoopCharValidator();
+
     public StatusCommandParser() {
         super(ImapCommand.authenticatedStateCommand(ImapConstants.STATUS_COMMAND_NAME));
     }
@@ -68,12 +69,11 @@ public class StatusCommandParser extends AbstractImapCommandParser {
 
         request.nextWordChar();
         request.consumeChar('(');
-        CharacterValidator validator = new ImapRequestLineReader.NoopCharValidator();
-        String nextWord = request.consumeWord(validator);
+        String nextWord = request.consumeWord(NOOP_CHAR_VALIDATOR);
 
         while (!nextWord.endsWith(")")) {
             words.add(nextWord);
-            nextWord = request.consumeWord(validator);
+            nextWord = request.consumeWord(NOOP_CHAR_VALIDATOR);
         }
         // Got the closing ")", may be attached to a word.
         if (nextWord.length() > 1) {


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


[james-project] 12/32: [Refactoring] StatusCommandParser: uncorrelate word splitting from item parsing

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

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

commit 4bbc17082706262249025d81fe4b536a7f16114c
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:55:17 2019 +0700

    [Refactoring] StatusCommandParser: uncorrelate word splitting from item parsing
---
 .../imap/decode/parser/StatusCommandParser.java    | 23 +++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
index c319e98..88bebe0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
@@ -33,6 +33,10 @@ import org.apache.james.imap.decode.ImapRequestLineReader.CharacterValidator;
 import org.apache.james.imap.decode.base.AbstractImapCommandParser;
 import org.apache.james.imap.message.request.StatusRequest;
 
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.ImmutableList;
+
 /**
  * Parse STATUS commands
  */
@@ -42,7 +46,17 @@ public class StatusCommandParser extends AbstractImapCommandParser {
     }
 
     private StatusDataItems statusDataItems(ImapRequestLineReader request) throws DecodingException {
-        EnumSet<StatusDataItems.StatusItem> items = EnumSet.noneOf(StatusDataItems.StatusItem.class);
+        ImmutableList<String> words = splitWords(request);
+
+        EnumSet<StatusDataItems.StatusItem> items = EnumSet.copyOf(words.stream()
+            .map(Throwing.function(this::parseStatus).sneakyThrow())
+            .collect(Guavate.toImmutableList()));
+
+        return new StatusDataItems(items);
+    }
+
+    private ImmutableList<String> splitWords(ImapRequestLineReader request) throws DecodingException {
+        ImmutableList.Builder<String> words = ImmutableList.builder();
 
         request.nextWordChar();
         request.consumeChar('(');
@@ -50,15 +64,14 @@ public class StatusCommandParser extends AbstractImapCommandParser {
         String nextWord = request.consumeWord(validator);
 
         while (!nextWord.endsWith(")")) {
-            items.add(parseStatus(nextWord));
+            words.add(nextWord);
             nextWord = request.consumeWord(validator);
         }
         // Got the closing ")", may be attached to a word.
         if (nextWord.length() > 1) {
-            items.add(parseStatus(nextWord.substring(0, nextWord.length() - 1)));
+            words.add(nextWord.substring(0, nextWord.length() - 1));
         }
-
-        return new StatusDataItems(items);
+        return words.build();
     }
 
     private StatusDataItems.StatusItem parseStatus(String nextWord) throws DecodingException {


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


[james-project] 04/32: [Refactoring] StatusProcessor: Remove never thrown exceptions

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 6cc7b1889ce0a0def46879718f963b247f35d21c
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:20:54 2019 +0700

    [Refactoring] StatusProcessor: Remove never thrown exceptions
---
 .../org/apache/james/imap/processor/StatusProcessor.java     | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 5dd0ab4..1642103 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -92,7 +92,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private Long unseen(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
+    private Long unseen(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isUnseen()) {
             return metaData.getUnseenCount();
         } else {
@@ -100,7 +100,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private Long uidValidity(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
+    private Long uidValidity(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isUidValidity()) {
             return metaData.getUidValidity();
         } else {
@@ -109,7 +109,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
     }
 
 
-    private Long highestModSeq(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
+    private Long highestModSeq(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isHighestModSeq()) {
             return metaData.getHighestModSeq();
         } else {
@@ -118,7 +118,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
     }
 
     
-    private MessageUid uidNext(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
+    private MessageUid uidNext(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isUidNext()) {
             return metaData.getUidNext();
         } else {
@@ -126,7 +126,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private Long recent(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
+    private Long recent(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isRecent()) {
             return metaData.countRecent();
         } else {
@@ -134,7 +134,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-    private Long messages(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
+    private Long messages(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isMessages()) {
            return metaData.getMessageCount();
         } else {


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


[james-project] 17/32: MAILBOX-391 DefaultMailboxBackup omitted namespace when querying user mailboxes

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 623bdb98bb1990260b45b99f432fb4bdacc6095a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 11 16:09:50 2019 +0700

    MAILBOX-391 DefaultMailboxBackup omitted namespace when querying user mailboxes
---
 .../main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
index 6dd74ef..8a5cf6d 100644
--- a/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
+++ b/mailbox/backup/src/main/java/org/apache/james/mailbox/backup/DefaultMailboxBackup.java
@@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory;
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
+
 import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
 
@@ -138,6 +139,7 @@ public class DefaultMailboxBackup implements MailboxBackup {
     @VisibleForTesting
     List<MailAccountContent> getAccountContentForUser(MailboxSession session) throws MailboxException {
         MailboxQuery queryUser = MailboxQuery.builder()
+            .privateNamespace()
             .user(session.getUser())
             .build();
         Stream<MailboxPath> paths = mailboxManager.search(queryUser, session)


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


[james-project] 16/32: MAILBOX-391 MailboxQuery constructor is actually 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 8531c0ada3550d5119b4d20f1ebc8056be5ee6df
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 11 16:08:32 2019 +0700

    MAILBOX-391 MailboxQuery constructor is actually private
---
 .../main/java/org/apache/james/mailbox/model/search/MailboxQuery.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
index c29e2d2..616b108 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
@@ -117,7 +117,7 @@ public final class MailboxQuery {
     /**
      * Constructs an expression determining a set of mailbox names.
      */
-    @VisibleForTesting MailboxQuery(Optional<String> namespace, Optional<String> user, MailboxNameExpression mailboxNameExpression) {
+    private MailboxQuery(Optional<String> namespace, Optional<String> user, MailboxNameExpression mailboxNameExpression) {
         this.namespace = namespace;
         this.user = user;
         this.mailboxNameExpression = mailboxNameExpression;


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


[james-project] 05/32: [Refactoring] StatusProcessor: Extract FetchGroup computation

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 80a34d3756fc271741c79c39ae1b201798843693
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:23:36 2019 +0700

    [Refactoring] StatusProcessor: Extract FetchGroup computation
---
 .../org/apache/james/imap/processor/StatusProcessor.java  | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 1642103..b0bed8f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -62,12 +62,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
 
             MailboxManager mailboxManager = getMailboxManager();
             MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
-            MessageManager.MetaData.FetchGroup fetchGroup;
-            if (statusDataItems.isUnseen()) {
-                fetchGroup = MessageManager.MetaData.FetchGroup.UNSEEN_COUNT;
-            } else {
-                fetchGroup = MessageManager.MetaData.FetchGroup.NO_UNSEEN;
-            }
+            MessageManager.MetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
             MessageManager.MetaData metaData = mailbox.getMetaData(false, mailboxSession, fetchGroup);
 
             Long messages = messages(statusDataItems, metaData);
@@ -92,6 +87,14 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
+    private MessageManager.MetaData.FetchGroup computeFetchGroup(StatusDataItems statusDataItems) {
+        if (statusDataItems.isUnseen()) {
+            return MessageManager.MetaData.FetchGroup.UNSEEN_COUNT;
+        } else {
+            return MessageManager.MetaData.FetchGroup.NO_UNSEEN;
+        }
+    }
+
     private Long unseen(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isUnseen()) {
             return metaData.getUnseenCount();


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


[james-project] 10/32: [Refactoring] StatusDataItems should be immutable

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 9c0287f70b4aab71b2e7db5c5d2382a187debbd0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:46:10 2019 +0700

    [Refactoring] StatusDataItems should be immutable
---
 .../james/imap/api/message/StatusDataItems.java    | 71 ++++++++--------------
 .../imap/decode/parser/StatusCommandParser.java    | 24 ++++----
 2 files changed, 39 insertions(+), 56 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java
index 5458e1a..06e3542 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/StatusDataItems.java
@@ -18,78 +18,59 @@
  ****************************************************************/
 package org.apache.james.imap.api.message;
 
+import java.util.EnumSet;
+
 import com.google.common.base.MoreObjects;
 
 public class StatusDataItems {
-    private boolean messages;
-
-    private boolean recent;
-
-    private boolean uidNext;
-
-    private boolean uidValidity;
-
-    private boolean unseen;
+    public enum StatusItem {
+        MESSAGES,
+        RECENT,
+        UID_NEXT,
+        UID_VALIDITY,
+        UNSEEN,
+        HIGHEST_MODSEQ
+    }
 
-    private boolean highestModSeq;
+    private final EnumSet<StatusItem> statusItems;
 
-    public boolean isMessages() {
-        return messages;
+    public StatusDataItems(EnumSet<StatusItem> statusItems) {
+        this.statusItems = statusItems;
     }
 
-    public void setMessages(boolean messages) {
-        this.messages = messages;
+    public boolean isMessages() {
+        return statusItems.contains(StatusItem.MESSAGES);
     }
 
     public boolean isRecent() {
-        return recent;
-    }
-
-    public void setRecent(boolean recent) {
-        this.recent = recent;
+        return statusItems.contains(StatusItem.RECENT);
     }
 
     public boolean isUidNext() {
-        return uidNext;
-    }
-
-    public void setUidNext(boolean uidNext) {
-        this.uidNext = uidNext;
+        return statusItems.contains(StatusItem.UID_NEXT);
     }
 
     public boolean isUidValidity() {
-        return uidValidity;
-    }
-
-    public void setUidValidity(boolean uidValidity) {
-        this.uidValidity = uidValidity;
+        return statusItems.contains(StatusItem.UID_VALIDITY);
     }
 
     public boolean isUnseen() {
-        return unseen;
-    }
-
-    public void setUnseen(boolean unseen) {
-        this.unseen = unseen;
-    }
-
-    public void setHighestModSeq(boolean highestModSeq) {
-        this.highestModSeq = highestModSeq;
+        return statusItems.contains(StatusItem.UNSEEN);
     }
     
     public boolean isHighestModSeq() {
-        return highestModSeq;
+        return statusItems.contains(StatusItem.HIGHEST_MODSEQ);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("messages", messages)
-            .add("recent", recent)
-            .add("uidNext", uidNext)
-            .add("uidValidity", uidValidity)
-            .add("unseen", unseen)
-            .add("highestModSeq", highestModSeq)
+            .add("messages", isMessages())
+            .add("recent", isRecent())
+            .add("uidNext", isUidNext())
+            .add("uidValidity", isUidValidity())
+            .add("unseen", isUnseen())
+            .add("highestModSeq", isHighestModSeq())
             .toString();
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
index 5030f92..92babee 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.imap.decode.parser;
 
+import java.util.EnumSet;
+
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
@@ -40,7 +42,7 @@ public class StatusCommandParser extends AbstractImapCommandParser {
     }
 
     private StatusDataItems statusDataItems(ImapRequestLineReader request) throws DecodingException {
-        StatusDataItems items = new StatusDataItems();
+        EnumSet<StatusDataItems.StatusItem> items = EnumSet.noneOf(StatusDataItems.StatusItem.class);
 
         request.nextWordChar();
         request.consumeChar('(');
@@ -48,33 +50,33 @@ public class StatusCommandParser extends AbstractImapCommandParser {
         String nextWord = request.consumeWord(validator);
 
         while (!nextWord.endsWith(")")) {
-            addItem(nextWord, items);
+            items.add(parseStatus(nextWord));
             nextWord = request.consumeWord(validator);
         }
         // Got the closing ")", may be attached to a word.
         if (nextWord.length() > 1) {
-            addItem(nextWord.substring(0, nextWord.length() - 1), items);
+            items.add(parseStatus(nextWord.substring(0, nextWord.length() - 1)));
         }
 
-        return items;
+        return new StatusDataItems(items);
     }
 
-    private void addItem(String nextWord, StatusDataItems items) throws DecodingException {
+    private StatusDataItems.StatusItem parseStatus(String nextWord) throws DecodingException {
         // All the matching must be done in a case-insensitive fashion.
         // See rfc3501 9. Formal Syntax and IMAP-282
         if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_MESSAGES)) {
-            items.setMessages(true);
+            return StatusDataItems.StatusItem.MESSAGES;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_RECENT)) {
-            items.setRecent(true);
+            return StatusDataItems.StatusItem.RECENT;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_UIDNEXT)) {
-            items.setUidNext(true);
+            return StatusDataItems.StatusItem.UID_NEXT;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_UIDVALIDITY)) {
-            items.setUidValidity(true);
+            return StatusDataItems.StatusItem.UID_VALIDITY;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_UNSEEN)) {
-            items.setUnseen(true);
+            return StatusDataItems.StatusItem.UNSEEN;
         } else if (nextWord.equalsIgnoreCase(ImapConstants.STATUS_HIGHESTMODSEQ)) {
             // HIGHESTMODSEQ status item as defined in RFC4551 3.6 HIGHESTMODSEQ Status Data Items
-            items.setHighestModSeq(true);
+            return StatusDataItems.StatusItem.HIGHEST_MODSEQ;
         } else {
             throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Unknown status item: '" + nextWord + "'");
         }


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


[james-project] 23/32: [REFACTORING] Search comparators should rely on Java 8

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 83f4e820f72f0869f237e5ba66b3057247dcde24
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 8 12:35:29 2019 +0700

    [REFACTORING] Search comparators should rely on Java 8
---
 .../search/comparator/CombinedComparator.java      | 10 ++--
 .../search/comparator/InternalDateComparator.java  | 36 --------------
 ...SizeComparator.java => MessageComparators.java} | 18 ++++---
 .../search/comparator/MessageIdComparator.java     | 35 --------------
 .../store/search/comparator/ReverseComparator.java | 56 ----------------------
 .../store/search/comparator/UidComparator.java     | 36 --------------
 .../store/search/CombinedComparatorTest.java       | 30 +++++++-----
 7 files changed, 32 insertions(+), 189 deletions(-)

diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java
index 3c8d53e..cb44353 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/CombinedComparator.java
@@ -51,19 +51,19 @@ public class CombinedComparator implements Comparator<MailboxMessage> {
     private static Comparator<MailboxMessage> toComparator(Sort sort) {
         switch (sort.getSortClause()) {
             case Arrival:
-                return InternalDateComparator.INTERNALDATE;
+                return MessageComparators.INTERNAL_DATE_COMPARATOR;
             case MailboxCc:
                 return HeaderMailboxComparator.CC_COMPARATOR;
             case MailboxFrom:
                 return HeaderMailboxComparator.FROM_COMPARATOR;
             case Size:
-                return SizeComparator.SIZE;
+                return MessageComparators.SIZE_COMPARATOR;
             case BaseSubject:
                 return BaseSubjectComparator.BASESUBJECT;
             case MailboxTo:
                 return HeaderMailboxComparator.TO_COMPARATOR;
             case Uid:
-                return UidComparator.UID;
+                return MessageComparators.UID_COMPARATOR;
             case SentDate:
                 return SentDateComparator.SENTDATE;
             case DisplayFrom:
@@ -71,7 +71,7 @@ public class CombinedComparator implements Comparator<MailboxMessage> {
             case DisplayTo:
                 return HeaderDisplayComparator.TO_COMPARATOR;
             case Id:
-                return MessageIdComparator.MESSAGE_ID_COMPARATOR;
+                return MessageComparators.MESSAGE_ID_COMPARATOR;
             default:
                 throw new NotImplementedException("Combined comparator does not support sort " + sort.getSortClause());
         }
@@ -79,7 +79,7 @@ public class CombinedComparator implements Comparator<MailboxMessage> {
 
     private static Comparator<MailboxMessage> optionalResverse(Comparator<MailboxMessage> comparator, boolean isReverse) {
         if (isReverse) {
-            return new ReverseComparator(comparator);
+            return comparator.reversed();
         }
         return comparator;
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java
deleted file mode 100644
index 7db51ca..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/InternalDateComparator.java
+++ /dev/null
@@ -1,36 +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.search.comparator;
-
-import java.util.Comparator;
-
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-
-/**
- * {@link Comparator} which compares {@link MailboxMessage}'s with their {@link MailboxMessage#getInternalDate()} value
- */
-public class InternalDateComparator  implements Comparator<MailboxMessage> {
-    public static final Comparator<MailboxMessage> INTERNALDATE = new InternalDateComparator();
-
-    @Override
-    public int compare(MailboxMessage o1, MailboxMessage o2) {
-        return (o1.getInternalDate().compareTo(o2.getInternalDate()));
-    }
-
-}
\ No newline at end of file
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SizeComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/MessageComparators.java
similarity index 71%
rename from mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SizeComparator.java
rename to mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/MessageComparators.java
index ccb7180..ab72a6d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/SizeComparator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/MessageComparators.java
@@ -16,20 +16,18 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
+
 package org.apache.james.mailbox.store.search.comparator;
 
 import java.util.Comparator;
+import java.util.Locale;
 
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
-/**
- * {@link Comparator} which compares {@link MailboxMessage}'s with their {@link MailboxMessage#getFullContentOctets()} value
- */
-public class SizeComparator implements Comparator<MailboxMessage> {
-    public static final Comparator<MailboxMessage> SIZE = new SizeComparator();
-
-    @Override
-    public int compare(MailboxMessage o1, MailboxMessage o2) {
-        return (int) (o1.getFullContentOctets() - o2.getFullContentOctets());
-    }
+public interface MessageComparators {
+    Comparator<MailboxMessage> UID_COMPARATOR = Comparator.comparing(MailboxMessage::getUid);
+    Comparator<MailboxMessage> SIZE_COMPARATOR = Comparator.comparing(MailboxMessage::getFullContentOctets);
+    Comparator<MailboxMessage> INTERNAL_DATE_COMPARATOR = Comparator.comparing(MailboxMessage::getInternalDate);
+    Comparator<MailboxMessage> MESSAGE_ID_COMPARATOR = Comparator.comparing(mailboxMessage ->
+        mailboxMessage.getMessageId().serialize().toLowerCase(Locale.US));
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/MessageIdComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/MessageIdComparator.java
deleted file mode 100644
index f65064e..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/MessageIdComparator.java
+++ /dev/null
@@ -1,35 +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.search.comparator;
-
-import java.util.Comparator;
-
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-
-public class MessageIdComparator implements Comparator<MailboxMessage> {
-    public static final MessageIdComparator MESSAGE_ID_COMPARATOR = new MessageIdComparator();
-
-    @Override
-    public int compare(MailboxMessage mailboxMessage1, MailboxMessage mailboxMessage2) {
-        return mailboxMessage1.getMessageId()
-            .serialize()
-            .compareToIgnoreCase(mailboxMessage2.getMessageId().serialize());
-    }
-}
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java
deleted file mode 100644
index 8abc477..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/ReverseComparator.java
+++ /dev/null
@@ -1,56 +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.search.comparator;
-
-import java.util.Comparator;
-
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-
-import com.google.common.base.Objects;
-
-/**
- * {@link Comparator} which wraps an other {@link Comparator} and reverse it
- */
-public class ReverseComparator implements Comparator<MailboxMessage> {
-
-    private final Comparator<MailboxMessage> comparator;
-
-    public ReverseComparator(Comparator<MailboxMessage> comparator) {
-        this.comparator = comparator;
-    }
-
-    @Override
-    public int compare(MailboxMessage o1, MailboxMessage o2) {
-        return comparator.compare(o2, o1);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o instanceof ReverseComparator) {
-            ReverseComparator that = (ReverseComparator) o;
-            return Objects.equal(this.comparator, that.comparator);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(comparator);
-    }
-}
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java
deleted file mode 100644
index 5081e03..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/comparator/UidComparator.java
+++ /dev/null
@@ -1,36 +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.search.comparator;
-
-import java.util.Comparator;
-
-import org.apache.james.mailbox.store.mail.model.MailboxMessage;
-
-/**
- * {@link Comparator} which compares {@link MailboxMessage}'s with their {@link MailboxMessage#getUid()} value
- */
-public class UidComparator implements Comparator<MailboxMessage> {
-    public static final Comparator<MailboxMessage> UID = new UidComparator();
-
-    @Override
-    public int compare(MailboxMessage o1, MailboxMessage o2) {
-        return o1.getUid().compareTo(o2.getUid());
-    }
-
-}
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java
index 9277646..2fecfbb 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/CombinedComparatorTest.java
@@ -20,21 +20,23 @@
 package org.apache.james.mailbox.store.search;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
+import java.util.Comparator;
+
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mailbox.model.SearchQuery.Sort;
 import org.apache.james.mailbox.model.SearchQuery.Sort.Order;
 import org.apache.james.mailbox.model.SearchQuery.Sort.SortClause;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.comparator.BaseSubjectComparator;
 import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
 import org.apache.james.mailbox.store.search.comparator.HeaderDisplayComparator;
 import org.apache.james.mailbox.store.search.comparator.HeaderMailboxComparator;
-import org.apache.james.mailbox.store.search.comparator.InternalDateComparator;
-import org.apache.james.mailbox.store.search.comparator.MessageIdComparator;
-import org.apache.james.mailbox.store.search.comparator.ReverseComparator;
+import org.apache.james.mailbox.store.search.comparator.MessageComparators;
 import org.apache.james.mailbox.store.search.comparator.SentDateComparator;
-import org.apache.james.mailbox.store.search.comparator.SizeComparator;
-import org.apache.james.mailbox.store.search.comparator.UidComparator;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -63,7 +65,7 @@ public class CombinedComparatorTest {
     @Test
     public void createShouldConvertInternalDate() {
         assertThat(CombinedComparator.create(ImmutableList.of(new Sort(SortClause.Arrival))).getComparators())
-            .containsOnly(InternalDateComparator.INTERNALDATE);
+            .containsOnly(MessageComparators.INTERNAL_DATE_COMPARATOR);
     }
 
     @Test
@@ -87,7 +89,7 @@ public class CombinedComparatorTest {
     @Test
     public void createShouldConvertSize() {
         assertThat(CombinedComparator.create(ImmutableList.of(new Sort(SortClause.Size))).getComparators())
-            .containsOnly(SizeComparator.SIZE);
+            .containsOnly(MessageComparators.SIZE_COMPARATOR);
     }
 
     @Test
@@ -99,7 +101,7 @@ public class CombinedComparatorTest {
     @Test
     public void createShouldConvertUid() {
         assertThat(CombinedComparator.create(ImmutableList.of(new Sort(SortClause.Uid))).getComparators())
-            .containsOnly(UidComparator.UID);
+            .containsOnly(MessageComparators.UID_COMPARATOR);
     }
 
     @Test
@@ -123,12 +125,18 @@ public class CombinedComparatorTest {
     @Test
     public void createShouldConvertId() {
         assertThat(CombinedComparator.create(ImmutableList.of(new Sort(SortClause.Id))).getComparators())
-            .containsOnly(MessageIdComparator.MESSAGE_ID_COMPARATOR);
+            .containsOnly(MessageComparators.MESSAGE_ID_COMPARATOR);
     }
 
     @Test
     public void createShouldReverse() {
-        assertThat(CombinedComparator.create(ImmutableList.of(new Sort(SortClause.DisplayFrom, Order.REVERSE))).getComparators())
-            .containsOnly(new ReverseComparator(HeaderDisplayComparator.FROM_COMPARATOR));
+        MailboxMessage message1 = mock(MailboxMessage.class);
+        when(message1.getUid()).thenReturn(MessageUid.of(1));
+        MailboxMessage message2 = mock(MailboxMessage.class);
+        when(message2.getUid()).thenReturn(MessageUid.of(2));
+
+        Comparator<MailboxMessage> comparator = CombinedComparator.create(ImmutableList.of(new Sort(SortClause.Uid, Order.REVERSE)));
+
+        assertThat(comparator.compare(message1, message2)).isGreaterThan(0);
     }
 }


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


[james-project] 15/32: MAILBOX-391 Simplify some quota related code

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 c01dabc5a9ebf799f7d535c361243741c006eeeb
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 11 15:56:19 2019 +0700

    MAILBOX-391 Simplify some quota related code
    
    We can avoid some Mailbox -> MailboxPath -> Mailbox roundtrips
---
 .../apache/james/mailbox/quota/QuotaRootResolver.java  |  3 ++-
 .../mailbox/store/quota/CurrentQuotaCalculator.java    | 18 +-----------------
 .../store/quota/DefaultUserQuotaRootResolver.java      |  8 +++-----
 .../store/quota/DefaultUserQuotaRootResolverTest.java  |  2 +-
 .../apache/james/imap/processor/GetQuotaProcessor.java |  8 ++++----
 .../james/imap/processor/GetQuotaProcessorTest.java    | 10 +++++++---
 6 files changed, 18 insertions(+), 31 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java
index 2ba6cf9..258a870 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -39,5 +40,5 @@ public interface QuotaRootResolver extends QuotaRootDeserializer {
 
     QuotaRoot getQuotaRoot(MailboxId mailboxId) throws MailboxException;
 
-    List<MailboxPath> retrieveAssociatedMailboxes(QuotaRoot quotaRoot, MailboxSession mailboxSession) throws MailboxException;
+    List<Mailbox> retrieveAssociatedMailboxes(QuotaRoot quotaRoot, MailboxSession mailboxSession) throws MailboxException;
 }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
index a97f717..a46b2dd 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
@@ -29,17 +29,13 @@ import javax.inject.Inject;
 import org.apache.james.mailbox.MailboxSession;
 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.model.QuotaRoot;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 
-import com.google.common.collect.Lists;
-
 public class CurrentQuotaCalculator {
 
     private final MailboxSessionMapperFactory factory;
@@ -53,7 +49,7 @@ public class CurrentQuotaCalculator {
     }
 
     public CurrentQuotas recalculateCurrentQuotas(QuotaRoot quotaRoot, MailboxSession session) throws MailboxException {
-        List<Mailbox> mailboxes = retrieveMailboxes(quotaRoot, session);
+        List<Mailbox> mailboxes = quotaRootResolver.retrieveAssociatedMailboxes(quotaRoot, session);
         MessageMapper mapper = factory.getMessageMapper(session);
         long messagesSizes = 0;
         long messageCount = 0;
@@ -67,18 +63,6 @@ public class CurrentQuotaCalculator {
         return new CurrentQuotas(messageCount, messagesSizes);
     }
 
-    private List<Mailbox> retrieveMailboxes(QuotaRoot quotaRoot, MailboxSession session) throws MailboxException {
-        List<MailboxPath> paths = quotaRootResolver.retrieveAssociatedMailboxes(quotaRoot, session);
-        final MailboxMapper mapper = factory.getMailboxMapper(session);
-        return Lists.transform(paths, mailboxPath -> {
-            try {
-                return mapper.findMailboxByPath(mailboxPath);
-            } catch (MailboxException e) {
-                throw new RuntimeException(e);
-            }
-        });
-    }
-
     public static class CurrentQuotas {
         private final long count;
         private final long size;
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
index 0b420c4..d7f54d9 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
@@ -39,7 +39,6 @@ import org.apache.james.mailbox.store.SessionProvider;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
 
 public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
 
@@ -109,12 +108,11 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
     }
 
     @Override
-    public List<MailboxPath> retrieveAssociatedMailboxes(QuotaRoot quotaRoot, MailboxSession mailboxSession) throws MailboxException {
+    public List<Mailbox> retrieveAssociatedMailboxes(QuotaRoot quotaRoot, MailboxSession mailboxSession) throws MailboxException {
         List<String> parts = QUOTA_ROOT_DESERIALIZER.toParts(quotaRoot.getValue());
         String namespace = parts.get(0);
         String user = parts.get(1);
-        return Lists.transform(factory.getMailboxMapper(mailboxSession)
-            .findMailboxWithPathLike(new MailboxPath(namespace, user, "%")),
-            Mailbox::generateAssociatedPath);
+        return factory.getMailboxMapper(mailboxSession)
+            .findMailboxWithPathLike(new MailboxPath(namespace, user, "%"));
     }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
index ec9b637..e8cb58d 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
@@ -89,7 +89,7 @@ public class DefaultUserQuotaRootResolverTest {
         when(mockedFactory.getMailboxMapper(MAILBOX_SESSION)).thenReturn(mockedMapper);
         when(mockedMapper.findMailboxWithPathLike(PATH_LIKE)).thenReturn(Lists.newArrayList(MAILBOX, MAILBOX_2));
 
-        assertThat(testee.retrieveAssociatedMailboxes(QUOTA_ROOT, MAILBOX_SESSION)).containsOnly(MAILBOX_PATH, MAILBOX_PATH_2);
+        assertThat(testee.retrieveAssociatedMailboxes(QUOTA_ROOT, MAILBOX_SESSION)).containsOnly(MAILBOX, MAILBOX_2);
     }
 
     @Test(expected = MailboxException.class)
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 2213deb..7ee3113 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
@@ -37,8 +37,8 @@ import org.apache.james.imap.message.response.QuotaResponse;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
-import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.QuotaManager;
@@ -101,9 +101,9 @@ public class GetQuotaProcessor extends AbstractMailboxProcessor<GetQuotaRequest>
     private boolean hasRight(QuotaRoot quotaRoot, ImapSession session) throws MailboxException {
         // If any of the mailboxes owned by quotaRoot user can be read by the current user, then we should respond to him.
         final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
-        List<MailboxPath> mailboxList = quotaRootResolver.retrieveAssociatedMailboxes(quotaRoot, mailboxSession);
-        for (MailboxPath mailboxPath : mailboxList) {
-            if (getMailboxManager().hasRight(mailboxPath, MailboxACL.Right.Read, mailboxSession)) {
+        List<Mailbox> mailboxList = quotaRootResolver.retrieveAssociatedMailboxes(quotaRoot, mailboxSession);
+        for (Mailbox mailbox : mailboxList) {
+            if (getMailboxManager().hasRight(mailbox.generateAssociatedPath(), MailboxACL.Right.Read, mailboxSession)) {
                 return true;
             }
         }
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 3df2da8..5c76ef7 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
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.Quota;
@@ -74,6 +75,7 @@ public class GetQuotaProcessorTest {
     private QuotaRootResolver mockedQuotaRootResolver;
     private MailboxManager mockedMailboxManager;
     private MailboxSession mailboxSession;
+    private Mailbox mailbox;
 
     @Before
     public void setUp() throws Exception {
@@ -87,6 +89,8 @@ public class GetQuotaProcessorTest {
         mockedMailboxManager = mock(MailboxManager.class);
         testee = new GetQuotaProcessor(mock(ImapProcessor.class), mockedMailboxManager,
             statusResponseFactory, mockedQuotaManager, mockedQuotaRootResolver, new NoopMetricFactory());
+        mailbox = mock(Mailbox.class);
+        when(mailbox.generateAssociatedPath()).thenReturn(MAILBOX_PATH);
     }
 
     @Test
@@ -97,7 +101,7 @@ public class GetQuotaProcessorTest {
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
             .thenReturn(mailboxSession);
         when(mockedQuotaRootResolver.retrieveAssociatedMailboxes(QUOTA_ROOT, mailboxSession))
-            .thenReturn(ImmutableList.of(MAILBOX_PATH));
+            .thenReturn(ImmutableList.of(mailbox));
         when(mockedMailboxManager.hasRight(MAILBOX_PATH, MailboxACL.Right.Read, mailboxSession))
             .thenReturn(true);
         when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenReturn(MESSAGE_QUOTA);
@@ -127,7 +131,7 @@ public class GetQuotaProcessorTest {
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
             .thenReturn(mailboxSession);
         when(mockedQuotaRootResolver.retrieveAssociatedMailboxes(QUOTA_ROOT, mailboxSession))
-            .thenReturn(ImmutableList.of(MAILBOX_PATH));
+            .thenReturn(ImmutableList.of(mailbox));
         when(mockedMailboxManager.hasRight(MAILBOX_PATH, MailboxACL.Right.Read, mailboxSession))
             .thenReturn(true);
         when(mockedQuotaManager.getMessageQuota(QUOTA_ROOT)).thenThrow(new MailboxException());
@@ -152,7 +156,7 @@ public class GetQuotaProcessorTest {
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
             .thenReturn(mailboxSession);
         when(mockedQuotaRootResolver.retrieveAssociatedMailboxes(QUOTA_ROOT, mailboxSession))
-            .thenReturn(ImmutableList.of(MAILBOX_PATH));
+            .thenReturn(ImmutableList.of(mailbox));
         when(mockedMailboxManager.hasRight(MAILBOX_PATH, MailboxACL.Right.Read, mailboxSession))
             .thenReturn(false);
 


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


[james-project] 07/32: [Refactoring] StatusProcessor: Inline 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 f07f878b3bc68ddb25e55fece5a5e343effeebb0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:28:31 2019 +0700

    [Refactoring] StatusProcessor: Inline MailboxManager
---
 .../src/main/java/org/apache/james/imap/processor/StatusProcessor.java | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 84b9a7b..00cddea 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -60,8 +60,7 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         try {
             LOGGER.debug("Status called on mailbox named {}", mailboxPath);
 
-            MailboxManager mailboxManager = getMailboxManager();
-            MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
+            MessageManager mailbox = getMailboxManager().getMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
             MessageManager.MetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
             MessageManager.MetaData metaData = mailbox.getMetaData(false, mailboxSession, fetchGroup);
             MailboxStatusResponse response = computeStatusResponse(request, statusDataItems, metaData);


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


[james-project] 13/32: [Refactoring] StatusCommandParser: reorder methods by visibility

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 ac7e71f75e161b0809ca50ed99e8514382249f8b
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:56:07 2019 +0700

    [Refactoring] StatusCommandParser: reorder methods by visibility
---
 .../james/imap/decode/parser/StatusCommandParser.java    | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
index 88bebe0..03262f4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
@@ -45,6 +45,14 @@ public class StatusCommandParser extends AbstractImapCommandParser {
         super(ImapCommand.authenticatedStateCommand(ImapConstants.STATUS_COMMAND_NAME));
     }
 
+    @Override
+    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
+        String mailboxName = request.mailbox();
+        StatusDataItems statusDataItems = statusDataItems(request);
+        request.eol();
+        return new StatusRequest(command, mailboxName, statusDataItems, tag);
+    }
+
     private StatusDataItems statusDataItems(ImapRequestLineReader request) throws DecodingException {
         ImmutableList<String> words = splitWords(request);
 
@@ -94,12 +102,4 @@ public class StatusCommandParser extends AbstractImapCommandParser {
             throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Unknown status item: '" + nextWord + "'");
         }
     }
-
-    @Override
-        protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
-        String mailboxName = request.mailbox();
-        StatusDataItems statusDataItems = statusDataItems(request);
-        request.eol();
-        return new StatusRequest(command, mailboxName, statusDataItems, tag);
-    }
 }


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


[james-project] 09/32: [Refactoring] StatusCommandParser: statusDataItems 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 105edc9246af321a5c81e2e8bc8037e320a84b80
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:32:40 2019 +0700

    [Refactoring] StatusCommandParser: statusDataItems can be private
---
 .../java/org/apache/james/imap/decode/parser/StatusCommandParser.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
index 75ae4ae..5030f92 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
@@ -39,7 +39,7 @@ public class StatusCommandParser extends AbstractImapCommandParser {
         super(ImapCommand.authenticatedStateCommand(ImapConstants.STATUS_COMMAND_NAME));
     }
 
-    StatusDataItems statusDataItems(ImapRequestLineReader request) throws DecodingException {
+    private StatusDataItems statusDataItems(ImapRequestLineReader request) throws DecodingException {
         StatusDataItems items = new StatusDataItems();
 
         request.nextWordChar();


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


[james-project] 22/32: [Refactoring] Allow a mailboxQuery to fluently match mailboxes

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 9a0ae791225d81000eb28846c08afa111ec52318
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 12 14:33:34 2019 +0700

    [Refactoring] Allow a mailboxQuery to fluently match mailboxes
---
 .../java/org/apache/james/mailbox/model/search/MailboxQuery.java     | 5 +++++
 .../java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java     | 2 +-
 .../org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java  | 2 +-
 .../apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java    | 4 ++--
 4 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
index 52afd64..f4ed134 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 
@@ -179,6 +180,10 @@ public class MailboxQuery {
             && isExpressionMatch(mailboxPath.getName());
     }
 
+    public boolean matches(Mailbox mailbox) {
+        return isPathMatch(mailbox.generateAssociatedPath());
+    }
+
     public UserBound asUserBound() {
         Preconditions.checkState(namespace.isPresent(), "This MailboxQuery is not user bound as namespace is missing");
         Preconditions.checkState(user.isPresent(), "This MailboxQuery is not user bound as user is missing");
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index 8b69d39..43a9295 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -198,7 +198,7 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
                 .getResultList()
                 .stream()
                 .map(JPAMailbox::toMailbox)
-                .filter(mailbox -> query.isPathMatch(mailbox.generateAssociatedPath()))
+                .filter(query::matches)
                 .collect(Guavate.toImmutableList());
         } catch (PersistenceException e) {
             throw new MailboxException("Search of mailbox " + query + " failed", e);
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index 843fe95..fe75ff1 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -143,7 +143,7 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
             mailboxList.add(0, mailbox);
         }
         return mailboxList.stream()
-            .filter(mailbox -> query.isPathMatch(mailbox.generateAssociatedPath()))
+            .filter(query::matches)
             .collect(Guavate.toImmutableList());
     }
 
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
index d1d28a0..3c9fceb 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
@@ -82,10 +82,10 @@ public class InMemoryMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> findMailboxWithPathLike(MailboxQuery.UserBound query) throws MailboxException {
+    public List<Mailbox> findMailboxWithPathLike(MailboxQuery.UserBound query) {
         return mailboxesByPath.values()
             .stream()
-            .filter(mailbox -> query.isPathMatch(mailbox.generateAssociatedPath()))
+            .filter(query::matches)
             .map(Mailbox::new)
             .collect(Guavate.toImmutableList());
     }


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


[james-project] 21/32: MAILBOX-391 MailboxMapper::findMailboxWithPathLike should be also queried for child mailboxes

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 09a02ce474f9432423cec645fb47d6b77ad04fcd
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 12 14:32:56 2019 +0700

    MAILBOX-391 MailboxMapper::findMailboxWithPathLike should be also queried for child mailboxes
    
    This allows to avoid further requests for positionning child metadata
---
 .../org/apache/james/mailbox/model/search/ExactName.java |  5 +++++
 .../mailbox/model/search/MailboxNameExpression.java      |  2 ++
 .../apache/james/mailbox/model/search/MailboxQuery.java  | 12 +++++++-----
 .../apache/james/mailbox/model/search/PrefixedRegex.java |  5 +++++
 .../james/mailbox/model/search/PrefixedWildcard.java     |  5 +++++
 .../org/apache/james/mailbox/model/search/Wildcard.java  |  5 +++++
 .../apache/james/mailbox/store/StoreMailboxManager.java  | 16 +++++++---------
 .../james/mailbox/store/StoreMailboxManagerTest.java     |  4 ++--
 8 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java
index 1a9b0c8..1c04431 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java
@@ -49,6 +49,11 @@ public class ExactName implements MailboxNameExpression {
     }
 
     @Override
+    public MailboxNameExpression includeChildren() {
+        return new PrefixedWildcard(name);
+    }
+
+    @Override
     public final boolean equals(Object o) {
         if (o instanceof ExactName) {
             ExactName exactName = (ExactName) o;
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java
index eda289d..8a17ee5 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxNameExpression.java
@@ -53,6 +53,8 @@ public interface MailboxNameExpression {
      */
     boolean isWild();
 
+    MailboxNameExpression includeChildren();
+
     /**
      * Gets wildcard character that matches any series of characters.
      *
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
index 4ed7c58..52afd64 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
@@ -112,10 +112,10 @@ public class MailboxQuery {
     }
 
     public static class UserBound extends MailboxQuery {
-        private UserBound(Optional<String> namespace, Optional<String> user, MailboxNameExpression mailboxNameExpression) {
-            super(namespace, user, mailboxNameExpression);
-            Preconditions.checkArgument(namespace.isPresent());
-            Preconditions.checkArgument(user.isPresent());
+        private UserBound(String namespace, String user, MailboxNameExpression mailboxNameExpression) {
+            super(Optional.of(namespace), Optional.of(user), mailboxNameExpression);
+            Preconditions.checkNotNull(namespace);
+            Preconditions.checkNotNull(user);
         }
 
         public String getFixedNamespace() {
@@ -180,7 +180,9 @@ public class MailboxQuery {
     }
 
     public UserBound asUserBound() {
-        return new UserBound(namespace, user, mailboxNameExpression);
+        Preconditions.checkState(namespace.isPresent(), "This MailboxQuery is not user bound as namespace is missing");
+        Preconditions.checkState(user.isPresent(), "This MailboxQuery is not user bound as user is missing");
+        return new UserBound(namespace.get(), user.get(), mailboxNameExpression);
     }
 
     @Override
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java
index 86e6743..3f2be46 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java
@@ -54,6 +54,11 @@ public class PrefixedRegex implements MailboxNameExpression {
     }
 
     @Override
+    public MailboxNameExpression includeChildren() {
+        return new PrefixedRegex(prefix, regex + "*", pathDelimiter);
+    }
+
+    @Override
     public String getCombinedName() {
         if (prefix != null && prefix.length() > 0) {
             final int baseLength = prefix.length();
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java
index ae1e6fb..b313319 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java
@@ -48,6 +48,11 @@ public class PrefixedWildcard implements MailboxNameExpression {
     }
 
     @Override
+    public MailboxNameExpression includeChildren() {
+        return this;
+    }
+
+    @Override
     public final boolean equals(Object o) {
         if (o instanceof PrefixedWildcard) {
             PrefixedWildcard that = (PrefixedWildcard) o;
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java
index fa647cb..73e76e5 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/Wildcard.java
@@ -47,6 +47,11 @@ public class Wildcard implements MailboxNameExpression {
     }
 
     @Override
+    public MailboxNameExpression includeChildren() {
+        return this;
+    }
+
+    @Override
     public final boolean equals(Object o) {
         return o instanceof Wildcard;
     }
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 d85608f..b40eb95 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
@@ -574,33 +574,31 @@ public class StoreMailboxManager implements MailboxManager {
         return searchMailboxes(mailboxExpression, session, Right.Lookup);
     }
 
-    private List<MailboxMetaData> searchMailboxes(MailboxQuery mailboxExpression, MailboxSession session, Right right) throws MailboxException {
+    private List<MailboxMetaData> searchMailboxes(MailboxQuery mailboxQuery, MailboxSession session, Right right) throws MailboxException {
         MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(session);
         Stream<Mailbox> baseMailboxes = mailboxMapper
-            .findMailboxWithPathLike(toSingleUserQuery(mailboxExpression, session))
+            .findMailboxWithPathLike(toSingleUserQuery(mailboxQuery, session))
             .stream();
-        Stream<Mailbox> delegatedMailboxes = getDelegatedMailboxes(mailboxMapper, mailboxExpression, right, session);
-        List<Mailbox> mailboxes = Stream.concat(baseMailboxes,
-                delegatedMailboxes)
+        Stream<Mailbox> delegatedMailboxes = getDelegatedMailboxes(mailboxMapper, mailboxQuery, right, session);
+        List<Mailbox> mailboxes = Stream.concat(baseMailboxes, delegatedMailboxes)
             .distinct()
             .filter(Throwing.predicate(mailbox -> storeRightManager.hasRight(mailbox, right, session)))
             .collect(Guavate.toImmutableList());
 
         return mailboxes
             .stream()
-            .filter(mailbox -> mailboxExpression.isPathMatch(mailbox.generateAssociatedPath()))
+            .filter(mailboxQuery::matches)
             .map(mailbox -> toMailboxMetadata(session, mailboxes, mailbox))
             .sorted(new StandardMailboxMetaDataComparator())
             .collect(Guavate.toImmutableList());
     }
 
     public static MailboxQuery.UserBound toSingleUserQuery(MailboxQuery mailboxQuery, MailboxSession mailboxSession) {
-        MailboxNameExpression nameExpression = mailboxQuery.getMailboxNameExpression();
-
         return MailboxQuery.builder()
             .namespace(mailboxQuery.getNamespace().orElse(MailboxConstants.USER_NAMESPACE))
             .username(mailboxQuery.getUser().orElse(mailboxSession.getUser().asString()))
-            .expression(nameExpression)
+            .expression(mailboxQuery.getMailboxNameExpression()
+                .includeChildren())
             .build()
             .asUserBound();
     }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index db99510..85834fd 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -208,7 +208,7 @@ public class StoreMailboxManagerTest {
             .isEqualTo(MailboxQuery.builder()
                 .namespace(MailboxConstants.USER_NAMESPACE)
                 .username("user")
-                .expression(new PrefixedRegex(EMPTY_PREFIX, "abc", session.getPathDelimiter()))
+                .expression(new PrefixedRegex(EMPTY_PREFIX, "abc*", session.getPathDelimiter()))
                 .build()
                 .asUserBound());
     }
@@ -227,7 +227,7 @@ public class StoreMailboxManagerTest {
             .isEqualTo(MailboxQuery.builder()
                 .namespace(MailboxConstants.USER_NAMESPACE)
                 .username("user")
-                .expression(new PrefixedRegex("prefix.", "abc", session.getPathDelimiter()))
+                .expression(new PrefixedRegex("prefix.", "abc*", session.getPathDelimiter()))
                 .build()
                 .asUserBound());
     }


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


[james-project] 25/32: [REFACTORING] StandardMailboxMetaDataComparator should rely on Java 8

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 f9850ee4486a50cccdbb61690fd86d74c0ae47ce
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 8 12:44:58 2019 +0700

    [REFACTORING] StandardMailboxMetaDataComparator should rely on Java 8
---
 .../mailbox/StandardMailboxMetaDataComparator.java | 66 ----------------------
 .../james/mailbox/model/MailboxMetaData.java       |  9 ++-
 .../james/mailbox/store/StoreMailboxManager.java   |  3 +-
 3 files changed, 7 insertions(+), 71 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/StandardMailboxMetaDataComparator.java b/mailbox/api/src/main/java/org/apache/james/mailbox/StandardMailboxMetaDataComparator.java
deleted file mode 100644
index 7aa0ea4..0000000
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/StandardMailboxMetaDataComparator.java
+++ /dev/null
@@ -1,66 +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;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-import org.apache.james.mailbox.model.MailboxConstants;
-import org.apache.james.mailbox.model.MailboxMetaData;
-
-/**
- * Orders by name with INBOX first.
- */
-public class StandardMailboxMetaDataComparator implements Comparator<MailboxMetaData>, Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * Static comparison.
-     * 
-     * @param one
-     *            possibly null
-     * @param two
-     *            possibly null
-     * @return {@link Comparator#compare(Object, Object)}
-     */
-    public static int order(MailboxMetaData one, MailboxMetaData two) {
-        final String nameTwo = two.getPath().getName();
-        final int result;
-        final String nameOne = one.getPath().getName();
-        if (MailboxConstants.INBOX.equals(nameOne)) {
-            result = MailboxConstants.INBOX.equals(nameTwo) ? 0 : -1;
-        } else if (MailboxConstants.INBOX.equals(nameTwo)) {
-            result = 1;
-        } else if (nameOne == null) {
-            result = nameTwo == null ? 0 : 1;
-        } else if (nameTwo == null) {
-            result = -1;
-        } else {
-            result = nameOne.compareTo(nameTwo);
-        }
-        return result;
-    }
-
-    @Override
-    public int compare(MailboxMetaData one, MailboxMetaData two) {
-        return order(one, two);
-    }
-
-}
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java
index 7dc49c0..0ec6c0f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxMetaData.java
@@ -19,10 +19,9 @@
 
 package org.apache.james.mailbox.model;
 
+import java.util.Comparator;
 import java.util.Objects;
 
-import org.apache.james.mailbox.StandardMailboxMetaDataComparator;
-
 import com.google.common.base.MoreObjects;
 
 /**
@@ -65,6 +64,10 @@ public class MailboxMetaData implements Comparable<MailboxMetaData> {
         return new MailboxMetaData(path, mailboxId, delimiter, Children.CHILDREN_ALLOWED_BUT_UNKNOWN, Selectability.NONE);
     }
 
+    public static  final Comparator<MailboxMetaData> COMPARATOR = Comparator
+        .<MailboxMetaData, Boolean>comparing(metadata -> metadata.getPath().isInbox()).reversed()
+        .thenComparing(metadata -> metadata.getPath().getName());
+
     private final MailboxPath path;
     private final char delimiter;
     private final Children inferiors;
@@ -141,6 +144,6 @@ public class MailboxMetaData implements Comparable<MailboxMetaData> {
 
     @Override
     public int compareTo(MailboxMetaData o) {
-        return StandardMailboxMetaDataComparator.order(this, o);
+        return COMPARATOR.compare(this, o);
     }
 }
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 b40eb95..86f3ebe 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
@@ -40,7 +40,6 @@ import org.apache.james.mailbox.MailboxPathLocker.LockAwareExecution;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MetadataWithMailboxId;
-import org.apache.james.mailbox.StandardMailboxMetaDataComparator;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.exception.HasEmptyMailboxNameInHierarchyException;
@@ -589,7 +588,7 @@ public class StoreMailboxManager implements MailboxManager {
             .stream()
             .filter(mailboxQuery::matches)
             .map(mailbox -> toMailboxMetadata(session, mailboxes, mailbox))
-            .sorted(new StandardMailboxMetaDataComparator())
+            .sorted(MailboxMetaData.COMPARATOR)
             .collect(Guavate.toImmutableList());
     }
 


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


[james-project] 32/32: [Refactoring] Simplify MailAddressTest by fully using the power of assertj

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 52bf917a846521a41e8c515b4063808039a489f3
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Nov 7 14:54:26 2019 +0700

    [Refactoring] Simplify MailAddressTest by fully using the power of assertj
---
 .../org/apache/james/core/MailAddressTest.java     | 124 +++++++--------------
 1 file changed, 39 insertions(+), 85 deletions(-)

diff --git a/core/src/test/java/org/apache/james/core/MailAddressTest.java b/core/src/test/java/org/apache/james/core/MailAddressTest.java
index e2ed131..fb27066 100644
--- a/core/src/test/java/org/apache/james/core/MailAddressTest.java
+++ b/core/src/test/java/org/apache/james/core/MailAddressTest.java
@@ -102,100 +102,54 @@ class MailAddressTest {
             .isInstanceOf(AddressException.class);
     }
 
-    /**
-     * Test method for {@link MailAddress#MailAddress(java.lang.String, java.lang.String)}.
-     */
     @Test
-    void testMailAddressStringString() {
-        try {
-            new MailAddress("local-part", "domain");
-        } catch (AddressException e) {
-            assertThat(false).describedAs(e.getMessage()).isTrue();
-        }
-        try {
-            MailAddress a = new MailAddress("local-part", "-domain");
-            assertThat(true).describedAs(a.toString()).isFalse();
-        } catch (AddressException e) {
-            assertThat(true).isTrue();
-        }
-    }
-
-    /**
-     * Test method for {@link MailAddress#MailAddress(javax.mail.internet.InternetAddress)}.
-     */
+    void testGoodMailAddressWithLocalPartAndDomain() {
+        assertThatCode(() -> new MailAddress("local-part", "domain"))
+            .doesNotThrowAnyException();
+    }
+
+    @Test
+    void testBadMailAddressWithLocalPartAndDomain() {
+        Assertions.assertThatThrownBy(() -> new MailAddress("local-part", "-domain"))
+            .isInstanceOf(AddressException.class);
+    }
+
     @Test
     void testMailAddressInternetAddress() {
-        try {
-            new MailAddress(new InternetAddress(GOOD_QUOTED_LOCAL_PART));
-        } catch (AddressException e) {
-            System.out.println("AddressException" + e.getMessage());
-            assertThat(false).describedAs(e.getMessage()).isTrue();
-        }
+        assertThatCode(() -> new MailAddress(new InternetAddress(GOOD_QUOTED_LOCAL_PART)))
+            .doesNotThrowAnyException();
     }
 
-    /**
-     * Test method for {@link MailAddress#getDomain()}.
-     */
     @Test
-    void testGetDomain() {
-        try {
-            MailAddress a = new MailAddress(new InternetAddress(GOOD_ADDRESS));
-            assertThat(a.getDomain()).isEqualTo(GOOD_DOMAIN);
-        } catch (AddressException e) {
-            System.out.println("AddressException" + e.getMessage());
-            assertThat(false).describedAs(e.getMessage()).isTrue();
-        }
-    }
-
-    /**
-     * Test method for {@link MailAddress#getLocalPart()}.
-     */
+    void testGetDomain() throws AddressException {
+        MailAddress a = new MailAddress(new InternetAddress(GOOD_ADDRESS));
+
+        assertThat(a.getDomain()).isEqualTo(GOOD_DOMAIN);
+    }
+
     @Test
-    void testGetLocalPart() {
-        try {
-            MailAddress a = new MailAddress(new InternetAddress(GOOD_QUOTED_LOCAL_PART));
-            assertThat(a.getLocalPart()).isEqualTo(GOOD_LOCAL_PART);
-        } catch (AddressException e) {
-            System.out.println("AddressException" + e.getMessage());
-            assertThat(false).describedAs(e.getMessage()).isTrue();
-        }
-    }
-
-    /**
-     * Test method for {@link MailAddress#toString()}.
-     */
+    void testGetLocalPart() throws AddressException {
+        MailAddress a = new MailAddress(new InternetAddress(GOOD_QUOTED_LOCAL_PART));
+
+        assertThat(a.getLocalPart()).isEqualTo(GOOD_LOCAL_PART);
+    }
+
     @Test
-    void testToString() {
-        try {
-            MailAddress a = new MailAddress(new InternetAddress(GOOD_ADDRESS));
-            assertThat(a.toString()).isEqualTo(GOOD_ADDRESS);
-        } catch (AddressException e) {
-            System.out.println("AddressException" + e.getMessage());
-            assertThat(false).describedAs(e.getMessage()).isTrue();
-        }
-    }
-
-    /**
-     * Test method for {@link MailAddress#toInternetAddress()}.
-     */
+    void testToString() throws AddressException {
+        MailAddress a = new MailAddress(new InternetAddress(GOOD_ADDRESS));
+
+        assertThat(a.toString()).isEqualTo(GOOD_ADDRESS);
+    }
+
     @Test
-    void testToInternetAddress() {
-        try {
-            InternetAddress b = new InternetAddress(GOOD_ADDRESS);
-            MailAddress a = new MailAddress(b);
-            assertThat(a.toInternetAddress()).isEqualTo(b);
-            assertThat(a.toString()).isEqualTo(GOOD_ADDRESS);
-        } catch (AddressException e) {
-            System.out.println("AddressException" + e.getMessage());
-            assertThat(false).describedAs(e.getMessage()).isTrue();
-        }
-    }
-
-    /**
-     * Test method for {@link MailAddress#equals(java.lang.Object)}.
-     *
-     * @throws AddressException
-     */
+    void testToInternetAddress() throws AddressException {
+        InternetAddress b = new InternetAddress(GOOD_ADDRESS);
+        MailAddress a = new MailAddress(b);
+
+        assertThat(a.toInternetAddress()).isEqualTo(b);
+        assertThat(a.toString()).isEqualTo(GOOD_ADDRESS);
+    }
+
     @Test
     void testEqualsObject() throws AddressException {
         MailAddress a = new MailAddress(GOOD_ADDRESS);


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


[james-project] 26/32: [REFACTORING] MXRecordComparator should rely on Java 8

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 60242ffba3fdcfbbecc46f279eb10b34c5a4997f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 8 12:48:26 2019 +0700

    [REFACTORING] MXRecordComparator should rely on Java 8
---
 .../james/dnsservice/dnsjava/DNSJavaService.java   | 22 +++++-----------------
 1 file changed, 5 insertions(+), 17 deletions(-)

diff --git a/server/dns-service/dnsservice-dnsjava/src/main/java/org/apache/james/dnsservice/dnsjava/DNSJavaService.java b/server/dns-service/dnsservice-dnsjava/src/main/java/org/apache/james/dnsservice/dnsjava/DNSJavaService.java
index 0d71888..5fde4a2 100644
--- a/server/dns-service/dnsservice-dnsjava/src/main/java/org/apache/james/dnsservice/dnsjava/DNSJavaService.java
+++ b/server/dns-service/dnsservice-dnsjava/src/main/java/org/apache/james/dnsservice/dnsjava/DNSJavaService.java
@@ -106,8 +106,11 @@ public class DNSJavaService implements DNSService, DNSServiceMBean, Configurable
 
     /**
      * The MX Comparator used in the MX sort.
+     *
+     * RFC 2821 section 5 requires that we sort the MX records by their
+     * preference.
      */
-    private final Comparator<MXRecord> mxComparator = new MXRecordComparator();
+    private final Comparator<MXRecord> mxComparator = Comparator.comparing(MXRecord::getPriority);
 
     /**
      * If true register this service as the default resolver/cache for DNSJava
@@ -400,22 +403,7 @@ public class DNSJavaService implements DNSService, DNSServiceMBean, Configurable
         }
     }
 
-    /*
-     * RFC 2821 section 5 requires that we sort the MX records by their
-     * preference. Reminder for maintainers: the return value on a Comparator
-     * can be counter-intuitive for those who aren't used to the old C strcmp
-     * function:
-     * 
-     * < 0 ==> a < b = 0 ==> a = b > 0 ==> a > b
-     */
-    private static class MXRecordComparator implements Comparator<MXRecord> {
-        @Override
-        public int compare(MXRecord a, MXRecord b) {
-            int pa = a.getPriority();
-            int pb = b.getPriority();
-            return pa - pb;
-        }
-    }
+
 
     /*
      * java.net.InetAddress.get[All]ByName(String) allows an IP literal to be


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


[james-project] 18/32: Remove pseudo-support for shared mailboxes (mailboxes with null user)

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 337606144f7aa832935bc0f78a846ae6e474cfd4
Author: Raphael Ouazana <ra...@linagora.com>
AuthorDate: Fri Nov 8 16:00:11 2019 +0100

    Remove pseudo-support for shared mailboxes (mailboxes with null user)
---
 .../apache/james/mailbox/model/MailboxPath.java    |  3 +-
 .../mailbox/model/search/MailboxQueryTest.java     | 42 -----------
 .../james/event/json/dtos/MailboxPathTest.java     | 32 --------
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   | 20 ++---
 .../store/mail/model/MailboxMapperTest.java        | 87 ++--------------------
 .../org/apache/james/imap/main/PathConverter.java  |  8 +-
 .../apache/james/imap/main/PathConverterTest.java  | 46 +-----------
 .../jmap/draft/model/mailbox/MailboxNamespace.java |  1 +
 8 files changed, 17 insertions(+), 222 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
index 7c4b948..92cbde1 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxPath.java
@@ -76,8 +76,7 @@ public class MailboxPath {
     }
 
     /**
-     * Get the name of the user who owns the mailbox. This can be null e.g. for
-     * shared mailboxes.
+     * Get the name of the user who owns the mailbox.
      */
     public String getUser() {
         return user;
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
index 82b121e..08c907f 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
@@ -130,18 +130,6 @@ public class MailboxQueryTest {
     }
 
     @Test
-    public void belongsToNamespaceAndUserShouldReturnTrueWithIdenticalMailboxesWithNullUser() {
-        MailboxPath base = new MailboxPath("namespace", null, "name");
-
-        MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .userAndNamespaceFrom(base)
-            .build();
-
-        assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(mailboxPath))
-            .isTrue();
-    }
-
-    @Test
     public void belongsToNamespaceAndUserShouldReturnTrueWithIdenticalMailboxesWithNullNamespace() {
         MailboxPath mailboxPath = new MailboxPath(null, "user", "name");
 
@@ -154,16 +142,6 @@ public class MailboxQueryTest {
     }
 
     @Test
-    public void belongsToNamespaceAndUserShouldReturnTrueWithMailboxWithSameNamespaceAndUserWithNullUser() {
-        MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .userAndNamespaceFrom(new MailboxPath("namespace", null, "name"))
-            .build();
-
-        assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new MailboxPath("namespace", null, "name")))
-            .isTrue();
-    }
-
-    @Test
     public void belongsToNamespaceAndUserShouldReturnTrueWithMailboxWithSameNamespaceAndUser() {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
             .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, "name"))
@@ -194,16 +172,6 @@ public class MailboxQueryTest {
     }
     
     @Test
-    public void belongsToNamespaceAndUserShouldReturnFalseWithOneOfTheUserNull() {
-        MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, "name"))
-            .build();
-
-        assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new MailboxPath("namespace", null, "name")))
-            .isFalse();
-    }
-
-    @Test
     public void belongsToNamespaceAndUserShouldReturnFalseWhenDifferentUser() {
         MailboxQuery mailboxQuery = MailboxQuery.builder()
             .userAndNamespaceFrom(new MailboxPath("namespace", CURRENT_USER, "name"))
@@ -212,14 +180,4 @@ public class MailboxQueryTest {
         assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new MailboxPath("namespace", "other", "name")))
             .isFalse();
     }
-
-    @Test
-    public void belongsToNamespaceAndUserShouldReturnFalseIfNamespaceAreDifferentWithNullUser() {
-        MailboxQuery mailboxQuery = MailboxQuery.builder()
-            .userAndNamespaceFrom(new MailboxPath("namespace", null, "name"))
-            .build();
-
-        assertThat(mailboxQuery.belongsToRequestedNamespaceAndUser(new MailboxPath("namespace2", null, "name")))
-            .isFalse();
-    }
 }
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java
index a47e582..a35e664 100644
--- a/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/dtos/MailboxPathTest.java
@@ -47,17 +47,6 @@ class MailboxPathTest {
     }
 
     @Test
-    void mailboxPathWithNullUserShouldBeWellSerialized() {
-        assertThatJson(DTO_JSON_SERIALIZE.mailboxPathWrites().writes(DTOs.MailboxPath$.MODULE$.fromJava(
-            new MailboxPath(MailboxConstants.USER_NAMESPACE, null, MAILBOX_NAME))).toString())
-            .isEqualTo(
-                "{" +
-                "  \"namespace\":\"#private\"," +
-                "  \"name\":\"mailboxName\"" +
-                "}");
-    }
-
-    @Test
     void mailboxPathWithEmptyNamespaceShouldBeWellSerialized() {
         assertThatJson(DTO_JSON_SERIALIZE.mailboxPathWrites().writes(DTOs.MailboxPath$.MODULE$.fromJava(
             new MailboxPath("", "user", MAILBOX_NAME))).toString())
@@ -81,27 +70,6 @@ class MailboxPathTest {
     }
 
     @Test
-    void mailboxPathWithNullUserShouldBeWellDeSerialized() {
-        assertThat(DTO_JSON_SERIALIZE.mailboxPathReads().reads(Json.parse("{" +
-            "  \"namespace\":\"#private\"," +
-            "  \"user\":null," +
-            "  \"name\":\"mailboxName\"" +
-            "}")).get())
-            .isEqualTo(DTOs.MailboxPath$.MODULE$.fromJava(
-                new MailboxPath(MailboxConstants.USER_NAMESPACE, null, MAILBOX_NAME)));
-    }
-
-    @Test
-    void mailboxPathWithNoUserShouldBeWellDeSerialized() {
-        assertThat(DTO_JSON_SERIALIZE.mailboxPathReads().reads(Json.parse("{" +
-            "  \"namespace\":\"#private\"," +
-            "  \"name\":\"mailboxName\"" +
-            "}")).get())
-            .isEqualTo(DTOs.MailboxPath$.MODULE$.fromJava(
-                new MailboxPath(MailboxConstants.USER_NAMESPACE, null, MAILBOX_NAME)));
-    }
-
-    @Test
     void mailboxPathDeserializationShouldFailWhenNoNamespace() {
         assertThat(DTO_JSON_SERIALIZE.mailboxPathReads().reads(Json.parse("{" +
             "  \"user\":\"user\"," +
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index d342649..ca633e7 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -202,16 +202,10 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
     }
 
     private TypedQuery<JPAMailbox> findMailboxWithPathLikeTypedQuery(MailboxPath path) {
-        if (path.getUser() == null) {
-            return getEntityManager().createNamedQuery("findMailboxWithNameLike", JPAMailbox.class)
-                .setParameter("nameParam", path.getName())
-                .setParameter("namespaceParam", path.getNamespace());
-        } else {
-            return getEntityManager().createNamedQuery("findMailboxWithNameLikeWithUser", JPAMailbox.class)
-                .setParameter("nameParam", path.getName())
-                .setParameter("namespaceParam", path.getNamespace())
-                .setParameter("userParam", path.getUser());
-        }
+        return getEntityManager().createNamedQuery("findMailboxWithNameLikeWithUser", JPAMailbox.class)
+            .setParameter("nameParam", path.getName())
+            .setParameter("namespaceParam", path.getNamespace())
+            .setParameter("userParam", path.getUser().asId());
     }
 
     public void deleteAllMemberships() throws MailboxException {
@@ -234,11 +228,7 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
     public boolean hasChildren(Mailbox mailbox, char delimiter) throws MailboxException, MailboxNotFoundException {
         final String name = mailbox.getName() + delimiter + SQL_WILDCARD_CHAR; 
         final Long numberOfChildMailboxes;
-        if (mailbox.getUser() == null) {
-            numberOfChildMailboxes = (Long) getEntityManager().createNamedQuery("countMailboxesWithNameLike").setParameter("nameParam", name).setParameter("namespaceParam", mailbox.getNamespace()).getSingleResult();
-        } else {
-            numberOfChildMailboxes = (Long) getEntityManager().createNamedQuery("countMailboxesWithNameLikeWithUser").setParameter("nameParam", name).setParameter("namespaceParam", mailbox.getNamespace()).setParameter("userParam", mailbox.getUser()).getSingleResult();
-        }
+        numberOfChildMailboxes = (Long) getEntityManager().createNamedQuery("countMailboxesWithNameLikeWithUser").setParameter("nameParam", name).setParameter("namespaceParam", mailbox.getNamespace()).setParameter("userParam", mailbox.getUser()).getSingleResult();
         return numberOfChildMailboxes != null && numberOfChildMailboxes > 0;
     }
 
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 afca3fd..06a1909 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
@@ -60,18 +60,6 @@ public abstract class MailboxMapperTest {
     private Mailbox bobyMailbox;
     private MailboxPath bobyMailboxPath;
     private Mailbox bobInboxMailbox;
-    private MailboxPath esnDevGroupInboxPath;
-    private Mailbox esnDevGroupInboxMailbox;
-    private MailboxPath esnDevGroupHublinPath;
-    private Mailbox esnDevGroupHublinMailbox;
-    private MailboxPath esnDevGroupJamesPath;
-    private Mailbox esnDevGroupJamesMailbox;
-    private MailboxPath obmTeamGroupInboxPath;
-    private Mailbox obmTeamGroupInboxMailbox;
-    private MailboxPath obmTeamGroupOPushPath;
-    private Mailbox obmTeamGroupOPushMailbox;
-    private MailboxPath obmTeamGroupRoundCubePath;
-    private Mailbox obmTeamGroupRoundCubeMailbox;
     private MailboxPath bobDifferentNamespacePath;
     private Mailbox bobDifferentNamespaceMailbox;
 
@@ -111,20 +99,12 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void saveWithNullUserShouldPersistTheMailbox() throws MailboxException {
-        mailboxMapper.save(esnDevGroupInboxMailbox);
-        MailboxAssert.assertThat(mailboxMapper.findMailboxByPath(esnDevGroupInboxPath)).isEqualTo(esnDevGroupInboxMailbox);
-    }
-
-    @Test
     public void listShouldRetrieveAllMailbox() throws MailboxException {
         saveAll();
         List<Mailbox> mailboxes = mailboxMapper.list();
 
         assertMailboxes(mailboxes)
             .containOnly(benwaInboxMailbox, benwaWorkMailbox, benwaWorkTodoMailbox, benwaPersoMailbox, benwaWorkDoneMailbox, 
-                esnDevGroupInboxMailbox, esnDevGroupHublinMailbox, esnDevGroupJamesMailbox, 
-                obmTeamGroupInboxMailbox, obmTeamGroupOPushMailbox, obmTeamGroupRoundCubeMailbox, 
                 bobyMailbox, bobDifferentNamespaceMailbox, bobInboxMailbox);
     }
     
@@ -141,18 +121,6 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void hasChildrenWithNullUserShouldReturnFalseWhenNoChildrenExists() throws MailboxException {
-        saveAll();
-        assertThat(mailboxMapper.hasChildren(esnDevGroupHublinMailbox, DELIMITER)).isFalse();
-    }
-
-    @Test
-    public void hasChildrenWithNullUserShouldReturnTrueWhenChildrenExists() throws MailboxException {
-        saveAll();
-        assertThat(mailboxMapper.hasChildren(esnDevGroupInboxMailbox, DELIMITER)).isTrue();
-    }
-
-    @Test
     public void hasChildrenShouldNotBeAcrossUsersAndNamespace() throws MailboxException {
         saveAll();
         assertThat(mailboxMapper.hasChildren(bobInboxMailbox, '.')).isFalse();
@@ -177,15 +145,6 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void deleteWithNullUserShouldEraseTheGivenMailbox() throws MailboxException {
-        saveAll();
-        mailboxMapper.delete(esnDevGroupJamesMailbox);
-
-        assertThatThrownBy(() -> mailboxMapper.findMailboxByPath(esnDevGroupJamesPath))
-            .isInstanceOf(MailboxNotFoundException.class);
-    }
-
-    @Test
     public void findMailboxWithPathLikeWithChildRegexShouldRetrieveChildren() throws MailboxException {
         saveAll();
         MailboxPath regexPath = new MailboxPath(benwaWorkPath.getNamespace(), benwaWorkPath.getUser(), benwaWorkPath.getName() + WILDCARD);
@@ -195,36 +154,20 @@ public abstract class MailboxMapperTest {
     }
 
     @Test
-    public void findMailboxWithPathLikeWithNullUserWithChildRegexShouldRetrieveChildren() throws MailboxException {
-        saveAll();
-        MailboxPath regexPath = new MailboxPath(obmTeamGroupInboxPath.getNamespace(), obmTeamGroupInboxPath.getUser(), obmTeamGroupInboxPath.getName() + WILDCARD);
-
-        List<Mailbox> mailboxes = mailboxMapper.findMailboxWithPathLike(regexPath);
-
-        assertMailboxes(mailboxes).containOnly(obmTeamGroupInboxMailbox, obmTeamGroupOPushMailbox, obmTeamGroupRoundCubeMailbox);
-    }
-    
-    @Test
     public void findMailboxWithPathLikeWithRegexShouldRetrieveCorrespondingMailbox() throws MailboxException {
         saveAll();
-        MailboxPath regexPath = new MailboxPath(benwaInboxPath.getNamespace(), benwaInboxPath.getUser(), WILDCARD + "X");
+        MailboxQuery.UserBound mailboxQuery = MailboxQuery.builder()
+            .userAndNamespaceFrom(benwaWorkPath)
+            .expression(new ExactName("INBOX"))
+            .build()
+            .asUserBound();
 
-        List<Mailbox> mailboxes = mailboxMapper.findMailboxWithPathLike(regexPath);
+        List<Mailbox> mailboxes = mailboxMapper.findMailboxWithPathLike(mailboxQuery);
 
         assertMailboxes(mailboxes).containOnly(benwaInboxMailbox);
     }
 
     @Test
-    public void findMailboxWithPathLikeWithNullUserWithRegexShouldRetrieveCorrespondingMailbox() throws MailboxException {
-        saveAll();
-        MailboxPath regexPath = new MailboxPath(esnDevGroupInboxPath.getNamespace(), esnDevGroupInboxPath.getUser(), WILDCARD + "X");
-
-        List<Mailbox> mailboxes = mailboxMapper.findMailboxWithPathLike(regexPath);
-
-        assertMailboxes(mailboxes).containOnly(esnDevGroupInboxMailbox);
-    }
-
-    @Test
     public void findMailboxWithPathLikeShouldEscapeMailboxName() throws MailboxException {
         saveAll();
         MailboxPath regexPath = new MailboxPath(benwaInboxPath.getNamespace(), benwaInboxPath.getUser(), "INB?X");
@@ -256,12 +199,6 @@ public abstract class MailboxMapperTest {
         bobInboxPath = MailboxPath.forUser("bob", "INBOX");
         bobyMailboxPath = MailboxPath.forUser("boby", "INBOX.that.is.a.trick");
         bobDifferentNamespacePath = new MailboxPath("#private_bob", "bob", "INBOX.bob");
-        esnDevGroupInboxPath = new MailboxPath("#community_ESN_DEV", null, "INBOX");
-        esnDevGroupHublinPath = new MailboxPath("#community_ESN_DEV", null, "INBOX" + DELIMITER + "hublin");
-        esnDevGroupJamesPath = new MailboxPath("#community_ESN_DEV", null, "INBOX" + DELIMITER + "james");
-        obmTeamGroupInboxPath = new MailboxPath("#community_OBM_Core_Team", null, "INBOX");
-        obmTeamGroupOPushPath = new MailboxPath("#community_OBM_Core_Team", null, "INBOX" + DELIMITER + "OPush");
-        obmTeamGroupRoundCubePath = new MailboxPath("#community_OBM_Core_Team", null, "INBOX" + DELIMITER + "roundCube");
 
         benwaInboxMailbox = createMailbox(benwaInboxPath);
         benwaWorkMailbox = createMailbox(benwaWorkPath);
@@ -269,12 +206,6 @@ public abstract class MailboxMapperTest {
         benwaPersoMailbox = createMailbox(benwaPersoPath);
         benwaWorkDoneMailbox = createMailbox(benwaWorkDonePath);
         bobInboxMailbox = createMailbox(bobInboxPath);
-        esnDevGroupInboxMailbox = createMailbox(esnDevGroupInboxPath);
-        esnDevGroupHublinMailbox = createMailbox(esnDevGroupHublinPath);
-        esnDevGroupJamesMailbox = createMailbox(esnDevGroupJamesPath);
-        obmTeamGroupInboxMailbox = createMailbox(obmTeamGroupInboxPath);
-        obmTeamGroupOPushMailbox = createMailbox(obmTeamGroupOPushPath);
-        obmTeamGroupRoundCubeMailbox = createMailbox(obmTeamGroupRoundCubePath);
         bobyMailbox = createMailbox(bobyMailboxPath);
         bobDifferentNamespaceMailbox = createMailbox(bobDifferentNamespacePath);
     }
@@ -285,12 +216,6 @@ public abstract class MailboxMapperTest {
         mailboxMapper.save(benwaWorkTodoMailbox);
         mailboxMapper.save(benwaPersoMailbox);
         mailboxMapper.save(benwaWorkDoneMailbox);
-        mailboxMapper.save(esnDevGroupInboxMailbox);
-        mailboxMapper.save(esnDevGroupHublinMailbox);
-        mailboxMapper.save(esnDevGroupJamesMailbox);
-        mailboxMapper.save(obmTeamGroupInboxMailbox);
-        mailboxMapper.save(obmTeamGroupOPushMailbox);
-        mailboxMapper.save(obmTeamGroupRoundCubeMailbox);
         mailboxMapper.save(bobyMailbox);
         mailboxMapper.save(bobDifferentNamespaceMailbox);
         mailboxMapper.save(bobInboxMailbox);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java b/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
index d348fbc..e7d5ff6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/main/PathConverter.java
@@ -48,7 +48,7 @@ public class PathConverter {
 
     public MailboxPath buildFullPath(String mailboxName) {
         if (Strings.isNullOrEmpty(mailboxName)) {
-            return buildDefaultPath();
+            return buildRelativePath("");
         }
         if (isAbsolute(mailboxName)) {
             return buildAbsolutePath(mailboxName);
@@ -57,10 +57,6 @@ public class PathConverter {
         }
     }
 
-    private MailboxPath buildDefaultPath() {
-        return new MailboxPath("", "", "");
-    }
-
     private boolean isAbsolute(String mailboxName) {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(mailboxName));
         return mailboxName.charAt(0) == MailboxConstants.NAMESPACE_PREFIX_CHAR;
@@ -82,7 +78,7 @@ public class PathConverter {
         if (namespace.equals(MailboxConstants.USER_NAMESPACE)) {
             return ImapSessionUtils.getUserName(session);
         }
-        return null;
+        throw new DeniedAccessOnSharedMailboxException();
     }
 
     private MailboxPath buildMailboxPath(String namespace, String user, String mailboxName) {
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterTest.java b/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterTest.java
index 893e59b..6395098 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/main/PathConverterTest.java
@@ -30,7 +30,6 @@ import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
@@ -56,13 +55,13 @@ public class PathConverterTest {
     @Test
     public void buildFullPathShouldAcceptNull() {
         assertThat(pathConverter.buildFullPath(null))
-            .isEqualTo(new MailboxPath("", "", ""));
+            .isEqualTo(new MailboxPath("", USERNAME, ""));
     }
 
     @Test
     public void buildPathShouldAcceptEmpty() {
         assertThat(pathConverter.buildFullPath(""))
-            .isEqualTo(new MailboxPath("", "", ""));
+            .isEqualTo(new MailboxPath("", USERNAME, ""));
     }
 
     @Test
@@ -72,41 +71,18 @@ public class PathConverterTest {
             .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName));
     }
 
-    @Ignore("Shared mailbox is not supported yet")
-    @Test
-    public void buildFullPathShouldAcceptNamespacePrefix() {
-        assertThat(pathConverter.buildFullPath("#"))
-            .isEqualTo(new MailboxPath("#", null, ""));
-    }
-
     @Test
     public void buildFullPathShouldAcceptUserNamespace() {
         assertThat(pathConverter.buildFullPath(MailboxConstants.USER_NAMESPACE))
             .isEqualTo(MailboxPath.forUser(USERNAME, ""));
     }
 
-    @Ignore("Shared mailbox is not supported yet")
-    @Test
-    public void buildFullPathShouldAcceptNamespaceAlone() {
-        String namespace = "#any";
-        assertThat(pathConverter.buildFullPath(namespace))
-            .isEqualTo(new MailboxPath(namespace, null, ""));
-    }
-
     @Test
     public void buildFullPathShouldAcceptUserNamespaceAndDelimiter() {
         assertThat(pathConverter.buildFullPath(MailboxConstants.USER_NAMESPACE + PATH_DELIMITER))
             .isEqualTo(MailboxPath.forUser(USERNAME, ""));
     }
 
-    @Ignore("Shared mailbox is not supported yet")
-    @Test
-    public void buildFullPathShouldAcceptNamespaceAndDelimiter() {
-        String namespace = "#any";
-        assertThat(pathConverter.buildFullPath(namespace + PATH_DELIMITER))
-            .isEqualTo(new MailboxPath(namespace, null, ""));
-    }
-
     @Test
     public void buildFullPathShouldAcceptFullAbsoluteUserPath() {
         String mailboxName = "mailboxName";
@@ -114,15 +90,6 @@ public class PathConverterTest {
             .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName));
     }
 
-    @Ignore("Shared mailbox is not supported yet")
-    @Test
-    public void buildFullPathShouldAcceptFullAbsolutePath() {
-        String namespace = "#any";
-        String mailboxName = "mailboxName";
-        assertThat(pathConverter.buildFullPath(namespace + PATH_DELIMITER + mailboxName))
-            .isEqualTo(new MailboxPath(namespace, null, mailboxName));
-    }
-
     @Test
     public void buildFullPathShouldAcceptRelativePathWithSubFolder() {
         String mailboxName = "mailboxName" + PATH_DELIMITER + "subFolder";
@@ -137,15 +104,6 @@ public class PathConverterTest {
             .isEqualTo(MailboxPath.forUser(USERNAME, mailboxName));
     }
 
-    @Ignore("Shared mailbox is not supported yet")
-    @Test
-    public void buildFullPathShouldAcceptAbsolutePathWithSubFolder() {
-        String namespace = "#any";
-        String mailboxName = "mailboxName.subFolder";
-        assertThat(pathConverter.buildFullPath(namespace + PATH_DELIMITER + mailboxName))
-            .isEqualTo(new MailboxPath(namespace, null, mailboxName));
-    }
-
     @Test
     public void buildFullPathShouldDenyMailboxPathNotBelongingToTheUser() {
         expectedException.expect(DeniedAccessOnSharedMailboxException.class);
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/MailboxNamespace.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/MailboxNamespace.java
index a0447b3..1a730f1 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/MailboxNamespace.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/mailbox/MailboxNamespace.java
@@ -42,6 +42,7 @@ public class MailboxNamespace {
     }
 
     public static MailboxNamespace delegated(String owner) {
+        Preconditions.checkArgument(owner != null);
         Preconditions.checkArgument(!StringUtils.isBlank(owner));
         return new MailboxNamespace(Type.Delegated, Optional.of(owner));
     }


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


[james-project] 03/32: [Refactoring] StatusProcessor: 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 141faa52c2eeedb92b68c2254e11acd58f98a02f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:20:03 2019 +0700

    [Refactoring] StatusProcessor: Avoid final variables
---
 .../james/imap/processor/StatusProcessor.java      | 30 +++++++++++-----------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index 5355051..5dd0ab4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -53,35 +53,35 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
 
     @Override
     protected void doProcess(StatusRequest request, ImapSession session, Tag tag, ImapCommand command, Responder responder) {
-        final MailboxPath mailboxPath = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
-        final StatusDataItems statusDataItems = request.getStatusDataItems();
-        final MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
+        MailboxPath mailboxPath = PathConverter.forSession(session).buildFullPath(request.getMailboxName());
+        StatusDataItems statusDataItems = request.getStatusDataItems();
+        MailboxSession mailboxSession = ImapSessionUtils.getMailboxSession(session);
 
         try {
             LOGGER.debug("Status called on mailbox named {}", mailboxPath);
 
-            final MailboxManager mailboxManager = getMailboxManager();
-            final MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
-            final MessageManager.MetaData.FetchGroup fetchGroup;
+            MailboxManager mailboxManager = getMailboxManager();
+            MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
+            MessageManager.MetaData.FetchGroup fetchGroup;
             if (statusDataItems.isUnseen()) {
                 fetchGroup = MessageManager.MetaData.FetchGroup.UNSEEN_COUNT;
             } else {
                 fetchGroup = MessageManager.MetaData.FetchGroup.NO_UNSEEN;
             }
-            final MessageManager.MetaData metaData = mailbox.getMetaData(false, mailboxSession, fetchGroup);
-
-            final Long messages = messages(statusDataItems, metaData);
-            final Long recent = recent(statusDataItems, metaData);
-            final MessageUid uidNext = uidNext(statusDataItems, metaData);
-            final Long uidValidity = uidValidity(statusDataItems, metaData);
-            final Long unseen = unseen(statusDataItems, metaData);
-            final Long highestModSeq = highestModSeq(statusDataItems, metaData);
+            MessageManager.MetaData metaData = mailbox.getMetaData(false, mailboxSession, fetchGroup);
+
+            Long messages = messages(statusDataItems, metaData);
+            Long recent = recent(statusDataItems, metaData);
+            MessageUid uidNext = uidNext(statusDataItems, metaData);
+            Long uidValidity = uidValidity(statusDataItems, metaData);
+            Long unseen = unseen(statusDataItems, metaData);
+            Long highestModSeq = highestModSeq(statusDataItems, metaData);
             
             // Enable CONDSTORE as this is a CONDSTORE enabling command
             if (highestModSeq != null) {
                 condstoreEnablingCommand(session, responder, metaData, false); 
             }
-            final MailboxStatusResponse response = new MailboxStatusResponse(messages, recent, uidNext, highestModSeq, uidValidity, unseen, request.getMailboxName());
+            MailboxStatusResponse response = new MailboxStatusResponse(messages, recent, uidNext, highestModSeq, uidValidity, unseen, request.getMailboxName());
             responder.respond(response);
             unsolicitedResponses(session, responder, false);
             okComplete(command, tag, responder);


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


[james-project] 02/32: [Refactoring] StatusProcessor: Avoid variable reallocation

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 bb31c7647eb649a1e5be6f63a4230c4401bf7c4d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:19:18 2019 +0700

    [Refactoring] StatusProcessor: Avoid variable reallocation
---
 .../james/imap/processor/StatusProcessor.java      | 36 ++++++++--------------
 1 file changed, 12 insertions(+), 24 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index d761d57..5355051 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -93,65 +93,53 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
     }
 
     private Long unseen(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
-        final Long unseen;
         if (statusDataItems.isUnseen()) {
-            unseen = metaData.getUnseenCount();
+            return metaData.getUnseenCount();
         } else {
-            unseen = null;
+            return null;
         }
-        return unseen;
     }
 
     private Long uidValidity(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
-        final Long uidValidity;
         if (statusDataItems.isUidValidity()) {
-            uidValidity = metaData.getUidValidity();
+            return metaData.getUidValidity();
         } else {
-            uidValidity = null;
+            return null;
         }
-        return uidValidity;
     }
 
 
     private Long highestModSeq(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
-        final Long highestModSeq;
         if (statusDataItems.isHighestModSeq()) {
-            highestModSeq = metaData.getHighestModSeq();
+            return metaData.getHighestModSeq();
         } else {
-            highestModSeq = null;
+            return null;
         }
-        return highestModSeq;
     }
 
     
     private MessageUid uidNext(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
-        final MessageUid uidNext;
         if (statusDataItems.isUidNext()) {
-            uidNext = metaData.getUidNext();
+            return metaData.getUidNext();
         } else {
-            uidNext = null;
+            return null;
         }
-        return uidNext;
     }
 
     private Long recent(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
-        final Long recent;
         if (statusDataItems.isRecent()) {
-            recent = metaData.countRecent();
+            return metaData.countRecent();
         } else {
-            recent = null;
+            return null;
         }
-        return recent;
     }
 
     private Long messages(StatusDataItems statusDataItems, MessageManager.MetaData metaData) throws MailboxException {
-        final Long messages;
         if (statusDataItems.isMessages()) {
-            messages = metaData.getMessageCount();
+           return metaData.getMessageCount();
         } else {
-            messages = null;
+            return null;
         }
-        return messages;
     }
 
     @Override


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


[james-project] 11/32: [Refactoring] StatusCommandParser should not use final variable

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 798f24b905fd3f7709a7b9f10dc743f770d41ebe
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:47:55 2019 +0700

    [Refactoring] StatusCommandParser should not use final variable
---
 .../org/apache/james/imap/decode/parser/StatusCommandParser.java    | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
index 92babee..c319e98 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/StatusCommandParser.java
@@ -83,9 +83,9 @@ public class StatusCommandParser extends AbstractImapCommandParser {
     }
 
     @Override
-    protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
-        final String mailboxName = request.mailbox();
-        final StatusDataItems statusDataItems = statusDataItems(request);
+        protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, ImapSession session) throws DecodingException {
+        String mailboxName = request.mailbox();
+        StatusDataItems statusDataItems = statusDataItems(request);
         request.eol();
         return new StatusRequest(command, mailboxName, statusDataItems, tag);
     }


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


[james-project] 30/32: [Refactoring] Parameterized MailAddress creation 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 61cbd4664ead1f7b8b42ea029d0a5cbb6dfbdf5f
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Nov 7 14:41:38 2019 +0700

    [Refactoring] Parameterized MailAddress creation tests
---
 core/pom.xml                                       |   5 +
 .../org/apache/james/core/MailAddressTest.java     | 121 ++++++++++-----------
 2 files changed, 65 insertions(+), 61 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index e8035f4..bde5d28 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -66,6 +66,11 @@
             <artifactId>commons-io</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
diff --git a/core/src/test/java/org/apache/james/core/MailAddressTest.java b/core/src/test/java/org/apache/james/core/MailAddressTest.java
index 0817587..ff1ccac 100644
--- a/core/src/test/java/org/apache/james/core/MailAddressTest.java
+++ b/core/src/test/java/org/apache/james/core/MailAddressTest.java
@@ -20,13 +20,18 @@
 package org.apache.james.core;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Fail.fail;
+import static org.assertj.core.api.Assertions.assertThatCode;
+
+import java.util.stream.Stream;
 
 import javax.mail.internet.AddressException;
 import javax.mail.internet.InternetAddress;
 
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
@@ -37,47 +42,51 @@ class MailAddressTest {
     private static final String GOOD_ADDRESS = "server-dev@james.apache.org";
     private static final Domain GOOD_DOMAIN = Domain.of("james.apache.org");
 
-    private static final String[] GOOD_ADDRESSES = {
-            GOOD_ADDRESS,
-            GOOD_QUOTED_LOCAL_PART,
-            "server-dev@james-apache.org",
-            "server-dev@[127.0.0.1]",
-            "server-dev@#123",
-            "server-dev@#123.apache.org",
-            "server.dev@james.apache.org",
-            "\\.server-dev@james.apache.org",
-            "server-dev\\.@james.apache.org",
+    private static Stream<Arguments> goodAddresses() {
+        return Stream.of(
+                GOOD_ADDRESS,
+                GOOD_QUOTED_LOCAL_PART,
+                "server-dev@james-apache.org",
+                "server-dev@[127.0.0.1]",
+                "server-dev@#123",
+                "server-dev@#123.apache.org",
+                "server.dev@james.apache.org",
+                "\\.server-dev@james.apache.org",
+                "server-dev\\.@james.apache.org")
+            .map(Arguments::of);
     };
 
-    private static final String[] BAD_ADDRESSES = {
-            "",
-            "server-dev",
-            "server-dev@",
-            "[]",
-            "server-dev@[]",
-            "server-dev@#",
-            "quoted local-part@james.apache.org",
-            "quoted@local-part@james.apache.org",
-            "local-part.@james.apache.org",
-            ".local-part@james.apache.org",
-            "local-part@.james.apache.org",
-            "local-part@james.apache.org.",
-            "local-part@james.apache..org",
-            "server-dev@-james.apache.org",
-            "server-dev@james.apache.org-",
-            "server-dev@#james.apache.org",
-            "server-dev@#123james.apache.org",
-            "server-dev@#-123.james.apache.org",
-            "server-dev@james. apache.org",
-            "server-dev@james\\.apache.org",
-            "server-dev@[300.0.0.1]",
-            "server-dev@[127.0.1]",
-            "server-dev@[0127.0.0.1]",
-            "server-dev@[127.0.1.1a]",
-            "server-dev@[127\\.0.1.1]",
-            "server-dev@[127.0.1.1.1]",
-            "server-dev@[127.0.1.-1]"
-    };
+    private static Stream<Arguments> badAddresses() {
+        return Stream.of(
+                "",
+                "server-dev",
+                "server-dev@",
+                "[]",
+                "server-dev@[]",
+                "server-dev@#",
+                "quoted local-part@james.apache.org",
+                "quoted@local-part@james.apache.org",
+                "local-part.@james.apache.org",
+                ".local-part@james.apache.org",
+                "local-part@.james.apache.org",
+                "local-part@james.apache.org.",
+                "local-part@james.apache..org",
+                "server-dev@-james.apache.org",
+                "server-dev@james.apache.org-",
+                "server-dev@#james.apache.org",
+                "server-dev@#123james.apache.org",
+                "server-dev@#-123.james.apache.org",
+                "server-dev@james. apache.org",
+                "server-dev@james\\.apache.org",
+                "server-dev@[300.0.0.1]",
+                "server-dev@[127.0.1]",
+                "server-dev@[0127.0.0.1]",
+                "server-dev@[127.0.1.1a]",
+                "server-dev@[127\\.0.1.1]",
+                "server-dev@[127.0.1.1.1]",
+                "server-dev@[127.0.1.-1]")
+            .map(Arguments::of);
+    }
 
     /**
      * Test method for {@link MailAddress#hashCode()}.
@@ -91,28 +100,18 @@ class MailAddressTest {
         assertThat(a.hashCode()).isEqualTo(b.hashCode());
     }
 
-    /**
-     * Test method for {@link MailAddress#MailAddress(java.lang.String)}.
-     *
-     * @throws AddressException
-     */
-    @Test
-    void testMailAddressString() throws AddressException {
-        MailAddress a = new MailAddress(GOOD_ADDRESS);
-        assertThat(a.toString()).isEqualTo(GOOD_ADDRESS);
-
-        for (String goodAddress : GOOD_ADDRESSES) {
-            try {
-                a = new MailAddress(goodAddress);
-            } catch (AddressException e) {
-                fail(e.getMessage());
-            }
-        }
+    @ParameterizedTest
+    @MethodSource("goodAddresses")
+    void testGoodMailAddressString(String mailAddress) {
+        assertThatCode(() -> new MailAddress(mailAddress))
+            .doesNotThrowAnyException();
+    }
 
-        for (String badAddress : BAD_ADDRESSES) {
-            Assertions.assertThatThrownBy(() -> new MailAddress(badAddress))
-                .isInstanceOf(AddressException.class);
-        }
+    @ParameterizedTest
+    @MethodSource("badAddresses")
+    void testBadMailAddressString(String mailAddress) {
+        Assertions.assertThatThrownBy(() -> new MailAddress(mailAddress))
+            .isInstanceOf(AddressException.class);
     }
 
     /**


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


[james-project] 24/32: [REFACTORING] JPA should not depend on search comparators

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 a858a965ecbb587ed44396afb9fae5d6fc5150ac
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Nov 8 12:35:55 2019 +0700

    [REFACTORING] JPA should not depend on search comparators
---
 .../mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java      | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index 5480e1d..792209d 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -59,7 +59,6 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.Property;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
-import org.apache.james.mailbox.store.search.comparator.UidComparator;
 import org.apache.james.mime4j.MimeException;
 import org.apache.openjpa.persistence.jdbc.ElementJoinColumn;
 import org.apache.openjpa.persistence.jdbc.ElementJoinColumns;
@@ -98,7 +97,7 @@ import com.google.common.base.Objects;
 @MappedSuperclass
 public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
 
-    private static final Comparator<MailboxMessage> MESSAGE_UID_COMPARATOR = new UidComparator();
+    private static final Comparator<MailboxMessage> MESSAGE_UID_COMPARATOR = Comparator.comparing(MailboxMessage::getUid);
     private static final String TOSTRING_SEPARATOR = " ";
 
     /** Identifies composite key */


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


[james-project] 27/32: [Refactoring] Use a default method for MailboxMessage::compareTo

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 0794c5ba49d050c31b9adce2da4266ddafd5b1a5
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 09:25:02 2019 +0700

    [Refactoring] Use a default method for MailboxMessage::compareTo
---
 .../jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java        | 8 --------
 .../james/mailbox/store/mail/model/DelegatingMailboxMessage.java | 5 -----
 .../apache/james/mailbox/store/mail/model/MailboxMessage.java    | 9 ++++++---
 .../org/apache/james/mailbox/store/SimpleMailboxMembership.java  | 5 -----
 .../james/mailbox/store/mail/model/ListMessageAssertTest.java    | 5 -----
 5 files changed, 6 insertions(+), 26 deletions(-)

diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
index 792209d..306a436 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/AbstractJPAMailboxMessage.java
@@ -23,7 +23,6 @@ import java.io.InputStream;
 import java.io.SequenceInputStream;
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 
@@ -96,8 +95,6 @@ import com.google.common.base.Objects;
         @NamedQuery(name = "deleteAllMemberships", query = "DELETE FROM MailboxMessage message") })
 @MappedSuperclass
 public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
-
-    private static final Comparator<MailboxMessage> MESSAGE_UID_COMPARATOR = Comparator.comparing(MailboxMessage::getUid);
     private static final String TOSTRING_SEPARATOR = " ";
 
     /** Identifies composite key */
@@ -487,11 +484,6 @@ public abstract class AbstractJPAMailboxMessage implements MailboxMessage {
         return new DefaultMessageId();
     }
 
-    @Override
-    public int compareTo(MailboxMessage other) {
-        return MESSAGE_UID_COMPARATOR.compare(this, other);
-    }
-
     public String toString() {
         return "message("
                 + "mailboxId = " + this.getMailboxId() + TOSTRING_SEPARATOR
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
index fde3f82..46e5a94 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/DelegatingMailboxMessage.java
@@ -37,11 +37,6 @@ public abstract class DelegatingMailboxMessage implements MailboxMessage {
     }
 
     @Override
-    public int compareTo(MailboxMessage other) {
-        return this.getUid().compareTo(other.getUid());
-    }
-
-    @Override
     public final Flags createFlags() {
         return FlagsFactory.createFlags(this, createUserFlags());
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
index 2936f1e..399fc10 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/MailboxMessage.java
@@ -43,7 +43,7 @@ public interface MailboxMessage extends Message, Comparable<MailboxMessage> {
      * Return the uid
      */
     MessageUid getUid();
-    
+
     /**
      * Set the uid for the message. This must be called before the message is added to the store
      * and must be unique / sequential.
@@ -51,11 +51,11 @@ public interface MailboxMessage extends Message, Comparable<MailboxMessage> {
     void setUid(MessageUid uid);
 
     /**
-     * Set the mod-sequence for the message. This must be called before the message is added to the store 
+     * Set the mod-sequence for the message. This must be called before the message is added to the store
      * or any flags are changed. This must be unique / sequential.
      */
     void setModSeq(long modSeq);
-    
+
     /**
      * Return the mod-sequence for the message
      */
@@ -109,4 +109,7 @@ public interface MailboxMessage extends Message, Comparable<MailboxMessage> {
         return new MessageMetaData(getUid(), getModSeq(), createFlags(), getFullContentOctets(), getInternalDate(), getMessageId());
     }
 
+    default int compareTo(MailboxMessage other) {
+        return this.getUid().compareTo(other.getUid());
+    }
 }
\ No newline at end of file
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
index 7e50a95..322f87a 100644
--- 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
@@ -282,11 +282,6 @@ public class SimpleMailboxMembership implements MailboxMessage {
     }
 
     @Override
-    public int compareTo(MailboxMessage other) {
-        return getUid().compareTo(other.getUid());
-    }
-
-    @Override
     public long getModSeq() {
         return modSeq;
     }
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 ad84d6a..ee42ac9 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
@@ -159,11 +159,6 @@ public class ListMessageAssertTest {
             }
 
             @Override
-            public int compareTo(MailboxMessage o) {
-                return 0;
-            }
-
-            @Override
             public long getHeaderOctets() {
                 return bodyStart;
             }


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


[james-project] 20/32: MAILBOX-391 MailboxQuery should implement Equals & HashCode

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 42769f59e55daef36a52fa9fceadaf2bbe99c753
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Nov 12 11:25:30 2019 +0700

    MAILBOX-391 MailboxQuery should implement Equals & HashCode
---
 .../apache/james/mailbox/model/search/ExactName.java   | 17 +++++++++++++++++
 .../james/mailbox/model/search/MailboxQuery.java       | 18 ++++++++++++++++++
 .../james/mailbox/model/search/PrefixedRegex.java      | 18 ++++++++++++++++++
 .../james/mailbox/model/search/PrefixedWildcard.java   | 17 +++++++++++++++++
 .../james/mailbox/model/search/ExactNameTest.java      |  9 ++++++++-
 .../james/mailbox/model/search/MailboxQueryTest.java   |  8 ++++++++
 .../james/mailbox/model/search/PrefixedRegexTest.java  |  9 +++++++++
 .../mailbox/model/search/PrefixedWildcardTest.java     |  8 ++++++++
 8 files changed, 103 insertions(+), 1 deletion(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java
index 347e978..1a9b0c8 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/ExactName.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.model.search;
 
+import java.util.Objects;
+
 import com.google.common.base.Preconditions;
 
 public class ExactName implements MailboxNameExpression {
@@ -45,4 +47,19 @@ public class ExactName implements MailboxNameExpression {
     public boolean isWild() {
         return false;
     }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof ExactName) {
+            ExactName exactName = (ExactName) o;
+
+            return Objects.equals(this.name, exactName.name);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(name);
+    }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
index 388280f..4ed7c58 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.model.search;
 
+import java.util.Objects;
 import java.util.Optional;
 
 import org.apache.james.core.Username;
@@ -182,6 +183,23 @@ public class MailboxQuery {
         return new UserBound(namespace, user, mailboxNameExpression);
     }
 
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof MailboxQuery) {
+            MailboxQuery that = (MailboxQuery) o;
+
+            return Objects.equals(this.namespace, that.namespace)
+                && Objects.equals(this.user, that.user)
+                && Objects.equals(this.mailboxNameExpression, that.mailboxNameExpression);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(namespace, user, mailboxNameExpression);
+    }
+
     public String toString() {
         return MoreObjects.toStringHelper(this)
             .add("namespace", namespace)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java
index 3c96a69..86e6743 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedRegex.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.model.search;
 
+import java.util.Objects;
 import java.util.Optional;
 import java.util.StringTokenizer;
 import java.util.regex.Pattern;
@@ -109,4 +110,21 @@ public class PrefixedRegex implements MailboxNameExpression {
             return Pattern.quote(token);
         }
     }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof PrefixedRegex) {
+            PrefixedRegex that = (PrefixedRegex) o;
+
+            return Objects.equals(this.pathDelimiter, that.pathDelimiter)
+                && Objects.equals(this.prefix, that.prefix)
+                && Objects.equals(this.regex, that.regex);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(prefix, regex, pathDelimiter);
+    }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java
index cbc1934..ae1e6fb 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/PrefixedWildcard.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.model.search;
 
+import java.util.Objects;
+
 import com.google.common.base.Preconditions;
 
 public class PrefixedWildcard implements MailboxNameExpression {
@@ -44,4 +46,19 @@ public class PrefixedWildcard implements MailboxNameExpression {
     public boolean isWild() {
         return true;
     }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof PrefixedWildcard) {
+            PrefixedWildcard that = (PrefixedWildcard) o;
+
+            return Objects.equals(this.prefix, that.prefix);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(prefix);
+    }
 }
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/ExactNameTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/ExactNameTest.java
index c63bf00..94ca305 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/ExactNameTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/ExactNameTest.java
@@ -24,11 +24,18 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.junit.Test;
 
-public class ExactNameTest {
+import nl.jqno.equalsverifier.EqualsVerifier;
 
+public class ExactNameTest {
     public static final String NAME = "toto";
 
     @Test
+    public void shouldMatchBeanContract() {
+        EqualsVerifier.forClass(ExactName.class)
+            .verify();
+    }
+
+    @Test
     public void constructorShouldThrowOnNullName() {
         assertThatThrownBy(() -> new ExactName(null))
             .isInstanceOf(NullPointerException.class);
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
index 08c907f..4f87989 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/MailboxQueryTest.java
@@ -27,6 +27,8 @@ import org.apache.james.mailbox.model.search.MailboxQuery.Builder;
 import org.junit.Before;
 import org.junit.Test;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 public class MailboxQueryTest {
     private static final String CURRENT_USER = "user";
 
@@ -38,6 +40,12 @@ public class MailboxQueryTest {
     }
 
     @Test
+    public void shouldMatchBeanContract() {
+        EqualsVerifier.forClass(MailboxQuery.class)
+            .verify();
+    }
+
+    @Test
     public void buildShouldMatchAllValuesWhenMatchesAll() throws Exception {
 
         MailboxQuery actual = MailboxQuery.builder()
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedRegexTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedRegexTest.java
index 03a8351..6092e05 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedRegexTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedRegexTest.java
@@ -23,12 +23,21 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.junit.Test;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 public class PrefixedRegexTest {
     private static final char PATH_DELIMITER = '.';
     private static final String PREFIX = "name";
     private static final String EMPTY_PREFIX = "";
 
     @Test
+    public void shouldMatchBeanContract() {
+        EqualsVerifier.forClass(PrefixedRegex.class)
+            .withIgnoredFields("pattern")
+            .verify();
+    }
+
+    @Test
     public void isWildShouldReturnTrueWhenOnlyFreeWildcard() throws Exception {
         PrefixedRegex prefixedRegex = new PrefixedRegex(PREFIX, "*", PATH_DELIMITER);
 
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedWildcardTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedWildcardTest.java
index 762b025..9f67a64 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedWildcardTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/search/PrefixedWildcardTest.java
@@ -24,10 +24,18 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.junit.Test;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 public class PrefixedWildcardTest {
     public static final String NAME = "toto";
 
     @Test
+    public void shouldMatchBeanContract() {
+        EqualsVerifier.forClass(PrefixedWildcard.class)
+            .verify();
+    }
+
+    @Test
     public void constructorShouldThrowOnNullName() {
         assertThatThrownBy(() -> new PrefixedWildcard(null))
             .isInstanceOf(NullPointerException.class);


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


[james-project] 31/32: [Refactoring] Remove useless test in MailAddressTest

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 49be93958bfa88eed9485acec3b3cc9a54c1e082
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Nov 7 14:45:46 2019 +0700

    [Refactoring] Remove useless test in MailAddressTest
    
    The hashCode is verified with the matchBeanContract test
---
 .../src/test/java/org/apache/james/core/MailAddressTest.java | 12 ------------
 1 file changed, 12 deletions(-)

diff --git a/core/src/test/java/org/apache/james/core/MailAddressTest.java b/core/src/test/java/org/apache/james/core/MailAddressTest.java
index ff1ccac..e2ed131 100644
--- a/core/src/test/java/org/apache/james/core/MailAddressTest.java
+++ b/core/src/test/java/org/apache/james/core/MailAddressTest.java
@@ -88,18 +88,6 @@ class MailAddressTest {
             .map(Arguments::of);
     }
 
-    /**
-     * Test method for {@link MailAddress#hashCode()}.
-     *
-     * @throws AddressException
-     */
-    @Test
-    void testHashCode() throws AddressException {
-        MailAddress a = new MailAddress(GOOD_ADDRESS);
-        MailAddress b = new MailAddress(GOOD_ADDRESS);
-        assertThat(a.hashCode()).isEqualTo(b.hashCode());
-    }
-
     @ParameterizedTest
     @MethodSource("goodAddresses")
     void testGoodMailAddressString(String mailAddress) {


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


[james-project] 06/32: [Refactoring] StatusProcessor: Extract response computation

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 1e8480bb0903abca53c57c5839e62e59ab13e0e2
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Nov 13 11:28:00 2019 +0700

    [Refactoring] StatusProcessor: Extract response computation
---
 .../james/imap/processor/StatusProcessor.java      | 24 +++++++++++-----------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
index b0bed8f..84b9a7b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/StatusProcessor.java
@@ -64,29 +64,31 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
             MessageManager mailbox = mailboxManager.getMailbox(mailboxPath, ImapSessionUtils.getMailboxSession(session));
             MessageManager.MetaData.FetchGroup fetchGroup = computeFetchGroup(statusDataItems);
             MessageManager.MetaData metaData = mailbox.getMetaData(false, mailboxSession, fetchGroup);
+            MailboxStatusResponse response = computeStatusResponse(request, statusDataItems, metaData);
 
-            Long messages = messages(statusDataItems, metaData);
-            Long recent = recent(statusDataItems, metaData);
-            MessageUid uidNext = uidNext(statusDataItems, metaData);
-            Long uidValidity = uidValidity(statusDataItems, metaData);
-            Long unseen = unseen(statusDataItems, metaData);
-            Long highestModSeq = highestModSeq(statusDataItems, metaData);
-            
             // Enable CONDSTORE as this is a CONDSTORE enabling command
-            if (highestModSeq != null) {
+            if (response.getHighestModSeq() != null) {
                 condstoreEnablingCommand(session, responder, metaData, false); 
             }
-            MailboxStatusResponse response = new MailboxStatusResponse(messages, recent, uidNext, highestModSeq, uidValidity, unseen, request.getMailboxName());
             responder.respond(response);
             unsolicitedResponses(session, responder, false);
             okComplete(command, tag, responder);
-
         } catch (MailboxException e) {
             LOGGER.error("Status failed for mailbox {}", mailboxPath, e);
             no(command, tag, responder, HumanReadableText.SEARCH_FAILED);
         }
     }
 
+    private MailboxStatusResponse computeStatusResponse(StatusRequest request, StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
+        Long messages = messages(statusDataItems, metaData);
+        Long recent = recent(statusDataItems, metaData);
+        MessageUid uidNext = uidNext(statusDataItems, metaData);
+        Long uidValidity = uidValidity(statusDataItems, metaData);
+        Long unseen = unseen(statusDataItems, metaData);
+        Long highestModSeq = highestModSeq(statusDataItems, metaData);
+        return new MailboxStatusResponse(messages, recent, uidNext, highestModSeq, uidValidity, unseen, request.getMailboxName());
+    }
+
     private MessageManager.MetaData.FetchGroup computeFetchGroup(StatusDataItems statusDataItems) {
         if (statusDataItems.isUnseen()) {
             return MessageManager.MetaData.FetchGroup.UNSEEN_COUNT;
@@ -111,7 +113,6 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
         }
     }
 
-
     private Long highestModSeq(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isHighestModSeq()) {
             return metaData.getHighestModSeq();
@@ -119,7 +120,6 @@ public class StatusProcessor extends AbstractMailboxProcessor<StatusRequest> {
             return null;
         }
     }
-
     
     private MessageUid uidNext(StatusDataItems statusDataItems, MessageManager.MetaData metaData) {
         if (statusDataItems.isUidNext()) {


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


[james-project] 19/32: MAILBOX-391 MailboxMapper::findMailboxWithPathLike should use MailboxQuery.UserBound

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 86044a30a55c9a4bdefddec6aa95d7020b2d193e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 11 16:55:44 2019 +0700

    MAILBOX-391  MailboxMapper::findMailboxWithPathLike should use MailboxQuery.UserBound
---
 .../james/mailbox/model/search/MailboxQuery.java   | 26 ++++++++++++++--
 .../cassandra/mail/CassandraMailboxMapper.java     | 13 ++++----
 .../cassandra/mail/CassandraMailboxMapperTest.java | 33 +++++++++++++++-----
 .../james/mailbox/jpa/mail/JPAMailboxMapper.java   | 18 ++++++-----
 .../jpa/mail/TransactionalMailboxMapper.java       |  5 +--
 .../mailbox/maildir/mail/MaildirMailboxMapper.java | 31 ++++++++++++-------
 .../inmemory/mail/InMemoryMailboxMapper.java       | 12 ++------
 .../MailboxExpressionBackwardCompatibility.java    | 35 +++++++++++++++++++++
 .../james/mailbox/store/StoreMailboxManager.java   | 36 +++++++++++-----------
 .../james/mailbox/store/mail/MailboxMapper.java    |  3 +-
 .../store/quota/DefaultUserQuotaRootResolver.java  |  8 ++++-
 .../mailbox/store/StoreMailboxManagerTest.java     | 23 ++++++++++----
 .../store/mail/model/MailboxMapperTest.java        | 30 ++++++++++++++----
 .../quota/DefaultUserQuotaRootResolverTest.java    |  2 +-
 14 files changed, 196 insertions(+), 79 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
index 616b108..388280f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/search/MailboxQuery.java
@@ -34,7 +34,7 @@ import com.google.common.base.Preconditions;
 /**
  * Expresses select criteria for mailboxes.
  */
-public final class MailboxQuery {
+public class MailboxQuery {
 
     public static Builder builder() {
         return new Builder();
@@ -110,8 +110,24 @@ public final class MailboxQuery {
         }
     }
 
-    private final Optional<String> namespace;
-    private final Optional<String> user;
+    public static class UserBound extends MailboxQuery {
+        private UserBound(Optional<String> namespace, Optional<String> user, MailboxNameExpression mailboxNameExpression) {
+            super(namespace, user, mailboxNameExpression);
+            Preconditions.checkArgument(namespace.isPresent());
+            Preconditions.checkArgument(user.isPresent());
+        }
+
+        public String getFixedNamespace() {
+            return namespace.get();
+        }
+
+        public String getFixedUser() {
+            return user.get();
+        }
+    }
+
+    protected final Optional<String> namespace;
+    protected final Optional<String> user;
     private final MailboxNameExpression mailboxNameExpression;
 
     /**
@@ -162,6 +178,10 @@ public final class MailboxQuery {
             && isExpressionMatch(mailboxPath.getName());
     }
 
+    public UserBound asUserBound() {
+        return new UserBound(namespace, user, mailboxNameExpression);
+    }
+
     public String toString() {
         return MoreObjects.toStringHelper(this)
             .add("namespace", namespace)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
index 919a9c2..06d5246 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapper.java
@@ -39,6 +39,7 @@ import org.apache.james.mailbox.model.MailboxACL;
 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.model.search.MailboxQuery;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.util.ReactorUtils;
 import org.slf4j.Logger;
@@ -134,9 +135,9 @@ public class CassandraMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> findMailboxWithPathLike(MailboxPath path) {
-        List<Mailbox> mailboxesV2 = toMailboxes(path, mailboxPathV2DAO.listUserMailboxes(path.getNamespace(), path.getUser()));
-        List<Mailbox> mailboxesV1 = toMailboxes(path, mailboxPathDAO.listUserMailboxes(path.getNamespace(), path.getUser()));
+    public List<Mailbox> findMailboxWithPathLike(MailboxQuery.UserBound query) {
+        List<Mailbox> mailboxesV2 = toMailboxes(query, mailboxPathV2DAO.listUserMailboxes(query.getFixedNamespace(), query.getFixedUser()));
+        List<Mailbox> mailboxesV1 = toMailboxes(query, mailboxPathDAO.listUserMailboxes(query.getFixedNamespace(), query.getFixedUser()));
 
         List<Mailbox> mailboxesV1NotInV2 = mailboxesV1.stream()
             .filter(mailboxV1 -> mailboxesV2.stream()
@@ -150,11 +151,9 @@ public class CassandraMailboxMapper implements MailboxMapper {
             .build();
     }
 
-    private List<Mailbox> toMailboxes(MailboxPath path, Flux<CassandraIdAndPath> listUserMailboxes) {
-        Pattern regex = Pattern.compile(constructEscapedRegexForMailboxNameMatching(path));
-
+    private List<Mailbox> toMailboxes(MailboxQuery.UserBound query, Flux<CassandraIdAndPath> listUserMailboxes) {
         return listUserMailboxes
-                .filter(idAndPath -> regex.matcher(idAndPath.getMailboxPath().getName()).matches())
+                .filter(idAndPath -> query.isPathMatch(idAndPath.getMailboxPath()))
                 .flatMap(this::retrieveMailbox)
                 .collectList()
                 .block();
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 ff0f610..e408fb7 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
@@ -37,8 +37,9 @@ import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.exception.TooLongMailboxNameException;
 import org.apache.james.mailbox.model.Mailbox;
-import org.apache.james.mailbox.model.MailboxConstants;
 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;
@@ -55,9 +56,7 @@ public class CassandraMailboxMapperTest {
 
     private static final CassandraId MAILBOX_ID_2 = CassandraId.timeBased();
 
-
     private static final Mailbox MAILBOX_BIS = new Mailbox(MAILBOX_PATH, UID_VALIDITY, MAILBOX_ID_2);
-    private static final String WILDCARD = "%";
 
     private static final CassandraModule MODULES = CassandraModule.aggregateModules(
         CassandraMailboxModule.MODULE,
@@ -236,7 +235,12 @@ public class CassandraMailboxMapperTest {
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID)
             .block();
     
-        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, WILDCARD));
+        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
+            .privateNamespace()
+            .username(USER)
+            .expression(Wildcard.INSTANCE)
+            .build()
+            .asUserBound());
 
         assertThat(mailboxes).containsOnly(MAILBOX);
     }
@@ -250,7 +254,12 @@ public class CassandraMailboxMapperTest {
         mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
             .block();
 
-        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, WILDCARD));
+        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
+            .privateNamespace()
+            .username(USER)
+            .expression(Wildcard.INSTANCE)
+            .build()
+            .asUserBound());
 
         assertThat(mailboxes).containsOnly(MAILBOX);
     }
@@ -262,7 +271,12 @@ public class CassandraMailboxMapperTest {
         mailboxPathV2DAO.save(MAILBOX_PATH, MAILBOX_ID)
             .block();
     
-        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, WILDCARD));
+        List<Mailbox> mailboxes = testee.findMailboxWithPathLike(MailboxQuery.builder()
+            .privateNamespace()
+            .username(USER)
+            .expression(Wildcard.INSTANCE)
+            .build()
+            .asUserBound());
 
         assertThat(mailboxes).containsOnly(MAILBOX);
     }
@@ -335,7 +349,12 @@ public class CassandraMailboxMapperTest {
         mailboxPathDAO.save(MAILBOX_PATH, MAILBOX_ID_2).block();
 
         assertThat(testee.findMailboxWithPathLike(
-            new MailboxPath(MailboxConstants.USER_NAMESPACE, USER, WILDCARD)))
+            MailboxQuery.builder()
+                .privateNamespace()
+                .username(USER)
+                .expression(Wildcard.INSTANCE)
+                .build()
+                .asUserBound()))
             .containsOnly(MAILBOX);
     }
 }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
index ca633e7..8b69d39 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/JPAMailboxMapper.java
@@ -40,6 +40,8 @@ import org.apache.james.mailbox.model.MailboxACL;
 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.model.search.MailboxQuery;
+import org.apache.james.mailbox.store.MailboxExpressionBackwardCompatibility;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 
 import com.github.steveash.guavate.Guavate;
@@ -189,23 +191,25 @@ public class JPAMailboxMapper extends JPATransactionalMapper implements MailboxM
     }
 
     @Override
-    public List<Mailbox> findMailboxWithPathLike(MailboxPath path) throws MailboxException {
+    public List<Mailbox> findMailboxWithPathLike(MailboxQuery.UserBound query) throws MailboxException {
         try {
-            return findMailboxWithPathLikeTypedQuery(path)
+            String pathLike = MailboxExpressionBackwardCompatibility.getPathLike(query);
+            return findMailboxWithPathLikeTypedQuery(query.getFixedNamespace(), query.getFixedUser(), pathLike)
                 .getResultList()
                 .stream()
                 .map(JPAMailbox::toMailbox)
+                .filter(mailbox -> query.isPathMatch(mailbox.generateAssociatedPath()))
                 .collect(Guavate.toImmutableList());
         } catch (PersistenceException e) {
-            throw new MailboxException("Search of mailbox " + path + " failed", e);
+            throw new MailboxException("Search of mailbox " + query + " failed", e);
         }
     }
 
-    private TypedQuery<JPAMailbox> findMailboxWithPathLikeTypedQuery(MailboxPath path) {
+    private TypedQuery<JPAMailbox> findMailboxWithPathLikeTypedQuery(String namespace, String user, String pathLike) {
         return getEntityManager().createNamedQuery("findMailboxWithNameLikeWithUser", JPAMailbox.class)
-            .setParameter("nameParam", path.getName())
-            .setParameter("namespaceParam", path.getNamespace())
-            .setParameter("userParam", path.getUser().asId());
+            .setParameter("nameParam", pathLike)
+            .setParameter("namespaceParam", namespace)
+            .setParameter("userParam", user);
     }
 
     public void deleteAllMemberships() throws MailboxException {
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
index 98537b1..45c8706 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/TransactionalMailboxMapper.java
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.model.MailboxACL;
 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.model.search.MailboxQuery;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.transaction.Mapper;
 
@@ -71,8 +72,8 @@ public class TransactionalMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> findMailboxWithPathLike(MailboxPath mailboxPath) throws MailboxException {
-        return wrapped.findMailboxWithPathLike(mailboxPath);
+    public List<Mailbox> findMailboxWithPathLike(MailboxQuery.UserBound query) throws MailboxException {
+        return wrapped.findMailboxWithPathLike(query);
     }
 
     @Override
diff --git a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
index b7e6db5..843fe95 100644
--- a/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
+++ b/mailbox/maildir/src/main/java/org/apache/james/mailbox/maildir/mail/MaildirMailboxMapper.java
@@ -42,11 +42,15 @@ 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.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedWildcard;
+import org.apache.james.mailbox.store.MailboxExpressionBackwardCompatibility;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.transaction.NonTransactionalMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
 public class MaildirMailboxMapper extends NonTransactionalMapper implements MailboxMapper {
@@ -119,34 +123,39 @@ public class MaildirMailboxMapper extends NonTransactionalMapper implements Mail
     }
     
     @Override
-    public List<Mailbox> findMailboxWithPathLike(MailboxPath mailboxPath)
-            throws MailboxException {
+    public List<Mailbox> findMailboxWithPathLike(MailboxQuery.UserBound query) throws MailboxException {
+        String pathLike = MailboxExpressionBackwardCompatibility.getPathLike(query);
         final Pattern searchPattern = Pattern.compile("[" + MaildirStore.maildirDelimiter + "]"
-                + mailboxPath.getName().replace(".", "\\.").replace(MaildirStore.WILDCARD, ".*"));
+                + pathLike.replace(".", "\\.").replace(MaildirStore.WILDCARD, ".*"));
         FilenameFilter filter = MaildirMessageName.createRegexFilter(searchPattern);
-        File root = maildirStore.getMailboxRootForUser(mailboxPath.getUser());
+        File root = maildirStore.getMailboxRootForUser(query.getFixedUser());
         File[] folders = root.listFiles(filter);
         ArrayList<Mailbox> mailboxList = new ArrayList<>();
         for (File folder : folders) {
             if (folder.isDirectory()) {
-                Mailbox mailbox = maildirStore.loadMailbox(session, root, mailboxPath.getNamespace(), mailboxPath.getUser(), folder.getName());
+                Mailbox mailbox = maildirStore.loadMailbox(session, root, query.getFixedNamespace(), query.getFixedUser(), folder.getName());
                 mailboxList.add(mailbox);
             }
         }
         // INBOX is in the root of the folder
-        if (Pattern.matches(mailboxPath.getName().replace(MaildirStore.WILDCARD, ".*"), MailboxConstants.INBOX)) {
-            Mailbox mailbox = maildirStore.loadMailbox(session, root, mailboxPath.getNamespace(), mailboxPath.getUser(), "");
+        if (Pattern.matches(pathLike.replace(MaildirStore.WILDCARD, ".*"), MailboxConstants.INBOX)) {
+            Mailbox mailbox = maildirStore.loadMailbox(session, root, query.getFixedNamespace(), query.getFixedUser(), "");
             mailboxList.add(0, mailbox);
         }
-        return mailboxList;
+        return mailboxList.stream()
+            .filter(mailbox -> query.isPathMatch(mailbox.generateAssociatedPath()))
+            .collect(Guavate.toImmutableList());
     }
 
     @Override
     public boolean hasChildren(Mailbox mailbox, char delimiter) throws MailboxException, MailboxNotFoundException {
-        String searchString = mailbox.getName() + MaildirStore.maildirDelimiter + MaildirStore.WILDCARD;
         List<Mailbox> mailboxes = findMailboxWithPathLike(
-                new MailboxPath(mailbox.getNamespace(), mailbox.getUser(), searchString));
-        return (mailboxes.size() > 0);
+            MailboxQuery.builder()
+            .userAndNamespaceFrom(mailbox.generateAssociatedPath())
+            .expression(new PrefixedWildcard(mailbox.getName() + delimiter))
+            .build()
+            .asUserBound());
+        return mailboxes.size() > 0;
     }
 
     @Override
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
index 9014dfc..d1d28a0 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxMapper.java
@@ -35,6 +35,7 @@ import org.apache.james.mailbox.model.MailboxACL.NameType;
 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.model.search.MailboxQuery;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 
 import com.github.steveash.guavate.Guavate;
@@ -81,21 +82,14 @@ public class InMemoryMailboxMapper implements MailboxMapper {
     }
 
     @Override
-    public List<Mailbox> findMailboxWithPathLike(MailboxPath path) throws MailboxException {
-        final String regex = path.getName().replace("%", ".*");
+    public List<Mailbox> findMailboxWithPathLike(MailboxQuery.UserBound query) throws MailboxException {
         return mailboxesByPath.values()
             .stream()
-            .filter(mailbox -> mailboxMatchesRegex(mailbox, path, regex))
+            .filter(mailbox -> query.isPathMatch(mailbox.generateAssociatedPath()))
             .map(Mailbox::new)
             .collect(Guavate.toImmutableList());
     }
 
-    private boolean mailboxMatchesRegex(Mailbox mailbox, MailboxPath path, String regex) {
-        return Objects.equal(mailbox.getNamespace(), path.getNamespace())
-            && Objects.equal(mailbox.getUser(), path.getUser())
-            && mailbox.getName().matches(regex);
-    }
-
     @Override
     public MailboxId save(Mailbox mailbox) throws MailboxException {
         InMemoryId id = (InMemoryId) mailbox.getMailboxId();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxExpressionBackwardCompatibility.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxExpressionBackwardCompatibility.java
new file mode 100644
index 0000000..e8e59a7
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/MailboxExpressionBackwardCompatibility.java
@@ -0,0 +1,35 @@
+/****************************************************************
+ * 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 static org.apache.james.mailbox.store.StoreMailboxManager.SQL_WILDCARD_CHAR;
+
+import org.apache.james.mailbox.model.search.MailboxNameExpression;
+import org.apache.james.mailbox.model.search.MailboxQuery;
+
+public class MailboxExpressionBackwardCompatibility {
+    public static String getPathLike(MailboxQuery mailboxQuery) {
+        MailboxNameExpression nameExpression = mailboxQuery.getMailboxNameExpression();
+        return nameExpression.getCombinedName()
+            .replace(nameExpression.getFreeWildcard(), SQL_WILDCARD_CHAR)
+            .replace(nameExpression.getLocalWildcard(), SQL_WILDCARD_CHAR)
+            + SQL_WILDCARD_CHAR;
+    }
+}
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 b86fc79..d85608f 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
@@ -68,8 +68,8 @@ import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.MultimailboxesSearchQuery;
 import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.model.search.MailboxNameExpression;
 import org.apache.james.mailbox.model.search.MailboxQuery;
+import org.apache.james.mailbox.model.search.PrefixedWildcard;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.event.EventFactory;
@@ -85,7 +85,6 @@ import org.slf4j.LoggerFactory;
 
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -510,13 +509,17 @@ public class StoreMailboxManager implements MailboxManager {
             .block();
 
         // rename submailboxes
-        MailboxPath children = new MailboxPath(from.getNamespace(), from.getUser(), from.getName() + getDelimiter() + "%");
-        locker.executeWithLock(session, children, (LockAwareExecution<Void>) () -> {
-            List<Mailbox> subMailboxes = mapper.findMailboxWithPathLike(children);
+        MailboxQuery.UserBound query = MailboxQuery.builder()
+            .userAndNamespaceFrom(from)
+            .expression(new PrefixedWildcard(from.getName() + getDelimiter()))
+            .build()
+            .asUserBound();
+        locker.executeWithLock(session, from, (LockAwareExecution<Void>) () -> {
+            List<Mailbox> subMailboxes = mapper.findMailboxWithPathLike(query);
             for (Mailbox sub : subMailboxes) {
                 String subOriginalName = sub.getName();
                 String subNewName = to.getName() + subOriginalName.substring(from.getName().length());
-                MailboxPath fromPath = new MailboxPath(children, subOriginalName);
+                MailboxPath fromPath = new MailboxPath(from, subOriginalName);
                 sub.setName(subNewName);
                 mapper.save(sub);
                 eventBus.dispatch(EventFactory.mailboxRenamed()
@@ -574,7 +577,7 @@ public class StoreMailboxManager implements MailboxManager {
     private List<MailboxMetaData> searchMailboxes(MailboxQuery mailboxExpression, MailboxSession session, Right right) throws MailboxException {
         MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(session);
         Stream<Mailbox> baseMailboxes = mailboxMapper
-            .findMailboxWithPathLike(getPathLike(mailboxExpression, session))
+            .findMailboxWithPathLike(toSingleUserQuery(mailboxExpression, session))
             .stream();
         Stream<Mailbox> delegatedMailboxes = getDelegatedMailboxes(mailboxMapper, mailboxExpression, right, session);
         List<Mailbox> mailboxes = Stream.concat(baseMailboxes,
@@ -591,18 +594,15 @@ public class StoreMailboxManager implements MailboxManager {
             .collect(Guavate.toImmutableList());
     }
 
-    @VisibleForTesting
-    public static MailboxPath getPathLike(MailboxQuery mailboxQuery, MailboxSession mailboxSession) {
+    public static MailboxQuery.UserBound toSingleUserQuery(MailboxQuery mailboxQuery, MailboxSession mailboxSession) {
         MailboxNameExpression nameExpression = mailboxQuery.getMailboxNameExpression();
-        String combinedName = nameExpression.getCombinedName()
-            .replace(nameExpression.getFreeWildcard(), SQL_WILDCARD_CHAR)
-            .replace(nameExpression.getLocalWildcard(), SQL_WILDCARD_CHAR)
-            + SQL_WILDCARD_CHAR;
-        MailboxPath base = new MailboxPath(
-            mailboxQuery.getNamespace().orElse(MailboxConstants.USER_NAMESPACE),
-            mailboxQuery.getUser().orElse(mailboxSession.getUser().asString()),
-            combinedName);
-        return new MailboxPath(base, combinedName);
+
+        return MailboxQuery.builder()
+            .namespace(mailboxQuery.getNamespace().orElse(MailboxConstants.USER_NAMESPACE))
+            .username(mailboxQuery.getUser().orElse(mailboxSession.getUser().asString()))
+            .expression(nameExpression)
+            .build()
+            .asUserBound();
     }
 
     private Stream<Mailbox> getDelegatedMailboxes(MailboxMapper mailboxMapper, MailboxQuery mailboxQuery,
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
index d91e6ad..6b73444 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/MailboxMapper.java
@@ -28,6 +28,7 @@ import org.apache.james.mailbox.model.MailboxACL;
 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.model.search.MailboxQuery;
 import org.apache.james.mailbox.store.transaction.Mapper;
 
 /**
@@ -68,7 +69,7 @@ public interface MailboxMapper extends Mapper {
     /**
      * Return a List of {@link Mailbox} which name is like the given name
      */
-    List<Mailbox> findMailboxWithPathLike(MailboxPath mailboxPath)
+    List<Mailbox> findMailboxWithPathLike(MailboxQuery.UserBound query)
             throws MailboxException;
 
     /**
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
index d7f54d9..7bcd0e9 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
@@ -32,6 +32,7 @@ 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.QuotaRoot;
+import org.apache.james.mailbox.model.search.MailboxQuery;
 import org.apache.james.mailbox.quota.QuotaRootDeserializer;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
@@ -113,6 +114,11 @@ public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
         String namespace = parts.get(0);
         String user = parts.get(1);
         return factory.getMailboxMapper(mailboxSession)
-            .findMailboxWithPathLike(new MailboxPath(namespace, user, "%"));
+            .findMailboxWithPathLike(MailboxQuery.builder()
+                .namespace(namespace)
+                .user(Username.of(user))
+                .matchesAllMailboxNames()
+                .build()
+                .asUserBound());
     }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index c00c201..db99510 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.exception.NotAdminException;
 import org.apache.james.mailbox.exception.UserDoesNotExistException;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxACL;
+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.MessageId;
@@ -195,7 +196,7 @@ public class StoreMailboxManagerTest {
     }
 
     @Test
-    public void getPathLikeShouldReturnUserPathLikeWhenNoPrefixDefined() throws Exception {
+    public void getPathLikeShouldReturnUserPathLikeWhenNoPrefixDefined() {
         //Given
         MailboxSession session = MailboxSessionUtil.create("user");
         MailboxQuery.Builder testee = MailboxQuery.builder()
@@ -203,12 +204,17 @@ public class StoreMailboxManagerTest {
         //When
         MailboxQuery mailboxQuery = testee.build();
 
-        assertThat(StoreMailboxManager.getPathLike(mailboxQuery, session))
-            .isEqualTo(MailboxPath.forUser("user", "abc%"));
+        assertThat(StoreMailboxManager.toSingleUserQuery(mailboxQuery, session))
+            .isEqualTo(MailboxQuery.builder()
+                .namespace(MailboxConstants.USER_NAMESPACE)
+                .username("user")
+                .expression(new PrefixedRegex(EMPTY_PREFIX, "abc", session.getPathDelimiter()))
+                .build()
+                .asUserBound());
     }
 
     @Test
-    public void getPathLikeShouldReturnUserPathLikeWhenPrefixDefined() throws Exception {
+    public void getPathLikeShouldReturnUserPathLikeWhenPrefixDefined() {
         //Given
         MailboxSession session = MailboxSessionUtil.create("user");
         MailboxQuery.Builder testee = MailboxQuery.builder()
@@ -217,8 +223,13 @@ public class StoreMailboxManagerTest {
         //When
         MailboxQuery mailboxQuery = testee.build();
 
-        assertThat(StoreMailboxManager.getPathLike(mailboxQuery, session))
-            .isEqualTo(MailboxPath.forUser("user", "prefix.abc%"));
+        assertThat(StoreMailboxManager.toSingleUserQuery(mailboxQuery, session))
+            .isEqualTo(MailboxQuery.builder()
+                .namespace(MailboxConstants.USER_NAMESPACE)
+                .username("user")
+                .expression(new PrefixedRegex("prefix.", "abc", session.getPathDelimiter()))
+                .build()
+                .asUserBound());
     }
 }
 
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 06a1909..739d1bd 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
@@ -32,6 +32,9 @@ import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxAssert;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
+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;
 
@@ -129,8 +132,13 @@ public abstract class MailboxMapperTest {
     @Test
     public void findMailboxWithPathLikeShouldBeLimitedToUserAndNamespace() throws MailboxException {
         saveAll();
-        MailboxPath mailboxPathQuery = new MailboxPath(bobInboxMailbox.getNamespace(), bobInboxMailbox.getUser(), "IN" + WILDCARD);
-        List<Mailbox> mailboxes = mailboxMapper.findMailboxWithPathLike(mailboxPathQuery);
+        MailboxQuery.UserBound mailboxQuery = MailboxQuery.builder()
+            .userAndNamespaceFrom(bobInboxPath)
+            .expression(new PrefixedWildcard("IN"))
+            .build()
+            .asUserBound();
+
+        List<Mailbox> mailboxes = mailboxMapper.findMailboxWithPathLike(mailboxQuery);
 
         assertMailboxes(mailboxes).containOnly(bobInboxMailbox);
     }
@@ -147,8 +155,13 @@ public abstract class MailboxMapperTest {
     @Test
     public void findMailboxWithPathLikeWithChildRegexShouldRetrieveChildren() throws MailboxException {
         saveAll();
-        MailboxPath regexPath = new MailboxPath(benwaWorkPath.getNamespace(), benwaWorkPath.getUser(), benwaWorkPath.getName() + WILDCARD);
-        List<Mailbox> mailboxes = mailboxMapper.findMailboxWithPathLike(regexPath);
+        MailboxQuery.UserBound mailboxQuery = MailboxQuery.builder()
+            .userAndNamespaceFrom(benwaWorkPath)
+            .expression(new PrefixedWildcard(benwaWorkPath.getName()))
+            .build()
+            .asUserBound();
+
+        List<Mailbox> mailboxes = mailboxMapper.findMailboxWithPathLike(mailboxQuery);
 
         assertMailboxes(mailboxes).containOnly(benwaWorkMailbox, benwaWorkDoneMailbox, benwaWorkTodoMailbox);
     }
@@ -170,8 +183,13 @@ public abstract class MailboxMapperTest {
     @Test
     public void findMailboxWithPathLikeShouldEscapeMailboxName() throws MailboxException {
         saveAll();
-        MailboxPath regexPath = new MailboxPath(benwaInboxPath.getNamespace(), benwaInboxPath.getUser(), "INB?X");
-        assertThat(mailboxMapper.findMailboxWithPathLike(regexPath)).isEmpty();
+        MailboxQuery.UserBound mailboxQuery = MailboxQuery.builder()
+            .userAndNamespaceFrom(benwaInboxPath)
+            .expression(new ExactName("INB?X"))
+            .build()
+            .asUserBound();
+
+        assertThat(mailboxMapper.findMailboxWithPathLike(mailboxQuery)).isEmpty();
     }
 
     @Test
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
index e8cb58d..97bb334 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolverTest.java
@@ -87,7 +87,7 @@ public class DefaultUserQuotaRootResolverTest {
     public void retrieveAssociatedMailboxesShouldWork() throws Exception {
         MailboxMapper mockedMapper = mock(MailboxMapper.class);
         when(mockedFactory.getMailboxMapper(MAILBOX_SESSION)).thenReturn(mockedMapper);
-        when(mockedMapper.findMailboxWithPathLike(PATH_LIKE)).thenReturn(Lists.newArrayList(MAILBOX, MAILBOX_2));
+        when(mockedMapper.findMailboxWithPathLike(any())).thenReturn(Lists.newArrayList(MAILBOX, MAILBOX_2));
 
         assertThat(testee.retrieveAssociatedMailboxes(QUOTA_ROOT, MAILBOX_SESSION)).containsOnly(MAILBOX, MAILBOX_2);
     }


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


[james-project] 28/32: [Refactoring] Move test classes in James Core 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 3d386b72a8cb57302830227383dae2dcb495b112
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Thu Nov 7 14:18:54 2019 +0700

    [Refactoring] Move test classes in James Core to JUnit 5
---
 .../org/apache/james/core/MailAddressTest.java     | 43 +++++++++-------------
 .../james/core/builder/MimeMessageBuilderTest.java | 15 ++++----
 .../james/core/builder/MimeMessageWrapperTest.java | 10 ++---
 .../james/core/healthcheck/ResultStatusTest.java   | 10 ++---
 .../apache/james/core/quota/QuotaCountTest.java    |  2 +-
 .../org/apache/james/core/quota/QuotaSizeTest.java |  2 +-
 6 files changed, 36 insertions(+), 46 deletions(-)

diff --git a/core/src/test/java/org/apache/james/core/MailAddressTest.java b/core/src/test/java/org/apache/james/core/MailAddressTest.java
index 8169978..0817587 100644
--- a/core/src/test/java/org/apache/james/core/MailAddressTest.java
+++ b/core/src/test/java/org/apache/james/core/MailAddressTest.java
@@ -26,11 +26,11 @@ import javax.mail.internet.AddressException;
 import javax.mail.internet.InternetAddress;
 
 import org.assertj.core.api.Assertions;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class MailAddressTest {
+class MailAddressTest {
 
     private static final String GOOD_LOCAL_PART = "\"quoted@local part\"";
     private static final String GOOD_QUOTED_LOCAL_PART = "\"quoted@local part\"@james.apache.org";
@@ -85,8 +85,7 @@ public class MailAddressTest {
      * @throws AddressException
      */
     @Test
-    public void testHashCode() throws AddressException {
-
+    void testHashCode() throws AddressException {
         MailAddress a = new MailAddress(GOOD_ADDRESS);
         MailAddress b = new MailAddress(GOOD_ADDRESS);
         assertThat(a.hashCode()).isEqualTo(b.hashCode());
@@ -98,8 +97,7 @@ public class MailAddressTest {
      * @throws AddressException
      */
     @Test
-    public void testMailAddressString() throws AddressException {
-
+    void testMailAddressString() throws AddressException {
         MailAddress a = new MailAddress(GOOD_ADDRESS);
         assertThat(a.toString()).isEqualTo(GOOD_ADDRESS);
 
@@ -121,8 +119,7 @@ public class MailAddressTest {
      * Test method for {@link MailAddress#MailAddress(java.lang.String, java.lang.String)}.
      */
     @Test
-    public void testMailAddressStringString() {
-
+    void testMailAddressStringString() {
         try {
             new MailAddress("local-part", "domain");
         } catch (AddressException e) {
@@ -140,8 +137,7 @@ public class MailAddressTest {
      * Test method for {@link MailAddress#MailAddress(javax.mail.internet.InternetAddress)}.
      */
     @Test
-    public void testMailAddressInternetAddress() {
-
+    void testMailAddressInternetAddress() {
         try {
             new MailAddress(new InternetAddress(GOOD_QUOTED_LOCAL_PART));
         } catch (AddressException e) {
@@ -154,8 +150,7 @@ public class MailAddressTest {
      * Test method for {@link MailAddress#getDomain()}.
      */
     @Test
-    public void testGetDomain() {
-
+    void testGetDomain() {
         try {
             MailAddress a = new MailAddress(new InternetAddress(GOOD_ADDRESS));
             assertThat(a.getDomain()).isEqualTo(GOOD_DOMAIN);
@@ -169,8 +164,7 @@ public class MailAddressTest {
      * Test method for {@link MailAddress#getLocalPart()}.
      */
     @Test
-    public void testGetLocalPart() {
-
+    void testGetLocalPart() {
         try {
             MailAddress a = new MailAddress(new InternetAddress(GOOD_QUOTED_LOCAL_PART));
             assertThat(a.getLocalPart()).isEqualTo(GOOD_LOCAL_PART);
@@ -184,8 +178,7 @@ public class MailAddressTest {
      * Test method for {@link MailAddress#toString()}.
      */
     @Test
-    public void testToString() {
-
+    void testToString() {
         try {
             MailAddress a = new MailAddress(new InternetAddress(GOOD_ADDRESS));
             assertThat(a.toString()).isEqualTo(GOOD_ADDRESS);
@@ -199,8 +192,7 @@ public class MailAddressTest {
      * Test method for {@link MailAddress#toInternetAddress()}.
      */
     @Test
-    public void testToInternetAddress() {
-
+    void testToInternetAddress() {
         try {
             InternetAddress b = new InternetAddress(GOOD_ADDRESS);
             MailAddress a = new MailAddress(b);
@@ -218,8 +210,7 @@ public class MailAddressTest {
      * @throws AddressException
      */
     @Test
-    public void testEqualsObject() throws AddressException {
-
+    void testEqualsObject() throws AddressException {
         MailAddress a = new MailAddress(GOOD_ADDRESS);
         MailAddress b = new MailAddress(GOOD_ADDRESS);
 
@@ -227,41 +218,41 @@ public class MailAddressTest {
     }
 
     @Test
-    public void equalsShouldReturnTrueWhenBothNullSender() {
+    void equalsShouldReturnTrueWhenBothNullSender() {
         assertThat(MailAddress.nullSender())
             .isEqualTo(MailAddress.nullSender());
     }
 
     @SuppressWarnings("deprecation")
     @Test
-    public void getMailSenderShouldReturnNullSenderWhenNullSender() {
+    void getMailSenderShouldReturnNullSenderWhenNullSender() {
         assertThat(MailAddress.getMailSender(MailAddress.NULL_SENDER_AS_STRING))
             .isEqualTo(MailAddress.nullSender());
     }
 
     @SuppressWarnings("deprecation")
     @Test
-    public void getMailSenderShouldReturnParsedAddressWhenNotNullAddress() throws Exception {
+    void getMailSenderShouldReturnParsedAddressWhenNotNullAddress() throws Exception {
         assertThat(MailAddress.getMailSender(GOOD_ADDRESS))
             .isEqualTo(new MailAddress(GOOD_ADDRESS));
     }
 
     @SuppressWarnings("deprecation")
     @Test
-    public void equalsShouldReturnFalseWhenOnlyFirstMemberIsANullSender() {
+    void equalsShouldReturnFalseWhenOnlyFirstMemberIsANullSender() {
         assertThat(MailAddress.getMailSender(GOOD_ADDRESS))
             .isNotEqualTo(MailAddress.nullSender());
     }
 
     @SuppressWarnings("deprecation")
     @Test
-    public void equalsShouldReturnFalseWhenOnlySecondMemberIsANullSender() {
+    void equalsShouldReturnFalseWhenOnlySecondMemberIsANullSender() {
         assertThat(MailAddress.nullSender())
             .isNotEqualTo(MailAddress.getMailSender(GOOD_ADDRESS));
     }
 
     @Test
-    public void shouldMatchBeanContract() {
+    void shouldMatchBeanContract() {
         EqualsVerifier.forClass(MailAddress.class)
             .verify();
     }
diff --git a/core/src/test/java/org/apache/james/core/builder/MimeMessageBuilderTest.java b/core/src/test/java/org/apache/james/core/builder/MimeMessageBuilderTest.java
index 62b8c56..8783b63 100644
--- a/core/src/test/java/org/apache/james/core/builder/MimeMessageBuilderTest.java
+++ b/core/src/test/java/org/apache/james/core/builder/MimeMessageBuilderTest.java
@@ -24,12 +24,12 @@ import static org.assertj.core.api.Assertions.assertThat;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.util.MimeMessageUtil;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-public class MimeMessageBuilderTest {
+class MimeMessageBuilderTest {
 
     @Test
-    public void buildShouldPreserveMessageID() throws Exception {
+    void buildShouldPreserveMessageID() throws Exception {
         String messageID = "<ab...@123>";
         MimeMessage mimeMessage = MimeMessageBuilder.mimeMessageBuilder()
             .addHeader("Message-ID", messageID)
@@ -40,7 +40,7 @@ public class MimeMessageBuilderTest {
     }
 
     @Test
-    public void buildShouldAllowMultiValuedHeader() throws Exception {
+    void buildShouldAllowMultiValuedHeader() throws Exception {
         String headerName = "header";
         MimeMessage mimeMessage = MimeMessageBuilder.mimeMessageBuilder()
             .addHeader(headerName, "value1")
@@ -52,7 +52,7 @@ public class MimeMessageBuilderTest {
     }
 
     @Test
-    public void buildShouldPreserveDate() throws Exception {
+    void buildShouldPreserveDate() throws Exception {
         String value = "Wed, 28 Mar 2018 17:02:25 +0200";
         MimeMessage mimeMessage = MimeMessageBuilder.mimeMessageBuilder()
             .addHeader("Date", value)
@@ -63,7 +63,7 @@ public class MimeMessageBuilderTest {
     }
 
     @Test
-    public void embeddedMessagesShouldBeSupported() throws Exception {
+    void embeddedMessagesShouldBeSupported() throws Exception {
         MimeMessage embeddedMimeMessage = MimeMessageBuilder.mimeMessageBuilder()
             .setSubject("A unicorn eat popcorn")
             .setText("As studies demonstrated unicorns eats cereals.")
@@ -81,7 +81,7 @@ public class MimeMessageBuilderTest {
     }
 
     @Test
-    public void buildShouldAllowToSpecifyMultipartSubtype() throws Exception {
+    void buildShouldAllowToSpecifyMultipartSubtype() throws Exception {
         MimeMessage mimeMessage = MimeMessageBuilder.mimeMessageBuilder()
             .setContent(MimeMessageBuilder.multipartBuilder()
                 .subType("alternative")
@@ -93,5 +93,4 @@ public class MimeMessageBuilderTest {
             .startsWith("multipart/alternative");
     }
 
-
 }
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/james/core/builder/MimeMessageWrapperTest.java b/core/src/test/java/org/apache/james/core/builder/MimeMessageWrapperTest.java
index 230763c..62947c6 100644
--- a/core/src/test/java/org/apache/james/core/builder/MimeMessageWrapperTest.java
+++ b/core/src/test/java/org/apache/james/core/builder/MimeMessageWrapperTest.java
@@ -31,12 +31,12 @@ import java.util.Properties;
 import javax.mail.Session;
 import javax.mail.internet.MimeMessage;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-public class MimeMessageWrapperTest {
+class MimeMessageWrapperTest {
 
     @Test
-    public void saveChangesShouldPreserveMessageId() throws Exception {
+    void saveChangesShouldPreserveMessageId() throws Exception {
         String messageId = "<54...@ab.com>";
         String messageText = "Message-ID: " + messageId + "\r\n" +
             "Subject: test\r\n" +
@@ -53,7 +53,7 @@ public class MimeMessageWrapperTest {
     }
 
     @Test
-    public void wrapShouldPreserveBody() throws Exception {
+    void wrapShouldPreserveBody() throws Exception {
         String messageAsText = "header1: <54...@ab.com>\r\n" +
             "Subject: test\r\n" +
             "\r\n" +
@@ -71,7 +71,7 @@ public class MimeMessageWrapperTest {
     }
 
     @Test
-    public void wrapShouldNotThrowWhenNoBody() throws Exception {
+    void wrapShouldNotThrowWhenNoBody() throws Exception {
         MimeMessage originalMessage = new MimeMessage(Session.getDefaultInstance(new Properties()));
         originalMessage.addHeader("header1", "value1");
         originalMessage.addHeader("header2", "value2");
diff --git a/core/src/test/java/org/apache/james/core/healthcheck/ResultStatusTest.java b/core/src/test/java/org/apache/james/core/healthcheck/ResultStatusTest.java
index 1003ef5..2cd4f10 100644
--- a/core/src/test/java/org/apache/james/core/healthcheck/ResultStatusTest.java
+++ b/core/src/test/java/org/apache/james/core/healthcheck/ResultStatusTest.java
@@ -22,18 +22,18 @@ package org.apache.james.core.healthcheck;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.assertj.core.api.SoftAssertions;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-public class ResultStatusTest {
+class ResultStatusTest {
 
     @Test
-    public void mergeReturnHealthyWhenMergeWithHealthy() {
+    void mergeReturnHealthyWhenMergeWithHealthy() {
         assertThat(ResultStatus.merge(ResultStatus.HEALTHY, ResultStatus.HEALTHY))
                 .isEqualTo(ResultStatus.HEALTHY);
     }
 
     @Test
-    public void mergeReturnUnHealthyWhenMergeWithUnHealthy() {
+    void mergeReturnUnHealthyWhenMergeWithUnHealthy() {
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(ResultStatus.merge(ResultStatus.HEALTHY, ResultStatus.UNHEALTHY))
                 .isEqualTo(ResultStatus.UNHEALTHY);
@@ -49,7 +49,7 @@ public class ResultStatusTest {
     }
 
     @Test
-    public void mergeReturnDegradedWhenMergeWithDegraded() {
+    void mergeReturnDegradedWhenMergeWithDegraded() {
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(ResultStatus.merge(ResultStatus.HEALTHY, ResultStatus.DEGRADED))
                 .isEqualTo(ResultStatus.DEGRADED);
diff --git a/core/src/test/java/org/apache/james/core/quota/QuotaCountTest.java b/core/src/test/java/org/apache/james/core/quota/QuotaCountTest.java
index d704687..4722297 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaCountTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaCountTest.java
@@ -35,7 +35,7 @@ public class QuotaCountTest implements QuotaValueTest<QuotaCount> {
     }
 
     @Test
-    public void shouldRespectBeanContract() {
+    void shouldRespectBeanContract() {
         EqualsVerifier.forClass(QuotaCount.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/QuotaSizeTest.java
index f89223b..7d1fa7b 100644
--- a/core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java
+++ b/core/src/test/java/org/apache/james/core/quota/QuotaSizeTest.java
@@ -35,7 +35,7 @@ public class QuotaSizeTest implements QuotaValueTest<QuotaSize> {
     }
 
     @Test
-    public void shouldRespectBeanContract() {
+    void shouldRespectBeanContract() {
         EqualsVerifier.forClass(QuotaSize.class).verify();
     }
 


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