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/12/13 02:39:16 UTC

[james-project] branch master updated (c2d2a86 -> 42092d4)

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 c2d2a86  [Refactoring] Move TikaTextExtractorTest to JUnit 5
     new 3e219c3  JAMES-2721 CassandraCluster extension needs to handle restart
     new 547f944  [Refactoring] Strongly type FlagsUpdateMode in StoreRequest
     new e7a528f  [Refactoring] SetQuotaRequest.ResourceLimit.limit can be unboxed
     new fbd7222  [Refactoring] SetQuotaRequest.ResourceLimit.limit can be static
     new 776c3ff  [Refactoring] FetchData: Use an enum representing item to fetch
     new 12367a7  [Refactoring] FetchData: boolean setter parameter are always true
     new d9ca246  [Refactoring] Solve intellij warnings in FetchProcessor
     new 2b6c925  [Refactoring] FetchData: Provide a builder
     new b0e0a75  PROTOCOLS-120 Slightly improve AbstractImapCommandParser style
     new c8a0ebf  PROTOCOLS-120 Slightly improve DefaultImapDecoder style
     new 59371b2  PROTOCOLS-120 ImapParserFactory should not create new instances
     new c2cb643  PROTOCOLS-120 parserFactory field should be final in UidCommandParser
     new a1df5a2  PROTOCOLS-120 StatusResponseFactory should be immutable in parsers
     new fa41121  PROTOCOLS-120 ImapParserFactory should rely on AbstractImapCommandParser for commandName <-> parser binding
     new e624fcd  PROTOCOLS-120 Simplify branching logic in IMAP command parsers
     new 8f999dc  PROTOCOLS-120 AbstractImapCommandParser statusResponseFactory field should be private
     new cea95b0  PROTOCOLS-120 ImapEncoders should no longer be chained
     new 7aac936  PROTOCOLS-120 ImapSession is never used by IMAP encoders
     new a0508e9  PROTOCOLS-120 Avoid some variable reallocation in StatusResponseEncoder
     new 3818e5d  [Refactoring] Tests for DefaultImapEncoderFactory
     new efe4133  PROTOCOLS-120 ImapEncoders should no longer be chained
     new 4f79944  JAMES-2991 Add a convenience MessageIdManager::getMessage method
     new 32649b1  JAMES-2992 Relax MessageFastViewProjection::retrieve
     new 532d29b  JAMES-2992 Rework MessageFastViewFactory accordingly
     new d928589  JAMES-2997 MessageFastViewPrecomputedProperties should implement toString
     new 889250d  [Refactoring] StoreMailboxManager::isMailboxNameTooLong is no longer used
     new 42092d4  JAMES-2992 Better name variable in MessageFastViewFactory

The 27 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:
 .../cassandra/CassandraClusterExtension.java       |  17 +-
 .../cassandra/CassandraRestartExtension.java       |  37 ---
 .../backends/cassandra/DockerCassandraRule.java    |   2 +-
 .../cassandra/DockerCassandraSingleton.java        |  19 +-
 .../org/apache/james/mailbox/MessageIdManager.java |   4 +
 .../cassandra/CassandraCombinationManagerTest.java |   4 -
 .../CassandraMailboxManagerStressTest.java         |   3 -
 .../cassandra/CassandraMailboxManagerTest.java     |   3 -
 .../CassandraMessageIdManagerQuotaTest.java        |   3 -
 .../CassandraMessageIdManagerSideEffectTest.java   |   3 -
 .../CassandraMessageIdManagerStorageTest.java      |   4 -
 .../CassandraSubscriptionManagerTest.java          |   3 -
 .../cassandra/mail/CassandraACLMapperTest.java     |   3 -
 .../mail/CassandraAnnotationMapperTest.java        |   3 -
 .../mail/CassandraApplicableFlagDAOTest.java       |   3 -
 .../cassandra/mail/CassandraAttachmentDAOTest.java |   3 -
 .../mail/CassandraAttachmentDAOV2Test.java         |   3 -
 .../mail/CassandraAttachmentFallbackTest.java      |   3 -
 .../mail/CassandraAttachmentMapperTest.java        |   3 -
 .../mail/CassandraAttachmentMessageIdDAOTest.java  |   3 -
 .../mail/CassandraAttachmentOwnerDAOTest.java      |   4 -
 .../mail/CassandraDeletedMessageDAOTest.java       |   3 -
 .../mail/CassandraFirstUnseenDAOTest.java          |   3 -
 .../mail/CassandraGenericMailboxMapperTest.java    |   3 -
 .../mail/CassandraIndexTableHandlerTest.java       |   3 -
 .../mail/CassandraMailboxCounterDAOTest.java       |   3 -
 .../cassandra/mail/CassandraMailboxDAOTest.java    |   3 -
 .../CassandraMailboxManagerAttachmentTest.java     |   3 -
 .../mail/CassandraMailboxMapperAclTest.java        |   3 -
 .../CassandraMailboxMapperConcurrencyTest.java     |   3 -
 .../cassandra/mail/CassandraMailboxMapperTest.java |   4 -
 .../mail/CassandraMailboxPathDAOTest.java          |   3 -
 .../mail/CassandraMailboxRecentDAOTest.java        |   3 -
 .../cassandra/mail/CassandraMessageDAOTest.java    |   3 -
 .../cassandra/mail/CassandraMessageIdDAOTest.java  |   3 -
 .../mail/CassandraMessageIdMapperTest.java         |   4 -
 .../mail/CassandraMessageIdToImapUidDAOTest.java   |   3 -
 .../cassandra/mail/CassandraMessageMapperTest.java |   4 -
 .../cassandra/mail/CassandraMessageMoveTest.java   |   4 -
 .../CassandraMessageWithAttachmentMapperTest.java  |   4 -
 .../mail/CassandraModSeqProviderTest.java          |   3 -
 .../cassandra/mail/CassandraUidProviderTest.java   |   3 -
 .../mail/CassandraUserMailboxRightsDAOTest.java    |   3 -
 .../migration/AttachmentMessageIdCreationTest.java |   4 +-
 .../mail/migration/AttachmentV2MigrationTest.java  |   3 -
 .../mail/migration/MailboxPathV2MigrationTest.java |   3 -
 .../quota/CassandraCurrentQuotaManagerTest.java    |   3 -
 .../quota/CassandraPerUserMaxQuotaManagerTest.java |   3 -
 .../user/CassandraSubscriptionMapperTest.java      |   3 -
 .../james/mailbox/store/StoreBlobManager.java      |   3 +-
 .../james/mailbox/store/StoreMailboxManager.java   |   4 -
 .../store/AbstractCombinationManagerTest.java      |  16 +-
 .../AbstractMessageIdManagerSideEffectTest.java    |  16 +-
 .../store/AbstractMessageIdManagerStorageTest.java | 119 ++++-----
 .../james/mailbox/store/StoreBlobManagerTest.java  |  16 +-
 .../apache/james/imap/api/message/FetchData.java   | 276 ++++++++-------------
 .../imap/decode/DelegatingImapCommandParser.java   |  27 --
 .../imap/decode/MessagingImapCommandParser.java    |  28 ---
 .../decode/base/AbstractImapCommandParser.java     |  39 ++-
 .../james/imap/decode/main/DefaultImapDecoder.java |  61 ++---
 .../parser/AbstractMessageRangeCommandParser.java  |   5 +-
 .../parser/AbstractSelectionCommandParser.java     |   5 +-
 .../decode/parser/AbstractUidCommandParser.java    |   5 +-
 .../imap/decode/parser/AppendCommandParser.java    |   5 +-
 .../decode/parser/AuthenticateCommandParser.java   |   5 +-
 .../decode/parser/CapabilityCommandParser.java     |   5 +-
 .../imap/decode/parser/CheckCommandParser.java     |   5 +-
 .../imap/decode/parser/CloseCommandParser.java     |   5 +-
 .../imap/decode/parser/CompressCommandParser.java  |   5 +-
 .../imap/decode/parser/CopyCommandParser.java      |   5 +-
 .../imap/decode/parser/CreateCommandParser.java    |   5 +-
 .../imap/decode/parser/DeleteACLCommandParser.java |   5 +-
 .../imap/decode/parser/DeleteCommandParser.java    |   5 +-
 .../imap/decode/parser/EnableCommandParser.java    |   5 +-
 .../imap/decode/parser/ExamineCommandParser.java   |   5 +-
 .../imap/decode/parser/ExpungeCommandParser.java   |   5 +-
 .../imap/decode/parser/FetchCommandParser.java     |  63 ++---
 .../imap/decode/parser/GetACLCommandParser.java    |   5 +-
 .../decode/parser/GetAnnotationCommandParser.java  |   5 +-
 .../imap/decode/parser/GetQuotaCommandParser.java  |   5 +-
 .../decode/parser/GetQuotaRootCommandParser.java   |   5 +-
 .../imap/decode/parser/IdleCommandParser.java      |   5 +-
 .../imap/decode/parser/ImapParserFactory.java      | 192 ++++++--------
 .../imap/decode/parser/ListCommandParser.java      |   9 +-
 .../decode/parser/ListRightsCommandParser.java     |   5 +-
 .../imap/decode/parser/LoginCommandParser.java     |   5 +-
 .../imap/decode/parser/LogoutCommandParser.java    |   5 +-
 .../imap/decode/parser/LsubCommandParser.java      |   5 +-
 .../imap/decode/parser/MoveCommandParser.java      |   5 +-
 .../imap/decode/parser/MyRightsCommandParser.java  |   5 +-
 .../imap/decode/parser/NamespaceCommandParser.java |   5 +-
 .../imap/decode/parser/NoopCommandParser.java      |   5 +-
 .../imap/decode/parser/RenameCommandParser.java    |   5 +-
 .../imap/decode/parser/SearchCommandParser.java    |   7 +-
 .../imap/decode/parser/SelectCommandParser.java    |   8 +-
 .../imap/decode/parser/SetACLCommandParser.java    |   5 +-
 .../decode/parser/SetAnnotationCommandParser.java  |   5 +-
 .../imap/decode/parser/SetQuotaCommandParser.java  |   5 +-
 .../imap/decode/parser/StartTLSCommandParser.java  |   5 +-
 .../imap/decode/parser/StatusCommandParser.java    |   5 +-
 .../imap/decode/parser/StoreCommandParser.java     |  18 +-
 .../imap/decode/parser/SubscribeCommandParser.java |   5 +-
 .../james/imap/decode/parser/UidCommandParser.java |  21 +-
 .../imap/decode/parser/UnselectCommandParser.java  |   5 +-
 .../decode/parser/UnsubscribeCommandParser.java    |   5 +-
 .../imap/decode/parser/XListCommandParser.java     |   5 +-
 .../james/imap/encode/ACLResponseEncoder.java      |  20 +-
 .../imap/encode/AnnotationResponseEncoder.java     |  28 +--
 .../imap/encode/AuthenticateResponseEncoder.java   |  17 +-
 .../imap/encode/CapabilityResponseEncoder.java     |  19 +-
 .../imap/encode/ContinuationResponseEncoder.java   |  25 +-
 .../james/imap/encode/ESearchResponseEncoder.java  |  19 +-
 .../james/imap/encode/EnableResponseEncoder.java   |  19 +-
 .../james/imap/encode/ExistsResponseEncoder.java   |  19 +-
 .../james/imap/encode/ExpungeResponseEncoder.java  |  18 +-
 .../james/imap/encode/FetchResponseEncoder.java    |  97 ++++----
 .../james/imap/encode/FlagsResponseEncoder.java    |  19 +-
 .../org/apache/james/imap/encode/ImapEncoder.java  |   5 +-
 .../ImapResponseEncoder.java}                      |  15 +-
 .../james/imap/encode/LSubResponseEncoder.java     |  21 +-
 .../james/imap/encode/ListResponseEncoder.java     |  21 +-
 .../imap/encode/ListRightsResponseEncoder.java     |  19 +-
 .../imap/encode/MailboxStatusResponseEncoder.java  |  20 +-
 .../james/imap/encode/MyRightsResponseEncoder.java |  21 +-
 .../imap/encode/NamespaceResponseEncoder.java      |  20 +-
 .../james/imap/encode/QuotaResponseEncoder.java    |  22 +-
 .../imap/encode/QuotaRootResponseEncoder.java      |  23 +-
 .../james/imap/encode/RecentResponseEncoder.java   |  18 +-
 .../james/imap/encode/SearchResponseEncoder.java   |  19 +-
 .../james/imap/encode/StatusResponseEncoder.java   |  40 ++-
 .../james/imap/encode/VanishedResponseEncoder.java |  23 +-
 .../james/imap/encode/XListResponseEncoder.java    |  23 +-
 .../encode/base/AbstractChainedImapEncoder.java    |  86 -------
 .../james/imap/encode/base/EndImapEncoder.java     |   3 +-
 .../encode/main/DefaultImapEncoderFactory.java     |  87 ++++---
 .../imap/main/AbstractImapRequestHandler.java      |   2 +-
 .../apache/james/imap/main/ResponseEncoder.java    |   8 +-
 .../james/imap/message/request/FetchRequest.java   |   3 -
 .../imap/message/request/SetQuotaRequest.java      |   4 +-
 .../james/imap/message/request/StoreRequest.java   |  48 +---
 .../james/imap/processor/StoreProcessor.java       |  11 +-
 .../imap/processor/fetch/FetchDataConverter.java   |   5 +-
 .../james/imap/processor/fetch/FetchProcessor.java |  36 ++-
 .../imap/processor/fetch/FetchResponseBuilder.java |  19 +-
 .../james/imap/decode/parser/CopyParserTest.java   |   4 +-
 .../decode/parser/CreateCommandParserTest.java     |   4 +-
 .../parser/FetchCommandParserPartialFetchTest.java |  18 +-
 .../parser/GetAnnotationCommandParserTest.java     |   4 +-
 .../imap/decode/parser/GetQuotaParserTest.java     |   4 +-
 .../imap/decode/parser/GetQuotaRootParserTest.java |   6 +-
 .../james/imap/decode/parser/MoveParserTest.java   |   4 +-
 .../SearchCommandParserAndParenthesesTest.java     |   5 +-
 .../parser/SearchCommandParserCharsetTest.java     |   6 +-
 .../decode/parser/SearchCommandParserNotTest.java  |   4 +-
 .../decode/parser/SearchCommandParserOrTest.java   |   4 +-
 .../SearchCommandParserQuotedCharsetTest.java      |   6 +-
 ...earchCommandParserSearchKeySequenceSetTest.java |   4 +-
 .../parser/SearchCommandParserSearchKeyTest.java   |   4 +-
 .../parser/SearchCommandParserTopLevelAndTest.java |   4 +-
 .../parser/SetAnnotationCommandParserTest.java     |   4 +-
 .../decode/parser/SetQuotaCommandParserTest.java   |   4 +-
 .../imap/decode/parser/StoreCommandParserTest.java |   3 +-
 .../imap/encode/AnnotationResponseEncoderTest.java |  18 +-
 .../encode/FetchResponseEncoderEnvelopeTest.java   |  40 ++-
 .../FetchResponseEncoderNoExtensionsTest.java      |  25 +-
 .../imap/encode/FetchResponseEncoderTest.java      |  23 +-
 .../james/imap/encode/LSubResponseEncoderTest.java |  28 +--
 .../james/imap/encode/ListResponseEncoderTest.java |  29 +--
 .../encode/MailboxStatusResponseEncoderTest.java   |  16 +-
 .../imap/encode/NamespaceResponseEncoderTest.java  |  33 +--
 .../imap/encode/QuotaResponseEncoderTest.java      |   9 +-
 .../imap/encode/QuotaRootResponseEncoderTest.java  |   5 +-
 .../imap/encode/SearchResponseEncoderTest.java     |  19 +-
 .../imap/encode/XListResponseEncoderTest.java      |  34 +--
 .../encode/main/DefaultImapEncoderFactoryTest.java |  46 ++--
 .../processor/fetch/FetchDataConverterTest.java    |  43 ++--
 .../apache/james/jmap/draft/MessageIdProbe.java    |   8 +-
 .../MessageFastViewPrecomputedProperties.java      |   9 +
 .../api/projections/MessageFastViewProjection.java |   4 +-
 .../CassandraMailRepositoryCountDAOTest.java       |   3 -
 .../CassandraMailRepositoryKeysDAOTest.java        |   3 -
 .../CassandraMailRepositoryMailDAOTest.java        |   3 -
 .../cassandra/CassandraMailRepositoryTest.java     |   4 -
 .../james/jmap/draft/methods/ReferenceUpdater.java |   2 +-
 .../james/jmap/draft/methods/SendMDNProcessor.java |   4 +-
 .../draft/methods/SetMessagesUpdateProcessor.java  |   5 +-
 .../model/message/view/MessageFastViewFactory.java |  20 +-
 .../jmap/draft/send/PostDequeueDecorator.java      |   2 +-
 .../jmap/draft/send/PostDequeueDecoratorTest.java  |   6 +-
 .../netty/ImapChannelUpstreamHandler.java          |   2 +-
 190 files changed, 1010 insertions(+), 1785 deletions(-)
 delete mode 100644 backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraRestartExtension.java
 delete mode 100644 protocols/imap/src/main/java/org/apache/james/imap/decode/DelegatingImapCommandParser.java
 delete mode 100644 protocols/imap/src/main/java/org/apache/james/imap/decode/MessagingImapCommandParser.java
 copy protocols/imap/src/main/java/org/apache/james/imap/{message/request/SystemMessage.java => encode/ImapResponseEncoder.java} (80%)
 delete mode 100644 protocols/imap/src/main/java/org/apache/james/imap/encode/base/AbstractChainedImapEncoder.java
 copy mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/ids/CassandraIdTest.java => protocols/imap/src/test/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactoryTest.java (53%)


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


[james-project] 25/27: JAMES-2997 MessageFastViewPrecomputedProperties should implement toString

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

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

commit d928589687f3b2ec58deeeeb15a20a86a6eb3b51
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 10:19:48 2019 +0700

    JAMES-2997 MessageFastViewPrecomputedProperties should implement toString
    
    This helps debugging
---
 .../api/projections/MessageFastViewPrecomputedProperties.java    | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
index 452f7fd..997ad66 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewPrecomputedProperties.java
@@ -23,6 +23,7 @@ import java.util.Objects;
 
 import org.apache.james.jmap.api.model.Preview;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 
 public class MessageFastViewPrecomputedProperties {
@@ -96,4 +97,12 @@ public class MessageFastViewPrecomputedProperties {
     public final int hashCode() {
         return Objects.hash(preview, hasAttachment);
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("preview", preview)
+            .add("hasAttachment", hasAttachment)
+            .toString();
+    }
 }


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


[james-project] 23/27: JAMES-2992 Relax MessageFastViewProjection::retrieve

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 32649b164b710bda913987f6ea85ef1711c0afaf
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 10:14:19 2019 +0700

    JAMES-2992 Relax MessageFastViewProjection::retrieve
    
    Accept a collection instead of a list
---
 .../apache/james/jmap/api/projections/MessageFastViewProjection.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java
index 3233366..c9c2e49 100644
--- a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java
+++ b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjection.java
@@ -19,7 +19,7 @@
 
 package org.apache.james.jmap.api.projections;
 
-import java.util.List;
+import java.util.Collection;
 import java.util.Map;
 
 import org.apache.commons.lang3.tuple.Pair;
@@ -44,7 +44,7 @@ public interface MessageFastViewProjection {
 
     Publisher<Void> delete(MessageId messageId);
 
-    default Publisher<Map<MessageId, MessageFastViewPrecomputedProperties>> retrieve(List<MessageId> messageIds) {
+    default Publisher<Map<MessageId, MessageFastViewPrecomputedProperties>> retrieve(Collection<MessageId> messageIds) {
         Preconditions.checkNotNull(messageIds);
 
         return Flux.fromIterable(messageIds)


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


[james-project] 16/27: PROTOCOLS-120 AbstractImapCommandParser statusResponseFactory field should 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 8f999dc024decf9d6d55f7d9be6afbc3564bf152
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 9 10:25:34 2019 +0700

    PROTOCOLS-120 AbstractImapCommandParser statusResponseFactory field should be private
---
 .../apache/james/imap/decode/base/AbstractImapCommandParser.java   | 7 ++++++-
 .../org/apache/james/imap/decode/parser/SearchCommandParser.java   | 2 +-
 .../imap/decode/parser/FetchCommandParserPartialFetchTest.java     | 1 +
 3 files changed, 8 insertions(+), 2 deletions(-)

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 0e17dc2..b49c5a5 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
@@ -23,6 +23,7 @@ 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.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
@@ -42,7 +43,7 @@ public abstract class AbstractImapCommandParser implements ImapCommandParser {
 
     private final ImapCommand command;
 
-    protected final StatusResponseFactory statusResponseFactory;
+    private final StatusResponseFactory statusResponseFactory;
 
     public AbstractImapCommandParser(ImapCommand command, StatusResponseFactory statusResponseFactory) {
         this.command = command;
@@ -53,6 +54,10 @@ public abstract class AbstractImapCommandParser implements ImapCommandParser {
         return command;
     }
 
+    protected StatusResponse taggedNo(Tag tag, ImapCommand command, HumanReadableText displayTextKey, StatusResponse.ResponseCode code) {
+        return statusResponseFactory.taggedNo(tag, command, displayTextKey, code);
+    }
+
     /**
      * Parses a request into a command message for later processing.
      * 
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 77040d2..b25a57d 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
@@ -904,7 +904,7 @@ public class SearchCommandParser extends AbstractUidCommandParser {
 
     private ImapMessage unsupportedCharset(Tag tag, ImapCommand command) {
         final ResponseCode badCharset = StatusResponse.ResponseCode.badCharset();
-        return statusResponseFactory.taggedNo(tag, command, HumanReadableText.BAD_CHARSET, badCharset);
+        return taggedNo(tag, command, HumanReadableText.BAD_CHARSET, badCharset);
     }
 
     /**
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 88e5deb..9a2b0e6 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
@@ -21,6 +21,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;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;


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


[james-project] 19/27: PROTOCOLS-120 Avoid some variable reallocation in StatusResponseEncoder

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 a0508e93a9e649bad6702ea788bd08f69c6bb59a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 9 10:03:06 2019 +0700

    PROTOCOLS-120 Avoid some variable reallocation in StatusResponseEncoder
---
 .../org/apache/james/imap/encode/StatusResponseEncoder.java | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

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 9c920b2..8f0435e 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
@@ -31,7 +31,6 @@ import org.apache.james.imap.api.display.Localizer;
 import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
 import org.apache.james.imap.api.message.response.StatusResponse.Type;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.ImmutableStatusResponse;
 
 public class StatusResponseEncoder implements ImapResponseEncoder<ImmutableStatusResponse> {
@@ -110,22 +109,18 @@ public class StatusResponseEncoder implements ImapResponseEncoder<ImmutableStatu
     }
 
     private String asString(StatusResponse.ResponseCode code) {
-        final String result;
         if (code == null) {
-            result = null;
+            return null;
         } else {
-            result = code.getCode();
+            return code.getCode();
         }
-        return result;
     }
 
     private String asString(StatusResponse.Type type) {
-        final String result;
         if (type == null) {
-            result = null;
+            return null;
         } else {
-            result = type.getCode();
+            return type.getCode();
         }
-        return result;
     }
 }


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


[james-project] 21/27: PROTOCOLS-120 ImapEncoders should no longer be chained

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 efe4133a8b8f47298dd2c9a27db2f969dfb5f2e2
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 16:36:43 2019 +0700

    PROTOCOLS-120 ImapEncoders should no longer be chained
---
 .../java/org/apache/james/imap/encode/ImapResponseEncoder.java   | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
index 422a0c0..86f2d5f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
@@ -27,14 +27,7 @@ public interface ImapResponseEncoder<T extends ImapMessage> {
     Class<T> acceptableMessages();
 
     /**
-     * Writes response.
-     * 
-     * @param message
-     *            <code>ImapMessage</code>, not null
-     * @param composer
-     *            <code>ImapResponseComposer</code>, not null
-     * @throws IOException
-     *             when message encoding fails
+     * Encodes the given message by the mean of the provided composer
      */
     void encode(T message, ImapResponseComposer composer) throws IOException;
 }


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


[james-project] 04/27: [Refactoring] SetQuotaRequest.ResourceLimit.limit can be static

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

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

commit fbd7222917ba1528d242e65b27583eec53a76fca
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 09:54:24 2019 +0700

    [Refactoring] SetQuotaRequest.ResourceLimit.limit can be static
---
 .../java/org/apache/james/imap/message/request/SetQuotaRequest.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 1c80405..6db1979 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
@@ -37,7 +37,7 @@ public class SetQuotaRequest extends AbstractImapRequest {
         private final String resource;
         private final long limit;
 
-        public ResourceLimit(String resource, long limit) {
+        ResourceLimit(String resource, long limit) {
             this.limit = limit;
             this.resource = resource;
         }


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


[james-project] 27/27: JAMES-2992 Better name variable in MessageFastViewFactory

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 42092d4bd1489338cf6c3a7b897e6173202b74dc
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 9 10:17:13 2019 +0700

    JAMES-2992 Better name variable in MessageFastViewFactory
    
    Reference the projection and not just the preview
---
 .../jmap/draft/model/message/view/MessageFastViewFactory.java     | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
index cc11416..6fd35d8 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
@@ -129,12 +129,12 @@ public class MessageFastViewFactory implements MessageViewFactory<MessageFastVie
 
     private Flux<MessageFastView> gatherMessageViews(Set<MessageId> messageIds, MailboxSession mailboxSession,
                                                      Map<MessageId, MessageFastViewPrecomputedProperties> fastProjections) {
-        Set<MessageId> withPreview = fastProjections.keySet();
-        Set<MessageId> withoutPreviews = Sets.difference(messageIds, fastProjections.keySet());
+        Set<MessageId> withProjectionEntry = fastProjections.keySet();
+        Set<MessageId> withoutProjectionEntry = Sets.difference(messageIds, withProjectionEntry);
         return Flux.merge(
-                fetch(withPreview, FetchGroup.HEADERS, mailboxSession)
+                fetch(withProjectionEntry, FetchGroup.HEADERS, mailboxSession)
                     .map(messageResults -> Helpers.toMessageViews(messageResults, new FromMessageResultAndPreview(blobManager, fastProjections))),
-                fetch(withoutPreviews, FetchGroup.FULL_CONTENT, mailboxSession)
+                fetch(withoutProjectionEntry, FetchGroup.FULL_CONTENT, mailboxSession)
                     .map(messageResults -> Helpers.toMessageViews(messageResults, messageFullViewFactory::fromMessageResults)))
             .flatMap(Flux::fromIterable);
     }


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


[james-project] 14/27: PROTOCOLS-120 ImapParserFactory should rely on AbstractImapCommandParser for commandName <-> parser binding

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 fa41121f0e539096a0a464a0b7130e2dcdcf9bd7
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 15:51:17 2019 +0700

    PROTOCOLS-120 ImapParserFactory should rely on AbstractImapCommandParser for commandName <-> parser binding
---
 .../imap/decode/parser/ImapParserFactory.java      | 152 +++++++++++----------
 1 file changed, 79 insertions(+), 73 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
index 0d02fc0..23e6a75 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
@@ -19,14 +19,17 @@
 
 package org.apache.james.imap.decode.parser;
 
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Stream;
 
-import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.ImapCommandParser;
 import org.apache.james.imap.decode.ImapCommandParserFactory;
+import org.apache.james.imap.decode.base.AbstractImapCommandParser;
+
+import com.github.steveash.guavate.Guavate;
 
 /**
  * A factory for ImapCommand instances, provided based on the command name.
@@ -36,77 +39,80 @@ public class ImapParserFactory implements ImapCommandParserFactory {
     private final Map<String, ImapCommandParser> imapCommands;
 
     public ImapParserFactory(StatusResponseFactory statusResponseFactory) {
-        imapCommands = new HashMap<>();
-
-        // Commands valid in any state
-        // CAPABILITY, NOOP, and LOGOUT
-        imapCommands.put(ImapConstants.CAPABILITY_COMMAND_NAME, new CapabilityCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.NOOP_COMMAND_NAME, new NoopCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.LOGOUT_COMMAND_NAME, new LogoutCommandParser(statusResponseFactory));
-
-        // Commands valid in NON_AUTHENTICATED state.
-        // AUTHENTICATE and LOGIN
-        imapCommands.put(ImapConstants.AUTHENTICATE_COMMAND_NAME, new AuthenticateCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.LOGIN_COMMAND_NAME, new LoginCommandParser(statusResponseFactory));
-
-        // Commands valid in AUTHENTICATED or SELECTED state.
-        // RFC2060: SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE,
-        // UNSUBSCRIBE, LIST, LSUB, STATUS, and APPEND
-        imapCommands.put(ImapConstants.SELECT_COMMAND_NAME, new SelectCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.EXAMINE_COMMAND_NAME, new ExamineCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.CREATE_COMMAND_NAME, new CreateCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.DELETE_COMMAND_NAME, new DeleteCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.RENAME_COMMAND_NAME, new RenameCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.SUBSCRIBE_COMMAND_NAME, new SubscribeCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.UNSUBSCRIBE_COMMAND_NAME, new UnsubscribeCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.LIST_COMMAND_NAME, new ListCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.XLIST_COMMAND_NAME, new XListCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.LSUB_COMMAND_NAME, new LsubCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.STATUS_COMMAND_NAME, new StatusCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.APPEND_COMMAND_NAME, new AppendCommandParser(statusResponseFactory));
-
-        // RFC2342 NAMESPACE
-        imapCommands.put(ImapConstants.NAMESPACE_COMMAND_NAME, new NamespaceCommandParser(statusResponseFactory));
-
-        // RFC4314 GETACL, SETACL, DELETEACL, LISTRIGHTS, MYRIGHTS
-        imapCommands.put(ImapConstants.GETACL_COMMAND_NAME, new GetACLCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.SETACL_COMMAND_NAME, new SetACLCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.DELETEACL_COMMAND_NAME, new DeleteACLCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.LISTRIGHTS_COMMAND_NAME, new ListRightsCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.MYRIGHTS_COMMAND_NAME, new MyRightsCommandParser(statusResponseFactory));
-
-        // Commands only valid in SELECTED state.
-        // CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY, UID and IDLE
-        imapCommands.put(ImapConstants.CHECK_COMMAND_NAME, new CheckCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.CLOSE_COMMAND_NAME, new CloseCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.EXPUNGE_COMMAND_NAME, new ExpungeCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.COPY_COMMAND_NAME, new CopyCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.MOVE_COMMAND_NAME, new MoveCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.SEARCH_COMMAND_NAME, new SearchCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.FETCH_COMMAND_NAME, new FetchCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.STORE_COMMAND_NAME, new StoreCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.UID_COMMAND_NAME, new UidCommandParser(this, statusResponseFactory));
-        imapCommands.put(ImapConstants.IDLE_COMMAND_NAME, new IdleCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.STARTTLS, new StartTLSCommandParser(statusResponseFactory));
-
-        // RFC3691
-        imapCommands.put(ImapConstants.UNSELECT_COMMAND_NAME, new UnselectCommandParser(statusResponseFactory));
-
-        // RFC4978
-        imapCommands.put(ImapConstants.COMPRESS_COMMAND_NAME, new CompressCommandParser(statusResponseFactory));
-
-        imapCommands.put(ImapConstants.ENABLE_COMMAND_NAME, new EnableCommandParser(statusResponseFactory));
-
-        // RFC2087
-        // GETQUOTAROOT, GETQUOTA, SETQUOTA
-        imapCommands.put(ImapConstants.GETQUOTAROOT_COMMAND_NAME, new GetQuotaRootCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.GETQUOTA_COMMAND_NAME, new GetQuotaCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.SETQUOTA_COMMAND_NAME, new SetQuotaCommandParser(statusResponseFactory));
-
-        //RFC5464
-        //SETMETADATA, GETMETADATA
-        imapCommands.put(ImapConstants.SETANNOTATION_COMMAND_NAME, new SetAnnotationCommandParser(statusResponseFactory));
-        imapCommands.put(ImapConstants.GETANNOTATION_COMMAND_NAME, new GetAnnotationCommandParser(statusResponseFactory));
+        Stream<AbstractImapCommandParser> parsers = Stream.of(
+            // Commands valid in any state
+            // CAPABILITY, NOOP, and LOGOUT
+            new CapabilityCommandParser(statusResponseFactory),
+            new NoopCommandParser(statusResponseFactory),
+            new LogoutCommandParser(statusResponseFactory),
+
+            // Commands valid in NON_AUTHENTICATED state.
+            // AUTHENTICATE and LOGIN
+            new AuthenticateCommandParser(statusResponseFactory),
+            new LoginCommandParser(statusResponseFactory),
+
+            // Commands valid in AUTHENTICATED or SELECTED state.
+            // RFC2060: SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE,
+            // UNSUBSCRIBE, LIST, LSUB, STATUS, and APPEND
+            new SelectCommandParser(statusResponseFactory),
+            new ExamineCommandParser(statusResponseFactory),
+            new CreateCommandParser(statusResponseFactory),
+            new DeleteCommandParser(statusResponseFactory),
+            new RenameCommandParser(statusResponseFactory),
+            new SubscribeCommandParser(statusResponseFactory),
+            new UnsubscribeCommandParser(statusResponseFactory),
+            new ListCommandParser(statusResponseFactory),
+            new XListCommandParser(statusResponseFactory),
+            new LsubCommandParser(statusResponseFactory),
+            new StatusCommandParser(statusResponseFactory),
+            new AppendCommandParser(statusResponseFactory),
+
+            // RFC2342 NAMESPACE
+            new NamespaceCommandParser(statusResponseFactory),
+
+            // RFC4314 GETACL, SETACL, DELETEACL, LISTRIGHTS, MYRIGHTS
+            new GetACLCommandParser(statusResponseFactory),
+            new SetACLCommandParser(statusResponseFactory),
+            new DeleteACLCommandParser(statusResponseFactory),
+            new ListRightsCommandParser(statusResponseFactory),
+            new MyRightsCommandParser(statusResponseFactory),
+
+            // Commands only valid in SELECTED state.
+            // CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY, UID and IDLE
+            new CheckCommandParser(statusResponseFactory),
+            new CloseCommandParser(statusResponseFactory),
+            new ExpungeCommandParser(statusResponseFactory),
+            new CopyCommandParser(statusResponseFactory),
+            new MoveCommandParser(statusResponseFactory),
+            new SearchCommandParser(statusResponseFactory),
+            new FetchCommandParser(statusResponseFactory),
+            new StoreCommandParser(statusResponseFactory),
+            new UidCommandParser(this, statusResponseFactory),
+            new IdleCommandParser(statusResponseFactory),
+            new StartTLSCommandParser(statusResponseFactory),
+
+            // RFC3691
+            new UnselectCommandParser(statusResponseFactory),
+
+            // RFC4978
+            new CompressCommandParser(statusResponseFactory),
+
+            new EnableCommandParser(statusResponseFactory),
+
+            // RFC2087
+            // GETQUOTAROOT, GETQUOTA, SETQUOTA
+            new GetQuotaRootCommandParser(statusResponseFactory),
+            new GetQuotaCommandParser(statusResponseFactory),
+            new SetQuotaCommandParser(statusResponseFactory),
+
+            //RFC5464
+            //SETMETADATA, GETMETADATA
+            new SetAnnotationCommandParser(statusResponseFactory),
+            new GetAnnotationCommandParser(statusResponseFactory));
+
+        imapCommands = parsers.collect(Guavate.toImmutableMap(
+                parser -> parser.getCommand().getName(),
+                Function.identity()));
     }
 
     @Override


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


[james-project] 24/27: JAMES-2992 Rework MessageFastViewFactory accordingly

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 532d29bc4fa42db895551534df7b1d59fe2ef08c
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 10:17:44 2019 +0700

    JAMES-2992 Rework MessageFastViewFactory accordingly
    
    We can now avoid some collection copy and inline some extracted methods
---
 .../model/message/view/MessageFastViewFactory.java   | 20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
index b212c11..cc11416 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/model/message/view/MessageFastViewFactory.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javax.inject.Inject;
 
@@ -118,30 +119,27 @@ public class MessageFastViewFactory implements MessageViewFactory<MessageFastVie
 
     @Override
     public List<MessageFastView> fromMessageIds(List<MessageId> messageIds, MailboxSession mailboxSession) {
+        ImmutableSet<MessageId> messageIdSet = ImmutableSet.copyOf(messageIds);
         return Mono.from(fastViewProjection.retrieve(messageIds))
-            .flatMapMany(fastProjections -> gatherMessageViews(messageIds, mailboxSession, fastProjections))
+            .flatMapMany(fastProjections -> gatherMessageViews(messageIdSet, mailboxSession, fastProjections))
             .collectList()
             .subscribeOn(Schedulers.boundedElastic())
             .block();
     }
 
-    private Flux<MessageFastView> gatherMessageViews(List<MessageId> messageIds, MailboxSession mailboxSession,
+    private Flux<MessageFastView> gatherMessageViews(Set<MessageId> messageIds, MailboxSession mailboxSession,
                                                      Map<MessageId, MessageFastViewPrecomputedProperties> fastProjections) {
+        Set<MessageId> withPreview = fastProjections.keySet();
+        Set<MessageId> withoutPreviews = Sets.difference(messageIds, fastProjections.keySet());
         return Flux.merge(
-                fetch(ImmutableList.copyOf(fastProjections.keySet()), FetchGroup.HEADERS, mailboxSession)
+                fetch(withPreview, FetchGroup.HEADERS, mailboxSession)
                     .map(messageResults -> Helpers.toMessageViews(messageResults, new FromMessageResultAndPreview(blobManager, fastProjections))),
-                fetch(withoutPreviews(messageIds, fastProjections), FetchGroup.FULL_CONTENT, mailboxSession)
+                fetch(withoutPreviews, FetchGroup.FULL_CONTENT, mailboxSession)
                     .map(messageResults -> Helpers.toMessageViews(messageResults, messageFullViewFactory::fromMessageResults)))
             .flatMap(Flux::fromIterable);
     }
 
-    private List<MessageId> withoutPreviews(List<MessageId> messageIds, Map<MessageId, MessageFastViewPrecomputedProperties> fastProjections) {
-        return ImmutableList.copyOf(Sets.difference(
-            ImmutableSet.copyOf(messageIds),
-            fastProjections.keySet()));
-    }
-
-    private Mono<List<MessageResult>> fetch(List<MessageId> messageIds, FetchGroup fetchGroup, MailboxSession mailboxSession) {
+    private Mono<List<MessageResult>> fetch(Collection<MessageId> messageIds, FetchGroup fetchGroup, MailboxSession mailboxSession) {
         return Mono.fromCallable(() -> messageIdManager.getMessages(messageIds, fetchGroup, mailboxSession))
             .onErrorResume(MailboxException.class, ex -> {
                 LOGGER.error("cannot read messages {}", messageIds, ex);


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


[james-project] 17/27: PROTOCOLS-120 ImapEncoders should no longer be chained

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 cea95b025b2350c0c4aa0629c3f4c6bee8865891
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 14:06:38 2019 +0700

    PROTOCOLS-120 ImapEncoders should no longer be chained
---
 .../james/imap/encode/ACLResponseEncoder.java      | 19 ++---
 .../imap/encode/AnnotationResponseEncoder.java     | 19 ++---
 .../imap/encode/AuthenticateResponseEncoder.java   | 16 +---
 .../imap/encode/CapabilityResponseEncoder.java     | 18 ++---
 .../imap/encode/ContinuationResponseEncoder.java   | 22 ++----
 .../james/imap/encode/ESearchResponseEncoder.java  | 18 ++---
 .../james/imap/encode/EnableResponseEncoder.java   | 18 ++---
 .../james/imap/encode/ExistsResponseEncoder.java   | 18 ++---
 .../james/imap/encode/ExpungeResponseEncoder.java  | 17 ++--
 .../james/imap/encode/FetchResponseEncoder.java    | 50 +++++-------
 .../james/imap/encode/FlagsResponseEncoder.java    | 18 ++---
 ...sponseEncoder.java => ImapResponseEncoder.java} | 33 ++++----
 .../james/imap/encode/LSubResponseEncoder.java     | 20 ++---
 .../james/imap/encode/ListResponseEncoder.java     | 20 ++---
 .../imap/encode/ListRightsResponseEncoder.java     | 18 ++---
 .../imap/encode/MailboxStatusResponseEncoder.java  | 19 ++---
 .../james/imap/encode/MyRightsResponseEncoder.java | 20 ++---
 .../imap/encode/NamespaceResponseEncoder.java      | 19 ++---
 .../james/imap/encode/QuotaResponseEncoder.java    | 21 ++---
 .../imap/encode/QuotaRootResponseEncoder.java      | 22 ++----
 .../james/imap/encode/RecentResponseEncoder.java   | 17 ++--
 .../james/imap/encode/SearchResponseEncoder.java   | 18 ++---
 .../james/imap/encode/StatusResponseEncoder.java   | 23 +++---
 .../james/imap/encode/VanishedResponseEncoder.java | 22 ++----
 .../james/imap/encode/XListResponseEncoder.java    | 22 ++----
 .../encode/base/AbstractChainedImapEncoder.java    | 86 ---------------------
 .../encode/main/DefaultImapEncoderFactory.java     | 90 +++++++++++++++-------
 .../imap/encode/AnnotationResponseEncoderTest.java |  3 +-
 .../encode/FetchResponseEncoderEnvelopeTest.java   | 40 +++++-----
 .../FetchResponseEncoderNoExtensionsTest.java      | 24 ++----
 .../imap/encode/FetchResponseEncoderTest.java      | 23 ++----
 .../james/imap/encode/LSubResponseEncoderTest.java | 26 +------
 .../james/imap/encode/ListResponseEncoderTest.java | 27 +------
 .../encode/MailboxStatusResponseEncoderTest.java   | 14 +---
 .../imap/encode/NamespaceResponseEncoderTest.java  | 21 ++---
 .../imap/encode/QuotaResponseEncoderTest.java      |  5 +-
 .../imap/encode/QuotaRootResponseEncoderTest.java  |  3 +-
 .../imap/encode/SearchResponseEncoderTest.java     | 17 +---
 .../imap/encode/XListResponseEncoderTest.java      | 31 +-------
 39 files changed, 274 insertions(+), 663 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
index 09f05a4..9cbb8c4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
@@ -24,27 +24,18 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.ACLResponse;
 import org.apache.james.mailbox.model.MailboxACL.EntryKey;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 
 /**
  * ACL Response Encoder.
- * 
  */
-public class ACLResponseEncoder extends AbstractChainedImapEncoder {
-
-    public ACLResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
+public class ACLResponseEncoder implements ImapResponseEncoder<ACLResponse> {
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final ACLResponse aclResponse = (ACLResponse) acceptableMessage;
-        final Map<EntryKey, Rfc4314Rights> entries = aclResponse.getAcl().getEntries();
+    public void encode(ACLResponse aclResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+        Map<EntryKey, Rfc4314Rights> entries = aclResponse.getAcl().getEntries();
         composer.untagged();
         composer.commandName(ImapConstants.ACL_RESPONSE_NAME);
         
@@ -63,7 +54,7 @@ public class ACLResponseEncoder extends AbstractChainedImapEncoder {
     }
 
     @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return message instanceof ACLResponse;
+    public Class<ACLResponse> acceptableMessages() {
+        return ACLResponse.class;
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/AnnotationResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/AnnotationResponseEncoder.java
index 6b0c36a..21429f2 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/AnnotationResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/AnnotationResponseEncoder.java
@@ -24,26 +24,22 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.AnnotationResponse;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AnnotationResponseEncoder extends AbstractChainedImapEncoder {
+public class AnnotationResponseEncoder implements ImapResponseEncoder<AnnotationResponse> {
     private static final Logger LOGGER = LoggerFactory.getLogger(AnnotationResponseEncoder.class);
 
-    public AnnotationResponseEncoder(ImapEncoder next) {
-        super(next);
+    @Override
+    public Class<AnnotationResponse> acceptableMessages() {
+        return AnnotationResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, final ImapResponseComposer composer, ImapSession session) throws IOException {
-
-        AnnotationResponse response = (AnnotationResponse) acceptableMessage;
-
+    public void encode(AnnotationResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
         composer.untagged();
         composer.commandName(ImapConstants.ANNOTATION_RESPONSE_NAME);
 
@@ -71,9 +67,4 @@ public class AnnotationResponseEncoder extends AbstractChainedImapEncoder {
             composer.quote(annotation.getValue().orElse(""));
         }
     }
-
-    @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return message instanceof AnnotationResponse;
-    }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java
index 689a2ca..bbb6c46 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java
@@ -20,25 +20,17 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.AuthenticateResponse;
 
-public class AuthenticateResponseEncoder  extends AbstractChainedImapEncoder {
-
-    public AuthenticateResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
+public class AuthenticateResponseEncoder implements ImapResponseEncoder<AuthenticateResponse> {
     @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return message instanceof AuthenticateResponse;
+    public Class<AuthenticateResponse> acceptableMessages() {
+        return AuthenticateResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(AuthenticateResponse message, ImapResponseComposer composer, ImapSession session) throws IOException {
         composer.continuationResponse("");
     }
-
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java
index 90eee64..685d283 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java
@@ -22,10 +22,8 @@ import java.io.IOException;
 import java.util.Iterator;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.message.Capability;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.CapabilityResponse;
 
 /**
@@ -33,15 +31,14 @@ import org.apache.james.imap.message.response.CapabilityResponse;
  * href='http://james.apache.org/server/rfclist/imap4/rfc2060.txt'
  * rel='tag'>RFC2060</a>.
  */
-public class CapabilityResponseEncoder extends AbstractChainedImapEncoder {
-
-    public CapabilityResponseEncoder(ImapEncoder next) {
-        super(next);
+public class CapabilityResponseEncoder implements ImapResponseEncoder<CapabilityResponse> {
+    @Override
+    public Class<CapabilityResponse> acceptableMessages() {
+        return CapabilityResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final CapabilityResponse response = (CapabilityResponse) acceptableMessage;
+    public void encode(CapabilityResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
         Iterator<Capability> capabilities = response.getCapabilities().iterator();
         composer.untagged();
         composer.message(ImapConstants.CAPABILITY_COMMAND_NAME);
@@ -50,9 +47,4 @@ public class CapabilityResponseEncoder extends AbstractChainedImapEncoder {
         }
         composer.end();        
     }
-
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof CapabilityResponse);
-    }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java
index f589984..9620c00 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java
@@ -22,28 +22,28 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 import java.util.ArrayList;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.display.Locales;
 import org.apache.james.imap.api.display.Localizer;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.ContinuationResponse;
 
-public class ContinuationResponseEncoder extends AbstractChainedImapEncoder {
+public class ContinuationResponseEncoder implements ImapResponseEncoder<ContinuationResponse> {
 
     private final Localizer localizer;
 
-    public ContinuationResponseEncoder(ImapEncoder next, Localizer localizer) {
-        super(next);
+    public ContinuationResponseEncoder(Localizer localizer) {
         this.localizer = localizer;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public Class<ContinuationResponse> acceptableMessages() {
+        return ContinuationResponse.class;
+    }
 
-        ContinuationResponse response = (ContinuationResponse) acceptableMessage;
-        final String message = response.getData() != null ? response.getData() : asString(response.getTextKey(), session);
+    @Override
+    public void encode(ContinuationResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+        String message = response.getData() != null ? response.getData() : asString(response.getTextKey(), session);
         composer.continuationResponse(message);
     }
 
@@ -51,10 +51,4 @@ public class ContinuationResponseEncoder extends AbstractChainedImapEncoder {
         // TODO: calculate locales
         return localizer.localize(text, new Locales(new ArrayList<>(), null));
     }
-
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof ContinuationResponse);
-    }
-
 }
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 8a4b65d..289e659 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
@@ -21,28 +21,25 @@ package org.apache.james.imap.encode;
 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;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.ESearchResponse;
 import org.apache.james.mailbox.ModSeq;
 
 /**
  * Encoders IMAP4rev1 <code>ESEARCH</code> responses.
  */
-public class ESearchResponseEncoder extends AbstractChainedImapEncoder {
-
-    public ESearchResponseEncoder(ImapEncoder next) {
-        super(next);
+public class ESearchResponseEncoder implements ImapResponseEncoder<ESearchResponse> {
+    @Override
+    public Class<ESearchResponse> acceptableMessages() {
+        return ESearchResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        ESearchResponse response = (ESearchResponse) acceptableMessage;
+    public void encode(ESearchResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
         Tag tag = response.getTag();
         long min = response.getMinUid();
         long max = response.getMaxUid();
@@ -84,9 +81,4 @@ public class ESearchResponseEncoder extends AbstractChainedImapEncoder {
         }
         composer.end();
     }
-
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof ESearchResponse);
-    }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java
index d9ca32f..0cdd72f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java
@@ -21,24 +21,21 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 import java.util.Set;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.message.Capability;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.EnableResponse;
 
 /**
  * Encodes <code>Enable</code> response.
  */
-public class EnableResponseEncoder extends AbstractChainedImapEncoder {
-
-    public EnableResponseEncoder(ImapEncoder next) {
-        super(next);
+public class EnableResponseEncoder implements ImapResponseEncoder<EnableResponse> {
+    @Override
+    public Class<EnableResponse> acceptableMessages() {
+        return EnableResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final EnableResponse response = (EnableResponse) acceptableMessage;
+    public void encode(EnableResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
         Set<Capability> capabilities = response.getCapabilities();
         composer.untagged();
         // Return ENABLED capabilities. See IMAP-323
@@ -48,9 +45,4 @@ public class EnableResponseEncoder extends AbstractChainedImapEncoder {
         }
         composer.end();
     }
-    
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof EnableResponse);
-    }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java
index ad205cb..6263ab5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java
@@ -21,28 +21,20 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.ExistsResponse;
 
-public class ExistsResponseEncoder extends AbstractChainedImapEncoder {
-   
+public class ExistsResponseEncoder implements ImapResponseEncoder<ExistsResponse> {
     public static final String EXISTS = "EXISTS";
 
-    public ExistsResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
     @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return message instanceof ExistsResponse;
+    public Class<ExistsResponse> acceptableMessages() {
+        return ExistsResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final ExistsResponse existsResponse = (ExistsResponse) acceptableMessage;
-        final long numberOfMessages = existsResponse.getNumberOfMessages();
+    public void encode(ExistsResponse existsResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+        long numberOfMessages = existsResponse.getNumberOfMessages();
         
         composer.untagged().message(numberOfMessages).message(EXISTS).end();
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java
index 0308f39..25ad3f5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java
@@ -21,27 +21,20 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.ExpungeResponse;
 
-public class ExpungeResponseEncoder extends AbstractChainedImapEncoder {
+public class ExpungeResponseEncoder implements ImapResponseEncoder<ExpungeResponse> {
     public static final String EXPUNGE = "EXPUNGE";
 
-    public ExpungeResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
     @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return (message instanceof ExpungeResponse);
+    public Class<ExpungeResponse> acceptableMessages() {
+        return ExpungeResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final ExpungeResponse expungeResponse = (ExpungeResponse) acceptableMessage;
-        final int messageSequenceNumber = expungeResponse.getMessageSequenceNumber();
+    public void encode(ExpungeResponse expungeResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+        int messageSequenceNumber = expungeResponse.getMessageSequenceNumber();
         composer.untagged().message(messageSequenceNumber).message(EXPUNGE).end();
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
index 344ebe1..6bc11be 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
@@ -31,9 +31,7 @@ import java.util.TreeSet;
 import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.FetchResponse;
 import org.apache.james.imap.message.response.FetchResponse.Structure;
 import org.apache.james.mailbox.MessageUid;
@@ -41,7 +39,7 @@ import org.apache.james.mailbox.ModSeq;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class FetchResponseEncoder extends AbstractChainedImapEncoder {
+public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse> {
     private static final Logger LOGGER = LoggerFactory.getLogger(FetchResponseEncoder.class);
     public static final String ENVELOPE = "ENVELOPE";
 
@@ -50,44 +48,38 @@ public class FetchResponseEncoder extends AbstractChainedImapEncoder {
 
     /**
      * Constructs an encoder for FETCH messages.
-     * 
-     * @param next
-     *            not null
+     *
      * @param neverAddBodyStructureExtensions
      *            true to activate a workaround for broken clients who cannot
      *            parse BODYSTRUCTURE extensions, false to fully support RFC3501
      */
-    public FetchResponseEncoder(ImapEncoder next, boolean neverAddBodyStructureExtensions) {
-        super(next);
+    public FetchResponseEncoder(boolean neverAddBodyStructureExtensions) {
         this.neverAddBodyStructureExtensions = neverAddBodyStructureExtensions;
     }
 
     @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return (message instanceof FetchResponse);
+    public Class<FetchResponse> acceptableMessages() {
+        return FetchResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        if (acceptableMessage instanceof FetchResponse) {
-            final FetchResponse fetchResponse = (FetchResponse) acceptableMessage;
-            final long messageNumber = fetchResponse.getMessageNumber();
-            
-            composer.untagged().message(messageNumber).message(ImapConstants.FETCH_COMMAND_NAME).openParen();
+    public void encode(FetchResponse fetchResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+        long messageNumber = fetchResponse.getMessageNumber();
 
-            
-            encodeModSeq(composer, fetchResponse);
-            encodeFlags(composer, fetchResponse);
-            encodeInternalDate(composer, fetchResponse);
-            encodeSize(composer, fetchResponse);
-            encodeEnvelope(composer, fetchResponse);
-            encodeBody(composer, fetchResponse.getBody(), session);
-            encodeBodyStructure(composer, fetchResponse.getBodyStructure(), session);
-            encodeUid(composer, fetchResponse);
-            encodeBodyElements(composer, fetchResponse.getElements());
-            
-            composer.closeParen().end();
-        }
+        composer.untagged().message(messageNumber).message(ImapConstants.FETCH_COMMAND_NAME).openParen();
+
+
+        encodeModSeq(composer, fetchResponse);
+        encodeFlags(composer, fetchResponse);
+        encodeInternalDate(composer, fetchResponse);
+        encodeSize(composer, fetchResponse);
+        encodeEnvelope(composer, fetchResponse);
+        encodeBody(composer, fetchResponse.getBody(), session);
+        encodeBodyStructure(composer, fetchResponse.getBodyStructure(), session);
+        encodeUid(composer, fetchResponse);
+        encodeBodyElements(composer, fetchResponse.getElements());
+
+        composer.closeParen().end();
     }
 
     // Handle the MODSEQ 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java
index 1d31d66..548f3ec 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java
@@ -23,26 +23,18 @@ import java.io.IOException;
 
 import javax.mail.Flags;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.FlagsResponse;
 
-public class FlagsResponseEncoder extends AbstractChainedImapEncoder {
-
-    public FlagsResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
+public class FlagsResponseEncoder implements ImapResponseEncoder<FlagsResponse> {
     @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return message instanceof FlagsResponse;
+    public Class<FlagsResponse> acceptableMessages() {
+        return FlagsResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final FlagsResponse flagsResponse = (FlagsResponse) acceptableMessage;
-        final Flags flags = flagsResponse.getFlags();
+    public void encode(FlagsResponse flagsResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+        Flags flags = flagsResponse.getFlags();
         composer.untagged().flags(flags).end();
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
similarity index 68%
copy from protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java
copy to protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
index 689a2ca..dc7c0ed 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
@@ -16,29 +16,28 @@
  * specific language governing permissions and limitations      *
  * under the License.                                           *
  ****************************************************************/
+
 package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
-import org.apache.james.imap.message.response.AuthenticateResponse;
-
-public class AuthenticateResponseEncoder  extends AbstractChainedImapEncoder {
-
-    public AuthenticateResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return message instanceof AuthenticateResponse;
-    }
 
-    @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        composer.continuationResponse("");
-    }
+public interface ImapResponseEncoder<T extends ImapMessage> {
+    Class<T> acceptableMessages();
 
+    /**
+     * Writes response.
+     * 
+     * @param message
+     *            <code>ImapMessage</code>, not null
+     * @param composer
+     *            <code>ImapResponseComposer</code>, not null
+     * @param session
+     *            TODO
+     * @throws IOException
+     *             when message encoding fails
+     */
+    void encode(T message, ImapResponseComposer composer, ImapSession session) throws IOException;
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java
index 8e47eea..315ef46 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java
@@ -21,30 +21,20 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
-import org.apache.james.imap.message.response.AbstractListingResponse;
 import org.apache.james.imap.message.response.LSubResponse;
 
 /**
  * Encoders IMAP4rev1 <code>List</code> responses.
  */
-public class LSubResponseEncoder extends AbstractChainedImapEncoder {
-
-    public LSubResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
+public class LSubResponseEncoder implements ImapResponseEncoder<LSubResponse> {
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final AbstractListingResponse response = (AbstractListingResponse) acceptableMessage;
-        ListingEncodingUtils.encodeListingResponse(ImapConstants.LSUB_RESPONSE_NAME, composer, response);
+    public Class<LSubResponse> acceptableMessages() {
+        return LSubResponse.class;
     }
 
     @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof LSubResponse);
+    public void encode(LSubResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+        ListingEncodingUtils.encodeListingResponse(ImapConstants.LSUB_RESPONSE_NAME, composer, response);
     }
-
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java
index 7485796..ba8df0f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java
@@ -21,30 +21,20 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
-import org.apache.james.imap.message.response.AbstractListingResponse;
 import org.apache.james.imap.message.response.ListResponse;
 
 /**
  * Encoders IMAP4rev1 <code>List</code> responses.
  */
-public class ListResponseEncoder extends AbstractChainedImapEncoder {
-
-    public ListResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
+public class ListResponseEncoder implements ImapResponseEncoder<ListResponse> {
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final AbstractListingResponse response = (AbstractListingResponse) acceptableMessage;
-        ListingEncodingUtils.encodeListingResponse(ImapConstants.LIST_RESPONSE_NAME, composer, response);
+    public Class<ListResponse> acceptableMessages() {
+        return ListResponse.class;
     }
 
     @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof ListResponse);
+    public void encode(ListResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+        ListingEncodingUtils.encodeListingResponse(ImapConstants.LIST_RESPONSE_NAME, composer, response);
     }
-
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java
index 18b7b2e..86428cc 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java
@@ -22,24 +22,21 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.ListRightsResponse;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 
 /**
  * ACL Response Encoder.
  */
-public class ListRightsResponseEncoder extends AbstractChainedImapEncoder {
-
-    public ListRightsResponseEncoder(ImapEncoder next) {
-        super(next);
+public class ListRightsResponseEncoder implements ImapResponseEncoder<ListRightsResponse> {
+    @Override
+    public Class<ListRightsResponse> acceptableMessages() {
+        return ListRightsResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final ListRightsResponse listRightsResponse = (ListRightsResponse) acceptableMessage;
+    public void encode(ListRightsResponse listRightsResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
         composer.untagged();
         composer.commandName(ImapConstants.LISTRIGHTS_RESPONSE_NAME);
         
@@ -56,9 +53,4 @@ public class ListRightsResponseEncoder extends AbstractChainedImapEncoder {
        }
         composer.end();
     }
-
-    @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return message instanceof ListRightsResponse;
-    }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
index 20a961d..b507434 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
@@ -22,9 +22,7 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.MailboxStatusResponse;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
@@ -32,15 +30,14 @@ import org.apache.james.mailbox.ModSeq;
 /**
  * Encodes <code>STATUS</code> responses.
  */
-public class MailboxStatusResponseEncoder extends AbstractChainedImapEncoder implements ImapConstants {
-
-    public MailboxStatusResponseEncoder(ImapEncoder next) {
-        super(next);
+public class MailboxStatusResponseEncoder implements ImapConstants, ImapResponseEncoder<MailboxStatusResponse> {
+    @Override
+    public Class<MailboxStatusResponse> acceptableMessages() {
+        return MailboxStatusResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        MailboxStatusResponse response = (MailboxStatusResponse) acceptableMessage;
+    public void encode(MailboxStatusResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
         Long messages = response.getMessages();
         Long recent = response.getRecent();
         MessageUid uidNext = response.getUidNext();
@@ -92,10 +89,4 @@ public class MailboxStatusResponseEncoder extends AbstractChainedImapEncoder imp
         composer.closeParen();
         composer.end();
     }
-
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return message != null && message instanceof MailboxStatusResponse;
-    }
-
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java
index 20a124a..e5f619c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java
@@ -22,25 +22,22 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.MyRightsResponse;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 
 /**
  * MYRIGHTS Response Encoder.
  */
-public class MyRightsResponseEncoder extends AbstractChainedImapEncoder {
-
-    public MyRightsResponseEncoder(ImapEncoder next) {
-        super(next);
+public class MyRightsResponseEncoder implements ImapResponseEncoder<MyRightsResponse> {
+    @Override
+    public Class<MyRightsResponse> acceptableMessages() {
+        return MyRightsResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final MyRightsResponse aclResponse = (MyRightsResponse) acceptableMessage;
-        final Rfc4314Rights myRights = aclResponse.getMyRights();
+    public void encode(MyRightsResponse aclResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+        Rfc4314Rights myRights = aclResponse.getMyRights();
         composer.untagged();
         composer.commandName(ImapConstants.MYRIGHTS_RESPONSE_NAME);
         
@@ -49,9 +46,4 @@ public class MyRightsResponseEncoder extends AbstractChainedImapEncoder {
         composer.quote(myRights == null ? "" : myRights.serialize());
         composer.end();
     }
-
-    @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return message instanceof MyRightsResponse;
-    }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java
index 9cc5987..3eee9cc 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java
@@ -22,24 +22,21 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.NamespaceResponse;
 import org.apache.james.imap.message.response.NamespaceResponse.Namespace;
 
 /**
  * Encodes namespace responses.
  */
-public class NamespaceResponseEncoder extends AbstractChainedImapEncoder {
-
-    public NamespaceResponseEncoder(ImapEncoder next) {
-        super(next);
+public class NamespaceResponseEncoder implements ImapResponseEncoder<NamespaceResponse> {
+    @Override
+    public Class<NamespaceResponse> acceptableMessages() {
+        return NamespaceResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final NamespaceResponse response = (NamespaceResponse) acceptableMessage;
+    public void encode(NamespaceResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
         composer.untagged();
         composer.commandName(ImapConstants.NAMESPACE_COMMAND_NAME);
 
@@ -77,10 +74,4 @@ public class NamespaceResponseEncoder extends AbstractChainedImapEncoder {
         composer.quote(delimiter);
         composer.closeParen();
     }
-
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return message instanceof NamespaceResponse;
-    }
-
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
index a803ec7..9764e54 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
@@ -23,26 +23,21 @@ import java.io.IOException;
 import java.util.Locale;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.QuotaResponse;
 import org.apache.james.mailbox.model.Quota;
 
 /**
  * Quota response encoder
  */
-public class QuotaResponseEncoder extends AbstractChainedImapEncoder {
-
-    public QuotaResponseEncoder(ImapEncoder next) {
-        super(next);
+public class QuotaResponseEncoder implements ImapResponseEncoder<QuotaResponse> {
+    @Override
+    public Class<QuotaResponse> acceptableMessages() {
+        return QuotaResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-
-        QuotaResponse quotaResponse = (QuotaResponse) acceptableMessage;
-
+    public void encode(QuotaResponse quotaResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
         String quotaRoot = quotaResponse.getQuotaRoot();
         Quota<?, ?> quota = quotaResponse.getQuota();
 
@@ -75,10 +70,4 @@ public class QuotaResponseEncoder extends AbstractChainedImapEncoder {
         composer.message(quota.getUsed().asLong());
         composer.message(quota.getLimit().asLong());
     }
-
-    @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return message instanceof QuotaResponse;
-    }
-
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java
index e464b78..b13505f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java
@@ -22,39 +22,27 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.QuotaRootResponse;
 
 /**
  * QUOTAROOT response encoder
  */
-public class QuotaRootResponseEncoder extends AbstractChainedImapEncoder {
-
-    public QuotaRootResponseEncoder(ImapEncoder next) {
-        super(next);
+public class QuotaRootResponseEncoder implements ImapResponseEncoder<QuotaRootResponse> {
+    @Override
+    public Class<QuotaRootResponse> acceptableMessages() {
+        return QuotaRootResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-
-        QuotaRootResponse quotaRootResponse = (QuotaRootResponse) acceptableMessage;
-
+    public void encode(QuotaRootResponse quotaRootResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
         String quotaRoot = quotaRootResponse.getQuotaRoot();
         String mailbox = quotaRootResponse.getMailboxName();
 
-
         composer.untagged();
         composer.commandName(ImapConstants.QUOTAROOT_RESPONSE_NAME);
         composer.mailbox(mailbox == null ? "" : mailbox);
         composer.message(quotaRoot == null ? "" : quotaRoot);
         composer.end();
     }
-
-    @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return message instanceof QuotaRootResponse;
-    }
-
 }
\ No newline at end of file
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java
index 72cc1c8..be8df6f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java
@@ -21,27 +21,20 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.RecentResponse;
 
-public class RecentResponseEncoder extends AbstractChainedImapEncoder {
+public class RecentResponseEncoder implements ImapResponseEncoder<RecentResponse> {
     public static final String RECENT = "RECENT";
 
-    public RecentResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
     @Override
-    public boolean isAcceptable(ImapMessage message) {
-        return (message instanceof RecentResponse);
+    public Class<RecentResponse> acceptableMessages() {
+        return RecentResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final RecentResponse recentResponse = (RecentResponse) acceptableMessage;
-        final int numberFlaggedRecent = recentResponse.getNumberFlaggedRecent();
+    public void encode(RecentResponse recentResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+        int numberFlaggedRecent = recentResponse.getNumberFlaggedRecent();
         composer.untagged().message(numberFlaggedRecent).message(RECENT).end();
     }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
index e5020f0..b91f3c3 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
@@ -21,24 +21,21 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.SearchResponse;
 import org.apache.james.mailbox.ModSeq;
 
 /**
  * Encoders IMAP4rev1 <code>SEARCH</code> responses.
  */
-public class SearchResponseEncoder extends AbstractChainedImapEncoder {
-
-    public SearchResponseEncoder(ImapEncoder next) {
-        super(next);
+public class SearchResponseEncoder implements ImapResponseEncoder<SearchResponse> {
+    @Override
+    public Class<SearchResponse> acceptableMessages() {
+        return SearchResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        SearchResponse response = (SearchResponse) acceptableMessage;
+    public void encode(SearchResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
         final long[] ids = response.getIds();
         ModSeq highestModSeq = response.getHighestModSeq();
         composer.untagged();
@@ -58,9 +55,4 @@ public class SearchResponseEncoder extends AbstractChainedImapEncoder {
         }
         composer.end();
     }
-
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof SearchResponse);
-    }
 }
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 7afafea..e811e5b 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
@@ -24,7 +24,6 @@ import java.util.ArrayList;
 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;
@@ -33,20 +32,22 @@ import org.apache.james.imap.api.message.response.StatusResponse;
 import org.apache.james.imap.api.message.response.StatusResponse.ResponseCode;
 import org.apache.james.imap.api.message.response.StatusResponse.Type;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
-
-public class StatusResponseEncoder extends AbstractChainedImapEncoder {
+import org.apache.james.imap.message.response.ImmutableStatusResponse;
 
+public class StatusResponseEncoder implements ImapResponseEncoder<ImmutableStatusResponse> {
     private final Localizer localizer;
 
-    public StatusResponseEncoder(ImapEncoder next, Localizer localizer) {
-        super(next);
+    public StatusResponseEncoder(Localizer localizer) {
         this.localizer = localizer;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        StatusResponse response = (StatusResponse) acceptableMessage;
+    public Class<ImmutableStatusResponse> acceptableMessages() {
+        return ImmutableStatusResponse.class;
+    }
+
+    @Override
+    public void encode(ImmutableStatusResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
         final Type serverResponseType = response.getServerResponseType();
         final String type = asString(serverResponseType);
         final ResponseCode responseCode = response.getResponseCode();
@@ -127,10 +128,4 @@ public class StatusResponseEncoder extends AbstractChainedImapEncoder {
         }
         return result;
     }
-
-    @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof StatusResponse);
-    }
-
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java
index d43e8f5..d17ba5b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java
@@ -20,35 +20,25 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
 import org.apache.james.imap.message.response.VanishedResponse;
 
-public class VanishedResponseEncoder extends AbstractChainedImapEncoder {
-
-    public VanishedResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
+public class VanishedResponseEncoder implements ImapResponseEncoder<VanishedResponse> {
     @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return message instanceof VanishedResponse;
+    public Class<VanishedResponse> acceptableMessages() {
+        return VanishedResponse.class;
     }
 
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        VanishedResponse vr = (VanishedResponse) acceptableMessage;
+    public void encode(VanishedResponse message, ImapResponseComposer composer, ImapSession session) throws IOException {
         composer.untagged();
         composer.message("VANISHED");
-        if (vr.isEarlier()) {
+        if (message.isEarlier()) {
             composer.openParen();
             composer.message("EARLIER");
             composer.closeParen();
         }
-        composer.sequenceSet(vr.getUids());
+        composer.sequenceSet(message.getUids());
         composer.end();
-        
     }
-
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
index 8ba977f..d24a9cf 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
@@ -21,29 +21,17 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
-import org.apache.james.imap.message.response.AbstractListingResponse;
 import org.apache.james.imap.message.response.XListResponse;
 
-/**
- *
- */
-public class XListResponseEncoder extends AbstractChainedImapEncoder {
-
-    public XListResponseEncoder(ImapEncoder next) {
-        super(next);
-    }
-
+public class XListResponseEncoder implements ImapResponseEncoder<XListResponse> {
     @Override
-    protected void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final AbstractListingResponse response = (AbstractListingResponse) acceptableMessage;
-        ListingEncodingUtils.encodeListingResponse(ImapConstants.XLIST_RESPONSE_NAME, composer, response);
+    public Class<XListResponse> acceptableMessages() {
+        return XListResponse.class;
     }
 
     @Override
-    protected boolean isAcceptable(ImapMessage message) {
-        return (message instanceof XListResponse);
+    public void encode(XListResponse message, ImapResponseComposer composer, ImapSession session) throws IOException {
+        ListingEncodingUtils.encodeListingResponse(ImapConstants.XLIST_RESPONSE_NAME, composer, message);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/base/AbstractChainedImapEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/base/AbstractChainedImapEncoder.java
deleted file mode 100644
index 1c454c7..0000000
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/base/AbstractChainedImapEncoder.java
+++ /dev/null
@@ -1,86 +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.imap.encode.base;
-
-import java.io.IOException;
-
-import org.apache.james.imap.api.ImapMessage;
-import org.apache.james.imap.api.process.ImapSession;
-import org.apache.james.imap.encode.ImapEncoder;
-import org.apache.james.imap.encode.ImapResponseComposer;
-
-/**
- * Abstract base class for chained {@link ImapEncoder} implementations.
- * Implementations of this will check if the {@link ImapMessage} should get
- * encoded by this Implementation or should get passed to the next
- * {@link ImapEncoder} in the chain
- */
-public abstract class AbstractChainedImapEncoder implements ImapEncoder {
-
-    private final ImapEncoder next;
-
-    public AbstractChainedImapEncoder(ImapEncoder next) {
-        super();
-        this.next = next;
-    }
-
-    /**
-     * Encode the {@link ImapMessage} if {@link #isAcceptable(ImapMessage)}
-     * return true, if not pass it to the next encoder in the chain
-     */
-    @Override
-    public void encode(ImapMessage message, ImapResponseComposer composer, ImapSession session) throws IOException {
-        final boolean isAcceptable = isAcceptable(message);
-        if (isAcceptable) {
-            doEncode(message, composer, session);
-        } else {
-            chainEncode(message, composer, session);
-        }
-    }
-
-    /**
-     * Call next Encoder in the chain
-     */
-    protected void chainEncode(ImapMessage message, ImapResponseComposer composer, ImapSession session) throws IOException {
-        next.encode(message, composer, session);
-    }
-
-    /**
-     * Is the given message acceptable?
-     * 
-     * @param message
-     *            <code>ImapMessage</code>, not null
-     * @return true if the given message is encodable by this encoder
-     */
-    protected abstract boolean isAcceptable(ImapMessage message);
-
-    /**
-     * Processes an acceptable message. Only messages passing
-     * {@link #isAcceptable(ImapMessage)} should be passed to this method.
-     * 
-     * @param acceptableMessage
-     *            <code>ImapMessage</code>, not null
-     * @param composer
-     *            <code>ImapResponseComposer</code>, not null
-     * @param session
-     *            TODO
-     */
-    protected abstract void doEncode(ImapMessage acceptableMessage, ImapResponseComposer composer, ImapSession session) throws IOException;
-}
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
index 974604f..1050ff7 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
@@ -19,7 +19,15 @@
 
 package org.apache.james.imap.encode.main;
 
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Stream;
+
+import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.display.Localizer;
+import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.ACLResponseEncoder;
 import org.apache.james.imap.encode.AnnotationResponseEncoder;
 import org.apache.james.imap.encode.AuthenticateResponseEncoder;
@@ -33,6 +41,8 @@ import org.apache.james.imap.encode.FetchResponseEncoder;
 import org.apache.james.imap.encode.FlagsResponseEncoder;
 import org.apache.james.imap.encode.ImapEncoder;
 import org.apache.james.imap.encode.ImapEncoderFactory;
+import org.apache.james.imap.encode.ImapResponseComposer;
+import org.apache.james.imap.encode.ImapResponseEncoder;
 import org.apache.james.imap.encode.LSubResponseEncoder;
 import org.apache.james.imap.encode.ListResponseEncoder;
 import org.apache.james.imap.encode.ListRightsResponseEncoder;
@@ -48,10 +58,36 @@ import org.apache.james.imap.encode.VanishedResponseEncoder;
 import org.apache.james.imap.encode.XListResponseEncoder;
 import org.apache.james.imap.encode.base.EndImapEncoder;
 
+import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.ImmutableList;
+
 /**
  * TODO: perhaps a POJO would be better
  */
 public class DefaultImapEncoderFactory implements ImapEncoderFactory {
+    private static class DefaultImapEncoder implements ImapEncoder {
+        private final Map<Class<? extends ImapMessage>, ImapResponseEncoder> encoders;
+        private final EndImapEncoder endImapEncoder;
+
+        private DefaultImapEncoder(Stream<ImapResponseEncoder> encoders, EndImapEncoder endImapEncoder) {
+            this.encoders = encoders
+                .collect(Guavate.toImmutableMap(
+                    ImapResponseEncoder::acceptableMessages,
+                    Function.identity()));
+            this.endImapEncoder = endImapEncoder;
+        }
+
+        @Override
+        public void encode(ImapMessage message, ImapResponseComposer composer, ImapSession session) throws IOException {
+            ImapResponseEncoder imapResponseEncoder = encoders.get(message.getClass());
+
+            if (imapResponseEncoder != null) {
+                imapResponseEncoder.encode(message, composer, session);
+            } else {
+                endImapEncoder.encode(message, composer, session);
+            }
+        }
+    }
 
     /**
      * Builds the default encoder
@@ -64,33 +100,32 @@ public class DefaultImapEncoderFactory implements ImapEncoderFactory {
      * @return not null
      */
     public static final ImapEncoder createDefaultEncoder(Localizer localizer, boolean neverAddBodyStructureExtensions) {
-        final EndImapEncoder endImapEncoder = new EndImapEncoder();
-        
-        final AnnotationResponseEncoder annotationResponseEncoder = new AnnotationResponseEncoder(endImapEncoder);
-        final MyRightsResponseEncoder myRightsResponseEncoder = new MyRightsResponseEncoder(annotationResponseEncoder); 
-        final ListRightsResponseEncoder listRightsResponseEncoder = new ListRightsResponseEncoder(myRightsResponseEncoder); 
-        final ACLResponseEncoder aclResponseEncoder = new ACLResponseEncoder(listRightsResponseEncoder); 
-        final NamespaceResponseEncoder namespaceEncoder = new NamespaceResponseEncoder(aclResponseEncoder);
-        final StatusResponseEncoder statusResponseEncoder = new StatusResponseEncoder(namespaceEncoder, localizer);
-        final RecentResponseEncoder recentResponseEncoder = new RecentResponseEncoder(statusResponseEncoder);
-        final FetchResponseEncoder fetchResponseEncoder = new FetchResponseEncoder(recentResponseEncoder, neverAddBodyStructureExtensions);
-        final ExpungeResponseEncoder expungeResponseEncoder = new ExpungeResponseEncoder(fetchResponseEncoder);
-        final ExistsResponseEncoder existsResponseEncoder = new ExistsResponseEncoder(expungeResponseEncoder);
-        final MailboxStatusResponseEncoder statusCommandResponseEncoder = new MailboxStatusResponseEncoder(existsResponseEncoder);
-        final SearchResponseEncoder searchResponseEncoder = new SearchResponseEncoder(statusCommandResponseEncoder);
-        final LSubResponseEncoder lsubResponseEncoder = new LSubResponseEncoder(searchResponseEncoder);
-        final ListResponseEncoder listResponseEncoder = new ListResponseEncoder(lsubResponseEncoder);
-        final XListResponseEncoder xListResponseEncoder = new XListResponseEncoder(listResponseEncoder);
-        final FlagsResponseEncoder flagsResponseEncoder = new FlagsResponseEncoder(xListResponseEncoder);
-        final CapabilityResponseEncoder capabilityResponseEncoder = new CapabilityResponseEncoder(flagsResponseEncoder);
-        final EnableResponseEncoder enableResponseEncoder = new EnableResponseEncoder(capabilityResponseEncoder);
-        final ContinuationResponseEncoder continuationResponseEncoder = new ContinuationResponseEncoder(enableResponseEncoder, localizer);
-        final AuthenticateResponseEncoder authResponseEncoder = new AuthenticateResponseEncoder(continuationResponseEncoder);
-        final ESearchResponseEncoder esearchResponseEncoder = new ESearchResponseEncoder(authResponseEncoder);
-        final VanishedResponseEncoder vanishedResponseEncoder = new VanishedResponseEncoder(esearchResponseEncoder);
-        final QuotaResponseEncoder quotaResponseEncoder = new QuotaResponseEncoder(vanishedResponseEncoder);
-        final QuotaRootResponseEncoder quotaRootResponseEncoder = new QuotaRootResponseEncoder(quotaResponseEncoder);
-        return quotaRootResponseEncoder;
+        return new DefaultImapEncoder(Stream.of(
+            new AnnotationResponseEncoder(),
+            new MyRightsResponseEncoder(),
+            new ListRightsResponseEncoder(),
+            new ListResponseEncoder(),
+            new ACLResponseEncoder(),
+            new NamespaceResponseEncoder(),
+            new StatusResponseEncoder(localizer),
+            new RecentResponseEncoder(),
+            new FetchResponseEncoder(neverAddBodyStructureExtensions),
+            new ExpungeResponseEncoder(),
+            new ExistsResponseEncoder(),
+            new MailboxStatusResponseEncoder(),
+            new SearchResponseEncoder(),
+            new LSubResponseEncoder(),
+            new XListResponseEncoder(),
+            new FlagsResponseEncoder(),
+            new CapabilityResponseEncoder(),
+            new EnableResponseEncoder(),
+            new ContinuationResponseEncoder(localizer),
+            new AuthenticateResponseEncoder(),
+            new ESearchResponseEncoder(),
+            new VanishedResponseEncoder(),
+            new QuotaResponseEncoder(),
+            new QuotaRootResponseEncoder()),
+            new EndImapEncoder());
     }
 
     private final Localizer localizer;
@@ -110,7 +145,6 @@ public class DefaultImapEncoderFactory implements ImapEncoderFactory {
      *            parse BODYSTRUCTURE extensions, false to fully support RFC3501
      */
     public DefaultImapEncoderFactory(Localizer localizer, boolean neverAddBodyStructureExtensions) {
-        super();
         this.localizer = localizer;
         this.neverAddBodyStructureExtensions = neverAddBodyStructureExtensions;
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
index 3f7b4c8..c04074e 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
@@ -24,7 +24,6 @@ import static org.mockito.Mockito.mock;
 
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
-import org.apache.james.imap.encode.base.EndImapEncoder;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
 import org.apache.james.imap.message.response.AnnotationResponse;
 import org.apache.james.mailbox.model.MailboxAnnotation;
@@ -53,7 +52,7 @@ public class AnnotationResponseEncoderTest {
         imapSession = mock(ImapSession.class);
 
         composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
-        encoder = new AnnotationResponseEncoder(new EndImapEncoder());
+        encoder = new AnnotationResponseEncoder();
     }
 
     @Test
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java
index 54d035b..f48a61b 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java
@@ -51,9 +51,6 @@ public class FetchResponseEncoderEnvelopeTest {
 
     private static final int MSN = 100;
 
-
-    private ImapEncoder mockNextEncoder;
-
     private FetchResponseEncoder encoder;
 
     private FetchResponse message;
@@ -100,8 +97,7 @@ public class FetchResponseEncoderEnvelopeTest {
         to = null;
 
         message = new FetchResponse(MSN, null, null, null, null, null, envelope, null, null, null);
-        mockNextEncoder = mock(ImapEncoder.class);
-        encoder = new FetchResponseEncoder(mockNextEncoder, false);
+        encoder = new FetchResponseEncoder(false);
     }
 
     private Address[] mockOneAddress() {
@@ -144,7 +140,7 @@ public class FetchResponseEncoderEnvelopeTest {
     @Test
     public void testShouldNilAllNullProperties() throws Exception {
         envelopExpects();
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL))\r\n");
     }
@@ -155,7 +151,7 @@ public class FetchResponseEncoderEnvelopeTest {
         envelopExpects();
         
         
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (\"a date\" NIL NIL NIL NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -165,7 +161,7 @@ public class FetchResponseEncoderEnvelopeTest {
         subject = "some subject";
         envelopExpects();
         
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL \"some subject\" NIL NIL NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -175,7 +171,7 @@ public class FetchResponseEncoderEnvelopeTest {
         inReplyTo = "some reply to";
         envelopExpects();
        
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL \"some reply to\" NIL))\r\n");
     }
 
@@ -184,7 +180,7 @@ public class FetchResponseEncoderEnvelopeTest {
         messageId = "some message id";
         envelopExpects();
         
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL \"some message id\"))\r\n");
 
     }
@@ -193,7 +189,7 @@ public class FetchResponseEncoderEnvelopeTest {
     public void testShouldComposeOneFromAddress() throws Exception {
         from = mockOneAddress();
         envelopExpects();
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -203,7 +199,7 @@ public class FetchResponseEncoderEnvelopeTest {
         from = mockManyAddresses();
         envelopExpects();
         
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -213,7 +209,7 @@ public class FetchResponseEncoderEnvelopeTest {
         sender = mockOneAddress();
         envelopExpects();
      
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -223,7 +219,7 @@ public class FetchResponseEncoderEnvelopeTest {
         sender = mockManyAddresses();
         envelopExpects();
      
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -234,7 +230,7 @@ public class FetchResponseEncoderEnvelopeTest {
         replyTo = mockOneAddress();
         envelopExpects();
        
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -244,7 +240,7 @@ public class FetchResponseEncoderEnvelopeTest {
         replyTo = mockManyAddresses();
         envelopExpects();
        
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -254,7 +250,7 @@ public class FetchResponseEncoderEnvelopeTest {
         to = mockOneAddress();
         envelopExpects();
        
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL NIL))\r\n");
 
     }
@@ -264,7 +260,7 @@ public class FetchResponseEncoderEnvelopeTest {
         to = mockManyAddresses();
         envelopExpects();
        
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL NIL))\r\n");
 
     }
@@ -274,7 +270,7 @@ public class FetchResponseEncoderEnvelopeTest {
         cc = mockOneAddress();
         envelopExpects();
 
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL))\r\n");
 
     }
@@ -284,7 +280,7 @@ public class FetchResponseEncoderEnvelopeTest {
         cc = mockManyAddresses();
         envelopExpects();
        
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL))\r\n");
 
     }
@@ -294,7 +290,7 @@ public class FetchResponseEncoderEnvelopeTest {
         bcc = mockOneAddress();
         envelopExpects();
        
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL))\r\n");
 
     }
@@ -304,7 +300,7 @@ public class FetchResponseEncoderEnvelopeTest {
         bcc = mockManyAddresses();
         envelopExpects();
        
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL))\r\n");
 
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java
index 356997b..1d687f4 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java
@@ -30,7 +30,6 @@ import java.util.Map;
 
 import javax.mail.Flags;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
 import org.apache.james.imap.message.response.FetchResponse;
@@ -49,29 +48,16 @@ public class FetchResponseEncoderNoExtensionsTest {
 
     @Before
     public void setUp() throws Exception {
-        mockNextEncoder = mock(ImapEncoder.class);
-        encoder = new FetchResponseEncoder(mockNextEncoder, true);
+        encoder = new FetchResponseEncoder(true);
         flags = new Flags(Flags.Flag.DELETED);
         stubStructure = mock(FetchResponse.Structure.class);
     }
 
-
-    @Test
-    public void testShouldNotAcceptUnknownResponse() {
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-    }
-
-    @Test
-    public void testShouldAcceptFetchResponse() {
-        assertThat(encoder.isAcceptable(new FetchResponse(11, null, null, null, null,
-                null, null, null, null, null))).isTrue();
-    }
-
     @Test
     public void testShouldEncodeFlagsResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, flags, null, null, null, null,
                 null, null, null, null);
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted))\r\n");
     }
 
@@ -79,7 +65,7 @@ public class FetchResponseEncoderNoExtensionsTest {
     public void testShouldEncodeUidResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, null, MessageUid.of(72), null,
                 null, null, null, null, null, null);
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (UID 72)\r\n");
 
     }
@@ -88,7 +74,7 @@ public class FetchResponseEncoderNoExtensionsTest {
     public void testShouldEncodeAllResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, flags, MessageUid.of(72), null,
                 null, null, null, null, null, null);
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted) UID 72)\r\n");
 
     }
@@ -113,7 +99,7 @@ public class FetchResponseEncoderNoExtensionsTest {
         when(stubStructure.getDescription()).thenReturn("");
 
         final FakeImapSession fakeImapSession = new FakeImapSession();
-        encoder.doEncode(message, composer, fakeImapSession);
+        encoder.encode(message, composer, fakeImapSession);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted) BODYSTRUCTURE (\"TEXT\" \"HTML\" (\"CHARSET\" \"US-ASCII\") \"\" \"\" \"7BIT\" 2279 48) UID 72)\r\n");
 
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java
index 1eee9c8..4d867db 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java
@@ -20,11 +20,9 @@
 package org.apache.james.imap.encode;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
 
 import javax.mail.Flags;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
 import org.apache.james.imap.message.response.FetchResponse;
@@ -35,36 +33,25 @@ import org.junit.Test;
 public class FetchResponseEncoderTest  {
     private ByteImapResponseWriter writer = new ByteImapResponseWriter();
     private ImapResponseComposer composer = new ImapResponseComposerImpl(writer);
-   
     private Flags flags;
-
-    private ImapEncoder mockNextEncoder;
-
     private FetchResponseEncoder encoder;
 
     @Before
     public void setUp() throws Exception {
-        mockNextEncoder = mock(ImapEncoder.class);
-        encoder = new FetchResponseEncoder(mockNextEncoder, false);
+        encoder = new FetchResponseEncoder(false);
         flags = new Flags(Flags.Flag.DELETED);
     }
 
     @Test
-    public void testShouldNotAcceptUnknownResponse() {
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-    }
-
-    @Test
     public void testShouldAcceptFetchResponse() {
-        assertThat(encoder.isAcceptable(new FetchResponse(11, null, null, null, null,
-                null, null, null, null, null))).isTrue();
+        assertThat(encoder.acceptableMessages()).isEqualTo(FetchResponse.class);
     }
 
     @Test
     public void testShouldEncodeFlagsResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, flags, null, null, null, null,
                 null, null, null, null);
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted))\r\n");
 
 
@@ -74,7 +61,7 @@ public class FetchResponseEncoderTest  {
     public void testShouldEncodeUidResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, null, MessageUid.of(72), null,
                 null, null, null, null, null, null); 
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (UID 72)\r\n");
 
 
@@ -84,7 +71,7 @@ public class FetchResponseEncoderTest  {
     public void testShouldEncodeAllResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, flags, MessageUid.of(72), null,
                 null, null, null, null, null, null);
-        encoder.doEncode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer, new FakeImapSession());
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted) UID 72)\r\n");
         
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java
index b1a15aa..97ecead 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java
@@ -20,14 +20,10 @@
 package org.apache.james.imap.encode;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
 import org.apache.james.imap.message.response.LSubResponse;
-import org.apache.james.imap.message.response.ListResponse;
-import org.apache.james.mailbox.model.MailboxMetaData;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -39,28 +35,12 @@ public class LSubResponseEncoderTest  {
 
     @Before
     public void setUp() throws Exception {
-        encoder = new LSubResponseEncoder(mock(ImapEncoder.class));
+        encoder = new LSubResponseEncoder();
     }
 
     @Test
-    public void encoderShouldNotAcceptListResponse() {
-        assertThat(encoder.isAcceptable(new ListResponse(MailboxMetaData.Children.HAS_CHILDREN, MailboxMetaData.Selectability.NOSELECT, "name", '.')))
-            .isFalse();
-    }
-
-    @Test
-    public void encoderShouldAcceptLsubResponse() {
-        assertThat(encoder.isAcceptable(new LSubResponse("name", true, '.'))).isTrue();
-    }
-
-    @Test
-    public void encoderShouldNotAcceptImapMessage() {
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-    }
-
-    @Test
-    public void encoderShouldNotAcceptNull() {
-        assertThat(encoder.isAcceptable(null)).isFalse();
+    public void encoderShouldAcceptLSubResponse() {
+        assertThat(encoder.acceptableMessages()).isEqualTo(LSubResponse.class);
     }
 
     @Test
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java
index f7615b7..57e621b 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java
@@ -20,50 +20,27 @@
 package org.apache.james.imap.encode;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
-import org.apache.james.imap.message.response.LSubResponse;
 import org.apache.james.imap.message.response.ListResponse;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.junit.Before;
 import org.junit.Test;
 
 public class ListResponseEncoderTest {
-
     private ListResponseEncoder encoder;
-
     private ByteImapResponseWriter writer = new ByteImapResponseWriter();
     private ImapResponseComposer composer = new ImapResponseComposerImpl(writer);
 
     @Before
     public void setUp() throws Exception {
-        encoder = new ListResponseEncoder(mock(ImapEncoder.class));
+        encoder = new ListResponseEncoder();
     }
 
     @Test
     public void encoderShouldAcceptListResponse() {
-        assertThat(encoder.isAcceptable(new ListResponse(MailboxMetaData.Children.HAS_CHILDREN, MailboxMetaData.Selectability.NONE, "name", '.')))
-        .isTrue();
-    }
-
-    @Test
-    public void encoderShouldNotAcceptLsubResponse() {
-        assertThat(encoder.isAcceptable(new LSubResponse("name", true, '.'))).isFalse();
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-        assertThat(encoder.isAcceptable(null)).isFalse();
-    }
-
-    @Test
-    public void encoderShouldNotAcceptImapMessage() {
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-    }
-
-    @Test
-    public void encoderShouldNotAcceptNull() {
-        assertThat(encoder.isAcceptable(null)).isFalse();
+        assertThat(encoder.acceptableMessages()).isEqualTo(ListResponse.class);
     }
 
     @Test
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java
index 35f06da..af6d0cb 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java
@@ -20,9 +20,7 @@
 package org.apache.james.imap.encode;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
 import org.apache.james.imap.message.response.MailboxStatusResponse;
@@ -34,23 +32,17 @@ public class MailboxStatusResponseEncoderTest  {
 
     MailboxStatusResponseEncoder encoder;
 
-    ImapEncoder mockNextEncoder;
-
     ByteImapResponseWriter writer = new ByteImapResponseWriter();
     ImapResponseComposer composer = new ImapResponseComposerImpl(writer);
 
     @Before
     public void setUp() throws Exception {
-        mockNextEncoder = mock(ImapEncoder.class);
-        encoder = new MailboxStatusResponseEncoder(mockNextEncoder);
+        encoder = new MailboxStatusResponseEncoder();
     }
 
     @Test
-    public void testIsAcceptable() {
-        assertThat(encoder.isAcceptable(new MailboxStatusResponse(null, null, null,
-                null, null, null, "mailbox"))).isTrue();
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-        assertThat(encoder.isAcceptable(null)).isFalse();
+    public void acceptableMessagesShouldReturnMailboxStatusResponseClass() {
+        assertThat(encoder.acceptableMessages()).isEqualTo(MailboxStatusResponse.class);
     }
 
     @Test
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java
index 0226d68..6a79a05 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java
@@ -26,7 +26,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.NamespaceResponse;
 import org.junit.Before;
@@ -35,18 +34,14 @@ import org.mockito.InOrder;
 import org.mockito.Mockito;
 
 public class NamespaceResponseEncoderTest {
-
     ImapSession dummySession;
-
     ImapResponseComposer mockComposer;
-
     NamespaceResponseEncoder subject;
 
     @Before
     public void setUp() throws Exception {
         dummySession = new FakeImapSession();
-        final ImapEncoder stubNextEncoderInChain = mock(ImapEncoder.class);
-        subject = new NamespaceResponseEncoder(stubNextEncoderInChain);
+        subject = new NamespaceResponseEncoder();
         mockComposer = mock(ImapResponseComposer.class);
     }
 
@@ -59,7 +54,7 @@ public class NamespaceResponseEncoderTest {
         List<NamespaceResponse.Namespace> namespaces = new ArrayList<>();
         namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
                 .charAt(0)));
-        subject.doEncode(new NamespaceResponse(null, null, namespaces),
+        subject.encode(new NamespaceResponse(null, null, namespaces),
                 mockComposer, dummySession);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
@@ -82,7 +77,7 @@ public class NamespaceResponseEncoderTest {
         List<NamespaceResponse.Namespace> namespaces = new ArrayList<>();
         namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
                 .charAt(0)));
-        subject.doEncode(new NamespaceResponse(null, namespaces, null),
+        subject.encode(new NamespaceResponse(null, namespaces, null),
                 mockComposer, dummySession);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
@@ -106,7 +101,7 @@ public class NamespaceResponseEncoderTest {
         List<NamespaceResponse.Namespace> namespaces = new ArrayList<>();
         namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
                 .charAt(0)));
-        subject.doEncode(new NamespaceResponse(namespaces, null, null),
+        subject.encode(new NamespaceResponse(namespaces, null, null),
                 mockComposer, dummySession);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
@@ -133,7 +128,7 @@ public class NamespaceResponseEncoderTest {
                 .charAt(0)));
         namespaces.add(new NamespaceResponse.Namespace(anotherPrefix,
                 anotherDeliminator.charAt(0)));
-        subject.doEncode(new NamespaceResponse(namespaces, null, null),
+        subject.encode(new NamespaceResponse(namespaces, null, null),
                 mockComposer, dummySession);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
@@ -154,7 +149,7 @@ public class NamespaceResponseEncoderTest {
     @Test
     public void testAllNullShouldWriteAllNIL() throws Exception {
 
-        subject.doEncode(new NamespaceResponse(null, null, null), mockComposer,
+        subject.encode(new NamespaceResponse(null, null, null), mockComposer,
                 dummySession);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
@@ -166,9 +161,7 @@ public class NamespaceResponseEncoderTest {
 
     @Test
     public void testNamespaceResponseIsAcceptable() {
-        assertThat(subject.isAcceptable(mock(ImapMessage.class))).isFalse();
-        assertThat(subject
-                .isAcceptable(new NamespaceResponse(null, null, null))).isTrue();
+        assertThat(subject.acceptableMessages()).isEqualTo(NamespaceResponse.class);
     }
 
 }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
index a4518c5..a946324 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
@@ -26,7 +26,6 @@ import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeLimit;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
-import org.apache.james.imap.encode.base.EndImapEncoder;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
 import org.apache.james.imap.message.response.QuotaResponse;
 import org.apache.james.mailbox.model.Quota;
@@ -43,7 +42,7 @@ public class QuotaResponseEncoderTest {
             Quota.<QuotaCountLimit, QuotaCountUsage>builder().used(QuotaCountUsage.count(231)).computedLimit(QuotaCountLimit.count(1024)).build());
         ByteImapResponseWriter byteImapResponseWriter = new ByteImapResponseWriter();
         ImapResponseComposer composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
-        QuotaResponseEncoder encoder = new QuotaResponseEncoder(new EndImapEncoder());
+        QuotaResponseEncoder encoder = new QuotaResponseEncoder();
         encoder.encode(response, composer, null);
         String responseString = byteImapResponseWriter.getString();
         assertThat(responseString).isEqualTo("* QUOTA root (MESSAGE 231 1024)\r\n");
@@ -55,7 +54,7 @@ public class QuotaResponseEncoderTest {
         Quota.<QuotaSizeLimit, QuotaSizeUsage>builder().used(QuotaSizeUsage.size(231 * 1024)).computedLimit(QuotaSizeLimit.size(1024 * 1024)).build());
         ByteImapResponseWriter byteImapResponseWriter = new ByteImapResponseWriter();
         ImapResponseComposer composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
-        QuotaResponseEncoder encoder = new QuotaResponseEncoder(new EndImapEncoder());
+        QuotaResponseEncoder encoder = new QuotaResponseEncoder();
         encoder.encode(response, composer, null);
         String responseString = byteImapResponseWriter.getString();
         assertThat(responseString).isEqualTo("* QUOTA root (STORAGE 231 1024)\r\n");
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java
index a61190e..a95d0a0 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.encode;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
-import org.apache.james.imap.encode.base.EndImapEncoder;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
 import org.apache.james.imap.message.response.QuotaRootResponse;
 import org.junit.Test;
@@ -37,7 +36,7 @@ public class QuotaRootResponseEncoderTest {
         QuotaRootResponse response = new QuotaRootResponse("INBOX", "root");
         ByteImapResponseWriter byteImapResponseWriter = new ByteImapResponseWriter();
         ImapResponseComposer composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
-        QuotaRootResponseEncoder encoder = new QuotaRootResponseEncoder(new EndImapEncoder());
+        QuotaRootResponseEncoder encoder = new QuotaRootResponseEncoder();
         encoder.encode(response, composer, null);
         String responseString = byteImapResponseWriter.getString();
         assertThat(responseString).isEqualTo("* QUOTAROOT \"INBOX\" root\r\n");
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java
index 10b83af..baa0b07 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java
@@ -20,12 +20,9 @@
 package org.apache.james.imap.encode;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
-import org.apache.james.imap.message.response.LSubResponse;
 import org.apache.james.imap.message.response.SearchResponse;
 import org.junit.Before;
 import org.junit.Test;
@@ -35,27 +32,19 @@ public class SearchResponseEncoderTest {
     private static final long[] IDS = { 1, 4, 9, 16 };
 
     private SearchResponse response;
-
     private SearchResponseEncoder encoder;
-
-    private ImapEncoder mockNextEncoder;
-
     private ByteImapResponseWriter writer = new ByteImapResponseWriter();
     private ImapResponseComposer composer = new ImapResponseComposerImpl(writer);
 
     @Before
     public void setUp() throws Exception {
-        mockNextEncoder = mock(ImapEncoder.class);
         response = new SearchResponse(IDS, null);
-        encoder = new SearchResponseEncoder(mockNextEncoder);
+        encoder = new SearchResponseEncoder();
     }
 
     @Test
-    public void testIsAcceptable() {
-        assertThat(encoder.isAcceptable(response)).isTrue();
-        assertThat(encoder.isAcceptable(new LSubResponse("name", true, '.'))).isFalse();
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-        assertThat(encoder.isAcceptable(null)).isFalse();
+    public void acceptableMessagesShouldReturnSearchResponseClass() {
+        assertThat(encoder.acceptableMessages()).isEqualTo(SearchResponse.class);
     }
 
     @Test
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java
index d7280e7..43d5dd3 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java
@@ -20,13 +20,10 @@
 package org.apache.james.imap.encode;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
 
-import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.process.MailboxType;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
-import org.apache.james.imap.message.response.LSubResponse;
 import org.apache.james.imap.message.response.XListResponse;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.junit.Before;
@@ -41,36 +38,12 @@ public class XListResponseEncoderTest {
 
     @Before
     public void setUp() throws Exception {
-        encoder = new XListResponseEncoder(mock(ImapEncoder.class));
+        encoder = new XListResponseEncoder();
     }
 
     @Test
     public void encoderShouldAcceptXListResponse() {
-        assertThat(encoder.isAcceptable(
-            new XListResponse(
-                MailboxMetaData.Children.HAS_CHILDREN,
-                MailboxMetaData.Selectability.NONE,
-                "name",
-                '.',
-                MailboxType.INBOX)))
-        .isTrue();
-    }
-
-    @Test
-    public void encoderShouldNotAcceptLsubResponse() {
-        assertThat(encoder.isAcceptable(new LSubResponse("name", true, '.'))).isFalse();
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-        assertThat(encoder.isAcceptable(null)).isFalse();
-    }
-
-    @Test
-    public void encoderShouldNotAcceptImapMessage() {
-        assertThat(encoder.isAcceptable(mock(ImapMessage.class))).isFalse();
-    }
-
-    @Test
-    public void encoderShouldNotAcceptNull() {
-        assertThat(encoder.isAcceptable(null)).isFalse();
+        assertThat(encoder.acceptableMessages()).isEqualTo(XListResponse.class);
     }
 
     @Test


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


[james-project] 07/27: [Refactoring] Solve intellij warnings in FetchProcessor

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 d9ca246955926eaa25f1c003c1d814bec769d21e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 10:49:28 2019 +0700

    [Refactoring] Solve intellij warnings in FetchProcessor
---
 .../apache/james/imap/processor/fetch/FetchProcessor.java   | 13 ++-----------
 1 file changed, 2 insertions(+), 11 deletions(-)

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 ef8c007..20517d3 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
@@ -64,7 +64,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
         final FetchData fetch = request.getFetch();
         
         try {
-            final Long changedSince = fetch.getChangedSince();
+            final long changedSince = fetch.getChangedSince();
 
             final MessageManager mailbox = getSelectedMailbox(session);
 
@@ -132,17 +132,8 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
     /**
      * Process the given message ranges by fetch them and pass them to the
      * {@link org.apache.james.imap.api.process.ImapProcessor.Responder}
-     * 
-     * @param session
-     * @param mailbox
-     * @param ranges
-     * @param fetch
-     * @param useUids
-     * @param mailboxSession
-     * @param responder
-     * @throws MailboxException
      */
-    protected void processMessageRanges(ImapSession session, MessageManager mailbox, List<MessageRange> ranges, FetchData fetch, boolean useUids, MailboxSession mailboxSession, Responder responder) throws MailboxException {
+    private void processMessageRanges(ImapSession session, MessageManager mailbox, List<MessageRange> ranges, FetchData fetch, boolean useUids, MailboxSession mailboxSession, Responder responder) throws MailboxException {
         final FetchResponseBuilder builder = new FetchResponseBuilder(new EnvelopeBuilder());
         FetchGroup resultToFetch = FetchDataConverter.getFetchGroup(fetch);
 


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


[james-project] 01/27: JAMES-2721 CassandraCluster extension needs to handle restart

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 3e219c31d9e7c74afebb456273feb7fd709aad7f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 9 12:28:16 2019 +0700

    JAMES-2721 CassandraCluster extension needs to handle restart
    
    This enables restart in the middle of a test class. Otherwize, tests were
    failing for MailboxManager as it exceed the restart count.
    
    This changeset also ensures one don't accidentally forget the restart
---
 .../cassandra/CassandraClusterExtension.java       | 17 ++++++++--
 .../cassandra/CassandraRestartExtension.java       | 37 ----------------------
 .../backends/cassandra/DockerCassandraRule.java    |  2 +-
 .../cassandra/DockerCassandraSingleton.java        | 19 ++++++++++-
 .../cassandra/CassandraCombinationManagerTest.java |  4 ---
 .../CassandraMailboxManagerStressTest.java         |  3 --
 .../cassandra/CassandraMailboxManagerTest.java     |  3 --
 .../CassandraMessageIdManagerQuotaTest.java        |  3 --
 .../CassandraMessageIdManagerSideEffectTest.java   |  3 --
 .../CassandraMessageIdManagerStorageTest.java      |  4 ---
 .../CassandraSubscriptionManagerTest.java          |  3 --
 .../cassandra/mail/CassandraACLMapperTest.java     |  3 --
 .../mail/CassandraAnnotationMapperTest.java        |  3 --
 .../mail/CassandraApplicableFlagDAOTest.java       |  3 --
 .../cassandra/mail/CassandraAttachmentDAOTest.java |  3 --
 .../mail/CassandraAttachmentDAOV2Test.java         |  3 --
 .../mail/CassandraAttachmentFallbackTest.java      |  3 --
 .../mail/CassandraAttachmentMapperTest.java        |  3 --
 .../mail/CassandraAttachmentMessageIdDAOTest.java  |  3 --
 .../mail/CassandraAttachmentOwnerDAOTest.java      |  4 ---
 .../mail/CassandraDeletedMessageDAOTest.java       |  3 --
 .../mail/CassandraFirstUnseenDAOTest.java          |  3 --
 .../mail/CassandraGenericMailboxMapperTest.java    |  3 --
 .../mail/CassandraIndexTableHandlerTest.java       |  3 --
 .../mail/CassandraMailboxCounterDAOTest.java       |  3 --
 .../cassandra/mail/CassandraMailboxDAOTest.java    |  3 --
 .../CassandraMailboxManagerAttachmentTest.java     |  3 --
 .../mail/CassandraMailboxMapperAclTest.java        |  3 --
 .../CassandraMailboxMapperConcurrencyTest.java     |  3 --
 .../cassandra/mail/CassandraMailboxMapperTest.java |  4 ---
 .../mail/CassandraMailboxPathDAOTest.java          |  3 --
 .../mail/CassandraMailboxRecentDAOTest.java        |  3 --
 .../cassandra/mail/CassandraMessageDAOTest.java    |  3 --
 .../cassandra/mail/CassandraMessageIdDAOTest.java  |  3 --
 .../mail/CassandraMessageIdMapperTest.java         |  4 ---
 .../mail/CassandraMessageIdToImapUidDAOTest.java   |  3 --
 .../cassandra/mail/CassandraMessageMapperTest.java |  4 ---
 .../cassandra/mail/CassandraMessageMoveTest.java   |  4 ---
 .../CassandraMessageWithAttachmentMapperTest.java  |  4 ---
 .../mail/CassandraModSeqProviderTest.java          |  3 --
 .../cassandra/mail/CassandraUidProviderTest.java   |  3 --
 .../mail/CassandraUserMailboxRightsDAOTest.java    |  3 --
 .../migration/AttachmentMessageIdCreationTest.java |  4 +--
 .../mail/migration/AttachmentV2MigrationTest.java  |  3 --
 .../mail/migration/MailboxPathV2MigrationTest.java |  3 --
 .../quota/CassandraCurrentQuotaManagerTest.java    |  3 --
 .../quota/CassandraPerUserMaxQuotaManagerTest.java |  3 --
 .../user/CassandraSubscriptionMapperTest.java      |  3 --
 .../CassandraMailRepositoryCountDAOTest.java       |  3 --
 .../CassandraMailRepositoryKeysDAOTest.java        |  3 --
 .../CassandraMailRepositoryMailDAOTest.java        |  3 --
 .../cassandra/CassandraMailRepositoryTest.java     |  4 ---
 52 files changed, 35 insertions(+), 194 deletions(-)

diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
index f224ba3..d9f24ba 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraClusterExtension.java
@@ -23,12 +23,13 @@ import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.ParameterContext;
 import org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.ParameterResolver;
 
-public class CassandraClusterExtension implements BeforeAllCallback, AfterAllCallback, AfterEachCallback, ParameterResolver {
+public class CassandraClusterExtension implements BeforeAllCallback, BeforeEachCallback, AfterAllCallback, AfterEachCallback, ParameterResolver {
     private final DockerCassandraExtension cassandraExtension;
     private final CassandraModule cassandraModule;
     private CassandraCluster cassandraCluster;
@@ -43,10 +44,22 @@ public class CassandraClusterExtension implements BeforeAllCallback, AfterAllCal
         Class<?> testClass = extensionContext.getRequiredTestClass();
         if (testClass.getEnclosingClass() == null) {
             cassandraExtension.beforeAll(extensionContext);
-            cassandraCluster = CassandraCluster.create(cassandraModule, cassandraExtension.getDockerCassandra().getHost());
+            start();
         }
     }
 
+    private void start() {
+        cassandraCluster = CassandraCluster.create(cassandraModule, cassandraExtension.getDockerCassandra().getHost());
+    }
+
+    @Override
+    public void beforeEach(ExtensionContext extensionContext) throws Exception {
+        DockerCassandraSingleton.incrementTestsPlayed();
+        DockerCassandraSingleton.restartAfterMaxTestsPlayed(
+            cassandraCluster::close,
+            this::start);
+    }
+
     @Override
     public void afterEach(ExtensionContext extensionContext) {
         cassandraCluster.clearTables();
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraRestartExtension.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraRestartExtension.java
deleted file mode 100644
index 0d68c68..0000000
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/CassandraRestartExtension.java
+++ /dev/null
@@ -1,37 +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.backends.cassandra;
-
-import org.junit.jupiter.api.extension.BeforeAllCallback;
-import org.junit.jupiter.api.extension.BeforeEachCallback;
-import org.junit.jupiter.api.extension.ExtensionContext;
-
-public class CassandraRestartExtension implements BeforeAllCallback, BeforeEachCallback {
-
-    @Override
-    public void beforeAll(ExtensionContext extensionContext) {
-        DockerCassandraSingleton.restartAfterMaxTestsPlayed();
-    }
-
-    @Override
-    public void beforeEach(ExtensionContext extensionContext) {
-        DockerCassandraSingleton.incrementTestsPlayed();
-    }
-}
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
index d89fd55..aa67a4c 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraRule.java
@@ -34,7 +34,7 @@ public class DockerCassandraRule extends ExternalResource {
     }
 
     @Override
-    protected void before() {
+    protected void before() throws Exception {
         if (allowRestart) {
             DockerCassandraSingleton.restartAfterMaxTestsPlayed();
         }
diff --git a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraSingleton.java b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraSingleton.java
index 9684e63..038915e 100644
--- a/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraSingleton.java
+++ b/backends-common/cassandra/src/test/java/org/apache/james/backends/cassandra/DockerCassandraSingleton.java
@@ -20,6 +20,16 @@
 package org.apache.james.backends.cassandra;
 
 public class DockerCassandraSingleton {
+    @FunctionalInterface
+    interface BeforeHook {
+        void run() throws Exception;
+    }
+
+    @FunctionalInterface
+    interface AfterHook {
+        void run() throws Exception;
+    }
+
     private static final int MAX_TEST_PLAYED = 100;
 
     private static int testsPlayedCount = 0;
@@ -35,13 +45,20 @@ public class DockerCassandraSingleton {
     }
 
     // Call this method to ensure that cassandra is restarted every MAX_TEST_PLAYED tests
-    public static void restartAfterMaxTestsPlayed() {
+    public static void restartAfterMaxTestsPlayed(BeforeHook before, AfterHook after) throws Exception {
         if (testsPlayedCount > MAX_TEST_PLAYED) {
             testsPlayedCount = 0;
+            before.run();
             restart();
+            after.run();
         }
     }
 
+    // Call this method to ensure that cassandra is restarted every MAX_TEST_PLAYED tests
+    public static void restartAfterMaxTestsPlayed() throws Exception {
+        restartAfterMaxTestsPlayed(() -> {}, () -> {});
+    }
+
     private static void restart() {
         singleton.stop();
         singleton.start();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
index 68679a8..c63377c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraCombinationManagerTest.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
@@ -28,12 +27,9 @@ import org.apache.james.mailbox.store.AbstractCombinationManagerTest;
 import org.apache.james.mailbox.store.CombinationManagerTestSystem;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.api.NoopMetricFactory;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraCombinationManagerTest extends AbstractCombinationManagerTest {
-
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
index 9d9c9c5..8709413 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerStressTest.java
@@ -20,16 +20,13 @@
 package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.MailboxManagerStressContract;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.store.PreDeletionHooks;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailboxManagerStressTest implements MailboxManagerStressContract<CassandraMailboxManager> {
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index 157488f..eb0394c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -19,16 +19,13 @@
 package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.MailboxManagerTest;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.store.PreDeletionHooks;
 import org.apache.james.metrics.api.NoopMetricFactory;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 public class CassandraMailboxManagerTest extends MailboxManagerTest<CassandraMailboxManager> {
     @RegisterExtension
     static CassandraClusterExtension cassandra = new CassandraClusterExtension(MailboxAggregateModule.MODULE_WITH_QUOTA);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
index 4c693f8..2293ade 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
@@ -28,10 +27,8 @@ import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.AbstractMessageIdManagerQuotaTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageIdManagerQuotaTest extends AbstractMessageIdManagerQuotaTest {
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
index cfea4ad..db4f8bb 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerSideEffectTest.java
@@ -22,17 +22,14 @@ package org.apache.james.mailbox.cassandra;
 import java.util.Set;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.extension.PreDeletionHook;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.AbstractMessageIdManagerSideEffectTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageIdManagerSideEffectTest extends AbstractMessageIdManagerSideEffectTest {
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
index 1a9c4d5..3cb6776 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerStorageTest.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
@@ -29,12 +28,9 @@ import org.apache.james.mailbox.store.AbstractMessageIdManagerStorageTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.api.NoopMetricFactory;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageIdManagerStorageTest extends AbstractMessageIdManagerStorageTest {
-
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
index d3b5376..33f1022 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraSubscriptionManagerTest.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.blob.api.BlobStore;
@@ -48,13 +47,11 @@ import org.apache.james.mailbox.cassandra.mail.CassandraUserMailboxRightsDAO;
 import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 /**
  * Test Cassandra subscription against some general purpose written code.
  */
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraSubscriptionManagerTest implements SubscriptionManagerContract {
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
index 108e727..d112645 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraACLMapperTest.java
@@ -33,7 +33,6 @@ import java.util.concurrent.TimeoutException;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -46,10 +45,8 @@ import org.apache.james.util.concurrent.NamedThreadFactory;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraACLMapperTest {
 
     private static final CassandraId MAILBOX_ID = CassandraId.of(UUID.fromString("464765a0-e4e7-11e4-aba4-710c1de3782b"));
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
index a2aa280..deb914c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAnnotationMapperTest.java
@@ -20,17 +20,14 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraAnnotationModule;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.AnnotationMapper;
 import org.apache.james.mailbox.store.mail.model.AnnotationMapperTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraAnnotationMapperTest extends AnnotationMapperTest {
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java
index 5ac8eac..55f7b5c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraApplicableFlagDAOTest.java
@@ -25,18 +25,15 @@ import javax.mail.Flags;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.FlagsBuilder;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraApplicableFlagsModule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableSet;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraApplicableFlagDAOTest {
 
     private static final String USER_FLAG = "User Flag";
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java
index 45c6d9b..ec41c87 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOTest.java
@@ -26,17 +26,14 @@ import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraAttachmentDAOTest {
     private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
     private static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
index c4c6f8d..2bf90c7 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentDAOV2Test.java
@@ -26,7 +26,6 @@ import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.mailbox.cassandra.mail.CassandraAttachmentDAOV2.DAOAttachment;
@@ -35,10 +34,8 @@ import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraAttachmentDAOV2Test {
     private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
index c5cfd3b..5c45b28 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentFallbackTest.java
@@ -27,7 +27,6 @@ import java.util.List;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.blob.api.BlobId;
@@ -41,12 +40,10 @@ import org.apache.james.mailbox.model.Attachment;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraAttachmentFallbackTest {
     private static final AttachmentId ATTACHMENT_ID_1 = AttachmentId.from("id1");
     private static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
index 3c3d05d..e31a9c9 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapperTest.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
@@ -29,10 +28,8 @@ import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.AttachmentMapper;
 import org.apache.james.mailbox.store.mail.model.AttachmentMapperTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraAttachmentMapperTest extends AttachmentMapperTest {
 
     private static final CassandraModule MODULES = CassandraModule.aggregateModules(
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMessageIdDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMessageIdDAOTest.java
index 50d5c2d..d7aff6e 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMessageIdDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMessageIdDAOTest.java
@@ -23,7 +23,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
@@ -31,10 +30,8 @@ import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.AttachmentId;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraAttachmentMessageIdDAOTest {
 
     private static final CassandraModule MODULE = CassandraModule.aggregateModules(
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
index 820fdd5..036f9f9 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentOwnerDAOTest.java
@@ -23,19 +23,15 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.modules.CassandraAttachmentModule;
 import org.apache.james.mailbox.model.AttachmentId;
-
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import reactor.core.publisher.Flux;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraAttachmentOwnerDAOTest {
     private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
     private static final Username OWNER_1 = Username.of("owner1");
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java
index e24ac61..6197506 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraDeletedMessageDAOTest.java
@@ -26,17 +26,14 @@ import java.util.UUID;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraDeletedMessageModule;
 import org.apache.james.mailbox.model.MessageRange;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraDeletedMessageDAOTest {
     private static final CassandraId MAILBOX_ID = CassandraId.of(UUID.fromString("110e8400-e29b-11d4-a716-446655440000"));
     private static final MessageUid UID_1 = MessageUid.of(1);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
index 8bf116b..882ed3c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraFirstUnseenDAOTest.java
@@ -23,16 +23,13 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraFirstUnseenModule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraFirstUnseenDAOTest {
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
     private static final MessageUid UID_1 = MessageUid.of(1);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
index bf84354..5f4566c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraGenericMailboxMapperTest.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -32,10 +31,8 @@ import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMapperTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraGenericMailboxMapperTest extends MailboxMapperTest {
 
     private static final CassandraModule MODULES = CassandraModule.aggregateModules(
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
index 33f0d05..dc739f4 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraIndexTableHandlerTest.java
@@ -27,7 +27,6 @@ import javax.mail.Flags;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.FlagsBuilder;
@@ -49,10 +48,8 @@ import org.apache.james.mailbox.model.UpdatedFlags;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraIndexTableHandlerTest {
 
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
index c9b41b6..67e2007 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxCounterDAOTest.java
@@ -23,7 +23,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxCounterModule;
@@ -32,10 +31,8 @@ import org.apache.james.mailbox.model.MailboxCounters;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailboxCounterDAOTest {
     private static final int UID_VALIDITY = 15;
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
index 7d8cf78..59d4dcc 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxDAOTest.java
@@ -26,7 +26,6 @@ import java.util.Optional;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.core.Username;
@@ -37,10 +36,8 @@ import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailboxDAOTest {
     private static final int UID_VALIDITY_1 = 145;
     private static final int UID_VALIDITY_2 = 147;
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
index 8cef993..efd2323 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
@@ -23,7 +23,6 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
@@ -51,10 +50,8 @@ import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex;
 import org.apache.james.metrics.api.NoopMetricFactory;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManagerAttachmentTest {
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
index f0a8166..777ada2 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperAclTest.java
@@ -20,7 +20,6 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
@@ -30,10 +29,8 @@ import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMapperACLTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailboxMapperAclTest extends MailboxMapperACLTest {
 
     private static final CassandraModule MODULES = CassandraModule.aggregateModules(
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
index ddfd33a..9d6b69b 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxMapperConcurrencyTest.java
@@ -26,7 +26,6 @@ import java.util.List;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.core.Username;
@@ -38,10 +37,8 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailboxMapperConcurrencyTest {
 
     private static final int UID_VALIDITY = 52;
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 8fc831e..a6cfafa 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
@@ -27,7 +27,6 @@ import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -45,12 +44,9 @@ import org.apache.james.mailbox.model.search.Wildcard;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailboxMapperTest {
-    
     private static final int UID_VALIDITY = 52;
     private static final Username USER = Username.of("user");
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
index 68b3351..62c4026 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxPathDAOTest.java
@@ -25,7 +25,6 @@ import java.util.List;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.core.Username;
@@ -34,12 +33,10 @@ import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-@ExtendWith(CassandraRestartExtension.class)
 public abstract class CassandraMailboxPathDAOTest {
     private static final Username USER = Username.of("user");
     private static final Username OTHER_USER = Username.of("other");
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
index 1bd050e..8e05300 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxRecentDAOTest.java
@@ -25,16 +25,13 @@ import java.util.stream.IntStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.ids.CassandraId;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxRecentsModule;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailboxRecentDAOTest {
     private static final MessageUid UID1 = MessageUid.of(36L);
     private static final MessageUid UID2 = MessageUid.of(37L);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
index 90b136d..9581a15 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java
@@ -35,7 +35,6 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.blob.api.HashBlobId;
@@ -58,7 +57,6 @@ import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.apache.james.util.streams.Limit;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
@@ -68,7 +66,6 @@ import com.google.common.primitives.Bytes;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import reactor.core.publisher.Flux;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageDAOTest {
     private static final int BODY_START = 16;
     private static final CassandraId MAILBOX_ID = CassandraId.timeBased();
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
index f556a2e..8188a29 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdDAOTest.java
@@ -27,7 +27,6 @@ import javax.mail.Flags.Flag;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.MessageUid;
@@ -40,12 +39,10 @@ import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.apache.james.mailbox.model.MessageRange;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import reactor.core.publisher.Flux;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageIdDAOTest {
     public static final CassandraModule MODULE = CassandraModule.aggregateModules(
         CassandraMessageModule.MODULE,
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
index 8980d92..5176f9d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapperTest.java
@@ -24,7 +24,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 import java.util.List;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.MailboxSession;
@@ -36,14 +35,11 @@ import org.apache.james.mailbox.store.mail.MessageMapper;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.MessageIdMapperTest;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageIdMapperTest extends MessageIdMapperTest {
-
     private static final MailboxSession MAILBOX_SESSION = MailboxSessionUtil.create(Username.of("benwa"));
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
index 8d5d508..5bb8d48 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdToImapUidDAOTest.java
@@ -28,7 +28,6 @@ import javax.mail.Flags.Flag;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailbox.MessageUid;
@@ -40,14 +39,12 @@ import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.datastax.driver.core.utils.UUIDs;
 
 import reactor.core.publisher.Flux;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageIdToImapUidDAOTest {
     public static final CassandraModule MODULE = CassandraModule.aggregateModules(
             CassandraSchemaVersionModule.MODULE,
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
index f4022aa..acfacf3 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapperTest.java
@@ -20,15 +20,11 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMapperTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageMapperTest extends MessageMapperTest {
-
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
index d89dc9c..a768098 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMoveTest.java
@@ -20,15 +20,11 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageMoveTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageMoveTest extends MessageMoveTest {
-
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
index b39fd11..04899ca 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageWithAttachmentMapperTest.java
@@ -20,15 +20,11 @@
 package org.apache.james.mailbox.cassandra.mail;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.store.mail.model.MapperProvider;
 import org.apache.james.mailbox.store.mail.model.MessageWithAttachmentMapperTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMessageWithAttachmentMapperTest extends MessageWithAttachmentMapperTest {
-
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE);
     
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
index e9996ff..5daf429 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraModSeqProviderTest.java
@@ -27,7 +27,6 @@ import java.util.stream.LongStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.ModSeq;
@@ -38,12 +37,10 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.fge.lambdas.Throwing;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraModSeqProviderTest {
     private static final CassandraId CASSANDRA_ID = new CassandraId.Factory().fromString("e22b3ac0-a80b-11e7-bb00-777268d65503");
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
index e69373a..9f93323 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUidProviderTest.java
@@ -28,7 +28,6 @@ import java.util.stream.LongStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.MessageUid;
@@ -39,12 +38,10 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.fge.lambdas.Throwing;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraUidProviderTest {
     private static final CassandraId CASSANDRA_ID = new CassandraId.Factory().fromString("e22b3ac0-a80b-11e7-bb00-777268d65503");
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
index 167d352..5e9c8b0 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraUserMailboxRightsDAOTest.java
@@ -22,7 +22,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.core.Username;
 import org.apache.james.mailbox.acl.ACLDiff;
@@ -35,10 +34,8 @@ import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraUserMailboxRightsDAOTest {
     private static final Username USER_NAME = Username.of("userName");
     private static final EntryKey ENTRY_KEY = EntryKey.createUserEntryKey(USER_NAME);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
index f98df77..7317a97 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentMessageIdCreationTest.java
@@ -34,7 +34,6 @@ import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.blob.api.HashBlobId;
@@ -56,14 +55,13 @@ import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
 import org.apache.james.task.Task;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+
 import reactor.core.publisher.Flux;
 
-@ExtendWith(CassandraRestartExtension.class)
 class AttachmentMessageIdCreationTest {
     public static final CassandraModule MODULES = CassandraModule.aggregateModules(
             CassandraMessageModule.MODULE,
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
index 1712227..405ad9c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/AttachmentV2MigrationTest.java
@@ -28,7 +28,6 @@ import java.nio.charset.StandardCharsets;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.blob.api.BucketName;
@@ -43,13 +42,11 @@ import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.task.Task;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
-@ExtendWith(CassandraRestartExtension.class)
 class AttachmentV2MigrationTest {
     private static final AttachmentId ATTACHMENT_ID = AttachmentId.from("id1");
     private static final AttachmentId ATTACHMENT_ID_2 = AttachmentId.from("id2");
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
index 959fda3..5a7409d 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/migration/MailboxPathV2MigrationTest.java
@@ -23,7 +23,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
@@ -45,10 +44,8 @@ import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class MailboxPathV2MigrationTest {
 
     private static final MailboxPath MAILBOX_PATH_1 = MailboxPath.forUser(Username.of("bob"), "Important");
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
index 426da1e..540b428 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
@@ -20,14 +20,11 @@
 package org.apache.james.mailbox.cassandra.quota;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManagerTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraCurrentQuotaManagerTest extends StoreCurrentQuotaManagerTest {
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
index a7b5ac4..c4db9d5 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerTest.java
@@ -20,15 +20,12 @@
 package org.apache.james.mailbox.cassandra.quota;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.mailbox.cassandra.mail.utils.GuiceUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.store.quota.GenericMaxQuotaManagerTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraPerUserMaxQuotaManagerTest extends GenericMaxQuotaManagerTest {
 
     @RegisterExtension
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java
index 61923ee..b13561e 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/user/CassandraSubscriptionMapperTest.java
@@ -19,15 +19,12 @@
 package org.apache.james.mailbox.cassandra.user;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
 import org.apache.james.mailbox.store.user.SubscriptionMapper;
 import org.apache.james.mailbox.store.user.SubscriptionMapperTest;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraSubscriptionMapperTest extends SubscriptionMapperTest {
 
     @RegisterExtension
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java
index 2cc685c..4e4996d 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryCountDAOTest.java
@@ -23,16 +23,13 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailRepositoryCountDAOTest {
     static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url");
     static final MailRepositoryUrl URL2 = MailRepositoryUrl.from("proto://url2");
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java
index b63acd0..db7f98a 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java
@@ -23,7 +23,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
@@ -31,10 +30,8 @@ import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailRepositoryKeysDAOTest {
     static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url");
     static final MailRepositoryUrl URL2 = MailRepositoryUrl.from("proto://url2");
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
index aab0005..eebf29a 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryMailDAOTest.java
@@ -29,7 +29,6 @@ import javax.mail.MessagingException;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.blob.api.BlobId;
@@ -46,12 +45,10 @@ import org.apache.mailet.base.test.FakeMail;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.collect.ImmutableList;
 
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailRepositoryMailDAOTest {
     static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url");
     static final MailKey KEY_1 = new MailKey("key1");
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
index 835638b..fa39f8c 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryTest.java
@@ -21,7 +21,6 @@ package org.apache.james.mailrepository.cassandra;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
-import org.apache.james.backends.cassandra.CassandraRestartExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
@@ -35,11 +34,8 @@ import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-
-@ExtendWith(CassandraRestartExtension.class)
 class CassandraMailRepositoryTest implements MailRepositoryContract {
     static final MailRepositoryUrl URL = MailRepositoryUrl.from("proto://url");
     static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();


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


[james-project] 02/27: [Refactoring] Strongly type FlagsUpdateMode in StoreRequest

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 547f94478d6abe749024334461feab8a05255787
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 09:52:34 2019 +0700

    [Refactoring] Strongly type FlagsUpdateMode in StoreRequest
    
    Before, a nullable boolean argument was representing the 3 possible state.
    The request was storing this as 2 boolean (allowing 4 states thus one being invalid)
    and some conversion logic was needed in the processor.
    
    Using the FlagsUpdateMode enum straight away get rids of all this added
    complexity.
---
 .../imap/decode/parser/StoreCommandParser.java     | 13 +++---
 .../james/imap/message/request/StoreRequest.java   | 48 ++++------------------
 .../james/imap/processor/StoreProcessor.java       | 11 +----
 3 files changed, 16 insertions(+), 56 deletions(-)

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 07f924f..de64f2e 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
@@ -31,6 +31,7 @@ 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.message.request.StoreRequest;
+import org.apache.james.mailbox.MessageManager;
 
 /**
  * Parse STORE commands
@@ -46,7 +47,6 @@ public class StoreCommandParser extends AbstractUidCommandParser {
     @Override
     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;
         long unchangedSince = -1;
         char next = request.nextWordChar();
@@ -70,15 +70,16 @@ public class StoreCommandParser extends AbstractUidCommandParser {
             request.consumeChar(')');
             next = request.nextWordChar();
         }
-        
+
+        final MessageManager.FlagsUpdateMode flagsUpdateMode;
         if (next == '+') {
-            sign = Boolean.TRUE;
+            flagsUpdateMode = MessageManager.FlagsUpdateMode.ADD;
             request.consume();
         } else if (next == '-') {
-            sign = Boolean.FALSE;
+            flagsUpdateMode = MessageManager.FlagsUpdateMode.REMOVE;
             request.consume();
         } else {
-            sign = null;
+            flagsUpdateMode = MessageManager.FlagsUpdateMode.REPLACE;
         }
 
         String directive = request.consumeWord(new ImapRequestLineReader.NoopCharValidator());
@@ -109,6 +110,6 @@ public class StoreCommandParser extends AbstractUidCommandParser {
         }
 
         request.eol();
-        return new StoreRequest(command, idSet, silent, flags, useUids, tag, sign, unchangedSince);
+        return new StoreRequest(command, idSet, silent, flags, useUids, tag, flagsUpdateMode, unchangedSince);
     }
 }
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 53f3bc4..fb56994 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
@@ -23,39 +23,23 @@ 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;
+import org.apache.james.mailbox.MessageManager;
 
 public class StoreRequest extends AbstractImapRequest {
-
     private final IdRange[] idSet;
-
     private final Flags flags;
-
     private final boolean useUids;
-
     private final boolean silent;
-
-    private final boolean signedMinus;
-
-    private final boolean signedPlus;
-
+    private final MessageManager.FlagsUpdateMode flagsUpdateMode;
     private final long unchangedSince;
 
-    public StoreRequest(ImapCommand command, IdRange[] idSet, boolean silent, Flags flags, boolean useUids, Tag tag, Boolean sign, long unchangedSince) {
+    public StoreRequest(ImapCommand command, IdRange[] idSet, boolean silent, Flags flags, boolean useUids, Tag tag, MessageManager.FlagsUpdateMode flagsUpdateMode, long unchangedSince) {
         super(tag, command);
         this.idSet = idSet;
         this.silent = silent;
         this.flags = flags;
         this.useUids = useUids;
-        if (sign == null) {
-            signedMinus = false;
-            signedPlus = false;
-        } else if (sign) {
-            signedMinus = false;
-            signedPlus = true;
-        } else {
-            signedMinus = true;
-            signedPlus = false;
-        }
+        this.flagsUpdateMode = flagsUpdateMode;
         this.unchangedSince = unchangedSince;
     }
 
@@ -68,24 +52,8 @@ public class StoreRequest extends AbstractImapRequest {
         return silent;
     }
 
-    /**
-     * Is the store signed MINUS? Note that {@link #isSignedPlus()} must be
-     * false when this property is true.
-     * 
-     * @return true if the store is subtractive
-     */
-    public final boolean isSignedMinus() {
-        return signedMinus;
-    }
-
-    /**
-     * Is the store signed PLUS? Note that {@link #isSignedMinus()} must be
-     * false when this property is true.
-     * 
-     * @return true if the store is additive
-     */
-    public final boolean isSignedPlus() {
-        return signedPlus;
+    public final MessageManager.FlagsUpdateMode getFlagsUpdateMode() {
+        return flagsUpdateMode;
     }
 
     public final Flags getFlags() {
@@ -113,10 +81,10 @@ public class StoreRequest extends AbstractImapRequest {
         if (isSilent()) {
             builder.append("SILENT ");
         }
-        if (isSignedPlus()) {
+        if (flagsUpdateMode == MessageManager.FlagsUpdateMode.ADD) {
             builder.append("+ ");
         }
-        if (isSignedMinus()) {
+        if (flagsUpdateMode == MessageManager.FlagsUpdateMode.REMOVE) {
             builder.append("- ");
         }
         if (flags.contains(Flags.Flag.ANSWERED)) {
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 cbba9d4..7671d89 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
@@ -225,17 +225,8 @@ public class StoreProcessor extends AbstractMailboxProcessor<StoreRequest> {
         final Flags flags = request.getFlags();
         final boolean useUids = request.isUseUids();
         final boolean silent = request.isSilent();
-        final boolean isSignedPlus = request.isSignedPlus();
-        final boolean isSignedMinus = request.isSignedMinus();
         final long unchangedSince = request.getUnchangedSince();
-        final MessageManager.FlagsUpdateMode mode;
-        if (isSignedMinus) {
-            mode = MessageManager.FlagsUpdateMode.REMOVE;
-        } else if (isSignedPlus) {
-            mode = MessageManager.FlagsUpdateMode.ADD;
-        } else {
-            mode = MessageManager.FlagsUpdateMode.REPLACE;
-        }
+        final MessageManager.FlagsUpdateMode mode = request.getFlagsUpdateMode();
         
         SelectedMailbox selected = session.getSelected();
         final Map<MessageUid, Flags> flagsByUid = mailbox.setFlags(flags, mode, messageSet, mailboxSession);


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


[james-project] 20/27: [Refactoring] Tests for DefaultImapEncoderFactory

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 3818e5d211eb0a6c7459b885c5539610ef9bcd77
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 11:32:58 2019 +0700

    [Refactoring] Tests for DefaultImapEncoderFactory
---
 .../encode/main/DefaultImapEncoderFactory.java     |  6 +--
 .../encode/main/DefaultImapEncoderFactoryTest.java | 56 ++++++++++++++++++++++
 2 files changed, 58 insertions(+), 4 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
index bdeb461..d5ed92f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
@@ -20,7 +20,6 @@
 package org.apache.james.imap.encode.main;
 
 import java.io.IOException;
-import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Stream;
@@ -58,17 +57,16 @@ import org.apache.james.imap.encode.XListResponseEncoder;
 import org.apache.james.imap.encode.base.EndImapEncoder;
 
 import com.github.steveash.guavate.Guavate;
-import com.google.common.collect.ImmutableList;
 
 /**
  * TODO: perhaps a POJO would be better
  */
 public class DefaultImapEncoderFactory implements ImapEncoderFactory {
-    private static class DefaultImapEncoder implements ImapEncoder {
+    static class DefaultImapEncoder implements ImapEncoder {
         private final Map<Class<? extends ImapMessage>, ImapResponseEncoder> encoders;
         private final EndImapEncoder endImapEncoder;
 
-        private DefaultImapEncoder(Stream<ImapResponseEncoder> encoders, EndImapEncoder endImapEncoder) {
+        DefaultImapEncoder(Stream<ImapResponseEncoder> encoders, EndImapEncoder endImapEncoder) {
             this.encoders = encoders
                 .collect(Guavate.toImmutableMap(
                     ImapResponseEncoder::acceptableMessages,
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactoryTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactoryTest.java
new file mode 100644
index 0000000..b9e270b
--- /dev/null
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactoryTest.java
@@ -0,0 +1,56 @@
+/****************************************************************
+ * 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.imap.encode.main;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import java.util.stream.Stream;
+
+import org.apache.james.imap.encode.ImapResponseComposer;
+import org.apache.james.imap.encode.RecentResponseEncoder;
+import org.apache.james.imap.encode.base.EndImapEncoder;
+import org.apache.james.imap.message.response.RecentResponse;
+import org.junit.jupiter.api.Test;
+
+class DefaultImapEncoderFactoryTest {
+    @Test
+    void defaultImapEncoderConstructorShouldThrowOnDuplicatedProcessor() {
+        assertThatThrownBy(() -> new DefaultImapEncoderFactory.DefaultImapEncoder(
+            Stream.of(
+                new RecentResponseEncoder(),
+                new RecentResponseEncoder()),
+            new EndImapEncoder()))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void encodeShouldTagNoWhenUnknownMessage() throws Exception {
+        DefaultImapEncoderFactory.DefaultImapEncoder defaultImapEncoder = new DefaultImapEncoderFactory.DefaultImapEncoder(
+            Stream.empty(),
+            new EndImapEncoder());
+
+        ImapResponseComposer composer = mock(ImapResponseComposer.class);
+        defaultImapEncoder.encode(new RecentResponse(18), composer);
+
+        verify(composer).untaggedNoResponse("Unknown message in pipeline", null);
+    }
+}
\ No newline at end of file


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


[james-project] 26/27: [Refactoring] StoreMailboxManager::isMailboxNameTooLong is no longer used

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

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

commit 889250d946fad6d1c9fbe111b913abcff4b99a89
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 11:57:56 2019 +0700

    [Refactoring] StoreMailboxManager::isMailboxNameTooLong is no longer used
    
    See PROTOCOLS-117, such validation is now done in MailboxPath
---
 .../main/java/org/apache/james/mailbox/store/StoreMailboxManager.java | 4 ----
 1 file changed, 4 deletions(-)

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 c54e09e..0b62dbe 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
@@ -407,10 +407,6 @@ public class StoreMailboxManager implements MailboxManager {
         }
     }
 
-    public boolean isMailboxNameTooLong(MailboxPath mailboxPath) {
-        return mailboxPath.getName().length() > MAX_MAILBOX_NAME_LENGTH;
-    }
-
     @Override
     public void deleteMailbox(final MailboxPath mailboxPath, final MailboxSession session) throws MailboxException {
         LOGGER.info("deleteMailbox {}", mailboxPath);


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


[james-project] 11/27: PROTOCOLS-120 ImapParserFactory should not create new instances

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 59371b299635244cd033ce9c89bd93247f1c64ec
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 15:25:33 2019 +0700

    PROTOCOLS-120 ImapParserFactory should not create new instances
---
 .../imap/decode/parser/ImapParserFactory.java      | 108 +++++++++------------
 1 file changed, 48 insertions(+), 60 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
index de8d619..f4ca8fd 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
@@ -35,7 +35,7 @@ import org.apache.james.imap.decode.MessagingImapCommandParser;
  * Command instances are created on demand, when first accessed.
  */
 public class ImapParserFactory implements ImapCommandParserFactory {
-    private final Map<String, Class<?>> imapCommands;
+    private final Map<String, ImapCommandParser> imapCommands;
 
     private final StatusResponseFactory statusResponseFactory;
 
@@ -45,100 +45,88 @@ public class ImapParserFactory implements ImapCommandParserFactory {
 
         // Commands valid in any state
         // CAPABILITY, NOOP, and LOGOUT
-        imapCommands.put(ImapConstants.CAPABILITY_COMMAND_NAME, CapabilityCommandParser.class);
-        imapCommands.put(ImapConstants.NOOP_COMMAND_NAME, NoopCommandParser.class);
-        imapCommands.put(ImapConstants.LOGOUT_COMMAND_NAME, LogoutCommandParser.class);
+        imapCommands.put(ImapConstants.CAPABILITY_COMMAND_NAME, new CapabilityCommandParser());
+        imapCommands.put(ImapConstants.NOOP_COMMAND_NAME, new NoopCommandParser());
+        imapCommands.put(ImapConstants.LOGOUT_COMMAND_NAME, new LogoutCommandParser());
 
         // Commands valid in NON_AUTHENTICATED state.
         // AUTHENTICATE and LOGIN
-        imapCommands.put(ImapConstants.AUTHENTICATE_COMMAND_NAME, AuthenticateCommandParser.class);
-        imapCommands.put(ImapConstants.LOGIN_COMMAND_NAME, LoginCommandParser.class);
+        imapCommands.put(ImapConstants.AUTHENTICATE_COMMAND_NAME, new AuthenticateCommandParser());
+        imapCommands.put(ImapConstants.LOGIN_COMMAND_NAME, new LoginCommandParser());
 
         // Commands valid in AUTHENTICATED or SELECTED state.
         // RFC2060: SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE,
         // UNSUBSCRIBE, LIST, LSUB, STATUS, and APPEND
-        imapCommands.put(ImapConstants.SELECT_COMMAND_NAME, SelectCommandParser.class);
-        imapCommands.put(ImapConstants.EXAMINE_COMMAND_NAME, ExamineCommandParser.class);
-        imapCommands.put(ImapConstants.CREATE_COMMAND_NAME, CreateCommandParser.class);
-        imapCommands.put(ImapConstants.DELETE_COMMAND_NAME, DeleteCommandParser.class);
-        imapCommands.put(ImapConstants.RENAME_COMMAND_NAME, RenameCommandParser.class);
-        imapCommands.put(ImapConstants.SUBSCRIBE_COMMAND_NAME, SubscribeCommandParser.class);
-        imapCommands.put(ImapConstants.UNSUBSCRIBE_COMMAND_NAME, UnsubscribeCommandParser.class);
-        imapCommands.put(ImapConstants.LIST_COMMAND_NAME, ListCommandParser.class);
-        imapCommands.put(ImapConstants.XLIST_COMMAND_NAME, XListCommandParser.class);
-        imapCommands.put(ImapConstants.LSUB_COMMAND_NAME, LsubCommandParser.class);
-        imapCommands.put(ImapConstants.STATUS_COMMAND_NAME, StatusCommandParser.class);
-        imapCommands.put(ImapConstants.APPEND_COMMAND_NAME, AppendCommandParser.class);
+        imapCommands.put(ImapConstants.SELECT_COMMAND_NAME, new SelectCommandParser());
+        imapCommands.put(ImapConstants.EXAMINE_COMMAND_NAME, new ExamineCommandParser());
+        imapCommands.put(ImapConstants.CREATE_COMMAND_NAME, new CreateCommandParser());
+        imapCommands.put(ImapConstants.DELETE_COMMAND_NAME, new DeleteCommandParser());
+        imapCommands.put(ImapConstants.RENAME_COMMAND_NAME, new RenameCommandParser());
+        imapCommands.put(ImapConstants.SUBSCRIBE_COMMAND_NAME, new SubscribeCommandParser());
+        imapCommands.put(ImapConstants.UNSUBSCRIBE_COMMAND_NAME, new UnsubscribeCommandParser());
+        imapCommands.put(ImapConstants.LIST_COMMAND_NAME, new ListCommandParser());
+        imapCommands.put(ImapConstants.XLIST_COMMAND_NAME, new XListCommandParser());
+        imapCommands.put(ImapConstants.LSUB_COMMAND_NAME, new LsubCommandParser());
+        imapCommands.put(ImapConstants.STATUS_COMMAND_NAME, new StatusCommandParser());
+        imapCommands.put(ImapConstants.APPEND_COMMAND_NAME,new AppendCommandParser());
 
         // RFC2342 NAMESPACE
-        imapCommands.put(ImapConstants.NAMESPACE_COMMAND_NAME, NamespaceCommandParser.class);
+        imapCommands.put(ImapConstants.NAMESPACE_COMMAND_NAME, new NamespaceCommandParser());
 
         // RFC4314 GETACL, SETACL, DELETEACL, LISTRIGHTS, MYRIGHTS
-        imapCommands.put(ImapConstants.GETACL_COMMAND_NAME, GetACLCommandParser.class);
-        imapCommands.put(ImapConstants.SETACL_COMMAND_NAME, SetACLCommandParser.class);
-        imapCommands.put(ImapConstants.DELETEACL_COMMAND_NAME, DeleteACLCommandParser.class);
-        imapCommands.put(ImapConstants.LISTRIGHTS_COMMAND_NAME, ListRightsCommandParser.class);
-        imapCommands.put(ImapConstants.MYRIGHTS_COMMAND_NAME, MyRightsCommandParser.class);
+        imapCommands.put(ImapConstants.GETACL_COMMAND_NAME, new GetACLCommandParser());
+        imapCommands.put(ImapConstants.SETACL_COMMAND_NAME, new SetACLCommandParser());
+        imapCommands.put(ImapConstants.DELETEACL_COMMAND_NAME, new DeleteACLCommandParser());
+        imapCommands.put(ImapConstants.LISTRIGHTS_COMMAND_NAME, new ListRightsCommandParser());
+        imapCommands.put(ImapConstants.MYRIGHTS_COMMAND_NAME, new MyRightsCommandParser());
 
         // Commands only valid in SELECTED state.
         // CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY, UID and IDLE
-        imapCommands.put(ImapConstants.CHECK_COMMAND_NAME, CheckCommandParser.class);
-        imapCommands.put(ImapConstants.CLOSE_COMMAND_NAME, CloseCommandParser.class);
-        imapCommands.put(ImapConstants.EXPUNGE_COMMAND_NAME, ExpungeCommandParser.class);
-        imapCommands.put(ImapConstants.COPY_COMMAND_NAME, CopyCommandParser.class);
-        imapCommands.put(ImapConstants.MOVE_COMMAND_NAME, MoveCommandParser.class);
-        imapCommands.put(ImapConstants.SEARCH_COMMAND_NAME, SearchCommandParser.class);
-        imapCommands.put(ImapConstants.FETCH_COMMAND_NAME, FetchCommandParser.class);
-        imapCommands.put(ImapConstants.STORE_COMMAND_NAME, StoreCommandParser.class);
-        imapCommands.put(ImapConstants.UID_COMMAND_NAME, UidCommandParser.class);
-        imapCommands.put(ImapConstants.IDLE_COMMAND_NAME, IdleCommandParser.class);
-        imapCommands.put(ImapConstants.STARTTLS, StartTLSCommandParser.class);
+        imapCommands.put(ImapConstants.CHECK_COMMAND_NAME, new CheckCommandParser());
+        imapCommands.put(ImapConstants.CLOSE_COMMAND_NAME, new CloseCommandParser());
+        imapCommands.put(ImapConstants.EXPUNGE_COMMAND_NAME, new ExpungeCommandParser());
+        imapCommands.put(ImapConstants.COPY_COMMAND_NAME, new CopyCommandParser());
+        imapCommands.put(ImapConstants.MOVE_COMMAND_NAME, new MoveCommandParser());
+        imapCommands.put(ImapConstants.SEARCH_COMMAND_NAME, new SearchCommandParser());
+        imapCommands.put(ImapConstants.FETCH_COMMAND_NAME, new FetchCommandParser());
+        imapCommands.put(ImapConstants.STORE_COMMAND_NAME, new StoreCommandParser());
+        imapCommands.put(ImapConstants.UID_COMMAND_NAME, new UidCommandParser());
+        imapCommands.put(ImapConstants.IDLE_COMMAND_NAME, new IdleCommandParser());
+        imapCommands.put(ImapConstants.STARTTLS, new StartTLSCommandParser());
 
         // RFC3691
-        imapCommands.put(ImapConstants.UNSELECT_COMMAND_NAME, UnselectCommandParser.class);
+        imapCommands.put(ImapConstants.UNSELECT_COMMAND_NAME, new UnselectCommandParser());
 
         // RFC4978
-        imapCommands.put(ImapConstants.COMPRESS_COMMAND_NAME, CompressCommandParser.class);
+        imapCommands.put(ImapConstants.COMPRESS_COMMAND_NAME, new CompressCommandParser());
         
-        imapCommands.put(ImapConstants.ENABLE_COMMAND_NAME, EnableCommandParser.class);
+        imapCommands.put(ImapConstants.ENABLE_COMMAND_NAME, new EnableCommandParser());
 
         // RFC2087
         // GETQUOTAROOT, GETQUOTA, SETQUOTA
-        imapCommands.put(ImapConstants.GETQUOTAROOT_COMMAND_NAME, GetQuotaRootCommandParser.class);
-        imapCommands.put(ImapConstants.GETQUOTA_COMMAND_NAME, GetQuotaCommandParser.class);
-        imapCommands.put(ImapConstants.SETQUOTA_COMMAND_NAME, SetQuotaCommandParser.class);
+        imapCommands.put(ImapConstants.GETQUOTAROOT_COMMAND_NAME, new GetQuotaRootCommandParser());
+        imapCommands.put(ImapConstants.GETQUOTA_COMMAND_NAME, new GetQuotaCommandParser());
+        imapCommands.put(ImapConstants.SETQUOTA_COMMAND_NAME, new SetQuotaCommandParser());
 
         //RFC5464
         //SETMETADATA, GETMETADATA
-        imapCommands.put(ImapConstants.SETANNOTATION_COMMAND_NAME, SetAnnotationCommandParser.class);
-        imapCommands.put(ImapConstants.GETANNOTATION_COMMAND_NAME, GetAnnotationCommandParser.class);
+        imapCommands.put(ImapConstants.SETANNOTATION_COMMAND_NAME, new SetAnnotationCommandParser());
+        imapCommands.put(ImapConstants.GETANNOTATION_COMMAND_NAME, new GetAnnotationCommandParser());
     }
 
     @Override
     public ImapCommandParser getParser(String commandName) {
-        Class<?> cmdClass = imapCommands.get(commandName.toUpperCase(Locale.US));
+        ImapCommandParser parser = imapCommands.get(commandName.toUpperCase(Locale.US));
 
-        if (cmdClass == null) {
+        if (parser == null) {
             return null;
         } else {
-            return createCommand(cmdClass);
+            initialiseParser(parser);
+            return parser;
         }
     }
 
-    private ImapCommandParser createCommand(Class<?> commandClass) {
-        try {
-            ImapCommandParser cmd = (ImapCommandParser) commandClass.newInstance();
-            initialiseParser(cmd);
-            return cmd;
-        } catch (Exception e) {
-            // TODO: would probably be better to manage this in protocol
-            // TODO: this runtime will produce a nasty disconnect for the client
-            throw new RuntimeException("Could not create command instance: " + commandClass.getName(), e);
-        }
-    }
-
-    protected void initialiseParser(ImapCommandParser cmd) {
-
+    private void initialiseParser(ImapCommandParser cmd) {
         if (cmd instanceof DelegatingImapCommandParser) {
             ((DelegatingImapCommandParser) cmd).setParserFactory(this);
         }


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


[james-project] 06/27: [Refactoring] FetchData: boolean setter parameter are always true

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 12367a727fffecb0c649362b01027d4763d22755
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 10:22:36 2019 +0700

    [Refactoring] FetchData: boolean setter parameter are always true
    
    Remove this useless parameter.
    
    Rename these methods to `fetch*` to better express the intent.
---
 .../apache/james/imap/api/message/FetchData.java   | 25 +++++---------
 .../imap/decode/parser/FetchCommandParser.java     | 40 +++++++++++-----------
 .../james/imap/message/request/FetchRequest.java   |  2 +-
 .../james/imap/processor/fetch/FetchProcessor.java |  2 +-
 .../processor/fetch/FetchDataConverterTest.java    | 14 ++++----
 5 files changed, 37 insertions(+), 46 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
index da9443c..3459a63 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
@@ -25,7 +25,6 @@ import java.util.Objects;
 import java.util.Set;
 
 import com.google.common.base.MoreObjects;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 
 public class FetchData {
@@ -55,8 +54,7 @@ public class FetchData {
         return itemToFetch.contains(Item.BODY);
     }
 
-    public FetchData setBody(boolean body) {
-        Preconditions.checkArgument(body, "'body' can not be unset");
+    public FetchData fetchBody() {
         itemToFetch.add(Item.BODY);
         return this;
     }
@@ -65,8 +63,7 @@ public class FetchData {
         return itemToFetch.contains(Item.BODY_STRUCTURE);
     }
 
-    public FetchData setBodyStructure(boolean bodyStructure) {
-        Preconditions.checkArgument(bodyStructure, "'bodyStructure' can not be unset");
+    public FetchData fetchBodyStructure() {
         itemToFetch.add(Item.BODY_STRUCTURE);
         return this;
     }
@@ -75,8 +72,7 @@ public class FetchData {
         return itemToFetch.contains(Item.ENVELOPE);
     }
 
-    public FetchData setEnvelope(boolean envelope) {
-        Preconditions.checkArgument(envelope, "'envelope' can not be unset");
+    public FetchData fetchEnvelope() {
         itemToFetch.add(Item.ENVELOPE);
         return this;
     }
@@ -85,8 +81,7 @@ public class FetchData {
         return itemToFetch.contains(Item.FLAGS);
     }
 
-    public FetchData setFlags(boolean flags) {
-        Preconditions.checkArgument(flags, "'flags' can not be unset");
+    public FetchData fetchFlags() {
         itemToFetch.add(Item.FLAGS);
         return this;
     }
@@ -95,8 +90,7 @@ public class FetchData {
         return itemToFetch.contains(Item.INTERNAL_DATE);
     }
 
-    public FetchData setInternalDate(boolean internalDate) {
-        Preconditions.checkArgument(internalDate, "'internalDate' can not be unset");
+    public FetchData fetchInternalDate() {
         itemToFetch.add(Item.INTERNAL_DATE);
         return this;
     }
@@ -105,8 +99,7 @@ public class FetchData {
         return itemToFetch.contains(Item.SIZE);
     }
 
-    public FetchData setSize(boolean size) {
-        Preconditions.checkArgument(size, "'size' can not be unset");
+    public FetchData fetchSize() {
         itemToFetch.add(Item.SIZE);
         return this;
     }
@@ -115,8 +108,7 @@ public class FetchData {
         return itemToFetch.contains(Item.UID);
     }
 
-    public FetchData setUid(boolean uid) {
-        Preconditions.checkArgument(uid, "'uid' can not be unset");
+    public FetchData fetchUid() {
         itemToFetch.add(Item.UID);
         return this;
     }
@@ -130,8 +122,7 @@ public class FetchData {
         return itemToFetch.contains(Item.MODSEQ);
     }
 
-    public FetchData setModSeq(boolean modSeq) {
-        Preconditions.checkArgument(modSeq, "'modSeq' can not be unset");
+    public FetchData fetchModSeq() {
         itemToFetch.add(Item.MODSEQ);
         return this;
     }
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 f929325..698a819 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
@@ -129,34 +129,34 @@ public class FetchCommandParser extends AbstractUidCommandParser {
         // Simple elements with no '[]' parameters.
         if (next != '[') {
             if ("FAST".equalsIgnoreCase(name)) {
-                fetch.setFlags(true);
-                fetch.setInternalDate(true);
-                fetch.setSize(true);
+                fetch.fetchFlags();
+                fetch.fetchInternalDate();
+                fetch.fetchSize();
             } else if ("FULL".equalsIgnoreCase(name)) {
-                fetch.setFlags(true);
-                fetch.setInternalDate(true);
-                fetch.setSize(true);
-                fetch.setEnvelope(true);
-                fetch.setBody(true);
+                fetch.fetchFlags();
+                fetch.fetchInternalDate();
+                fetch.fetchSize();
+                fetch.fetchEnvelope();
+                fetch.fetchBody();
             } else if ("ALL".equalsIgnoreCase(name)) {
-                fetch.setFlags(true);
-                fetch.setInternalDate(true);
-                fetch.setSize(true);
-                fetch.setEnvelope(true);
+                fetch.fetchFlags();
+                fetch.fetchInternalDate();
+                fetch.fetchSize();
+                fetch.fetchEnvelope();
             } else if ("FLAGS".equalsIgnoreCase(name)) {
-                fetch.setFlags(true);
+                fetch.fetchFlags();
             } else if ("RFC822.SIZE".equalsIgnoreCase(name)) {
-                fetch.setSize(true);
+                fetch.fetchSize();
             } else if ("ENVELOPE".equalsIgnoreCase(name)) {
-                fetch.setEnvelope(true);
+                fetch.fetchEnvelope();
             } else if ("INTERNALDATE".equalsIgnoreCase(name)) {
-                fetch.setInternalDate(true);
+                fetch.fetchInternalDate();
             } else if ("BODY".equalsIgnoreCase(name)) {
-                fetch.setBody(true);
+                fetch.fetchBody();
             } else if ("BODYSTRUCTURE".equalsIgnoreCase(name)) {
-                fetch.setBodyStructure(true);
+                fetch.fetchBodyStructure();
             } else if ("UID".equalsIgnoreCase(name)) {
-                fetch.setUid(true);
+                fetch.fetchUid();
             } else if ("RFC822".equalsIgnoreCase(name)) {
                 fetch.add(BodyFetchElement.createRFC822(), false);
             } else if ("RFC822.HEADER".equalsIgnoreCase(name)) {
@@ -164,7 +164,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
             } else if ("RFC822.TEXT".equalsIgnoreCase(name)) {
                 fetch.add(BodyFetchElement.createRFC822Text(), false);
             } else if ("MODSEQ".equalsIgnoreCase(name)) {
-                fetch.setModSeq(true);
+                fetch.fetchModSeq();
             } else {
                 throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid fetch attribute: " + name);
             }
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 61e8758..6867bda 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
@@ -36,7 +36,7 @@ public class FetchRequest extends AbstractImapRequest {
         this.idSet = idSet;
         this.fetch = fetch;
         if (useUids) {
-            fetch.setUid(true);
+            fetch.fetchUid();
         }
     }
 
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 668128e..ef8c007 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
@@ -108,7 +108,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
             }
             // if QRESYNC is enable its necessary to also return the UID in all cases
             if (EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
-                fetch.setUid(true);
+                fetch.fetchUid();
             }
             processMessageRanges(session, mailbox, ranges, fetch, useUids, mailboxSession, responder);
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
index 0050bfa..84f06e7 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
@@ -44,14 +44,14 @@ class FetchDataConverterTest {
     static Stream<Arguments> getFetchGroupShouldReturnCorrectValue() {
         return Stream.of(
             Arguments.arguments(new FetchData(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().setBody(true), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
-            Arguments.arguments(new FetchData().setBodyStructure(true), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
+            Arguments.arguments(new FetchData().fetchBody(), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
+            Arguments.arguments(new FetchData().fetchBodyStructure(), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
             Arguments.arguments(new FetchData().setChangedSince(0L), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().setEnvelope(true), FetchGroup.HEADERS),
-            Arguments.arguments(new FetchData().setFlags(true), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().setInternalDate(true), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().setModSeq(true), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().setUid(true), FetchGroup.MINIMAL),
+            Arguments.arguments(new FetchData().fetchEnvelope(), FetchGroup.HEADERS),
+            Arguments.arguments(new FetchData().fetchFlags(), FetchGroup.MINIMAL),
+            Arguments.arguments(new FetchData().fetchInternalDate(), FetchGroup.MINIMAL),
+            Arguments.arguments(new FetchData().fetchModSeq(), FetchGroup.MINIMAL),
+            Arguments.arguments(new FetchData().fetchUid(), FetchGroup.MINIMAL),
             Arguments.arguments(new FetchData().setVanished(true), FetchGroup.MINIMAL),
             Arguments.arguments(new FetchData().add(BodyFetchElement.createRFC822(), PEEK), FetchGroup.FULL_CONTENT),
             Arguments.arguments(new FetchData().add(BodyFetchElement.createRFC822Header(), PEEK), FetchGroup.HEADERS),


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


[james-project] 22/27: JAMES-2991 Add a convenience MessageIdManager::getMessage method

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

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

commit 4f79944ea4570dceca950fe784bc325345977455
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 10:11:14 2019 +0700

    JAMES-2991 Add a convenience MessageIdManager::getMessage method
---
 .../org/apache/james/mailbox/MessageIdManager.java |   4 +
 .../james/mailbox/store/StoreBlobManager.java      |   3 +-
 .../store/AbstractCombinationManagerTest.java      |  16 +--
 .../AbstractMessageIdManagerSideEffectTest.java    |  16 +--
 .../store/AbstractMessageIdManagerStorageTest.java | 119 +++++++++------------
 .../james/mailbox/store/StoreBlobManagerTest.java  |  16 +--
 .../apache/james/jmap/draft/MessageIdProbe.java    |   8 +-
 .../james/jmap/draft/methods/ReferenceUpdater.java |   2 +-
 .../james/jmap/draft/methods/SendMDNProcessor.java |   4 +-
 .../draft/methods/SetMessagesUpdateProcessor.java  |   5 +-
 .../jmap/draft/send/PostDequeueDecorator.java      |   2 +-
 .../jmap/draft/send/PostDequeueDecoratorTest.java  |   6 +-
 12 files changed, 88 insertions(+), 113 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java
index 095a697..a4548be 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageIdManager.java
@@ -49,6 +49,10 @@ public interface MessageIdManager {
 
     void setInMailboxes(MessageId messageId, Collection<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException;
 
+    default List<MessageResult> getMessage(MessageId messageId, FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException {
+        return getMessages(ImmutableList.of(messageId), fetchGroup, mailboxSession);
+    }
+
     default DeleteResult delete(MessageId messageId, MailboxSession mailboxSession) throws MailboxException {
         return delete(ImmutableList.of(messageId), mailboxSession);
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreBlobManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreBlobManager.java
index 85eba76..3be2405 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreBlobManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreBlobManager.java
@@ -39,7 +39,6 @@ import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MessageId;
 
 import com.github.fge.lambdas.Throwing;
-import com.google.common.collect.ImmutableList;
 
 public class StoreBlobManager implements BlobManager {
     public static final String MESSAGE_RFC822_CONTENT_TYPE = "message/rfc822";
@@ -97,7 +96,7 @@ public class StoreBlobManager implements BlobManager {
 
     private Optional<InputStream> loadMessageAsBlob(MessageId messageId, MailboxSession mailboxSession)  {
         try {
-            return messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.FULL_CONTENT, mailboxSession)
+            return messageIdManager.getMessage(messageId, FetchGroup.FULL_CONTENT, mailboxSession)
                 .stream()
                 .map(Throwing.function(message -> message.getFullContent().getInputStream()))
                 .findFirst();
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
index 344d673..30dedcf 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractCombinationManagerTest.java
@@ -127,7 +127,7 @@ public abstract class AbstractCombinationManagerTest {
         messageIdManager.setInMailboxes(messageId,
             ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        MessageUid uidInMailbox2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)
+        MessageUid uidInMailbox2 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session)
             .get(0)
             .getUid();
 
@@ -175,7 +175,7 @@ public abstract class AbstractCombinationManagerTest {
         messageManager1.setFlags(deleted, FlagsUpdateMode.ADD, MessageRange.all(), session);
         messageManager1.expunge(MessageRange.all(), session);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)).isEmpty();
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session)).isEmpty();
     }
 
     @Test
@@ -210,7 +210,7 @@ public abstract class AbstractCombinationManagerTest {
         MessageId messageId = messageManager1.appendMessage(MessageManager.AppendCommand.from(mailContent), session)
             .getMessageId();
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)).hasSize(1);
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session)).hasSize(1);
     }
 
     @Test
@@ -220,7 +220,7 @@ public abstract class AbstractCombinationManagerTest {
 
         mailboxManager.copyMessages(MessageRange.all(), mailbox1.getMailboxId(), mailbox2.getMailboxId(), session);
 
-        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
+        List<MessageResult> listMessages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session);
 
         assertThat(listMessages).hasSize(2)
             .extractingResultOf("getMailboxId")
@@ -234,7 +234,7 @@ public abstract class AbstractCombinationManagerTest {
 
         mailboxManager.copyMessages(MessageRange.all(), MailboxFixture.INBOX_ALICE, MailboxFixture.OUTBOX_ALICE, session);
 
-        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
+        List<MessageResult> listMessages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session);
 
         assertThat(listMessages).hasSize(2)
             .extractingResultOf("getMailboxId")
@@ -248,7 +248,7 @@ public abstract class AbstractCombinationManagerTest {
 
         mailboxManager.moveMessages(MessageRange.all(), MailboxFixture.INBOX_ALICE, MailboxFixture.OUTBOX_ALICE, session);
 
-        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
+        List<MessageResult> listMessages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session);
 
         assertThat(listMessages).hasSize(1)
             .extractingResultOf("getMailboxId")
@@ -308,7 +308,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId.getMessageId(), ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageResult> listMessages = messageIdManager.getMessages(ImmutableList.of(messageId.getMessageId()), FetchGroup.MINIMAL, session);
+        List<MessageResult> listMessages = messageIdManager.getMessage(messageId.getMessageId(), FetchGroup.MINIMAL, session);
 
         long uid2 = listMessages.stream()
             .filter(messageInMailbox2())
@@ -501,7 +501,7 @@ public abstract class AbstractCombinationManagerTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        MessageUid uid2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)
+        MessageUid uid2 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session)
             .stream()
             .filter(messageInMailbox2())
             .findFirst()
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
index 60124c3..b579036 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerSideEffectTest.java
@@ -134,7 +134,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         givenUnlimitedQuota();
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
 
-        MessageResult messageResult = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session).get(0);
+        MessageResult messageResult = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session).get(0);
         MessageMetaData simpleMessageMetaData = messageResult.messageMetaData();
 
         eventBus.register(eventCollector);
@@ -158,9 +158,9 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         MessageId messageId1 = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         MessageId messageId2 = testingData.persist(mailbox1.getMailboxId(), messageUid2, FLAGS, session);
 
-        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, session).get(0);
+        MessageResult messageResult1 = messageIdManager.getMessage(messageId1, FetchGroup.MINIMAL, session).get(0);
         MessageMetaData simpleMessageMetaData1 = messageResult1.messageMetaData();
-        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroup.MINIMAL, session).get(0);
+        MessageResult messageResult2 = messageIdManager.getMessage(messageId2, FetchGroup.MINIMAL, session).get(0);
         MessageMetaData simpleMessageMetaData2 = messageResult2.messageMetaData();
 
         eventBus.register(eventCollector);
@@ -275,7 +275,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         assertThatThrownBy(() -> messageIdManager.delete(messageId, ImmutableList.of(mailbox1.getMailboxId()), session))
             .isInstanceOf(RuntimeException.class);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session)
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session)
                 .stream()
                 .map(MessageResult::getMessageId))
             .hasSize(1)
@@ -306,7 +306,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         latchForHook1.await();
         latchForHook2.await();
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session))
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session))
             .isEmpty();
     }
 
@@ -343,7 +343,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         eventBus.register(eventCollector);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId(), mailbox3.getMailboxId()), session);
 
-        messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
+        messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session);
 
         assertThat(eventCollector.getEvents()).filteredOn(event -> event instanceof MessageMoveEvent).hasSize(1);
         assertThat(eventCollector.getEvents()).filteredOn(event -> event instanceof MailboxListener.Added).hasSize(2)
@@ -373,7 +373,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         MessageId messageId = testingData.persist(mailbox1.getMailboxId(), messageUid1, FLAGS, session);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
+        List<MessageResult> messageResults = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session);
         assertThat(messageResults).hasSize(2);
 
         eventBus.register(eventCollector);
@@ -459,7 +459,7 @@ public abstract class AbstractMessageIdManagerSideEffectTest {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(mailbox1.getMailboxId(), mailbox2.getMailboxId()), session);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, session);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, session);
         assertThat(messages).hasSize(1);
         MessageResult messageResult = messages.get(0);
         MessageUid messageUid = messageResult.getUid();
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
index ac79368..fa1c0ec 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerStorageTest.java
@@ -92,7 +92,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     void getMessagesShouldReturnEmptyListWhenMessageIdNotUsed() throws Exception {
         MessageId messageId = testingData.createNotUsedMessageId();
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession))
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession))
             .isEmpty();
     }
 
@@ -122,7 +122,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
     void getMessagesShouldReturnStoredResults() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession))
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession))
             .hasSize(1);
     }
 
@@ -130,8 +130,8 @@ public abstract class AbstractMessageIdManagerStorageTest {
     void getMessageShouldReturnOnlyMessageBelongingToCurrentUser() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).hasSize(1);
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession)).isEmpty();
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)).hasSize(1);
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession)).isEmpty();
     }
 
     @Test
@@ -140,7 +140,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession))
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession))
             .hasSize(2);
     }
 
@@ -150,7 +150,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession))
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession))
             .hasSize(1);
     }
 
@@ -161,10 +161,10 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId2, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        MessageUid uidMessage1Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
+        MessageUid uidMessage1Mailbox1 = messageIdManager.getMessage(messageId1, FetchGroup.MINIMAL, aliceSession)
             .get(0)
             .getUid();
-        MessageUid uidMessage2Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroup.MINIMAL, aliceSession)
+        MessageUid uidMessage2Mailbox1 = messageIdManager.getMessage(messageId2, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox1.getMailboxId()))
             .findFirst()
@@ -181,10 +181,10 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId2, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        ModSeq modSeqMessage1Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
+        ModSeq modSeqMessage1Mailbox1 = messageIdManager.getMessage(messageId1, FetchGroup.MINIMAL, aliceSession)
             .get(0)
             .getModSeq();
-        ModSeq modSeqMessage2Mailbox1 = messageIdManager.getMessages(ImmutableList.of(messageId2), FetchGroup.MINIMAL, aliceSession)
+        ModSeq modSeqMessage2Mailbox1 = messageIdManager.getMessage(messageId2, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox1.getMailboxId()))
             .findFirst()
@@ -197,13 +197,13 @@ public abstract class AbstractMessageIdManagerStorageTest {
     @Test
     void setInMailboxesShouldNotChangeUidAndModSeqInOriginalMailbox() throws Exception {
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
-        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult1 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession).get(0);
         MessageUid messageUid1 = messageResult1.getUid();
         ModSeq modSeq1 = messageResult1.getModSeq();
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)
+        MessageResult messageResult2 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox1.getMailboxId()))
             .findFirst()
@@ -221,7 +221,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox3.getMailboxId()), aliceSession);
 
-        List<MailboxId> messageMailboxIds = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)
+        List<MailboxId> messageMailboxIds = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getMailboxId)
             .collect(Guavate.toImmutableList());
@@ -238,7 +238,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox3.getMailboxId()), aliceSession);
 
-        MessageResult messageResult3 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)
+        MessageResult messageResult3 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .filter(inMailbox(aliceMailbox3.getMailboxId()))
             .findFirst()
@@ -272,7 +272,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -281,7 +281,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -290,7 +290,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -300,7 +300,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messageResults = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messageResults).hasSize(1);
         assertThat(messageResults.get(0).getMailboxId()).isEqualTo(aliceMailbox2.getMailboxId());
     }
@@ -312,7 +312,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -321,7 +321,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox2.getMailboxId()), aliceSession);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messageResults = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messageResults).hasSize(1);
         assertThat(messageResults.get(0).getMailboxId()).isEqualTo(aliceMailbox1.getMailboxId());
     }
@@ -365,7 +365,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        MessageResult messageResult = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession).get(0);
         assertThat(messageResult.getFlags()).isEqualTo(newFlags);
     }
 
@@ -374,12 +374,12 @@ public abstract class AbstractMessageIdManagerStorageTest {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult1 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession).get(0);
         MessageUid messageUid1 = messageResult1.getUid();
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult2 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession).get(0);
         MessageUid messageUid2 = messageResult2.getUid();
 
         assertThat(messageUid2).isEqualTo(messageUid1);
@@ -390,12 +390,12 @@ public abstract class AbstractMessageIdManagerStorageTest {
         Flags newFlags = new Flags(Flags.Flag.SEEN);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        MessageResult messageResult1 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult1 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession).get(0);
         ModSeq modSeq1 = messageResult1.getModSeq();
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        MessageResult messageResult2 = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession).get(0);
+        MessageResult messageResult2 = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession).get(0);
         ModSeq modSeq2 = messageResult2.getModSeq();
 
         assertThat(modSeq2).isGreaterThan(modSeq1);
@@ -409,7 +409,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), aliceMailbox2.getMailboxId()), aliceSession);
 
-        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)
+        List<Flags> flags = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getFlags)
             .collect(Guavate.toImmutableList());
@@ -427,7 +427,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId2, ImmutableList.of(aliceMailbox1.getMailboxId()), aliceSession);
 
-        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
+        List<Flags> flags = messageIdManager.getMessage(messageId1, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getFlags)
             .collect(Guavate.toImmutableList());
@@ -443,7 +443,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId1, ImmutableList.of(), aliceSession);
 
-        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
+        List<Flags> flags = messageIdManager.getMessage(messageId1, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getFlags)
             .collect(Guavate.toImmutableList());
@@ -459,7 +459,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.ADD, messageId1, ImmutableList.of(aliceMailbox2.getMailboxId()), aliceSession);
 
-        List<Flags> flags = messageIdManager.getMessages(ImmutableList.of(messageId1), FetchGroup.MINIMAL, aliceSession)
+        List<Flags> flags = messageIdManager.getMessage(messageId1, FetchGroup.MINIMAL, aliceSession)
             .stream()
             .map(MessageResult::getFlags)
             .collect(Guavate.toImmutableList());
@@ -530,7 +530,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         testingData.deleteMailbox(aliceMailbox1.getMailboxId(), aliceSession);
 
-        assertThat(messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession)).isEmpty();
+        assertThat(messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession)).isEmpty();
     }
 
     @Test
@@ -540,7 +540,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         testingData.deleteMailbox(aliceMailbox1.getMailboxId(), aliceSession);
 
-        List<MessageResult> messageResults = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messageResults = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messageResults).hasSize(1);
         assertThat(messageResults.get(0).getMailboxId()).isEqualTo(aliceMailbox2.getMailboxId());
     }
@@ -588,7 +588,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             aliceSession);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId),
+        List<MessageResult> messages = messageIdManager.getMessage(messageId,
             FetchGroup.MINIMAL, bobSession);
 
         assertThat(messages)
@@ -607,7 +607,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             aliceSession);
         MessageId messageId = testingData.persist(aliceMailbox1.getMailboxId(), messageUid1, FLAGS, aliceSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
 
         assertThat(messages)
             .isEmpty();
@@ -628,7 +628,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         messageIdManager.setFlags(newFlags, MessageManager.FlagsUpdateMode.REPLACE,
             messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getFlags)
             .containsOnly(newFlags);
@@ -650,7 +650,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
                 messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession))
             .isInstanceOf(MailboxNotFoundException.class);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getFlags)
             .containsOnly(FLAGS);
@@ -672,7 +672,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), bobMailbox1.getMailboxId()), bobSession);
 
         //Then
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId, messageId);
@@ -701,10 +701,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             .isInstanceOf(MailboxNotFoundException.class);
 
         //Then
-        List<MessageResult> messages = messageIdManager.getMessages(
-            ImmutableList.of(messageId),
-            FetchGroup.MINIMAL,
-            bobSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
         assertThat(messages)
             .isEmpty();
     }
@@ -725,10 +722,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId(), bobMailbox1.getMailboxId()), bobSession);
 
         //Then
-        List<MessageResult> messages = messageIdManager.getMessages(
-            ImmutableList.of(messageId),
-            FetchGroup.MINIMAL,
-            aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId);
@@ -757,10 +751,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             .isInstanceOf(MailboxNotFoundException.class);
 
         //Then
-        List<MessageResult> messages = messageIdManager.getMessages(
-            ImmutableList.of(messageId),
-            FetchGroup.MINIMAL,
-            bobSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId);
@@ -785,10 +776,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(bobMailbox1.getMailboxId()), bobSession);
 
         //Then
-        List<MessageResult> messages = messageIdManager.getMessages(
-            ImmutableList.of(messageId),
-            FetchGroup.MINIMAL,
-            bobSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId);
@@ -817,10 +805,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             .isInstanceOf(MailboxNotFoundException.class);
 
         //Then
-        List<MessageResult> messages = messageIdManager.getMessages(
-            ImmutableList.of(messageId),
-            FetchGroup.MINIMAL,
-            bobSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId);
@@ -848,10 +833,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             bobSession);
 
         //Then
-        List<MessageResult> messagesForSharee = messageIdManager.getMessages(
-            ImmutableList.of(messageId),
-            FetchGroup.MINIMAL,
-            bobSession);
+        List<MessageResult> messagesForSharee = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
         assertThat(messagesForSharee)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId, messageId);
@@ -859,10 +841,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             .extracting(MessageResult::getMailboxId)
             .containsOnly(aliceMailbox2.getMailboxId(), bobMailbox1.getMailboxId());
 
-        List<MessageResult> messagesForOwner = messageIdManager.getMessages(
-            ImmutableList.of(messageId),
-            FetchGroup.MINIMAL,
-            aliceSession);
+        List<MessageResult> messagesForOwner = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messagesForOwner)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId, messageId);
@@ -884,7 +863,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .isEmpty();
     }
@@ -904,7 +883,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             messageIdManager.delete(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession))
             .isInstanceOf(MailboxNotFoundException.class);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getMessageId)
             .containsOnly(messageId);
@@ -958,7 +937,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getFlags)
             .containsOnly(new Flags());
@@ -978,7 +957,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
 
         messageIdManager.setInMailboxes(messageId, ImmutableList.of(aliceMailbox1.getMailboxId()), bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, aliceSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, aliceSession);
         assertThat(messages)
             .extracting(MessageResult::getFlags)
             .containsOnly(flags);
@@ -992,7 +971,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
             .build(ClassLoaderUtils.getSystemResourceAsSharedStream("eml/twoAttachmentsApi.eml")), bobSession)
             .getMessageId();
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
 
         assertThat(messages)
             .hasSize(1)
@@ -1005,7 +984,7 @@ public abstract class AbstractMessageIdManagerStorageTest {
         Flags flags = new Flags(Flags.Flag.FLAGGED);
         MessageId messageId = testingData.persist(bobMailbox1.getMailboxId(), messageUid1, flags, bobSession);
 
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, bobSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, bobSession);
 
         assertThat(messages)
             .hasSize(1)
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
index 91b6661..dbcaca0 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreBlobManagerTest.java
@@ -94,7 +94,7 @@ class StoreBlobManagerTest {
     void retrieveShouldThrowWhenNotFound() throws Exception {
         when(attachmentManager.getAttachment(ATTACHMENT_ID, session))
             .thenThrow(new AttachmentNotFoundException(ID));
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
+        when(messageIdManager.getMessage(MESSAGE_ID, FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of());
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_ATTACHMENT, session))
@@ -110,7 +110,7 @@ class StoreBlobManagerTest {
         Content content = mock(Content.class);
         when(content.getInputStream()).thenReturn(new ByteArrayInputStream(BYTES));
         when(messageResult.getFullContent()).thenReturn(content);
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
+        when(messageIdManager.getMessage(MESSAGE_ID, FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThat(blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -144,7 +144,7 @@ class StoreBlobManagerTest {
         when(attachmentManager.getAttachment(any(), any()))
             .thenThrow(new AttachmentNotFoundException(ID));
 
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
+        when(messageIdManager.getMessage(MESSAGE_ID, FetchGroup.FULL_CONTENT, session))
             .thenThrow(new RuntimeException());
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -156,7 +156,7 @@ class StoreBlobManagerTest {
         when(attachmentManager.getAttachment(any(), any()))
             .thenThrow(new AttachmentNotFoundException(ID));
 
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
+        when(messageIdManager.getMessage(MESSAGE_ID, FetchGroup.FULL_CONTENT, session))
             .thenThrow(new MailboxException());
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -170,7 +170,7 @@ class StoreBlobManagerTest {
 
         MessageResult messageResult = mock(MessageResult.class);
         when(messageResult.getFullContent()).thenThrow(new MailboxException());
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
+        when(messageIdManager.getMessage(MESSAGE_ID, FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -184,7 +184,7 @@ class StoreBlobManagerTest {
 
         MessageResult messageResult = mock(MessageResult.class);
         when(messageResult.getFullContent()).thenThrow(new RuntimeException());
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
+        when(messageIdManager.getMessage(MESSAGE_ID, FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -200,7 +200,7 @@ class StoreBlobManagerTest {
         Content content = mock(Content.class);
         when(content.getInputStream()).thenThrow(new IOException());
         when(messageResult.getFullContent()).thenReturn(content);
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
+        when(messageIdManager.getMessage(MESSAGE_ID, FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
@@ -216,7 +216,7 @@ class StoreBlobManagerTest {
         Content content = mock(Content.class);
         when(content.getInputStream()).thenThrow(new RuntimeException());
         when(messageResult.getFullContent()).thenReturn(content);
-        when(messageIdManager.getMessages(ImmutableList.of(MESSAGE_ID), FetchGroup.FULL_CONTENT, session))
+        when(messageIdManager.getMessage(MESSAGE_ID, FetchGroup.FULL_CONTENT, session))
             .thenReturn(ImmutableList.of(messageResult));
 
         assertThatThrownBy(() -> blobManager.retrieve(BLOB_ID_MESSAGE, session))
diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
index 6b57af0..9d7dc4b 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/MessageIdProbe.java
@@ -40,7 +40,6 @@ import org.apache.james.utils.GuiceProbe;
 
 import com.github.fge.lambdas.Throwing;
 import com.github.steveash.guavate.Guavate;
-import com.google.common.collect.ImmutableList;
 
 public class MessageIdProbe implements GuiceProbe {
     private final MailboxManager mailboxManager;
@@ -55,7 +54,7 @@ public class MessageIdProbe implements GuiceProbe {
     public List<MessageResult> getMessages(MessageId messageId, Username user) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(user);
 
-        return messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.FULL_CONTENT, mailboxSession);
+        return messageIdManager.getMessage(messageId, FetchGroup.FULL_CONTENT, mailboxSession);
     }
 
     public void updateNewFlags(Username user, Flags newFlags, MessageId messageId, List<MailboxId> mailboxIds) throws MailboxException {
@@ -66,10 +65,7 @@ public class MessageIdProbe implements GuiceProbe {
 
     public List<AttachmentId> retrieveAttachmentIds(MessageId messageId, Username username) throws MailboxException {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
-        List<MessageResult> messages = messageIdManager.getMessages(
-            ImmutableList.of(messageId),
-            FetchGroup.FULL_CONTENT,
-            mailboxSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.FULL_CONTENT, mailboxSession);
 
         return messages.stream()
             .flatMap(Throwing.function(messageResult -> messageResult.getLoadedAttachments().stream()))
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ReferenceUpdater.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ReferenceUpdater.java
index bfc1c30..dca90fc 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ReferenceUpdater.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/ReferenceUpdater.java
@@ -93,7 +93,7 @@ public class ReferenceUpdater {
         List<MessageId> references = mailboxManager.search(searchByRFC822MessageId, session, limit);
         try {
             MessageId reference = Iterables.getOnlyElement(references);
-            List<MailboxId> mailboxIds = messageIdManager.getMessages(references, FetchGroup.MINIMAL, session).stream()
+            List<MailboxId> mailboxIds = messageIdManager.getMessage(reference, FetchGroup.MINIMAL, session).stream()
                 .map(MessageResult::getMailboxId)
                 .collect(Guavate.toImmutableList());
             messageIdManager.setFlags(flag, FlagsUpdateMode.ADD, reference, mailboxIds, session);
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
index 9edfb60..85e9068 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SendMDNProcessor.java
@@ -161,9 +161,7 @@ public class SendMDNProcessor implements SetMessagesProcessor {
     }
 
     private Message retrieveOriginalMessage(JmapMDN mdn, MailboxSession mailboxSession) throws MailboxException, IOException, MessageNotFoundException {
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(mdn.getMessageId()),
-            FetchGroup.HEADERS,
-            mailboxSession);
+        List<MessageResult> messages = messageIdManager.getMessage(mdn.getMessageId(), FetchGroup.HEADERS, mailboxSession);
 
         if (messages.size() == 0) {
             throw new MessageNotFoundException();
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
index 0633c0d..07816cb 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMessagesUpdateProcessor.java
@@ -127,7 +127,7 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
     private void update(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession,
                         SetMessagesResponse.Builder builder) {
         try {
-            List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, mailboxSession);
+            List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, mailboxSession);
             assertValidUpdate(messages, updateMessagePatch, mailboxSession);
 
             if (messages.isEmpty()) {
@@ -174,8 +174,7 @@ public class SetMessagesUpdateProcessor implements SetMessagesProcessor {
     private void sendMessageWhenOutboxInTargetMailboxIds(MessageId messageId, UpdateMessagePatch updateMessagePatch, MailboxSession mailboxSession, SetMessagesResponse.Builder builder) throws MailboxException, MessagingException, IOException {
         if (isTargetingOutbox(mailboxSession, listTargetMailboxIds(updateMessagePatch))) {
             Optional<MessageResult> maybeMessageToSend =
-                messageIdManager.getMessages(
-                    ImmutableList.of(messageId), FetchGroup.FULL_CONTENT, mailboxSession)
+                messageIdManager.getMessage(messageId, FetchGroup.FULL_CONTENT, mailboxSession)
                     .stream()
                     .findFirst();
             if (maybeMessageToSend.isPresent()) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
index a7ff93c..0d11502 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/PostDequeueDecorator.java
@@ -143,7 +143,7 @@ public class PostDequeueDecorator extends MailQueueItemDecorator {
 
     private void assertMessageBelongsToOutbox(MessageId messageId, MailboxSession mailboxSession) throws MailboxException, MailShouldBeInOutboxException {
         MailboxId outboxMailboxId = getOutboxMailboxId(mailboxSession);
-        List<MessageResult> messages = messageIdManager.getMessages(ImmutableList.of(messageId), FetchGroup.MINIMAL, mailboxSession);
+        List<MessageResult> messages = messageIdManager.getMessage(messageId, FetchGroup.MINIMAL, mailboxSession);
         for (MessageResult message: messages) {
             if (message.getMailboxId().equals(outboxMailboxId)) {
                 return;
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorTest.java
index 21555bf..1b4f256 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/PostDequeueDecoratorTest.java
@@ -271,12 +271,12 @@ public class PostDequeueDecoratorTest {
 
         ImmutableList<MessageResult> allMessages = ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), FetchGroup.MINIMAL, mailboxSession));
 
-        when(messageIdManager.getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroup.MINIMAL), any(MailboxSession.class))).thenReturn(allMessages);
+        when(messageIdManager.getMessage(eq(messageId.getMessageId()), eq(FetchGroup.MINIMAL), any(MailboxSession.class))).thenReturn(allMessages);
 
         testee.done(true);
         testee.done(true);
 
-        verify(messageIdManager, times(1)).getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroup.MINIMAL), any(MailboxSession.class));
+        verify(messageIdManager, times(1)).getMessage(eq(messageId.getMessageId()), eq(FetchGroup.MINIMAL), any(MailboxSession.class));
         verify(messageIdManager, times(1)).setInMailboxes(eq(messageId.getMessageId()), eq(ImmutableList.of(sentMailboxId)), any(MailboxSession.class));
         verify(messageIdManager, times(1)).setFlags(eq(new Flags(Flag.SEEN)), eq(MessageManager.FlagsUpdateMode.ADD), eq(messageId.getMessageId()), eq(ImmutableList.of(sentMailboxId)), any(MailboxSession.class));
 
@@ -297,7 +297,7 @@ public class PostDequeueDecoratorTest {
         mail.setAttribute(messageIdAttribute(messageId.getMessageId().serialize()));
         mail.setAttribute(USERNAME_ATTRIBUTE);
 
-        when(messageIdManager.getMessages(eq(ImmutableList.of(messageId.getMessageId())), eq(FetchGroup.MINIMAL), any(MailboxSession.class))).thenThrow(MailboxException.class);
+        when(messageIdManager.getMessage(eq(messageId.getMessageId()), eq(FetchGroup.MINIMAL), any(MailboxSession.class))).thenThrow(MailboxException.class);
 
         testee.done(true);
     }


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


[james-project] 15/27: PROTOCOLS-120 Simplify branching logic in IMAP command parsers

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 e624fcd016db8ae4a008e8be4830f093a8ddc957
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 9 10:24:21 2019 +0700

    PROTOCOLS-120 Simplify branching logic in IMAP command parsers
---
 .../imap/decode/base/AbstractImapCommandParser.java   | 13 ++++++-------
 .../james/imap/decode/main/DefaultImapDecoder.java    | 19 ++++++++-----------
 2 files changed, 14 insertions(+), 18 deletions(-)

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 46466f5..0e17dc2 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
@@ -64,13 +64,12 @@ public abstract class AbstractImapCommandParser implements ImapCommandParser {
     public final ImapMessage parse(ImapRequestLineReader request, Tag tag, ImapSession session) {
         if (!command.validForState(session.getState())) {
             return statusResponseFactory.taggedNo(tag, command, HumanReadableText.INVALID_COMMAND);
-        } else {
-            try {
-                return decode(command, request, tag, session);
-            } catch (DecodingException e) {
-                LOGGER.debug("Cannot parse protocol ", e);
-                return statusResponseFactory.taggedBad(tag, command, e.getKey());
-            }
+        }
+        try {
+            return decode(command, request, tag, session);
+        } catch (DecodingException e) {
+            LOGGER.debug("Cannot parse protocol ", e);
+            return statusResponseFactory.taggedBad(tag, command, e.getKey());
         }
     }
 
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 296a7c5..cce1b01 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
@@ -90,14 +90,12 @@ public class DefaultImapDecoder implements ImapDecoder {
             ImapMessage message = responseFactory.bye(HumanReadableText.BYE_UNKNOWN_COMMAND);
             session.logout();
             return message;
-        } else {
-            session.setAttribute(INVALID_COMMAND_COUNT, count);
-            if (tag == null) {
-                return responseFactory.untaggedBad(HumanReadableText.UNKNOWN_COMMAND);
-            } else {
-                return responseFactory.taggedBad(tag, null, HumanReadableText.UNKNOWN_COMMAND);
-            }
         }
+        session.setAttribute(INVALID_COMMAND_COUNT, count);
+        if (tag == null) {
+            return responseFactory.untaggedBad(HumanReadableText.UNKNOWN_COMMAND);
+        }
+        return responseFactory.taggedBad(tag, null, HumanReadableText.UNKNOWN_COMMAND);
     }
 
     private int retrieveUnknownCommandCount(ImapSession session) {
@@ -112,10 +110,9 @@ public class DefaultImapDecoder implements ImapDecoder {
         if (command == null) {
             LOGGER.info("Missing command implementation for commmand {}", commandName);
             return unknownCommand(tag, session);
-        } else {
-            ImapMessage message = command.parse(request, tag, session);
-            session.setAttribute(INVALID_COMMAND_COUNT, 0);
-            return message;
         }
+        ImapMessage message = command.parse(request, tag, session);
+        session.setAttribute(INVALID_COMMAND_COUNT, 0);
+        return message;
     }
 }


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


[james-project] 09/27: PROTOCOLS-120 Slightly improve AbstractImapCommandParser style

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

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

commit b0e0a758ac63d19a28e234535c218d59f82bca39
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 15:08:15 2019 +0700

    PROTOCOLS-120 Slightly improve AbstractImapCommandParser style
---
 .../james/imap/decode/base/AbstractImapCommandParser.java      | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

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 ac880d6..e4f62af 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
@@ -45,7 +45,6 @@ public abstract class AbstractImapCommandParser implements MessagingImapCommandP
     private StatusResponseFactory statusResponseFactory;
 
     public AbstractImapCommandParser(ImapCommand command) {
-        super();
         this.command = command;
     }
 
@@ -72,19 +71,16 @@ public abstract class AbstractImapCommandParser implements MessagingImapCommandP
      */
     @Override
     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);
+            return statusResponseFactory.taggedNo(tag, command, HumanReadableText.INVALID_COMMAND);
         } else {
             try {
-
-                result = decode(command, request, tag, session);
+                return decode(command, request, tag, session);
             } catch (DecodingException e) {
                 LOGGER.debug("Cannot parse protocol ", e);
-                result = statusResponseFactory.taggedBad(tag, command, e.getKey());
+                return statusResponseFactory.taggedBad(tag, command, e.getKey());
             }
         }
-        return result;
     }
 
     /**


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


[james-project] 18/27: PROTOCOLS-120 ImapSession is never used by IMAP encoders

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 7aac9362b16ba2393f243d0dd4c26dc136aefba6
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Dec 9 09:52:16 2019 +0700

    PROTOCOLS-120 ImapSession is never used by IMAP encoders
---
 .../james/imap/encode/ACLResponseEncoder.java      |  3 +-
 .../imap/encode/AnnotationResponseEncoder.java     | 11 ++---
 .../imap/encode/AuthenticateResponseEncoder.java   |  3 +-
 .../imap/encode/CapabilityResponseEncoder.java     |  3 +-
 .../imap/encode/ContinuationResponseEncoder.java   |  7 ++-
 .../james/imap/encode/ESearchResponseEncoder.java  |  3 +-
 .../james/imap/encode/EnableResponseEncoder.java   |  3 +-
 .../james/imap/encode/ExistsResponseEncoder.java   |  3 +-
 .../james/imap/encode/ExpungeResponseEncoder.java  |  3 +-
 .../james/imap/encode/FetchResponseEncoder.java    | 53 +++++++++++-----------
 .../james/imap/encode/FlagsResponseEncoder.java    |  3 +-
 .../org/apache/james/imap/encode/ImapEncoder.java  |  5 +-
 .../james/imap/encode/ImapResponseEncoder.java     |  5 +-
 .../james/imap/encode/LSubResponseEncoder.java     |  3 +-
 .../james/imap/encode/ListResponseEncoder.java     |  3 +-
 .../imap/encode/ListRightsResponseEncoder.java     |  3 +-
 .../imap/encode/MailboxStatusResponseEncoder.java  |  3 +-
 .../james/imap/encode/MyRightsResponseEncoder.java |  3 +-
 .../imap/encode/NamespaceResponseEncoder.java      |  3 +-
 .../james/imap/encode/QuotaResponseEncoder.java    |  3 +-
 .../imap/encode/QuotaRootResponseEncoder.java      |  3 +-
 .../james/imap/encode/RecentResponseEncoder.java   |  3 +-
 .../james/imap/encode/SearchResponseEncoder.java   |  3 +-
 .../james/imap/encode/StatusResponseEncoder.java   |  6 +--
 .../james/imap/encode/VanishedResponseEncoder.java |  3 +-
 .../james/imap/encode/XListResponseEncoder.java    |  3 +-
 .../james/imap/encode/base/EndImapEncoder.java     |  3 +-
 .../encode/main/DefaultImapEncoderFactory.java     |  7 ++-
 .../imap/main/AbstractImapRequestHandler.java      |  2 +-
 .../apache/james/imap/main/ResponseEncoder.java    |  8 +---
 .../imap/encode/AnnotationResponseEncoderTest.java | 15 ++----
 .../encode/FetchResponseEncoderEnvelopeTest.java   | 34 +++++++-------
 .../FetchResponseEncoderNoExtensionsTest.java      |  9 ++--
 .../imap/encode/FetchResponseEncoderTest.java      |  6 +--
 .../james/imap/encode/LSubResponseEncoderTest.java |  2 +-
 .../james/imap/encode/ListResponseEncoderTest.java |  2 +-
 .../encode/MailboxStatusResponseEncoderTest.java   |  2 +-
 .../imap/encode/NamespaceResponseEncoderTest.java  | 14 ++----
 .../imap/encode/QuotaResponseEncoderTest.java      |  4 +-
 .../imap/encode/QuotaRootResponseEncoderTest.java  |  2 +-
 .../imap/encode/SearchResponseEncoderTest.java     |  2 +-
 .../imap/encode/XListResponseEncoderTest.java      |  3 +-
 .../netty/ImapChannelUpstreamHandler.java          |  2 +-
 43 files changed, 109 insertions(+), 155 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
index 9cbb8c4..2b4fba0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.ACLResponse;
 import org.apache.james.mailbox.model.MailboxACL.EntryKey;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
@@ -34,7 +33,7 @@ import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
  */
 public class ACLResponseEncoder implements ImapResponseEncoder<ACLResponse> {
     @Override
-    public void encode(ACLResponse aclResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(ACLResponse aclResponse, ImapResponseComposer composer) throws IOException {
         Map<EntryKey, Rfc4314Rights> entries = aclResponse.getAcl().getEntries();
         composer.untagged();
         composer.commandName(ImapConstants.ACL_RESPONSE_NAME);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/AnnotationResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/AnnotationResponseEncoder.java
index 21429f2..336db1e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/AnnotationResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/AnnotationResponseEncoder.java
@@ -24,7 +24,6 @@ import java.util.List;
 import java.util.Optional;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.AnnotationResponse;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.slf4j.Logger;
@@ -39,27 +38,27 @@ public class AnnotationResponseEncoder implements ImapResponseEncoder<Annotation
     }
 
     @Override
-    public void encode(AnnotationResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(AnnotationResponse response, ImapResponseComposer composer) throws IOException {
         composer.untagged();
         composer.commandName(ImapConstants.ANNOTATION_RESPONSE_NAME);
 
         composer.quote(Optional.ofNullable(response.getMailboxName()).orElse(""));
-        composeAnnotations(composer, session, response.getMailboxAnnotations());
+        composeAnnotations(composer, response.getMailboxAnnotations());
 
         composer.end();
     }
 
-    private void composeAnnotations(ImapResponseComposer composer, ImapSession session, List<MailboxAnnotation> annotations) throws IOException {
+    private void composeAnnotations(ImapResponseComposer composer, List<MailboxAnnotation> annotations) throws IOException {
         if (!annotations.isEmpty()) {
             composer.openParen();
             for (MailboxAnnotation annotation : annotations) {
-                composeAnnotation(composer, session, annotation);
+                composeAnnotation(composer, annotation);
             }
             composer.closeParen();
         }
     }
 
-    private void composeAnnotation(ImapResponseComposer composer, ImapSession session, MailboxAnnotation annotation) throws IOException {
+    private void composeAnnotation(ImapResponseComposer composer, MailboxAnnotation annotation) throws IOException {
         if (annotation.isNil()) {
             LOGGER.warn("There is nil data of key {} on store: ", annotation.getKey().asString());
         } else {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java
index bbb6c46..13f9511 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/AuthenticateResponseEncoder.java
@@ -20,7 +20,6 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.AuthenticateResponse;
 
 public class AuthenticateResponseEncoder implements ImapResponseEncoder<AuthenticateResponse> {
@@ -30,7 +29,7 @@ public class AuthenticateResponseEncoder implements ImapResponseEncoder<Authenti
     }
 
     @Override
-    public void encode(AuthenticateResponse message, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(AuthenticateResponse message, ImapResponseComposer composer) throws IOException {
         composer.continuationResponse("");
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java
index 685d283..caabae1 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/CapabilityResponseEncoder.java
@@ -23,7 +23,6 @@ import java.util.Iterator;
 
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.message.Capability;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.CapabilityResponse;
 
 /**
@@ -38,7 +37,7 @@ public class CapabilityResponseEncoder implements ImapResponseEncoder<Capability
     }
 
     @Override
-    public void encode(CapabilityResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(CapabilityResponse response, ImapResponseComposer composer) throws IOException {
         Iterator<Capability> capabilities = response.getCapabilities().iterator();
         composer.untagged();
         composer.message(ImapConstants.CAPABILITY_COMMAND_NAME);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java
index 9620c00..0fdbb2b 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ContinuationResponseEncoder.java
@@ -25,7 +25,6 @@ import java.util.ArrayList;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.display.Locales;
 import org.apache.james.imap.api.display.Localizer;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.ContinuationResponse;
 
 public class ContinuationResponseEncoder implements ImapResponseEncoder<ContinuationResponse> {
@@ -42,12 +41,12 @@ public class ContinuationResponseEncoder implements ImapResponseEncoder<Continua
     }
 
     @Override
-    public void encode(ContinuationResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
-        String message = response.getData() != null ? response.getData() : asString(response.getTextKey(), session);
+    public void encode(ContinuationResponse response, ImapResponseComposer composer) throws IOException {
+        String message = response.getData() != null ? response.getData() : asString(response.getTextKey());
         composer.continuationResponse(message);
     }
 
-    private String asString(HumanReadableText text, ImapSession session) {
+    private String asString(HumanReadableText text) {
         // TODO: calculate locales
         return localizer.localize(text, new Locales(new ArrayList<>(), null));
     }
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 289e659..5cb255a 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
@@ -25,7 +25,6 @@ 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;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.ESearchResponse;
 import org.apache.james.mailbox.ModSeq;
 
@@ -39,7 +38,7 @@ public class ESearchResponseEncoder implements ImapResponseEncoder<ESearchRespon
     }
 
     @Override
-    public void encode(ESearchResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(ESearchResponse response, ImapResponseComposer composer) throws IOException {
         Tag tag = response.getTag();
         long min = response.getMinUid();
         long max = response.getMaxUid();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java
index 0cdd72f..7b5e86a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/EnableResponseEncoder.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.util.Set;
 
 import org.apache.james.imap.api.message.Capability;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.EnableResponse;
 
 /**
@@ -35,7 +34,7 @@ public class EnableResponseEncoder implements ImapResponseEncoder<EnableResponse
     }
 
     @Override
-    public void encode(EnableResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(EnableResponse response, ImapResponseComposer composer) throws IOException {
         Set<Capability> capabilities = response.getCapabilities();
         composer.untagged();
         // Return ENABLED capabilities. See IMAP-323
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java
index 6263ab5..bcfcdfd 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ExistsResponseEncoder.java
@@ -21,7 +21,6 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.ExistsResponse;
 
 public class ExistsResponseEncoder implements ImapResponseEncoder<ExistsResponse> {
@@ -33,7 +32,7 @@ public class ExistsResponseEncoder implements ImapResponseEncoder<ExistsResponse
     }
 
     @Override
-    public void encode(ExistsResponse existsResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(ExistsResponse existsResponse, ImapResponseComposer composer) throws IOException {
         long numberOfMessages = existsResponse.getNumberOfMessages();
         
         composer.untagged().message(numberOfMessages).message(EXISTS).end();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java
index 25ad3f5..992ee56 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ExpungeResponseEncoder.java
@@ -21,7 +21,6 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.ExpungeResponse;
 
 public class ExpungeResponseEncoder implements ImapResponseEncoder<ExpungeResponse> {
@@ -33,7 +32,7 @@ public class ExpungeResponseEncoder implements ImapResponseEncoder<ExpungeRespon
     }
 
     @Override
-    public void encode(ExpungeResponse expungeResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(ExpungeResponse expungeResponse, ImapResponseComposer composer) throws IOException {
         int messageSequenceNumber = expungeResponse.getMessageSequenceNumber();
         composer.untagged().message(messageSequenceNumber).message(EXPUNGE).end();
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
index 6bc11be..8cc21ce 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/FetchResponseEncoder.java
@@ -31,7 +31,6 @@ import java.util.TreeSet;
 import javax.mail.Flags;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.FetchResponse;
 import org.apache.james.imap.message.response.FetchResponse.Structure;
 import org.apache.james.mailbox.MessageUid;
@@ -63,7 +62,7 @@ public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse>
     }
 
     @Override
-    public void encode(FetchResponse fetchResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(FetchResponse fetchResponse, ImapResponseComposer composer) throws IOException {
         long messageNumber = fetchResponse.getMessageNumber();
 
         composer.untagged().message(messageNumber).message(ImapConstants.FETCH_COMMAND_NAME).openParen();
@@ -74,8 +73,8 @@ public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse>
         encodeInternalDate(composer, fetchResponse);
         encodeSize(composer, fetchResponse);
         encodeEnvelope(composer, fetchResponse);
-        encodeBody(composer, fetchResponse.getBody(), session);
-        encodeBodyStructure(composer, fetchResponse.getBodyStructure(), session);
+        encodeBody(composer, fetchResponse.getBody());
+        encodeBodyStructure(composer, fetchResponse.getBodyStructure());
         encodeUid(composer, fetchResponse);
         encodeBodyElements(composer, fetchResponse.getElements());
 
@@ -95,21 +94,21 @@ public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse>
     }
 
     
-    private void encodeBody(ImapResponseComposer composer, Structure body, ImapSession session) throws IOException {
+    private void encodeBody(ImapResponseComposer composer, Structure body) throws IOException {
         if (body != null) {
             composer.message(ImapConstants.FETCH_BODY);
-            encodeStructure(composer, body, false, false, session);
+            encodeStructure(composer, body, false, false);
         }
     }
 
-    private void encodeBodyStructure(ImapResponseComposer composer, Structure bodyStructure, ImapSession session) throws IOException {
+    private void encodeBodyStructure(ImapResponseComposer composer, Structure bodyStructure) throws IOException {
         if (bodyStructure != null) {
             composer.message(ImapConstants.FETCH_BODY_STRUCTURE);
-            encodeStructure(composer, bodyStructure, true, false, session);
+            encodeStructure(composer, bodyStructure, true, false);
         }
     }
 
-    private void encodeStructure(ImapResponseComposer composer, Structure structure, boolean includeExtensions, boolean isInnerPart, ImapSession session) throws IOException {
+    private void encodeStructure(ImapResponseComposer composer, Structure structure, boolean includeExtensions, boolean isInnerPart) throws IOException {
 
         final String mediaType;
         final String subType;
@@ -121,10 +120,10 @@ public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse>
             mediaType = rawMediaType;
             subType = structure.getSubType();
         }
-        encodeStructure(composer, structure, includeExtensions, mediaType, subType, isInnerPart, session);
+        encodeStructure(composer, structure, includeExtensions, mediaType, subType, isInnerPart);
     }
 
-    private void encodeStructure(ImapResponseComposer composer, Structure structure, boolean includeExtensions, String mediaType, String subType, boolean isInnerPart, ImapSession session) throws IOException {
+    private void encodeStructure(ImapResponseComposer composer, Structure structure, boolean includeExtensions, String mediaType, String subType, boolean isInnerPart) throws IOException {
         //
         // Workaround for broken clients
         // See IMAP-91
@@ -135,19 +134,19 @@ public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse>
         }
         if (ImapConstants.MIME_TYPE_MULTIPART.equalsIgnoreCase(mediaType)) {
 
-            encodeMultipart(composer, structure, subType, includeOptionalExtensions, session);
+            encodeMultipart(composer, structure, subType, includeOptionalExtensions);
 
         } else {
             if (ImapConstants.MIME_TYPE_MESSAGE.equalsIgnoreCase(mediaType) && ImapConstants.MIME_SUBTYPE_RFC822.equalsIgnoreCase(subType)) {
 
-                encodeRfc822Message(composer, structure, mediaType, subType, includeOptionalExtensions, session);
+                encodeRfc822Message(composer, structure, mediaType, subType, includeOptionalExtensions);
             } else {
-                encodeBasic(composer, structure, includeOptionalExtensions, mediaType, subType, session);
+                encodeBasic(composer, structure, includeOptionalExtensions, mediaType, subType);
             }
         }
     }
 
-    private void encodeBasic(ImapResponseComposer composer, Structure structure, boolean includeExtensions, String mediaType, String subType, ImapSession session) throws IOException {
+    private void encodeBasic(ImapResponseComposer composer, Structure structure, boolean includeExtensions, String mediaType, String subType) throws IOException {
         if (ImapConstants.MIME_TYPE_TEXT.equalsIgnoreCase(mediaType)) {
 
             final long lines = structure.getLines();
@@ -158,22 +157,22 @@ public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse>
             encodeBodyFields(composer, structure, mediaType, subType);
         }
         if (includeExtensions) {
-            encodeOnePartBodyExtensions(composer, structure, session);
+            encodeOnePartBodyExtensions(composer, structure);
         }
         composer.closeParen();
     }
 
-    private void encodeOnePartBodyExtensions(ImapResponseComposer composer, Structure structure, ImapSession session) throws IOException {
+    private void encodeOnePartBodyExtensions(ImapResponseComposer composer, Structure structure) throws IOException {
         final String md5 = structure.getMD5();
         final List<String> languages = structure.getLanguages();
         final String location = structure.getLocation();
         nillableQuote(composer, md5);
-        bodyFldDsp(structure, composer, session);
+        bodyFldDsp(structure, composer);
         nillableQuotes(composer, languages);
         nillableQuote(composer, location);
     }
 
-    private ImapResponseComposer bodyFldDsp(Structure structure, ImapResponseComposer composer, ImapSession session) throws IOException {
+    private ImapResponseComposer bodyFldDsp(Structure structure, ImapResponseComposer composer) throws IOException {
         final String disposition = structure.getDisposition();
         if (disposition == null) {
             composer.nil();
@@ -181,13 +180,13 @@ public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse>
             composer.openParen();
             composer.quote(disposition);
             final Map<String, String> params = structure.getDispositionParams();
-            bodyFldParam(params, composer, session);
+            bodyFldParam(params, composer);
             composer.closeParen();
         }
         return composer;
     }
 
-    private void bodyFldParam(Map<String, String> params, ImapResponseComposer composer, ImapSession session) throws IOException {
+    private void bodyFldParam(Map<String, String> params, ImapResponseComposer composer) throws IOException {
         if (params == null || params.isEmpty()) {
             composer.nil();
         } else {
@@ -221,37 +220,37 @@ public class FetchResponseEncoder implements ImapResponseEncoder<FetchResponse>
         composer.quoteUpperCaseAscii(encoding).message(octets);
     }
 
-    private void encodeMultipart(ImapResponseComposer composer, Structure structure, String subType, boolean includeExtensions, ImapSession session) throws IOException {
+    private void encodeMultipart(ImapResponseComposer composer, Structure structure, String subType, boolean includeExtensions) throws IOException {
         composer.openParen();
 
         for (Iterator<Structure> it = structure.parts(); it.hasNext();) {
             final Structure part = it.next();
-            encodeStructure(composer, part, includeExtensions, true, session);
+            encodeStructure(composer, part, includeExtensions, true);
         }
 
         composer.quoteUpperCaseAscii(subType);
         if (includeExtensions) {
             final List<String> languages = structure.getLanguages();
             nillableQuotes(composer, structure.getParameters());
-            bodyFldDsp(structure, composer, session);
+            bodyFldDsp(structure, composer);
             nillableQuotes(composer, languages);
             nillableQuote(composer, structure.getLocation());
         }
         composer.closeParen();
     }
 
-    private void encodeRfc822Message(ImapResponseComposer composer, Structure structure, String mediaType, String subType, boolean includeExtensions, ImapSession session) throws IOException {
+    private void encodeRfc822Message(ImapResponseComposer composer, Structure structure, String mediaType, String subType, boolean includeExtensions) throws IOException {
         final long lines = structure.getLines();
         final FetchResponse.Envelope envelope = structure.getEnvelope();
         final FetchResponse.Structure embeddedStructure = structure.getBody();
 
         encodeBodyFields(composer, structure, mediaType, subType);
         encodeEnvelope(composer, envelope, false);
-        encodeStructure(composer, embeddedStructure, includeExtensions, false, session);
+        encodeStructure(composer, embeddedStructure, includeExtensions, false);
         composer.message(lines);
 
         if (includeExtensions) {
-            encodeOnePartBodyExtensions(composer, structure, session);
+            encodeOnePartBodyExtensions(composer, structure);
         }
         composer.closeParen();
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java
index 548f3ec..d00baa1 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/FlagsResponseEncoder.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 
 import javax.mail.Flags;
 
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.FlagsResponse;
 
 public class FlagsResponseEncoder implements ImapResponseEncoder<FlagsResponse> {
@@ -33,7 +32,7 @@ public class FlagsResponseEncoder implements ImapResponseEncoder<FlagsResponse>
     }
 
     @Override
-    public void encode(FlagsResponse flagsResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(FlagsResponse flagsResponse, ImapResponseComposer composer) throws IOException {
         Flags flags = flagsResponse.getFlags();
         composer.untagged().flags(flags).end();
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapEncoder.java
index e11260f..226dfa8 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapEncoder.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapMessage;
-import org.apache.james.imap.api.process.ImapSession;
 
 /**
  * TODO: correct this API
@@ -36,10 +35,8 @@ public interface ImapEncoder {
      *            <code>ImapMessage</code>, not null
      * @param composer
      *            <code>ImapResponseComposer</code>, not null
-     * @param session
-     *            TODO
      * @throws IOException
      *             when message encoding fails
      */
-    void encode(ImapMessage message, ImapResponseComposer composer, ImapSession session) throws IOException;
+    void encode(ImapMessage message, ImapResponseComposer composer) throws IOException;
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
index dc7c0ed..422a0c0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ImapResponseEncoder.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapMessage;
-import org.apache.james.imap.api.process.ImapSession;
 
 public interface ImapResponseEncoder<T extends ImapMessage> {
     Class<T> acceptableMessages();
@@ -34,10 +33,8 @@ public interface ImapResponseEncoder<T extends ImapMessage> {
      *            <code>ImapMessage</code>, not null
      * @param composer
      *            <code>ImapResponseComposer</code>, not null
-     * @param session
-     *            TODO
      * @throws IOException
      *             when message encoding fails
      */
-    void encode(T message, ImapResponseComposer composer, ImapSession session) throws IOException;
+    void encode(T message, ImapResponseComposer composer) throws IOException;
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java
index 315ef46..4624d25 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/LSubResponseEncoder.java
@@ -21,7 +21,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.LSubResponse;
 
 /**
@@ -34,7 +33,7 @@ public class LSubResponseEncoder implements ImapResponseEncoder<LSubResponse> {
     }
 
     @Override
-    public void encode(LSubResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(LSubResponse response, ImapResponseComposer composer) throws IOException {
         ListingEncodingUtils.encodeListingResponse(ImapConstants.LSUB_RESPONSE_NAME, composer, response);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java
index ba8df0f..a146bca 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ListResponseEncoder.java
@@ -21,7 +21,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.ListResponse;
 
 /**
@@ -34,7 +33,7 @@ public class ListResponseEncoder implements ImapResponseEncoder<ListResponse> {
     }
 
     @Override
-    public void encode(ListResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(ListResponse response, ImapResponseComposer composer) throws IOException {
         ListingEncodingUtils.encodeListingResponse(ImapConstants.LIST_RESPONSE_NAME, composer, response);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java
index 86428cc..5af2bd4 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/ListRightsResponseEncoder.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.ListRightsResponse;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 
@@ -36,7 +35,7 @@ public class ListRightsResponseEncoder implements ImapResponseEncoder<ListRights
     }
 
     @Override
-    public void encode(ListRightsResponse listRightsResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(ListRightsResponse listRightsResponse, ImapResponseComposer composer) throws IOException {
         composer.untagged();
         composer.commandName(ImapConstants.LISTRIGHTS_RESPONSE_NAME);
         
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
index b507434..68aee4d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/MailboxStatusResponseEncoder.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.MailboxStatusResponse;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.ModSeq;
@@ -37,7 +36,7 @@ public class MailboxStatusResponseEncoder implements ImapConstants, ImapResponse
     }
 
     @Override
-    public void encode(MailboxStatusResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(MailboxStatusResponse response, ImapResponseComposer composer) throws IOException {
         Long messages = response.getMessages();
         Long recent = response.getRecent();
         MessageUid uidNext = response.getUidNext();
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java
index e5f619c..17be615 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/MyRightsResponseEncoder.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.MyRightsResponse;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 
@@ -36,7 +35,7 @@ public class MyRightsResponseEncoder implements ImapResponseEncoder<MyRightsResp
     }
 
     @Override
-    public void encode(MyRightsResponse aclResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(MyRightsResponse aclResponse, ImapResponseComposer composer) throws IOException {
         Rfc4314Rights myRights = aclResponse.getMyRights();
         composer.untagged();
         composer.commandName(ImapConstants.MYRIGHTS_RESPONSE_NAME);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java
index 3eee9cc..67f9cbb 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/NamespaceResponseEncoder.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.NamespaceResponse;
 import org.apache.james.imap.message.response.NamespaceResponse.Namespace;
 
@@ -36,7 +35,7 @@ public class NamespaceResponseEncoder implements ImapResponseEncoder<NamespaceRe
     }
 
     @Override
-    public void encode(NamespaceResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(NamespaceResponse response, ImapResponseComposer composer) throws IOException {
         composer.untagged();
         composer.commandName(ImapConstants.NAMESPACE_COMMAND_NAME);
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
index 9764e54..6ee7093 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaResponseEncoder.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.util.Locale;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.QuotaResponse;
 import org.apache.james.mailbox.model.Quota;
 
@@ -37,7 +36,7 @@ public class QuotaResponseEncoder implements ImapResponseEncoder<QuotaResponse>
     }
 
     @Override
-    public void encode(QuotaResponse quotaResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(QuotaResponse quotaResponse, ImapResponseComposer composer) throws IOException {
         String quotaRoot = quotaResponse.getQuotaRoot();
         Quota<?, ?> quota = quotaResponse.getQuota();
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java
index b13505f..1cb3a27 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/QuotaRootResponseEncoder.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.QuotaRootResponse;
 
 /**
@@ -35,7 +34,7 @@ public class QuotaRootResponseEncoder implements ImapResponseEncoder<QuotaRootRe
     }
 
     @Override
-    public void encode(QuotaRootResponse quotaRootResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(QuotaRootResponse quotaRootResponse, ImapResponseComposer composer) throws IOException {
         String quotaRoot = quotaRootResponse.getQuotaRoot();
         String mailbox = quotaRootResponse.getMailboxName();
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java
index be8df6f..ea7c6c6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/RecentResponseEncoder.java
@@ -21,7 +21,6 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.RecentResponse;
 
 public class RecentResponseEncoder implements ImapResponseEncoder<RecentResponse> {
@@ -33,7 +32,7 @@ public class RecentResponseEncoder implements ImapResponseEncoder<RecentResponse
     }
 
     @Override
-    public void encode(RecentResponse recentResponse, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(RecentResponse recentResponse, ImapResponseComposer composer) throws IOException {
         int numberFlaggedRecent = recentResponse.getNumberFlaggedRecent();
         composer.untagged().message(numberFlaggedRecent).message(RECENT).end();
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
index b91f3c3..daef20f 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/SearchResponseEncoder.java
@@ -21,7 +21,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.SearchResponse;
 import org.apache.james.mailbox.ModSeq;
 
@@ -35,7 +34,7 @@ public class SearchResponseEncoder implements ImapResponseEncoder<SearchResponse
     }
 
     @Override
-    public void encode(SearchResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(SearchResponse response, ImapResponseComposer composer) throws IOException {
         final long[] ids = response.getIds();
         ModSeq highestModSeq = response.getHighestModSeq();
         composer.untagged();
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 e811e5b..9c920b2 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
@@ -47,7 +47,7 @@ public class StatusResponseEncoder implements ImapResponseEncoder<ImmutableStatu
     }
 
     @Override
-    public void encode(ImmutableStatusResponse response, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(ImmutableStatusResponse response, ImapResponseComposer composer) throws IOException {
         final Type serverResponseType = response.getServerResponseType();
         final String type = asString(serverResponseType);
         final ResponseCode responseCode = response.getResponseCode();
@@ -55,7 +55,7 @@ public class StatusResponseEncoder implements ImapResponseEncoder<ImmutableStatu
         final Tag tag = response.getTag();
         final ImapCommand command = response.getCommand();
         final HumanReadableText textKey = response.getTextKey();
-        final String text = asString(textKey, session);
+        final String text = asString(textKey);
         final Collection<String> parameters;
         final long number;
         final boolean useParens;
@@ -104,7 +104,7 @@ public class StatusResponseEncoder implements ImapResponseEncoder<ImmutableStatu
         composer.end();
     }
 
-    private String asString(HumanReadableText text, ImapSession session) {
+    private String asString(HumanReadableText text) {
         // TODO: calculate locales
         return localizer.localize(text, new Locales(new ArrayList<>(), null));
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java
index d17ba5b..fb9aac5 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/VanishedResponseEncoder.java
@@ -20,7 +20,6 @@ package org.apache.james.imap.encode;
 
 import java.io.IOException;
 
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.VanishedResponse;
 
 public class VanishedResponseEncoder implements ImapResponseEncoder<VanishedResponse> {
@@ -30,7 +29,7 @@ public class VanishedResponseEncoder implements ImapResponseEncoder<VanishedResp
     }
 
     @Override
-    public void encode(VanishedResponse message, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(VanishedResponse message, ImapResponseComposer composer) throws IOException {
         composer.untagged();
         composer.message("VANISHED");
         if (message.isEarlier()) {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
index d24a9cf..93879da 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/XListResponseEncoder.java
@@ -21,7 +21,6 @@ package org.apache.james.imap.encode;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.XListResponse;
 
 public class XListResponseEncoder implements ImapResponseEncoder<XListResponse> {
@@ -31,7 +30,7 @@ public class XListResponseEncoder implements ImapResponseEncoder<XListResponse>
     }
 
     @Override
-    public void encode(XListResponse message, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(XListResponse message, ImapResponseComposer composer) throws IOException {
         ListingEncodingUtils.encodeListingResponse(ImapConstants.XLIST_RESPONSE_NAME, composer, message);
     }
 }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/base/EndImapEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/base/EndImapEncoder.java
index ad9892d..3a86589 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/base/EndImapEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/base/EndImapEncoder.java
@@ -22,7 +22,6 @@ package org.apache.james.imap.encode.base;
 import java.io.IOException;
 
 import org.apache.james.imap.api.ImapMessage;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.ImapEncoder;
 import org.apache.james.imap.encode.ImapResponseComposer;
 import org.slf4j.Logger;
@@ -37,7 +36,7 @@ public class EndImapEncoder implements ImapEncoder {
     private static final Logger LOGGER = LoggerFactory.getLogger(EndImapEncoder.class);
 
     @Override
-    public void encode(ImapMessage message, ImapResponseComposer composer, ImapSession session) throws IOException {
+    public void encode(ImapMessage message, ImapResponseComposer composer) throws IOException {
         LOGGER.warn("Unknown message {}", message);
         LOGGER.debug("Chain end reached for {}", message);
         composer.untaggedNoResponse("Unknown message in pipeline", null);
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
index 1050ff7..bdeb461 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
@@ -27,7 +27,6 @@ import java.util.stream.Stream;
 
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.display.Localizer;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.ACLResponseEncoder;
 import org.apache.james.imap.encode.AnnotationResponseEncoder;
 import org.apache.james.imap.encode.AuthenticateResponseEncoder;
@@ -78,13 +77,13 @@ public class DefaultImapEncoderFactory implements ImapEncoderFactory {
         }
 
         @Override
-        public void encode(ImapMessage message, ImapResponseComposer composer, ImapSession session) throws IOException {
+        public void encode(ImapMessage message, ImapResponseComposer composer) throws IOException {
             ImapResponseEncoder imapResponseEncoder = encoders.get(message.getClass());
 
             if (imapResponseEncoder != null) {
-                imapResponseEncoder.encode(message, composer, session);
+                imapResponseEncoder.encode(message, composer);
             } else {
-                endImapEncoder.encode(message, composer, session);
+                endImapEncoder.encode(message, composer);
             }
         }
     }
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java b/protocols/imap/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java
index 23cebdb..0bc421d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/main/AbstractImapRequestHandler.java
@@ -53,7 +53,7 @@ public abstract class AbstractImapRequestHandler {
 
     protected boolean doProcessRequest(ImapRequestLineReader request, ImapResponseComposer response, ImapSession session) {
         ImapMessage message = decoder.decode(request, session);
-        final ResponseEncoder responseEncoder = new ResponseEncoder(encoder, response, session);
+        final ResponseEncoder responseEncoder = new ResponseEncoder(encoder, response);
         processor.process(message, responseEncoder, session);
 
         final boolean result;
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/main/ResponseEncoder.java b/protocols/imap/src/main/java/org/apache/james/imap/main/ResponseEncoder.java
index f7e0d42..7e74dd2 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/main/ResponseEncoder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/main/ResponseEncoder.java
@@ -23,28 +23,24 @@ import java.io.IOException;
 
 import org.apache.james.imap.api.message.response.ImapResponseMessage;
 import org.apache.james.imap.api.process.ImapProcessor.Responder;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.ImapEncoder;
 import org.apache.james.imap.encode.ImapResponseComposer;
 
 public class ResponseEncoder implements Responder {
     private final ImapEncoder encoder;
-    private final ImapSession session;
     private final ImapResponseComposer composer;
 
     private IOException failure;
 
-    public ResponseEncoder(ImapEncoder encoder, ImapResponseComposer composer, ImapSession session) {
-        super();
+    public ResponseEncoder(ImapEncoder encoder, ImapResponseComposer composer) {
         this.encoder = encoder;
         this.composer = composer;
-        this.session = session;
     }
 
     @Override
     public void respond(ImapResponseMessage message) {
         try {
-            encoder.encode(message, composer, session);
+            encoder.encode(message, composer);
         } catch (IOException failure) {
             this.failure = failure;
         }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
index c04074e..040a195 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/AnnotationResponseEncoderTest.java
@@ -20,9 +20,7 @@
 package org.apache.james.imap.encode;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
 
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.encode.base.ByteImapResponseWriter;
 import org.apache.james.imap.encode.base.ImapResponseComposerImpl;
 import org.apache.james.imap.message.response.AnnotationResponse;
@@ -43,14 +41,11 @@ public class AnnotationResponseEncoderTest {
     private ByteImapResponseWriter byteImapResponseWriter;
     private ImapResponseComposer composer;
     private AnnotationResponseEncoder encoder;
-    private ImapSession imapSession;
 
     @Before
     public void setUp() throws Exception {
         byteImapResponseWriter = new ByteImapResponseWriter();
 
-        imapSession = mock(ImapSession.class);
-
         composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
         encoder = new AnnotationResponseEncoder();
     }
@@ -59,7 +54,7 @@ public class AnnotationResponseEncoderTest {
     public void encodingShouldWellFormEmptyRequest() throws Exception {
         AnnotationResponse response = new AnnotationResponse(null, ImmutableList.of());
 
-        encoder.encode(response, composer, imapSession);
+        encoder.encode(response, composer);
 
         assertThat(byteImapResponseWriter.getString()).isEqualTo("* METADATA \"\"\r\n");
     }
@@ -68,7 +63,7 @@ public class AnnotationResponseEncoderTest {
     public void encodingShouldWellFormWhenEmptyReturnedAnnotation() throws Exception {
         AnnotationResponse response = new AnnotationResponse("INBOX", ImmutableList.of());
 
-        encoder.encode(response, composer, imapSession);
+        encoder.encode(response, composer);
 
         assertThat(byteImapResponseWriter.getString()).isEqualTo("* METADATA \"INBOX\"\r\n");
     }
@@ -77,7 +72,7 @@ public class AnnotationResponseEncoderTest {
     public void encodingShouldWellFormWhenOnlyOneReturnedAnnotation() throws Exception {
         AnnotationResponse response = new AnnotationResponse("INBOX", ImmutableList.of(PRIVATE_ANNOTATION));
 
-        encoder.encode(response, composer, imapSession);
+        encoder.encode(response, composer);
 
         assertThat(byteImapResponseWriter.getString()).isEqualTo("* METADATA \"INBOX\" (/private/comment \"My own comment\")\r\n");
     }
@@ -85,7 +80,7 @@ public class AnnotationResponseEncoderTest {
     @Test
     public void encodingShouldWellFormWhenManyReturnedAnnotations() throws Exception {
         AnnotationResponse response = new AnnotationResponse("INBOX", ImmutableList.of(PRIVATE_ANNOTATION, SHARED_ANNOTATION));
-        encoder.encode(response, composer, imapSession);
+        encoder.encode(response, composer);
 
         assertThat(byteImapResponseWriter.getString()).isEqualTo("* METADATA \"INBOX\" (/private/comment \"My own comment\" /shared/comment \"Shared comment\")\r\n");
     }
@@ -94,7 +89,7 @@ public class AnnotationResponseEncoderTest {
     public void encodingShouldWellFormWhenNilReturnedAnnotation() throws Exception {
         AnnotationResponse response = new AnnotationResponse("INBOX", ImmutableList.of(MailboxAnnotation.nil(PRIVATE_KEY)));
 
-        encoder.encode(response, composer, imapSession);
+        encoder.encode(response, composer);
 
         assertThat(byteImapResponseWriter.getString()).isEqualTo("* METADATA \"INBOX\" ()\r\n");
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java
index f48a61b..340b8ce 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderEnvelopeTest.java
@@ -140,7 +140,7 @@ public class FetchResponseEncoderEnvelopeTest {
     @Test
     public void testShouldNilAllNullProperties() throws Exception {
         envelopExpects();
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL))\r\n");
     }
@@ -151,7 +151,7 @@ public class FetchResponseEncoderEnvelopeTest {
         envelopExpects();
         
         
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (\"a date\" NIL NIL NIL NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -161,7 +161,7 @@ public class FetchResponseEncoderEnvelopeTest {
         subject = "some subject";
         envelopExpects();
         
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL \"some subject\" NIL NIL NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -171,7 +171,7 @@ public class FetchResponseEncoderEnvelopeTest {
         inReplyTo = "some reply to";
         envelopExpects();
        
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL \"some reply to\" NIL))\r\n");
     }
 
@@ -180,7 +180,7 @@ public class FetchResponseEncoderEnvelopeTest {
         messageId = "some message id";
         envelopExpects();
         
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL NIL NIL \"some message id\"))\r\n");
 
     }
@@ -189,7 +189,7 @@ public class FetchResponseEncoderEnvelopeTest {
     public void testShouldComposeOneFromAddress() throws Exception {
         from = mockOneAddress();
         envelopExpects();
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -199,7 +199,7 @@ public class FetchResponseEncoderEnvelopeTest {
         from = mockManyAddresses();
         envelopExpects();
         
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -209,7 +209,7 @@ public class FetchResponseEncoderEnvelopeTest {
         sender = mockOneAddress();
         envelopExpects();
      
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -219,7 +219,7 @@ public class FetchResponseEncoderEnvelopeTest {
         sender = mockManyAddresses();
         envelopExpects();
      
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -230,7 +230,7 @@ public class FetchResponseEncoderEnvelopeTest {
         replyTo = mockOneAddress();
         envelopExpects();
        
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -240,7 +240,7 @@ public class FetchResponseEncoderEnvelopeTest {
         replyTo = mockManyAddresses();
         envelopExpects();
        
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL NIL NIL))\r\n");
 
     }
@@ -250,7 +250,7 @@ public class FetchResponseEncoderEnvelopeTest {
         to = mockOneAddress();
         envelopExpects();
        
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL NIL))\r\n");
 
     }
@@ -260,7 +260,7 @@ public class FetchResponseEncoderEnvelopeTest {
         to = mockManyAddresses();
         envelopExpects();
        
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL NIL))\r\n");
 
     }
@@ -270,7 +270,7 @@ public class FetchResponseEncoderEnvelopeTest {
         cc = mockOneAddress();
         envelopExpects();
 
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL NIL))\r\n");
 
     }
@@ -280,7 +280,7 @@ public class FetchResponseEncoderEnvelopeTest {
         cc = mockManyAddresses();
         envelopExpects();
        
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL NIL))\r\n");
 
     }
@@ -290,7 +290,7 @@ public class FetchResponseEncoderEnvelopeTest {
         bcc = mockOneAddress();
         envelopExpects();
        
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")) NIL NIL))\r\n");
 
     }
@@ -300,7 +300,7 @@ public class FetchResponseEncoderEnvelopeTest {
         bcc = mockManyAddresses();
         envelopExpects();
        
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (ENVELOPE (NIL NIL NIL NIL NIL NIL NIL ((\"NAME\" \"DOMAIN LIST\" \"MAILBOX\" \"HOST\")(\"2NAME\" \"2DOMAIN LIST\" \"2MAILBOX\" \"2HOST\")) NIL NIL))\r\n");
 
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java
index 1d687f4..a805a9c 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderNoExtensionsTest.java
@@ -57,7 +57,7 @@ public class FetchResponseEncoderNoExtensionsTest {
     public void testShouldEncodeFlagsResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, flags, null, null, null, null,
                 null, null, null, null);
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted))\r\n");
     }
 
@@ -65,7 +65,7 @@ public class FetchResponseEncoderNoExtensionsTest {
     public void testShouldEncodeUidResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, null, MessageUid.of(72), null,
                 null, null, null, null, null, null);
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (UID 72)\r\n");
 
     }
@@ -74,7 +74,7 @@ public class FetchResponseEncoderNoExtensionsTest {
     public void testShouldEncodeAllResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, flags, MessageUid.of(72), null,
                 null, null, null, null, null, null);
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted) UID 72)\r\n");
 
     }
@@ -98,8 +98,7 @@ public class FetchResponseEncoderNoExtensionsTest {
         when(stubStructure.getId()).thenReturn("");
         when(stubStructure.getDescription()).thenReturn("");
 
-        final FakeImapSession fakeImapSession = new FakeImapSession();
-        encoder.encode(message, composer, fakeImapSession);
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted) BODYSTRUCTURE (\"TEXT\" \"HTML\" (\"CHARSET\" \"US-ASCII\") \"\" \"\" \"7BIT\" 2279 48) UID 72)\r\n");
 
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java
index 4d867db..3a56fb6 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/FetchResponseEncoderTest.java
@@ -51,7 +51,7 @@ public class FetchResponseEncoderTest  {
     public void testShouldEncodeFlagsResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, flags, null, null, null, null,
                 null, null, null, null);
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted))\r\n");
 
 
@@ -61,7 +61,7 @@ public class FetchResponseEncoderTest  {
     public void testShouldEncodeUidResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, null, MessageUid.of(72), null,
                 null, null, null, null, null, null); 
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (UID 72)\r\n");
 
 
@@ -71,7 +71,7 @@ public class FetchResponseEncoderTest  {
     public void testShouldEncodeAllResponse() throws Exception {
         FetchResponse message = new FetchResponse(100, flags, MessageUid.of(72), null,
                 null, null, null, null, null, null);
-        encoder.encode(message, composer, new FakeImapSession());
+        encoder.encode(message, composer);
         assertThat(writer.getString()).isEqualTo("* 100 FETCH (FLAGS (\\Deleted) UID 72)\r\n");
         
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java
index 97ecead..080065d 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/LSubResponseEncoderTest.java
@@ -45,7 +45,7 @@ public class LSubResponseEncoderTest  {
 
     @Test
     public void encoderShouldIncludeLSUBCommand() throws Exception {
-        encoder.encode(new LSubResponse("name", true, '.'), composer, new FakeImapSession());
+        encoder.encode(new LSubResponse("name", true, '.'), composer);
         assertThat(writer.getString()).startsWith("* LSUB");
     }
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java
index 57e621b..a5f06f5 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/ListResponseEncoderTest.java
@@ -45,7 +45,7 @@ public class ListResponseEncoderTest {
 
     @Test
     public void encoderShouldIncludeListCommand() throws Exception {
-        encoder.encode(new ListResponse(MailboxMetaData.Children.HAS_CHILDREN, MailboxMetaData.Selectability.NONE, "name", '.'), composer, new FakeImapSession());
+        encoder.encode(new ListResponse(MailboxMetaData.Children.HAS_CHILDREN, MailboxMetaData.Selectability.NONE, "name", '.'), composer);
         assertThat(writer.getString()).startsWith("* LIST");
     }
 }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java
index af6d0cb..facc364 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/MailboxStatusResponseEncoderTest.java
@@ -55,7 +55,7 @@ public class MailboxStatusResponseEncoderTest  {
         final String mailbox = "A mailbox named desire";
 
         encoder.encode(new MailboxStatusResponse(messages, recent, uidNext,
-                null, uidValidity, unseen, mailbox), composer, new FakeImapSession());
+                null, uidValidity, unseen, mailbox), composer);
         assertThat(writer.getString()).isEqualTo("* STATUS \"A mailbox named desire\" (MESSAGES 2 RECENT 3 UIDNEXT 5 UIDVALIDITY 7 UNSEEN 11)\r\n");
     }
 }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java
index 6a79a05..87281f9 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/NamespaceResponseEncoderTest.java
@@ -26,7 +26,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapConstants;
-import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.message.response.NamespaceResponse;
 import org.junit.Before;
 import org.junit.Test;
@@ -34,13 +33,11 @@ import org.mockito.InOrder;
 import org.mockito.Mockito;
 
 public class NamespaceResponseEncoderTest {
-    ImapSession dummySession;
     ImapResponseComposer mockComposer;
     NamespaceResponseEncoder subject;
 
     @Before
     public void setUp() throws Exception {
-        dummySession = new FakeImapSession();
         subject = new NamespaceResponseEncoder();
         mockComposer = mock(ImapResponseComposer.class);
     }
@@ -55,7 +52,7 @@ public class NamespaceResponseEncoderTest {
         namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
                 .charAt(0)));
         subject.encode(new NamespaceResponse(null, null, namespaces),
-                mockComposer, dummySession);
+                mockComposer);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
         inOrder.verify(mockComposer, times(1)).untagged();
@@ -78,7 +75,7 @@ public class NamespaceResponseEncoderTest {
         namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
                 .charAt(0)));
         subject.encode(new NamespaceResponse(null, namespaces, null),
-                mockComposer, dummySession);
+                mockComposer);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
         inOrder.verify(mockComposer, times(1)).untagged();
@@ -102,7 +99,7 @@ public class NamespaceResponseEncoderTest {
         namespaces.add(new NamespaceResponse.Namespace(aPrefix, aDeliminator
                 .charAt(0)));
         subject.encode(new NamespaceResponse(namespaces, null, null),
-                mockComposer, dummySession);
+                mockComposer);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
         inOrder.verify(mockComposer, times(1)).untagged();
@@ -129,7 +126,7 @@ public class NamespaceResponseEncoderTest {
         namespaces.add(new NamespaceResponse.Namespace(anotherPrefix,
                 anotherDeliminator.charAt(0)));
         subject.encode(new NamespaceResponse(namespaces, null, null),
-                mockComposer, dummySession);
+                mockComposer);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
         inOrder.verify(mockComposer, times(1)).untagged();
@@ -149,8 +146,7 @@ public class NamespaceResponseEncoderTest {
     @Test
     public void testAllNullShouldWriteAllNIL() throws Exception {
 
-        subject.encode(new NamespaceResponse(null, null, null), mockComposer,
-                dummySession);
+        subject.encode(new NamespaceResponse(null, null, null), mockComposer);
 
         InOrder inOrder = Mockito.inOrder(mockComposer);
         inOrder.verify(mockComposer, times(1)).untagged();
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
index a946324..f50ac8e 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaResponseEncoderTest.java
@@ -43,7 +43,7 @@ public class QuotaResponseEncoderTest {
         ByteImapResponseWriter byteImapResponseWriter = new ByteImapResponseWriter();
         ImapResponseComposer composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
         QuotaResponseEncoder encoder = new QuotaResponseEncoder();
-        encoder.encode(response, composer, null);
+        encoder.encode(response, composer);
         String responseString = byteImapResponseWriter.getString();
         assertThat(responseString).isEqualTo("* QUOTA root (MESSAGE 231 1024)\r\n");
     }
@@ -55,7 +55,7 @@ public class QuotaResponseEncoderTest {
         ByteImapResponseWriter byteImapResponseWriter = new ByteImapResponseWriter();
         ImapResponseComposer composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
         QuotaResponseEncoder encoder = new QuotaResponseEncoder();
-        encoder.encode(response, composer, null);
+        encoder.encode(response, composer);
         String responseString = byteImapResponseWriter.getString();
         assertThat(responseString).isEqualTo("* QUOTA root (STORAGE 231 1024)\r\n");
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java
index a95d0a0..ae0970a 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/QuotaRootResponseEncoderTest.java
@@ -37,7 +37,7 @@ public class QuotaRootResponseEncoderTest {
         ByteImapResponseWriter byteImapResponseWriter = new ByteImapResponseWriter();
         ImapResponseComposer composer = new ImapResponseComposerImpl(byteImapResponseWriter, 1024);
         QuotaRootResponseEncoder encoder = new QuotaRootResponseEncoder();
-        encoder.encode(response, composer, null);
+        encoder.encode(response, composer);
         String responseString = byteImapResponseWriter.getString();
         assertThat(responseString).isEqualTo("* QUOTAROOT \"INBOX\" root\r\n");
     }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java
index baa0b07..6e80378 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/SearchResponseEncoderTest.java
@@ -49,7 +49,7 @@ public class SearchResponseEncoderTest {
 
     @Test
     public void testEncode() throws Exception {
-        encoder.encode(response, composer, new FakeImapSession());
+        encoder.encode(response, composer);
         assertThat(writer.getString()).isEqualTo("* SEARCH 1 4 9 16\r\n");
     }
 }
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java b/protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java
index 43d5dd3..2defd7d 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/encode/XListResponseEncoderTest.java
@@ -55,8 +55,7 @@ public class XListResponseEncoderTest {
                 "name",
                 '.',
                 MailboxType.INBOX),
-            composer,
-            new FakeImapSession());
+            composer);
         assertThat(writer.getString()).startsWith("* XLIST");
     }
 }
diff --git a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java
index 0eeb2ec..8f475c9 100644
--- a/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java
+++ b/server/protocols/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapChannelUpstreamHandler.java
@@ -192,7 +192,7 @@ public class ImapChannelUpstreamHandler extends SimpleChannelUpstreamHandler imp
                     cp.addBefore(NettyConstants.CORE_HANDLER, NettyConstants.HEARTBEAT_HANDLER, heartbeatHandler);
 
                 }
-                final ResponseEncoder responseEncoder = new ResponseEncoder(encoder, response, session);
+                final ResponseEncoder responseEncoder = new ResponseEncoder(encoder, response);
                 processor.process(message, responseEncoder, session);
 
                 if (session.getState() == ImapSessionState.LOGOUT) {


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


[james-project] 12/27: PROTOCOLS-120 parserFactory field should be final in UidCommandParser

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 c2cb64331d09a5ee043e323426e9c41b1fead893
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 15:27:45 2019 +0700

    PROTOCOLS-120 parserFactory field should be final in UidCommandParser
    
    Additional bonus: we can get rid of some reflection!
---
 .../imap/decode/DelegatingImapCommandParser.java   | 27 ----------------------
 .../imap/decode/parser/ImapParserFactory.java      |  8 +------
 .../james/imap/decode/parser/UidCommandParser.java | 18 ++++-----------
 3 files changed, 5 insertions(+), 48 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/DelegatingImapCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/DelegatingImapCommandParser.java
deleted file mode 100644
index 9c8b1fb..0000000
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/DelegatingImapCommandParser.java
+++ /dev/null
@@ -1,27 +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.imap.decode;
-
-public interface DelegatingImapCommandParser {
-
-    ImapCommandParserFactory getParserFactory();
-
-    void setParserFactory(ImapCommandParserFactory imapCommandFactory);
-
-}
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
index f4ca8fd..3d2be5e 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
@@ -25,7 +25,6 @@ import java.util.Map;
 
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
-import org.apache.james.imap.decode.DelegatingImapCommandParser;
 import org.apache.james.imap.decode.ImapCommandParser;
 import org.apache.james.imap.decode.ImapCommandParserFactory;
 import org.apache.james.imap.decode.MessagingImapCommandParser;
@@ -90,7 +89,7 @@ public class ImapParserFactory implements ImapCommandParserFactory {
         imapCommands.put(ImapConstants.SEARCH_COMMAND_NAME, new SearchCommandParser());
         imapCommands.put(ImapConstants.FETCH_COMMAND_NAME, new FetchCommandParser());
         imapCommands.put(ImapConstants.STORE_COMMAND_NAME, new StoreCommandParser());
-        imapCommands.put(ImapConstants.UID_COMMAND_NAME, new UidCommandParser());
+        imapCommands.put(ImapConstants.UID_COMMAND_NAME, new UidCommandParser(this));
         imapCommands.put(ImapConstants.IDLE_COMMAND_NAME, new IdleCommandParser());
         imapCommands.put(ImapConstants.STARTTLS, new StartTLSCommandParser());
 
@@ -127,14 +126,9 @@ public class ImapParserFactory implements ImapCommandParserFactory {
     }
 
     private void initialiseParser(ImapCommandParser cmd) {
-        if (cmd instanceof DelegatingImapCommandParser) {
-            ((DelegatingImapCommandParser) cmd).setParserFactory(this);
-        }
-
         if (cmd instanceof MessagingImapCommandParser) {
             final MessagingImapCommandParser messagingImapCommandParser = (MessagingImapCommandParser) cmd;
             messagingImapCommandParser.setStatusResponseFactory(statusResponseFactory);
         }
     }
-
 }
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 0ae7885..2c1e0ef 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
@@ -25,7 +25,6 @@ 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;
-import org.apache.james.imap.decode.DelegatingImapCommandParser;
 import org.apache.james.imap.decode.ImapCommandParser;
 import org.apache.james.imap.decode.ImapCommandParserFactory;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -36,23 +35,14 @@ import org.slf4j.LoggerFactory;
 /**
  * Parse UID commands
  */
-public class UidCommandParser extends AbstractImapCommandParser implements DelegatingImapCommandParser {
+public class UidCommandParser extends AbstractImapCommandParser {
     private static final Logger LOGGER = LoggerFactory.getLogger(UidCommandParser.class);
 
-    private ImapCommandParserFactory parserFactory;
+    private final ImapCommandParserFactory parserFactory;
 
-    public UidCommandParser() {
+    public UidCommandParser(ImapCommandParserFactory parserFactory) {
         super(ImapCommand.selectedStateCommand(ImapConstants.UID_COMMAND_NAME));
-    }
-
-    @Override
-    public ImapCommandParserFactory getParserFactory() {
-        return parserFactory;
-    }
-
-    @Override
-    public void setParserFactory(ImapCommandParserFactory imapCommandFactory) {
-        this.parserFactory = imapCommandFactory;
+        this.parserFactory = parserFactory;
     }
 
     @Override


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


[james-project] 10/27: PROTOCOLS-120 Slightly improve DefaultImapDecoder style

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

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

commit c8a0ebf57373ca5549086d74845ef48557cbb708
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 15:13:08 2019 +0700

    PROTOCOLS-120 Slightly improve DefaultImapDecoder style
    
     - Avoid variable re-allocation
     - Extract retrieveUnknownCommandCount method
---
 .../james/imap/decode/main/DefaultImapDecoder.java | 52 ++++++++++------------
 1 file changed, 24 insertions(+), 28 deletions(-)

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 05d7192..296a7c5 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
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.imap.decode.main;
 
+import java.util.Optional;
+
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.Tag;
@@ -47,7 +49,7 @@ public class DefaultImapDecoder implements ImapDecoder {
     private final int maxInvalidCommands;
 
     private static final String INVALID_COMMAND_COUNT = "INVALID_COMMAND_COUNT";
-    public static final int DEFAULT_MAX_INVALID_COMMANDS = 9;
+    private static final int DEFAULT_MAX_INVALID_COMMANDS = 9;
 
     public DefaultImapDecoder(StatusResponseFactory responseFactory, ImapCommandParserFactory imapCommands) {
         this(responseFactory, imapCommands, DEFAULT_MAX_INVALID_COMMANDS);
@@ -61,65 +63,59 @@ public class DefaultImapDecoder implements ImapDecoder {
 
     @Override
     public ImapMessage decode(ImapRequestLineReader request, ImapSession session) {
-        ImapMessage message;
         try {
-            final Tag tag = request.tag();
-            message = decodeCommandTagged(request, tag, session);
+            Tag tag = request.tag();
+            return decodeCommandTagged(request, tag, session);
         } catch (DecodingException e) {
             LOGGER.debug("Cannot parse tag", e);
-            message = unknownCommand(null, session);
+            return unknownCommand(null, session);
         }
-        return message;
     }
 
     private ImapMessage decodeCommandTagged(ImapRequestLineReader request, Tag tag, ImapSession session) {
-        ImapMessage message;
         LOGGER.debug("Got <tag>: {}", tag);
         try {
-            final String commandName = request.atom();
-            message = decodeCommandNamed(request, tag, commandName, session);
+            String commandName = request.atom();
+            return decodeCommandNamed(request, tag, commandName, session);
         } catch (DecodingException e) {
             LOGGER.debug("Error during initial request parsing", e);
-            message = unknownCommand(tag, session);
+            return unknownCommand(tag, session);
         }
-        return message;
     }
 
     private ImapMessage unknownCommand(Tag tag, ImapSession session) {
-        ImapMessage message;
-        Object c = session.getAttribute(INVALID_COMMAND_COUNT);
-        int count = 0;
-        if (c != null) {
-            count = (Integer) c;
-        }
-        count++;
+        int count = retrieveUnknownCommandCount(session) + 1;
+
         if (count > maxInvalidCommands || session.getState() == ImapSessionState.NON_AUTHENTICATED) {
-            message = responseFactory.bye(HumanReadableText.BYE_UNKNOWN_COMMAND);
+            ImapMessage message = responseFactory.bye(HumanReadableText.BYE_UNKNOWN_COMMAND);
             session.logout();
+            return message;
         } else {
             session.setAttribute(INVALID_COMMAND_COUNT, count);
             if (tag == null) {
-                message = responseFactory.untaggedBad(HumanReadableText.UNKNOWN_COMMAND);
+                return responseFactory.untaggedBad(HumanReadableText.UNKNOWN_COMMAND);
             } else {
-                message = responseFactory.taggedBad(tag, null, HumanReadableText.UNKNOWN_COMMAND);
+                return responseFactory.taggedBad(tag, null, HumanReadableText.UNKNOWN_COMMAND);
             }
-
         }
+    }
 
-        return message;
+    private int retrieveUnknownCommandCount(ImapSession session) {
+        return Optional.ofNullable(session.getAttribute(INVALID_COMMAND_COUNT))
+            .map(Integer.class::cast)
+            .orElse(0);
     }
 
     private ImapMessage decodeCommandNamed(ImapRequestLineReader request, Tag tag, String commandName, ImapSession session) {
-        ImapMessage message;
         LOGGER.debug("Got <command>: {}", commandName);
-        final ImapCommandParser command = imapCommands.getParser(commandName);
+        ImapCommandParser command = imapCommands.getParser(commandName);
         if (command == null) {
             LOGGER.info("Missing command implementation for commmand {}", commandName);
-            message = unknownCommand(tag, session);
+            return unknownCommand(tag, session);
         } else {
-            message = command.parse(request, tag, session);
+            ImapMessage message = command.parse(request, tag, session);
             session.setAttribute(INVALID_COMMAND_COUNT, 0);
+            return message;
         }
-        return message;
     }
 }


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


[james-project] 13/27: PROTOCOLS-120 StatusResponseFactory should be immutable in parsers

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 a1df5a2d1ac16ba6a10ed26406543835f9b4ef4f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Dec 6 15:39:58 2019 +0700

    PROTOCOLS-120 StatusResponseFactory should be immutable in parsers
---
 .../imap/decode/MessagingImapCommandParser.java    |  28 ------
 .../decode/base/AbstractImapCommandParser.java     |  19 +---
 .../parser/AbstractMessageRangeCommandParser.java  |   5 +-
 .../parser/AbstractSelectionCommandParser.java     |   5 +-
 .../decode/parser/AbstractUidCommandParser.java    |   5 +-
 .../imap/decode/parser/AppendCommandParser.java    |   5 +-
 .../decode/parser/AuthenticateCommandParser.java   |   5 +-
 .../decode/parser/CapabilityCommandParser.java     |   5 +-
 .../imap/decode/parser/CheckCommandParser.java     |   5 +-
 .../imap/decode/parser/CloseCommandParser.java     |   5 +-
 .../imap/decode/parser/CompressCommandParser.java  |   5 +-
 .../imap/decode/parser/CopyCommandParser.java      |   5 +-
 .../imap/decode/parser/CreateCommandParser.java    |   5 +-
 .../imap/decode/parser/DeleteACLCommandParser.java |   5 +-
 .../imap/decode/parser/DeleteCommandParser.java    |   5 +-
 .../imap/decode/parser/EnableCommandParser.java    |   5 +-
 .../imap/decode/parser/ExamineCommandParser.java   |   5 +-
 .../imap/decode/parser/ExpungeCommandParser.java   |   5 +-
 .../imap/decode/parser/FetchCommandParser.java     |   5 +-
 .../imap/decode/parser/GetACLCommandParser.java    |   5 +-
 .../decode/parser/GetAnnotationCommandParser.java  |   5 +-
 .../imap/decode/parser/GetQuotaCommandParser.java  |   5 +-
 .../decode/parser/GetQuotaRootCommandParser.java   |   5 +-
 .../imap/decode/parser/IdleCommandParser.java      |   5 +-
 .../imap/decode/parser/ImapParserFactory.java      | 106 +++++++++------------
 .../imap/decode/parser/ListCommandParser.java      |   9 +-
 .../decode/parser/ListRightsCommandParser.java     |   5 +-
 .../imap/decode/parser/LoginCommandParser.java     |   5 +-
 .../imap/decode/parser/LogoutCommandParser.java    |   5 +-
 .../imap/decode/parser/LsubCommandParser.java      |   5 +-
 .../imap/decode/parser/MoveCommandParser.java      |   5 +-
 .../imap/decode/parser/MyRightsCommandParser.java  |   5 +-
 .../imap/decode/parser/NamespaceCommandParser.java |   5 +-
 .../imap/decode/parser/NoopCommandParser.java      |   5 +-
 .../imap/decode/parser/RenameCommandParser.java    |   5 +-
 .../imap/decode/parser/SearchCommandParser.java    |   7 +-
 .../imap/decode/parser/SelectCommandParser.java    |   8 +-
 .../imap/decode/parser/SetACLCommandParser.java    |   5 +-
 .../decode/parser/SetAnnotationCommandParser.java  |   5 +-
 .../imap/decode/parser/SetQuotaCommandParser.java  |   5 +-
 .../imap/decode/parser/StartTLSCommandParser.java  |   5 +-
 .../imap/decode/parser/StatusCommandParser.java    |   5 +-
 .../imap/decode/parser/StoreCommandParser.java     |   5 +-
 .../imap/decode/parser/SubscribeCommandParser.java |   5 +-
 .../james/imap/decode/parser/UidCommandParser.java |   5 +-
 .../imap/decode/parser/UnselectCommandParser.java  |   5 +-
 .../decode/parser/UnsubscribeCommandParser.java    |   5 +-
 .../imap/decode/parser/XListCommandParser.java     |   5 +-
 .../james/imap/decode/parser/CopyParserTest.java   |   4 +-
 .../decode/parser/CreateCommandParserTest.java     |   4 +-
 .../parser/FetchCommandParserPartialFetchTest.java |   3 +-
 .../parser/GetAnnotationCommandParserTest.java     |   4 +-
 .../imap/decode/parser/GetQuotaParserTest.java     |   4 +-
 .../imap/decode/parser/GetQuotaRootParserTest.java |   6 +-
 .../james/imap/decode/parser/MoveParserTest.java   |   4 +-
 .../SearchCommandParserAndParenthesesTest.java     |   5 +-
 .../parser/SearchCommandParserCharsetTest.java     |   6 +-
 .../decode/parser/SearchCommandParserNotTest.java  |   4 +-
 .../decode/parser/SearchCommandParserOrTest.java   |   4 +-
 .../SearchCommandParserQuotedCharsetTest.java      |   6 +-
 ...earchCommandParserSearchKeySequenceSetTest.java |   4 +-
 .../parser/SearchCommandParserSearchKeyTest.java   |   4 +-
 .../parser/SearchCommandParserTopLevelAndTest.java |   4 +-
 .../parser/SetAnnotationCommandParserTest.java     |   4 +-
 .../decode/parser/SetQuotaCommandParserTest.java   |   4 +-
 .../imap/decode/parser/StoreCommandParserTest.java |   3 +-
 66 files changed, 237 insertions(+), 227 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/MessagingImapCommandParser.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/MessagingImapCommandParser.java
deleted file mode 100644
index 5040ad2..0000000
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/MessagingImapCommandParser.java
+++ /dev/null
@@ -1,28 +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.imap.decode;
-
-import org.apache.james.imap.api.message.response.StatusResponseFactory;
-
-public interface MessagingImapCommandParser extends ImapCommandParser {
-
-    StatusResponseFactory getStatusResponseFactory();
-
-    void setStatusResponseFactory(StatusResponseFactory statusResponseFactory);
-}
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 e4f62af..46466f5 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
@@ -26,8 +26,8 @@ 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;
 import org.apache.james.imap.decode.DecodingException;
+import org.apache.james.imap.decode.ImapCommandParser;
 import org.apache.james.imap.decode.ImapRequestLineReader;
-import org.apache.james.imap.decode.MessagingImapCommandParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,32 +36,23 @@ import org.slf4j.LoggerFactory;
  * <strong>Note:</strong>
  * </p>
  */
-public abstract class AbstractImapCommandParser implements MessagingImapCommandParser {
+public abstract class AbstractImapCommandParser implements ImapCommandParser {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AbstractImapCommandParser.class);
 
     private final ImapCommand command;
 
-    private StatusResponseFactory statusResponseFactory;
+    protected final StatusResponseFactory statusResponseFactory;
 
-    public AbstractImapCommandParser(ImapCommand command) {
+    public AbstractImapCommandParser(ImapCommand command, StatusResponseFactory statusResponseFactory) {
         this.command = command;
+        this.statusResponseFactory = statusResponseFactory;
     }
 
     public ImapCommand getCommand() {
         return command;
     }
 
-    @Override
-    public final StatusResponseFactory getStatusResponseFactory() {
-        return statusResponseFactory;
-    }
-
-    @Override
-    public final void setStatusResponseFactory(StatusResponseFactory statusResponseFactory) {
-        this.statusResponseFactory = statusResponseFactory;
-    }
-
     /**
      * Parses a request into a command message for later processing.
      * 
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 1a364c0..8d44469 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
@@ -23,6 +23,7 @@ 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.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -30,8 +31,8 @@ import org.apache.james.imap.message.request.AbstractMessageRangeRequest;
 
 public abstract class AbstractMessageRangeCommandParser extends AbstractUidCommandParser {
 
-    public AbstractMessageRangeCommandParser(ImapCommand command) {
-        super(command);
+    public AbstractMessageRangeCommandParser(ImapCommand command, StatusResponseFactory statusResponseFactory) {
+        super(command, statusResponseFactory);
     }
 
     @Override
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 4224e5a..5ec332a 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
@@ -25,6 +25,7 @@ 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;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -37,8 +38,8 @@ public abstract class AbstractSelectionCommandParser extends AbstractImapCommand
     private static final byte[] CONDSTORE = ImapConstants.SUPPORTS_CONDSTORE.asString().getBytes();
     private static final byte[] QRESYNC = ImapConstants.SUPPORTS_QRESYNC.asString().getBytes();
 
-    public AbstractSelectionCommandParser(ImapCommand command) {
-        super(command);
+    public AbstractSelectionCommandParser(ImapCommand command, StatusResponseFactory statusResponseFactory) {
+        super(command, statusResponseFactory);
     }
     
     @Override
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 82d94a6..c496f00 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
@@ -22,6 +22,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.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -29,8 +30,8 @@ import org.apache.james.imap.decode.base.AbstractImapCommandParser;
 
 abstract class AbstractUidCommandParser extends AbstractImapCommandParser {
 
-    public AbstractUidCommandParser(ImapCommand command) {
-        super(command);
+    public AbstractUidCommandParser(ImapCommand command, StatusResponseFactory statusResponseFactory) {
+        super(command, statusResponseFactory);
     }
 
     @Override
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 2fbfc63..bbf8ffc 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
@@ -28,6 +28,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -39,8 +40,8 @@ import org.apache.james.imap.message.request.AppendRequest;
  */
 public class AppendCommandParser extends AbstractImapCommandParser {
 
-    public AppendCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.APPEND_COMMAND_NAME));
+    public AppendCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.APPEND_COMMAND_NAME), statusResponseFactory);
     }
 
     /**
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 0f79b95..3985c75 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.IRAuthenticateRequest;
  */
 public class AuthenticateCommandParser extends AbstractImapCommandParser {
 
-    public AuthenticateCommandParser() {
-        super(ImapCommand.nonAuthenticatedStateCommand(ImapConstants.AUTHENTICATE_COMMAND_NAME));
+    public AuthenticateCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.nonAuthenticatedStateCommand(ImapConstants.AUTHENTICATE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 0dc4e3f..1e0d820 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.CapabilityRequest;
  */
 public class CapabilityCommandParser extends AbstractImapCommandParser {
 
-    public CapabilityCommandParser() {
-        super(ImapCommand.anyStateCommand(ImapConstants.CAPABILITY_COMMAND_NAME));
+    public CapabilityCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.anyStateCommand(ImapConstants.CAPABILITY_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 6cd6238..81b8b44 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.CheckRequest;
  */
 public class CheckCommandParser extends AbstractImapCommandParser {
 
-    public CheckCommandParser() {
-        super(ImapCommand.selectedStateCommand(ImapConstants.CHECK_COMMAND_NAME));
+    public CheckCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.CHECK_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 b5bd60c..3246a53 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.CloseRequest;
  */
 class CloseCommandParser extends AbstractImapCommandParser {
 
-    public CloseCommandParser() {
-        super(ImapCommand.selectedStateCommand(ImapConstants.CLOSE_COMMAND_NAME));
+    public CloseCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.CLOSE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 9809182..b7d66fe 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -30,8 +31,8 @@ import org.apache.james.imap.message.request.CompressRequest;
 
 public class CompressCommandParser extends AbstractImapCommandParser {
 
-    public CompressCommandParser() {
-        super(ImapCommand.anyStateCommand(ImapConstants.COMPRESS_COMMAND_NAME));
+    public CompressCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.anyStateCommand(ImapConstants.COMPRESS_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 9431a07..c84e0a8 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
@@ -22,6 +22,7 @@ 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.response.StatusResponseFactory;
 import org.apache.james.imap.message.request.CopyRequest;
 
 /**
@@ -29,8 +30,8 @@ import org.apache.james.imap.message.request.CopyRequest;
  */
 public class CopyCommandParser extends AbstractMessageRangeCommandParser {
 
-    public CopyCommandParser() {
-        super(ImapCommand.selectedStateCommand(ImapConstants.COPY_COMMAND_NAME));
+    public CopyCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.COPY_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 350f65f..894fc81 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
@@ -23,6 +23,7 @@ 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.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,8 +39,8 @@ import com.google.common.base.Strings;
  */
 public class CreateCommandParser extends AbstractImapCommandParser {
 
-    public CreateCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.CREATE_COMMAND_NAME));
+    public CreateCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.CREATE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 9d4497d..f7d16d1 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.DeleteACLRequest;
  */
 public class DeleteACLCommandParser extends AbstractImapCommandParser {
 
-    public DeleteACLCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.DELETEACL_COMMAND_NAME));
+    public DeleteACLCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.DELETEACL_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 3adac5f..6fc1a64 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.DeleteRequest;
  */
 public class DeleteCommandParser extends AbstractImapCommandParser {
 
-    public DeleteCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.DELETE_COMMAND_NAME));
+    public DeleteCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.DELETE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 256713a..555a0b7 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
@@ -26,6 +26,7 @@ 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.Capability;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.EnableRequest;
 
 public class EnableCommandParser extends AbstractImapCommandParser {
     
-    public EnableCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.ENABLE_COMMAND_NAME));
+    public EnableCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.ENABLE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 233b488..7bd0809 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
@@ -23,6 +23,7 @@ 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.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.message.request.AbstractMailboxSelectionRequest;
 import org.apache.james.imap.message.request.ExamineRequest;
 
@@ -31,8 +32,8 @@ import org.apache.james.imap.message.request.ExamineRequest;
  */
 public class ExamineCommandParser extends AbstractSelectionCommandParser {
 
-    public ExamineCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.EXAMINE_COMMAND_NAME));
+    public ExamineCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.EXAMINE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 a506e35..3d7f70d 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
@@ -23,6 +23,7 @@ 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.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.ExpungeRequest;
  */
 public class ExpungeCommandParser extends AbstractUidCommandParser {
 
-    public ExpungeCommandParser() {
-        super(ImapCommand.selectedStateCommand(ImapConstants.EXPUNGE_COMMAND_NAME));
+    public ExpungeCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.EXPUNGE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 d0573e3..4d5b616 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
@@ -38,6 +38,7 @@ import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.SectionType;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.FetchPartPathDecoder;
@@ -52,8 +53,8 @@ public class FetchCommandParser extends AbstractUidCommandParser {
     private static final byte[] CHANGEDSINCE = "CHANGEDSINCE".getBytes();
     private static final byte[] VANISHED = "VANISHED".getBytes();
 
-    public FetchCommandParser() {
-        super(ImapCommand.selectedStateCommand(ImapConstants.FETCH_COMMAND_NAME));
+    public FetchCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.FETCH_COMMAND_NAME), statusResponseFactory);
     }
 
     /**
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 b84777e..cc698c0 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.GetACLRequest;
  */
 public class GetACLCommandParser extends AbstractImapCommandParser {
 
-    public GetACLCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.GETACL_COMMAND_NAME));
+    public GetACLCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.GETACL_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 2e462d5..afda91d 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
@@ -26,6 +26,7 @@ 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.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -44,8 +45,8 @@ public class GetAnnotationCommandParser extends AbstractImapCommandParser {
     private static final String DEPTH = "DEPTH";
     private static final boolean STOP_ON_PAREN = true;
 
-    public GetAnnotationCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.GETANNOTATION_COMMAND_NAME));
+    public GetAnnotationCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.GETANNOTATION_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 8a240bb..a7717e7 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.GetQuotaRequest;
  * GETQUOTA command parser
  */
 public class GetQuotaCommandParser extends AbstractImapCommandParser {
-    public GetQuotaCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.GETQUOTA_COMMAND_NAME));
+    public GetQuotaCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.GETQUOTA_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 64d3a99..2f4d276 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.GetQuotaRootRequest;
  */
 public class GetQuotaRootCommandParser extends AbstractImapCommandParser {
 
-    public GetQuotaRootCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.GETQUOTAROOT_COMMAND_NAME));
+    public GetQuotaRootCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.GETQUOTAROOT_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 4171059..1b6835f 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.IdleRequest;
  */
 public class IdleCommandParser extends AbstractImapCommandParser {
 
-    public IdleCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.IDLE_COMMAND_NAME));
+    public IdleCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.IDLE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
index 3d2be5e..0d02fc0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
@@ -27,7 +27,6 @@ import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.ImapCommandParser;
 import org.apache.james.imap.decode.ImapCommandParserFactory;
-import org.apache.james.imap.decode.MessagingImapCommandParser;
 
 /**
  * A factory for ImapCommand instances, provided based on the command name.
@@ -36,99 +35,82 @@ import org.apache.james.imap.decode.MessagingImapCommandParser;
 public class ImapParserFactory implements ImapCommandParserFactory {
     private final Map<String, ImapCommandParser> imapCommands;
 
-    private final StatusResponseFactory statusResponseFactory;
-
     public ImapParserFactory(StatusResponseFactory statusResponseFactory) {
-        this.statusResponseFactory = statusResponseFactory;
         imapCommands = new HashMap<>();
 
         // Commands valid in any state
         // CAPABILITY, NOOP, and LOGOUT
-        imapCommands.put(ImapConstants.CAPABILITY_COMMAND_NAME, new CapabilityCommandParser());
-        imapCommands.put(ImapConstants.NOOP_COMMAND_NAME, new NoopCommandParser());
-        imapCommands.put(ImapConstants.LOGOUT_COMMAND_NAME, new LogoutCommandParser());
+        imapCommands.put(ImapConstants.CAPABILITY_COMMAND_NAME, new CapabilityCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.NOOP_COMMAND_NAME, new NoopCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.LOGOUT_COMMAND_NAME, new LogoutCommandParser(statusResponseFactory));
 
         // Commands valid in NON_AUTHENTICATED state.
         // AUTHENTICATE and LOGIN
-        imapCommands.put(ImapConstants.AUTHENTICATE_COMMAND_NAME, new AuthenticateCommandParser());
-        imapCommands.put(ImapConstants.LOGIN_COMMAND_NAME, new LoginCommandParser());
+        imapCommands.put(ImapConstants.AUTHENTICATE_COMMAND_NAME, new AuthenticateCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.LOGIN_COMMAND_NAME, new LoginCommandParser(statusResponseFactory));
 
         // Commands valid in AUTHENTICATED or SELECTED state.
         // RFC2060: SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE,
         // UNSUBSCRIBE, LIST, LSUB, STATUS, and APPEND
-        imapCommands.put(ImapConstants.SELECT_COMMAND_NAME, new SelectCommandParser());
-        imapCommands.put(ImapConstants.EXAMINE_COMMAND_NAME, new ExamineCommandParser());
-        imapCommands.put(ImapConstants.CREATE_COMMAND_NAME, new CreateCommandParser());
-        imapCommands.put(ImapConstants.DELETE_COMMAND_NAME, new DeleteCommandParser());
-        imapCommands.put(ImapConstants.RENAME_COMMAND_NAME, new RenameCommandParser());
-        imapCommands.put(ImapConstants.SUBSCRIBE_COMMAND_NAME, new SubscribeCommandParser());
-        imapCommands.put(ImapConstants.UNSUBSCRIBE_COMMAND_NAME, new UnsubscribeCommandParser());
-        imapCommands.put(ImapConstants.LIST_COMMAND_NAME, new ListCommandParser());
-        imapCommands.put(ImapConstants.XLIST_COMMAND_NAME, new XListCommandParser());
-        imapCommands.put(ImapConstants.LSUB_COMMAND_NAME, new LsubCommandParser());
-        imapCommands.put(ImapConstants.STATUS_COMMAND_NAME, new StatusCommandParser());
-        imapCommands.put(ImapConstants.APPEND_COMMAND_NAME,new AppendCommandParser());
+        imapCommands.put(ImapConstants.SELECT_COMMAND_NAME, new SelectCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.EXAMINE_COMMAND_NAME, new ExamineCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.CREATE_COMMAND_NAME, new CreateCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.DELETE_COMMAND_NAME, new DeleteCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.RENAME_COMMAND_NAME, new RenameCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.SUBSCRIBE_COMMAND_NAME, new SubscribeCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.UNSUBSCRIBE_COMMAND_NAME, new UnsubscribeCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.LIST_COMMAND_NAME, new ListCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.XLIST_COMMAND_NAME, new XListCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.LSUB_COMMAND_NAME, new LsubCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.STATUS_COMMAND_NAME, new StatusCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.APPEND_COMMAND_NAME, new AppendCommandParser(statusResponseFactory));
 
         // RFC2342 NAMESPACE
-        imapCommands.put(ImapConstants.NAMESPACE_COMMAND_NAME, new NamespaceCommandParser());
+        imapCommands.put(ImapConstants.NAMESPACE_COMMAND_NAME, new NamespaceCommandParser(statusResponseFactory));
 
         // RFC4314 GETACL, SETACL, DELETEACL, LISTRIGHTS, MYRIGHTS
-        imapCommands.put(ImapConstants.GETACL_COMMAND_NAME, new GetACLCommandParser());
-        imapCommands.put(ImapConstants.SETACL_COMMAND_NAME, new SetACLCommandParser());
-        imapCommands.put(ImapConstants.DELETEACL_COMMAND_NAME, new DeleteACLCommandParser());
-        imapCommands.put(ImapConstants.LISTRIGHTS_COMMAND_NAME, new ListRightsCommandParser());
-        imapCommands.put(ImapConstants.MYRIGHTS_COMMAND_NAME, new MyRightsCommandParser());
+        imapCommands.put(ImapConstants.GETACL_COMMAND_NAME, new GetACLCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.SETACL_COMMAND_NAME, new SetACLCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.DELETEACL_COMMAND_NAME, new DeleteACLCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.LISTRIGHTS_COMMAND_NAME, new ListRightsCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.MYRIGHTS_COMMAND_NAME, new MyRightsCommandParser(statusResponseFactory));
 
         // Commands only valid in SELECTED state.
         // CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY, UID and IDLE
-        imapCommands.put(ImapConstants.CHECK_COMMAND_NAME, new CheckCommandParser());
-        imapCommands.put(ImapConstants.CLOSE_COMMAND_NAME, new CloseCommandParser());
-        imapCommands.put(ImapConstants.EXPUNGE_COMMAND_NAME, new ExpungeCommandParser());
-        imapCommands.put(ImapConstants.COPY_COMMAND_NAME, new CopyCommandParser());
-        imapCommands.put(ImapConstants.MOVE_COMMAND_NAME, new MoveCommandParser());
-        imapCommands.put(ImapConstants.SEARCH_COMMAND_NAME, new SearchCommandParser());
-        imapCommands.put(ImapConstants.FETCH_COMMAND_NAME, new FetchCommandParser());
-        imapCommands.put(ImapConstants.STORE_COMMAND_NAME, new StoreCommandParser());
-        imapCommands.put(ImapConstants.UID_COMMAND_NAME, new UidCommandParser(this));
-        imapCommands.put(ImapConstants.IDLE_COMMAND_NAME, new IdleCommandParser());
-        imapCommands.put(ImapConstants.STARTTLS, new StartTLSCommandParser());
+        imapCommands.put(ImapConstants.CHECK_COMMAND_NAME, new CheckCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.CLOSE_COMMAND_NAME, new CloseCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.EXPUNGE_COMMAND_NAME, new ExpungeCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.COPY_COMMAND_NAME, new CopyCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.MOVE_COMMAND_NAME, new MoveCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.SEARCH_COMMAND_NAME, new SearchCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.FETCH_COMMAND_NAME, new FetchCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.STORE_COMMAND_NAME, new StoreCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.UID_COMMAND_NAME, new UidCommandParser(this, statusResponseFactory));
+        imapCommands.put(ImapConstants.IDLE_COMMAND_NAME, new IdleCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.STARTTLS, new StartTLSCommandParser(statusResponseFactory));
 
         // RFC3691
-        imapCommands.put(ImapConstants.UNSELECT_COMMAND_NAME, new UnselectCommandParser());
+        imapCommands.put(ImapConstants.UNSELECT_COMMAND_NAME, new UnselectCommandParser(statusResponseFactory));
 
         // RFC4978
-        imapCommands.put(ImapConstants.COMPRESS_COMMAND_NAME, new CompressCommandParser());
-        
-        imapCommands.put(ImapConstants.ENABLE_COMMAND_NAME, new EnableCommandParser());
+        imapCommands.put(ImapConstants.COMPRESS_COMMAND_NAME, new CompressCommandParser(statusResponseFactory));
+
+        imapCommands.put(ImapConstants.ENABLE_COMMAND_NAME, new EnableCommandParser(statusResponseFactory));
 
         // RFC2087
         // GETQUOTAROOT, GETQUOTA, SETQUOTA
-        imapCommands.put(ImapConstants.GETQUOTAROOT_COMMAND_NAME, new GetQuotaRootCommandParser());
-        imapCommands.put(ImapConstants.GETQUOTA_COMMAND_NAME, new GetQuotaCommandParser());
-        imapCommands.put(ImapConstants.SETQUOTA_COMMAND_NAME, new SetQuotaCommandParser());
+        imapCommands.put(ImapConstants.GETQUOTAROOT_COMMAND_NAME, new GetQuotaRootCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.GETQUOTA_COMMAND_NAME, new GetQuotaCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.SETQUOTA_COMMAND_NAME, new SetQuotaCommandParser(statusResponseFactory));
 
         //RFC5464
         //SETMETADATA, GETMETADATA
-        imapCommands.put(ImapConstants.SETANNOTATION_COMMAND_NAME, new SetAnnotationCommandParser());
-        imapCommands.put(ImapConstants.GETANNOTATION_COMMAND_NAME, new GetAnnotationCommandParser());
+        imapCommands.put(ImapConstants.SETANNOTATION_COMMAND_NAME, new SetAnnotationCommandParser(statusResponseFactory));
+        imapCommands.put(ImapConstants.GETANNOTATION_COMMAND_NAME, new GetAnnotationCommandParser(statusResponseFactory));
     }
 
     @Override
     public ImapCommandParser getParser(String commandName) {
-        ImapCommandParser parser = imapCommands.get(commandName.toUpperCase(Locale.US));
-
-        if (parser == null) {
-            return null;
-        } else {
-            initialiseParser(parser);
-            return parser;
-        }
-    }
-
-    private void initialiseParser(ImapCommandParser cmd) {
-        if (cmd instanceof MessagingImapCommandParser) {
-            final MessagingImapCommandParser messagingImapCommandParser = (MessagingImapCommandParser) cmd;
-            messagingImapCommandParser.setStatusResponseFactory(statusResponseFactory);
-        }
+        return imapCommands.get(commandName.toUpperCase(Locale.US));
     }
 }
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 e97eb96..8cad84f 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,12 +34,12 @@ import org.apache.james.imap.message.request.ListRequest;
  */
 public class ListCommandParser extends AbstractUidCommandParser {
 
-    public ListCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.LIST_COMMAND_NAME));
+    public ListCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.LIST_COMMAND_NAME), statusResponseFactory);
     }
 
-    protected ListCommandParser(ImapCommand command) {
-        super(command);
+    protected ListCommandParser(ImapCommand command, StatusResponseFactory statusResponseFactory) {
+        super(command, statusResponseFactory);
     }
 
     /**
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 88b0d13..584d9eb 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.ListRightsRequest;
  */
 public class ListRightsCommandParser extends AbstractImapCommandParser {
 
-    public ListRightsCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.LISTRIGHTS_COMMAND_NAME));
+    public ListRightsCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.LISTRIGHTS_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 4f0a53f..e974f8f 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.LoginRequest;
  */
 public class LoginCommandParser extends AbstractImapCommandParser {
 
-    public LoginCommandParser() {
-        super(ImapCommand.nonAuthenticatedStateCommand(ImapConstants.LOGIN_COMMAND_NAME));
+    public LoginCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.nonAuthenticatedStateCommand(ImapConstants.LOGIN_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 7a489aa..12db4de 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.LogoutRequest;
  */
 public class LogoutCommandParser extends AbstractImapCommandParser {
 
-    public LogoutCommandParser() {
-        super(ImapCommand.anyStateCommand(ImapConstants.LOGOUT_COMMAND_NAME));
+    public LogoutCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.anyStateCommand(ImapConstants.LOGOUT_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 51676e2..a3dd8fc 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.message.request.LsubRequest;
 
 /**
@@ -29,8 +30,8 @@ import org.apache.james.imap.message.request.LsubRequest;
  */
 public class LsubCommandParser extends ListCommandParser {
 
-    public LsubCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.LSUB_COMMAND_NAME));
+    public LsubCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.LSUB_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 63a5024..2ddc766 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
@@ -4,6 +4,7 @@ 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.response.StatusResponseFactory;
 import org.apache.james.imap.message.request.MoveRequest;
 
 /**
@@ -11,8 +12,8 @@ import org.apache.james.imap.message.request.MoveRequest;
  */
 public class MoveCommandParser extends AbstractMessageRangeCommandParser {
 
-    public MoveCommandParser() {
-        super(ImapCommand.selectedStateCommand(ImapConstants.MOVE_COMMAND_NAME));
+    public MoveCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.MOVE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 69e818a..e74119c 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.MyRightsRequest;
  */
 public class MyRightsCommandParser extends AbstractImapCommandParser {
 
-    public MyRightsCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.MYRIGHTS_COMMAND_NAME));
+    public MyRightsCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.MYRIGHTS_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 b59e63d..b83371a 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.NamespaceRequest;
  */
 public class NamespaceCommandParser extends AbstractImapCommandParser {
 
-    public NamespaceCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.NAMESPACE_COMMAND_NAME));
+    public NamespaceCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.NAMESPACE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 1bfb55b..ee3352a 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.NoopRequest;
  */
 public class NoopCommandParser extends AbstractImapCommandParser {
 
-    public NoopCommandParser() {
-        super(ImapCommand.anyStateCommand(ImapConstants.NOOP_COMMAND_NAME));
+    public NoopCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.anyStateCommand(ImapConstants.NOOP_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 feeef9d..9cee81f 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.RenameRequest;
  */
 public class RenameCommandParser extends AbstractImapCommandParser {
 
-    public RenameCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.RENAME_COMMAND_NAME));
+    public RenameCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.RENAME_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 68614da..77040d2 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
@@ -52,8 +52,8 @@ import org.slf4j.LoggerFactory;
 public class SearchCommandParser extends AbstractUidCommandParser {
     private static final Logger LOGGER = LoggerFactory.getLogger(SearchCommandParser.class);
 
-    public SearchCommandParser() {
-        super(ImapCommand.selectedStateCommand(ImapConstants.SEARCH_COMMAND_NAME));
+    public SearchCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.SEARCH_COMMAND_NAME), statusResponseFactory);
     }
 
     /**
@@ -903,9 +903,8 @@ public class SearchCommandParser extends AbstractUidCommandParser {
     }
 
     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);
+        return statusResponseFactory.taggedNo(tag, command, HumanReadableText.BAD_CHARSET, badCharset);
     }
 
     /**
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 253b853..2309bbe 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
@@ -23,6 +23,7 @@ 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.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.message.request.AbstractMailboxSelectionRequest;
 import org.apache.james.imap.message.request.SelectRequest;
 
@@ -30,15 +31,12 @@ import org.apache.james.imap.message.request.SelectRequest;
  * Parse SELECT commands
  */
 public class SelectCommandParser extends AbstractSelectionCommandParser {
-
-    public SelectCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.SELECT_COMMAND_NAME));
+    public SelectCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.SELECT_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
     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 4cfc4da..4a96992 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.SetACLRequest;
  */
 public class SetACLCommandParser extends AbstractImapCommandParser {
 
-    public SetACLCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.SETACL_COMMAND_NAME));
+    public SetACLCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.SETACL_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 0c24420..f650a72 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
@@ -27,6 +27,7 @@ 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.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -38,8 +39,8 @@ import org.apache.james.mailbox.model.MailboxAnnotationKey;
 import com.google.common.collect.ImmutableList;
 
 public class SetAnnotationCommandParser extends AbstractImapCommandParser {
-    public SetAnnotationCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.SETANNOTATION_COMMAND_NAME));
+    public SetAnnotationCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.SETANNOTATION_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 f38a554..fdbb092 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
@@ -23,6 +23,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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -34,8 +35,8 @@ import org.apache.james.imap.message.request.SetQuotaRequest;
  */
 public class SetQuotaCommandParser extends AbstractImapCommandParser {
 
-    public SetQuotaCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.SETQUOTA_COMMAND_NAME));
+    public SetQuotaCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.SETQUOTA_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 c5d2743..ec0fdf0 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.StartTLSRequest;
  */
 public class StartTLSCommandParser extends AbstractImapCommandParser {
 
-    public StartTLSCommandParser() {
-        super(ImapCommand.nonAuthenticatedStateCommand(ImapConstants.STARTTLS));
+    public StartTLSCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.nonAuthenticatedStateCommand(ImapConstants.STARTTLS), statusResponseFactory);
     }
 
     @Override
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 660256d..3c809e0 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
@@ -26,6 +26,7 @@ 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.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -42,8 +43,8 @@ import com.google.common.collect.ImmutableList;
 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));
+    public StatusCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.STATUS_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 de64f2e..ddf3bbc 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
@@ -26,6 +26,7 @@ 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.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -40,8 +41,8 @@ public class StoreCommandParser extends AbstractUidCommandParser {
 
     private static final byte[] UNCHANGEDSINCE = "UNCHANGEDSINCE".getBytes();
     
-    public StoreCommandParser() {
-        super(ImapCommand.selectedStateCommand(ImapConstants.STORE_COMMAND_NAME));
+    public StoreCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.STORE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 3934019..2f9669a 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.SubscribeRequest;
  */
 public class SubscribeCommandParser extends AbstractImapCommandParser {
 
-    public SubscribeCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.SUBSCRIBE_COMMAND_NAME));
+    public SubscribeCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.SUBSCRIBE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 2c1e0ef..b94e15f 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
@@ -23,6 +23,7 @@ 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.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapCommandParser;
@@ -40,8 +41,8 @@ public class UidCommandParser extends AbstractImapCommandParser {
 
     private final ImapCommandParserFactory parserFactory;
 
-    public UidCommandParser(ImapCommandParserFactory parserFactory) {
-        super(ImapCommand.selectedStateCommand(ImapConstants.UID_COMMAND_NAME));
+    public UidCommandParser(ImapCommandParserFactory parserFactory, StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.selectedStateCommand(ImapConstants.UID_COMMAND_NAME), statusResponseFactory);
         this.parserFactory = parserFactory;
     }
 
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 4ee9a15..452ee7a 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -35,11 +36,11 @@ import org.apache.james.imap.message.request.UnselectRequest;
  */
 public class UnselectCommandParser extends AbstractImapCommandParser {
 
-    public UnselectCommandParser() {
+    public UnselectCommandParser(StatusResponseFactory statusResponseFactory) {
         // from the RFC it seems like the command should be valid in any state.
         // At least kind of, as we will return a "BAD" response if no mailbox is
         // currently selected in the UnselectProcessor
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.UNSELECT_COMMAND_NAME));
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.UNSELECT_COMMAND_NAME), statusResponseFactory);
 
     }
 
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 1070ef9..487c96f 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -33,8 +34,8 @@ import org.apache.james.imap.message.request.UnsubscribeRequest;
  */
 public class UnsubscribeCommandParser extends AbstractImapCommandParser {
 
-    public UnsubscribeCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.UNSUBSCRIBE_COMMAND_NAME));
+    public UnsubscribeCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.UNSUBSCRIBE_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 9b056e9..861792b 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
@@ -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.Tag;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.message.request.XListRequest;
 
 /**
@@ -29,8 +30,8 @@ import org.apache.james.imap.message.request.XListRequest;
  */
 public class XListCommandParser extends ListCommandParser {
 
-    public XListCommandParser() {
-        super(ImapCommand.authenticatedStateCommand(ImapConstants.XLIST_COMMAND_NAME));
+    public XListCommandParser(StatusResponseFactory statusResponseFactory) {
+        super(ImapCommand.authenticatedStateCommand(ImapConstants.XLIST_COMMAND_NAME), statusResponseFactory);
     }
 
     @Override
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 5a87531..bc766a7 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
@@ -21,12 +21,14 @@ 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.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.message.IdRange;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.imap.message.request.CopyRequest;
@@ -36,7 +38,7 @@ public class CopyParserTest {
 
     @Test
     public void testQuotaParsing() throws DecodingException {
-        CopyCommandParser parser = new CopyCommandParser();
+        CopyCommandParser parser = new CopyCommandParser(mock(StatusResponseFactory.class));
         ImapCommand command = ImapCommand.anyStateCommand("Command");
         String commandString = " 42:69 foo \n";
 
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 7c9e6ed..77ef9a1 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
@@ -22,6 +22,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;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -30,6 +31,7 @@ import java.nio.charset.StandardCharsets;
 
 import org.apache.james.core.Username;
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.imap.encode.FakeImapSession;
@@ -52,7 +54,7 @@ public class CreateCommandParserTest {
         imapSession = new FakeImapSession();
         imapSession.setMailboxSession(mailboxSession);
 
-        parser = new CreateCommandParser();
+        parser = new CreateCommandParser(mock(StatusResponseFactory.class));
     }
 
     @Test
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 160c2b5..88e5deb 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
@@ -32,6 +32,7 @@ import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.SectionType;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
@@ -48,7 +49,7 @@ public class FetchCommandParserPartialFetchTest  {
 
     @Before
     public void setUp() throws Exception {
-        parser = new FetchCommandParser();
+        parser = new FetchCommandParser(mock(StatusResponseFactory.class));
         command = ImapCommand.anyStateCommand("Command");
         session = new FakeImapSession();
     }
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 38b5481..c5c4ee1 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
@@ -21,6 +21,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.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
@@ -28,6 +29,7 @@ import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
@@ -50,7 +52,7 @@ public class GetAnnotationCommandParserTest {
 
     @Before
     public void setUp() throws Exception {
-        parser = new GetAnnotationCommandParser();
+        parser = new GetAnnotationCommandParser(mock(StatusResponseFactory.class));
     }
 
     @Test(expected = DecodingException.class)
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 9e6fff3..666be6e 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
@@ -21,11 +21,13 @@ 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.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.imap.message.request.GetQuotaRequest;
@@ -38,7 +40,7 @@ public class GetQuotaParserTest {
 
     @Test
     public void testQuotaParsing() throws DecodingException {
-        GetQuotaCommandParser parser = new GetQuotaCommandParser();
+        GetQuotaCommandParser parser = new GetQuotaCommandParser(mock(StatusResponseFactory.class));
         ImapCommand command = ImapCommand.anyStateCommand("Command");
         String commandString = "quotaRoot \n";
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
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 6e82484..4cc06a1 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
@@ -21,11 +21,13 @@ 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.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.imap.message.request.GetQuotaRootRequest;
@@ -38,7 +40,7 @@ public class GetQuotaRootParserTest {
 
     @Test
     public void testNonQuotedMailbox() throws DecodingException {
-        GetQuotaRootCommandParser parser = new GetQuotaRootCommandParser();
+        GetQuotaRootCommandParser parser = new GetQuotaRootCommandParser(mock(StatusResponseFactory.class));
         ImapCommand command = ImapCommand.anyStateCommand("Command");
         String commandString = "INBOX\n";
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
@@ -50,7 +52,7 @@ public class GetQuotaRootParserTest {
 
     @Test
     public void testQuotedMailbox() throws DecodingException {
-        GetQuotaRootCommandParser parser = new GetQuotaRootCommandParser();
+        GetQuotaRootCommandParser parser = new GetQuotaRootCommandParser(mock(StatusResponseFactory.class));
         ImapCommand command = ImapCommand.anyStateCommand("Command");
         String commandString = "\"INBOX\" \n";
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
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 1cb617a..aa02143 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
@@ -21,12 +21,14 @@ 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.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.message.IdRange;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.imap.message.request.MoveRequest;
@@ -36,7 +38,7 @@ public class MoveParserTest {
 
     @Test
     public void testQuotaParsing() throws DecodingException {
-        MoveCommandParser parser = new MoveCommandParser();
+        MoveCommandParser parser = new MoveCommandParser(mock(StatusResponseFactory.class));
         ImapCommand command = ImapCommand.anyStateCommand("Command");
         String commandString = " 42:69 foo \n";
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java
index 95c1d78..6e7834d 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserAndParenthesesTest.java
@@ -20,10 +20,10 @@
 package org.apache.james.imap.decode.parser;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -34,6 +34,7 @@ import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.DayMonthYear;
 import org.apache.james.imap.api.message.request.SearchKey;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
@@ -152,7 +153,7 @@ public class SearchCommandParserAndParenthesesTest {
 
     @Before
     public void setUp() throws Exception {
-        parser = new SearchCommandParser();
+        parser = new SearchCommandParser(mock(StatusResponseFactory.class));
         command = ImapCommand.anyStateCommand("Command");
     }
 
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 805ff55..ca18b9c 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
@@ -72,12 +72,10 @@ public class SearchCommandParserCharsetTest {
 
     @Before
     public void setUp() throws Exception {
-        parser = new SearchCommandParser();
+        mockStatusResponseFactory = mock(StatusResponseFactory.class);
+        parser = new SearchCommandParser(mockStatusResponseFactory);
         command = ImapCommand.anyStateCommand("Command");
         message = mock(ImapMessage.class);
-
-        mockStatusResponseFactory = mock(StatusResponseFactory.class);
-        parser.setStatusResponseFactory(mockStatusResponseFactory);
     }
 
     @Test
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java
index 9b51acf..b479d87 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserNotTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.decode.parser;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -32,6 +33,7 @@ import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.DayMonthYear;
 import org.apache.james.imap.api.message.request.SearchKey;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.mailbox.MessageUid;
@@ -45,7 +47,7 @@ public class SearchCommandParserNotTest {
     
     @Before
     public void setUp() throws Exception {
-        parser = new SearchCommandParser();
+        parser = new SearchCommandParser(mock(StatusResponseFactory.class));
         command = ImapCommand.anyStateCommand("Command");
     }
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java
index eae0525..e157607 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserOrTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.decode.parser;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -31,6 +32,7 @@ import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.DayMonthYear;
 import org.apache.james.imap.api.message.request.SearchKey;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.mailbox.MessageUid;
@@ -44,7 +46,7 @@ public class SearchCommandParserOrTest {
 
     @Before
     public void setUp() throws Exception {
-        parser = new SearchCommandParser();
+        parser = new SearchCommandParser(mock(StatusResponseFactory.class));
         command = ImapCommand.anyStateCommand("Command");
     }
     
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 5fb2dc7..8e28d53 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
@@ -135,13 +135,11 @@ public class SearchCommandParserQuotedCharsetTest {
     
     @Before
     public void setUp() throws Exception {
-        parser = new SearchCommandParser();
+        mockStatusResponseFactory = mock(StatusResponseFactory.class);
+        parser = new SearchCommandParser(mockStatusResponseFactory);
         command = ImapCommand.anyStateCommand("Command");
         message = mock(ImapMessage.class);
-        mockStatusResponseFactory = mock(StatusResponseFactory.class);
         session = new FakeImapSession();
-
-        parser.setStatusResponseFactory(mockStatusResponseFactory);
     }
 
     @Test
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java
index 1287082..8fbff9e 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeySequenceSetTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.decode.parser;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -30,6 +31,7 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.SearchKey;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.mailbox.MessageUid;
@@ -43,7 +45,7 @@ public class SearchCommandParserSearchKeySequenceSetTest {
 
     @Before
     public void setUp() throws Exception {
-        parser = new SearchCommandParser();
+        parser = new SearchCommandParser(mock(StatusResponseFactory.class));
         command = ImapCommand.anyStateCommand("Command");
     }
     
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeyTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeyTest.java
index 2534ab0..ed4025b 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeyTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserSearchKeyTest.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.decode.parser;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Fail.fail;
+import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -32,6 +33,7 @@ import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.DayMonthYear;
 import org.apache.james.imap.api.message.request.SearchKey;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
@@ -49,7 +51,7 @@ public class SearchCommandParserSearchKeyTest {
 
     @Before
     public void setUp() throws Exception {
-        parser = new SearchCommandParser();
+        parser = new SearchCommandParser(mock(StatusResponseFactory.class));
         command = ImapCommand.anyStateCommand("Command");
     }
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java
index 4e779cf..e4cb20c 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/decode/parser/SearchCommandParserTopLevelAndTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.imap.decode.parser;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -33,6 +34,7 @@ import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.UidRange;
 import org.apache.james.imap.api.message.request.DayMonthYear;
 import org.apache.james.imap.api.message.request.SearchKey;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
@@ -137,7 +139,7 @@ public class SearchCommandParserTopLevelAndTest {
 
     @Before
     public void setUp() throws Exception {
-        parser = new SearchCommandParser();
+        parser = new SearchCommandParser(mock(StatusResponseFactory.class));
         command = ImapCommand.anyStateCommand("Command");
     }
 
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 a79162a..4457684 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
@@ -21,12 +21,14 @@ 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.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.imap.message.request.SetAnnotationRequest;
@@ -43,7 +45,7 @@ public class SetAnnotationCommandParserTest {
     private static final MailboxAnnotation PRIVATE_ANNOTATION = MailboxAnnotation.newInstance(PRIVATE_KEY, "This is my comment");
     private static final MailboxAnnotation SHARED_ANNOTATION = MailboxAnnotation.newInstance(SHARED_KEY, "This one is for you!");
     private static final MailboxAnnotation NIL_ANNOTATION = MailboxAnnotation.nil(PRIVATE_KEY);
-    private SetAnnotationCommandParser parser = new SetAnnotationCommandParser();
+    private SetAnnotationCommandParser parser = new SetAnnotationCommandParser(mock(StatusResponseFactory.class));
     private ImapCommand command = ImapCommand.anyStateCommand("Command");
 
     @Test
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 1be99d9..c262d16 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
@@ -21,12 +21,14 @@ 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.Mockito.mock;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
 import org.apache.james.imap.message.request.SetQuotaRequest;
@@ -39,7 +41,7 @@ public class SetQuotaCommandParserTest {
 
     @Test
     public void testQuotaParsing() throws DecodingException {
-        SetQuotaCommandParser parser = new SetQuotaCommandParser();
+        SetQuotaCommandParser parser = new SetQuotaCommandParser(mock(StatusResponseFactory.class));
         ImapCommand command = ImapCommand.anyStateCommand("Command");
         String commandString = "quotaRoot (STORAGE 512) ( MESSAGE  1024  ) \n";
         InputStream inputStream = new ByteArrayInputStream(commandString.getBytes());
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 a670c76..fb6518f 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
@@ -32,6 +32,7 @@ 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.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.ImapRequestStreamLineReader;
@@ -48,7 +49,7 @@ public class StoreCommandParserTest {
 
     @Before
     public void setUp() throws Exception {
-        parser = new StoreCommandParser();
+        parser = new StoreCommandParser(mock(StatusResponseFactory.class));
         command = ImapCommand.anyStateCommand("Command");
         session = mock(ImapSession.class);
     }


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


[james-project] 03/27: [Refactoring] SetQuotaRequest.ResourceLimit.limit can be unboxed

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 e7a528f9586bfd15cbc1a3be3d7cb5fadefabb38
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 09:53:49 2019 +0700

    [Refactoring] SetQuotaRequest.ResourceLimit.limit can be unboxed
---
 .../java/org/apache/james/imap/message/request/SetQuotaRequest.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 e353548..1c80405 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
@@ -35,7 +35,7 @@ public class SetQuotaRequest extends AbstractImapRequest {
 
     public static class ResourceLimit {
         private final String resource;
-        private final Long limit;
+        private final long limit;
 
         public ResourceLimit(String resource, long limit) {
             this.limit = limit;


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


[james-project] 08/27: [Refactoring] FetchData: Provide a builder

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 2b6c925ca951190612f24df98ff5e17fe4d94637
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 10:32:05 2019 +0700

    [Refactoring] FetchData: Provide a builder
    
    This allows to have FetchData immutable
---
 .../apache/james/imap/api/message/FetchData.java   | 188 ++++++++++-----------
 .../imap/decode/parser/FetchCommandParser.java     |  58 ++++---
 .../james/imap/message/request/FetchRequest.java   |   3 -
 .../imap/processor/fetch/FetchDataConverter.java   |   5 +-
 .../james/imap/processor/fetch/FetchProcessor.java |  23 ++-
 .../imap/processor/fetch/FetchResponseBuilder.java |  19 ++-
 .../parser/FetchCommandParserPartialFetchTest.java |  14 +-
 .../processor/fetch/FetchDataConverterTest.java    |  43 ++---
 8 files changed, 173 insertions(+), 180 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
index 3459a63..3a4b305 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.james.imap.api.message;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.EnumSet;
 import java.util.HashSet;
@@ -28,137 +29,118 @@ import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
 
 public class FetchData {
-    enum Item {
-        FLAGS,
-        UID,
-        INTERNAL_DATE,
-        SIZE,
-        ENVELOPE,
-        BODY,
-        BODY_STRUCTURE,
-        MODSEQ,
-    }
-
-    private final EnumSet<Item> itemToFetch = EnumSet.noneOf(Item.class);
-    private final Set<BodyFetchElement> bodyElements = new HashSet<>();
-
-    private boolean setSeen = false;
-    private long changedSince = -1;
-    private boolean vanished;
+    public static class Builder {
+        public static Builder from(FetchData fetchData) {
+            return builder()
+                .fetch(fetchData.itemToFetch)
+                .vanished(fetchData.vanished)
+                .changedSince(fetchData.changedSince)
+                .addBodyElements(fetchData.bodyElements)
+                .seen(fetchData.setSeen);
+        }
 
-    public Collection<BodyFetchElement> getBodyElements() {
-        return bodyElements;
-    }
+        private EnumSet<Item> itemToFetch = EnumSet.noneOf(Item.class);
+        private Set<BodyFetchElement> bodyElements = new HashSet<>();
+        private boolean setSeen = false;
+        private long changedSince = -1;
+        private boolean vanished;
 
-    public boolean isBody() {
-        return itemToFetch.contains(Item.BODY);
-    }
+        public Builder fetch(Item... item) {
+            return fetch(Arrays.asList(item));
+        }
 
-    public FetchData fetchBody() {
-        itemToFetch.add(Item.BODY);
-        return this;
-    }
+        public Builder fetch(Collection<Item> items) {
+            itemToFetch.addAll(items);
+            return this;
+        }
 
-    public boolean isBodyStructure() {
-        return itemToFetch.contains(Item.BODY_STRUCTURE);
-    }
+        public Builder changedSince(long changedSince) {
+            this.changedSince = changedSince;
+            return fetch(Item.MODSEQ);
+        }
 
-    public FetchData fetchBodyStructure() {
-        itemToFetch.add(Item.BODY_STRUCTURE);
-        return this;
-    }
+        /**
+         * Set to true if the VANISHED FETCH modifier was used as stated in <code>QRESYNC</code> extension
+         */
+        public Builder vanished(boolean vanished) {
+            this.vanished = vanished;
+            return this;
+        }
 
-    public boolean isEnvelope() {
-        return itemToFetch.contains(Item.ENVELOPE);
-    }
+        public Builder add(BodyFetchElement element, boolean peek) {
+            if (!peek) {
+                setSeen = true;
+            }
+            bodyElements.add(element);
+            return this;
+        }
 
-    public FetchData fetchEnvelope() {
-        itemToFetch.add(Item.ENVELOPE);
-        return this;
-    }
+        private Builder addBodyElements(Collection<BodyFetchElement> elements) {
+            bodyElements.addAll(elements);
+            return this;
+        }
 
-    public boolean isFlags() {
-        return itemToFetch.contains(Item.FLAGS);
-    }
+        private Builder seen(boolean setSeen) {
+            this.setSeen = setSeen;
+            return this;
+        }
 
-    public FetchData fetchFlags() {
-        itemToFetch.add(Item.FLAGS);
-        return this;
+        public FetchData build() {
+            return new FetchData(itemToFetch, bodyElements, setSeen, changedSince, vanished);
+        }
     }
 
-    public boolean isInternalDate() {
-        return itemToFetch.contains(Item.INTERNAL_DATE);
+    public enum Item {
+        FLAGS,
+        UID,
+        INTERNAL_DATE,
+        SIZE,
+        ENVELOPE,
+        BODY,
+        BODY_STRUCTURE,
+        MODSEQ,
     }
 
-    public FetchData fetchInternalDate() {
-        itemToFetch.add(Item.INTERNAL_DATE);
-        return this;
+    public static Builder builder() {
+        return new Builder();
     }
 
-    public boolean isSize() {
-        return itemToFetch.contains(Item.SIZE);
-    }
+    private final EnumSet<Item> itemToFetch;
+    private final Set<BodyFetchElement> bodyElements;
+    private final boolean setSeen;
+    private final long changedSince;
+    private final boolean vanished;
 
-    public FetchData fetchSize() {
-        itemToFetch.add(Item.SIZE);
-        return this;
+    private FetchData(EnumSet<Item> itemToFetch, Set<BodyFetchElement> bodyElements, boolean setSeen, long changedSince, boolean vanished) {
+        this.itemToFetch = EnumSet.copyOf(itemToFetch);
+        this.bodyElements = ImmutableSet.copyOf(bodyElements);
+        this.setSeen = setSeen;
+        this.changedSince = changedSince;
+        this.vanished = vanished;
     }
 
-    public boolean isUid() {
-        return itemToFetch.contains(Item.UID);
+    public Collection<BodyFetchElement> getBodyElements() {
+        return bodyElements;
     }
 
-    public FetchData fetchUid() {
-        itemToFetch.add(Item.UID);
-        return this;
+    public boolean contains(Item item) {
+        return itemToFetch.contains(item);
     }
 
     public boolean isSetSeen() {
         return setSeen;
     }
-
-
-    public boolean isModSeq() {
-        return itemToFetch.contains(Item.MODSEQ);
-    }
-
-    public FetchData fetchModSeq() {
-        itemToFetch.add(Item.MODSEQ);
-        return this;
-    }
-    
-    public FetchData setChangedSince(long changedSince) {
-        this.changedSince = changedSince;
-        itemToFetch.add(Item.MODSEQ);
-        return this;
-    }
     
     public long getChangedSince() {
         return changedSince;
     }
     
     /**
-     * Set to true if the VANISHED FETCH modifier was used as stated in <code>QRESYNC</code> extension
-     */
-    public FetchData setVanished(boolean vanished) {
-        this.vanished = vanished;
-        return this;
-    }
-    
-    /**
      * Return true if the VANISHED FETCH modifier was used as stated in <code>QRESYNC<code> extension
      */
     public boolean getVanished() {
         return vanished;
     }
-    
-    public FetchData add(BodyFetchElement element, boolean peek) {
-        if (!peek) {
-            setSeen = true;
-        }
-        bodyElements.add(element);
-        return this;
-    }
 
     @Override
     public final int hashCode() {
@@ -181,16 +163,16 @@ public class FetchData {
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("flags", isFlags())
-            .add("uid", isUid())
-            .add("internalDate", isInternalDate())
-            .add("size", isSize())
-            .add("envelope", isEnvelope())
-            .add("body", isBody())
-            .add("bodyStructure", isBodyStructure())
+            .add("flags", contains(Item.FLAGS))
+            .add("uid", contains(Item.UID))
+            .add("internalDate", contains(Item.INTERNAL_DATE))
+            .add("size", contains(Item.SIZE))
+            .add("envelope", contains(Item.ENVELOPE))
+            .add("body", contains(Item.BODY))
+            .add("bodyStructure", contains(Item.BODY_STRUCTURE))
             .add("setSeen", setSeen)
             .add("bodyElements", ImmutableSet.copyOf(bodyElements))
-            .add("modSeq", isModSeq())
+            .add("modSeq", contains(Item.MODSEQ))
             .add("changedSince", changedSince)
             .add("vanished", vanished)
             .toString();
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 698a819..d0573e3 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
@@ -18,6 +18,15 @@
  ****************************************************************/
 package org.apache.james.imap.decode.parser;
 
+import static org.apache.james.imap.api.message.FetchData.Item.BODY;
+import static org.apache.james.imap.api.message.FetchData.Item.BODY_STRUCTURE;
+import static org.apache.james.imap.api.message.FetchData.Item.ENVELOPE;
+import static org.apache.james.imap.api.message.FetchData.Item.FLAGS;
+import static org.apache.james.imap.api.message.FetchData.Item.INTERNAL_DATE;
+import static org.apache.james.imap.api.message.FetchData.Item.MODSEQ;
+import static org.apache.james.imap.api.message.FetchData.Item.SIZE;
+import static org.apache.james.imap.api.message.FetchData.Item.UID;
+
 import java.util.List;
 
 import org.apache.james.imap.api.ImapCommand;
@@ -53,8 +62,12 @@ public class FetchCommandParser extends AbstractUidCommandParser {
      *
      * @return fetchData
      */
-    protected FetchData fetchRequest(ImapRequestLineReader request) throws DecodingException {
-        FetchData fetch = new FetchData();
+    private FetchData fetchRequest(ImapRequestLineReader request, boolean useUid) throws DecodingException {
+        FetchData.Builder fetch = FetchData.builder();
+
+        if (useUid) {
+            fetch.fetch(UID);
+        }
 
         char next = nextNonSpaceChar(request);
         if (request.nextChar() == '(') {
@@ -87,7 +100,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
                             }
                         }
                     });
-                    fetch.setChangedSince(request.number(true));
+                    fetch.changedSince(request.number(true));
                     
                     break;
                 
@@ -104,7 +117,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
                             }
                         }
                     });
-                    fetch.setVanished(true);
+                    fetch.vanished(true);
                     break;
                 default:
                     break;
@@ -119,44 +132,35 @@ public class FetchCommandParser extends AbstractUidCommandParser {
 
         }
 
-        return fetch;
+        return fetch.build();
     }
 
-    private void addNextElement(ImapRequestLineReader reader, FetchData fetch) throws DecodingException {
+    private void addNextElement(ImapRequestLineReader reader, FetchData.Builder fetch) throws DecodingException {
         // String name = element.toString();
         String name = readWord(reader, " [)\r\n");
         char next = reader.nextChar();
         // Simple elements with no '[]' parameters.
         if (next != '[') {
             if ("FAST".equalsIgnoreCase(name)) {
-                fetch.fetchFlags();
-                fetch.fetchInternalDate();
-                fetch.fetchSize();
+                fetch.fetch(FLAGS, INTERNAL_DATE, SIZE);
             } else if ("FULL".equalsIgnoreCase(name)) {
-                fetch.fetchFlags();
-                fetch.fetchInternalDate();
-                fetch.fetchSize();
-                fetch.fetchEnvelope();
-                fetch.fetchBody();
+                fetch.fetch(FLAGS, INTERNAL_DATE, SIZE, ENVELOPE, BODY);
             } else if ("ALL".equalsIgnoreCase(name)) {
-                fetch.fetchFlags();
-                fetch.fetchInternalDate();
-                fetch.fetchSize();
-                fetch.fetchEnvelope();
+                fetch.fetch(FLAGS, INTERNAL_DATE, SIZE, ENVELOPE);
             } else if ("FLAGS".equalsIgnoreCase(name)) {
-                fetch.fetchFlags();
+                fetch.fetch(FLAGS);
             } else if ("RFC822.SIZE".equalsIgnoreCase(name)) {
-                fetch.fetchSize();
+                fetch.fetch(SIZE);
             } else if ("ENVELOPE".equalsIgnoreCase(name)) {
-                fetch.fetchEnvelope();
+                fetch.fetch(ENVELOPE);
             } else if ("INTERNALDATE".equalsIgnoreCase(name)) {
-                fetch.fetchInternalDate();
+                fetch.fetch(INTERNAL_DATE);
             } else if ("BODY".equalsIgnoreCase(name)) {
-                fetch.fetchBody();
+                fetch.fetch(BODY);
             } else if ("BODYSTRUCTURE".equalsIgnoreCase(name)) {
-                fetch.fetchBodyStructure();
+                fetch.fetch(BODY_STRUCTURE);
             } else if ("UID".equalsIgnoreCase(name)) {
-                fetch.fetchUid();
+                fetch.fetch(UID);
             } else if ("RFC822".equalsIgnoreCase(name)) {
                 fetch.add(BodyFetchElement.createRFC822(), false);
             } else if ("RFC822.HEADER".equalsIgnoreCase(name)) {
@@ -164,7 +168,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
             } else if ("RFC822.TEXT".equalsIgnoreCase(name)) {
                 fetch.add(BodyFetchElement.createRFC822Text(), false);
             } else if ("MODSEQ".equalsIgnoreCase(name)) {
-                fetch.fetchModSeq();
+                fetch.fetch(MODSEQ);
             } else {
                 throw new DecodingException(HumanReadableText.ILLEGAL_ARGUMENTS, "Invalid fetch attribute: " + name);
             }
@@ -244,7 +248,7 @@ public class FetchCommandParser extends AbstractUidCommandParser {
     @Override
     protected ImapMessage decode(ImapCommand command, ImapRequestLineReader request, Tag tag, boolean useUids, ImapSession session) throws DecodingException {
         IdRange[] idSet = request.parseIdRange(session);
-        FetchData fetch = fetchRequest(request);
+        FetchData fetch = fetchRequest(request, useUids);
 
         // Check if we have VANISHED and and UID FETCH as its only allowed there
         //
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 6867bda..0619636 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
@@ -35,9 +35,6 @@ public class FetchRequest extends AbstractImapRequest {
         this.useUids = useUids;
         this.idSet = idSet;
         this.fetch = fetch;
-        if (useUids) {
-            fetch.fetchUid();
-        }
     }
 
     public final FetchData getFetch() {
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java
index a6333e0..add60fe 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchDataConverter.java
@@ -23,6 +23,7 @@ import java.util.Collection;
 
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
+import org.apache.james.imap.api.message.FetchData.Item;
 import org.apache.james.imap.api.message.SectionType;
 import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.MimePath;
@@ -32,10 +33,10 @@ class FetchDataConverter {
     static FetchGroup getFetchGroup(FetchData fetch) {
         FetchGroup result = FetchGroup.MINIMAL;
 
-        if (fetch.isEnvelope()) {
+        if (fetch.contains(Item.ENVELOPE)) {
             result = result.with(FetchGroup.Profile.HEADERS);
         }
-        if (fetch.isBody() || fetch.isBodyStructure()) {
+        if (fetch.contains(Item.BODY) || fetch.contains(Item.BODY_STRUCTURE)) {
             result = result.with(FetchGroup.Profile.MIME_DESCRIPTOR);
         }
 
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 20517d3..a9677a3 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
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.FetchData;
+import org.apache.james.imap.api.message.FetchData.Item;
 import org.apache.james.imap.api.message.IdRange;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapProcessor;
@@ -61,8 +62,8 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
     protected void processRequest(FetchRequest request, ImapSession session, Responder responder) {
         final boolean useUids = request.isUseUids();
         final IdRange[] idSet = request.getIdSet();
-        final FetchData fetch = request.getFetch();
-        
+        final FetchData fetch = computeFetchData(request, session);
+
         try {
             final long changedSince = fetch.getChangedSince();
 
@@ -85,7 +86,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
             final MailboxSession mailboxSession = session.getMailboxSession();
 
             MetaData metaData = mailbox.getMetaData(false, mailboxSession, org.apache.james.mailbox.MessageManager.MetaData.FetchGroup.NO_COUNT);
-            if (fetch.getChangedSince() != -1 || fetch.isModSeq()) {
+            if (fetch.getChangedSince() != -1 || fetch.contains(Item.MODSEQ)) {
                 // Enable CONDSTORE as this is a CONDSTORE enabling command
                 condstoreEnablingCommand(session, responder,  metaData, true);
             }
@@ -106,10 +107,6 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
                 //       If we do so we could prolly save one mailbox access which should give use some more speed up
                 respondVanished(mailboxSession, mailbox, ranges, changedSince, metaData, responder);
             }
-            // if QRESYNC is enable its necessary to also return the UID in all cases
-            if (EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
-                fetch.fetchUid();
-            }
             processMessageRanges(session, mailbox, ranges, fetch, useUids, mailboxSession, responder);
 
             
@@ -127,8 +124,16 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
         }
     }
 
+    private FetchData computeFetchData(FetchRequest request, ImapSession session) {
+        // if QRESYNC is enable its necessary to also return the UID in all cases
+        if (EnableProcessor.getEnabledCapabilities(session).contains(ImapConstants.SUPPORTS_QRESYNC)) {
+            return FetchData.Builder.from(request.getFetch())
+                .fetch(Item.UID)
+                .build();
+        }
+        return request.getFetch();
+    }
 
-    
     /**
      * Process the given message ranges by fetch them and pass them to the
      * {@link org.apache.james.imap.api.process.ImapProcessor.Responder}
@@ -143,7 +148,7 @@ public class FetchProcessor extends AbstractMailboxProcessor<FetchRequest> {
                 final MessageResult result = messages.next();
 
                 //skip unchanged messages - this should be filtered at the mailbox level to take advantage of indexes
-                if (fetch.isModSeq() && result.getModSeq().asLong() <= fetch.getChangedSince()) {
+                if (fetch.contains(Item.MODSEQ) && result.getModSeq().asLong() <= fetch.getChangedSince()) {
                     continue;
                 }
 
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
index 16de9b3..8484b39 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/fetch/FetchResponseBuilder.java
@@ -33,6 +33,7 @@ import javax.mail.Flags;
 
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
+import org.apache.james.imap.api.message.FetchData.Item;
 import org.apache.james.imap.api.message.SectionType;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.api.process.SelectedMailbox;
@@ -132,7 +133,7 @@ public final class FetchResponseBuilder {
         }
 
         // FLAGS response
-        if (fetch.isFlags() || ensureFlagsResponse) {
+        if (fetch.contains(Item.FLAGS) || ensureFlagsResponse) {
             if (selected.isRecent(resultUid)) {
                 resultFlags.add(Flags.Flag.RECENT);
             }
@@ -140,16 +141,16 @@ public final class FetchResponseBuilder {
         }
 
         // INTERNALDATE response
-        if (fetch.isInternalDate()) {
+        if (fetch.contains(Item.INTERNAL_DATE)) {
             setInternalDate(result.getInternalDate());
         }
 
         // RFC822.SIZE response
-        if (fetch.isSize()) {
+        if (fetch.contains(Item.SIZE)) {
             setSize(result.getSize());
         }
 
-        if (fetch.isEnvelope()) {
+        if (fetch.contains(Item.ENVELOPE)) {
             this.envelope = buildEnvelope(result);
         }
 
@@ -165,29 +166,29 @@ public final class FetchResponseBuilder {
         }
         
         // Only create when needed
-        if (fetch.isBody() || fetch.isBodyStructure()) {
+        if (fetch.contains(Item.BODY) || fetch.contains(Item.BODY_STRUCTURE)) {
             // BODY response
             //
             // the STRUCTURE is only needed when no specific element is requested otherwise we don't need 
             // to access it and may be able to not parse the message
             //
             // See IMAP-333
-            if (fetch.isBody() && this.elements.isEmpty()) {
+            if (fetch.contains(Item.BODY) && this.elements.isEmpty()) {
                 body = new MimeDescriptorStructure(false, result.getMimeDescriptor(), envelopeBuilder);
             }
 
             // BODYSTRUCTURE response
-            if (fetch.isBodyStructure()) {
+            if (fetch.contains(Item.BODY_STRUCTURE)) {
                 bodystructure = new MimeDescriptorStructure(true, result.getMimeDescriptor(), envelopeBuilder);
             }
         }
         // UID response
-        if (fetch.isUid()) {
+        if (fetch.contains(Item.UID)) {
             setUid(resultUid);
         }
 
         
-        if (fetch.isModSeq()) {
+        if (fetch.contains(Item.MODSEQ)) {
             long changedSince = fetch.getChangedSince();
             if (changedSince != -1) {
                 // check if the modsequence if higher then the one specified by the CHANGEDSINCE option
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 8b4f8c8..160c2b5 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
@@ -56,18 +56,20 @@ public class FetchCommandParserPartialFetchTest  {
     @Test
     public void testShouldParseZeroAndLength() throws Exception {
         IdRange[] ranges = { new IdRange(1) };
-        FetchData data = new FetchData();
-        data.add(new BodyFetchElement("BODY[]", SectionType.CONTENT, null,
-                null, 0L, 100L), false);
+        FetchData data = FetchData.builder()
+            .add(new BodyFetchElement("BODY[]", SectionType.CONTENT, null,
+                null, 0L, 100L), false)
+            .build();
         check("1 (BODY[]<0.100>)\r\n", ranges, false, data, TAG);
     }
 
     @Test
     public void testShouldParseNonZeroAndLength() throws Exception {
         IdRange[] ranges = { new IdRange(1) };
-        FetchData data = new FetchData();
-        data.add(new BodyFetchElement("BODY[]", SectionType.CONTENT, null,
-                null, 20L, 12342348L), false);
+        FetchData data = FetchData.builder()
+            .add(new BodyFetchElement("BODY[]", SectionType.CONTENT, null,
+                null, 20L, 12342348L), false)
+            .build();
         check("1 (BODY[]<20.12342348>)\r\n", ranges, false, data, TAG);
     }
 
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
index 84f06e7..9272343 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/fetch/FetchDataConverterTest.java
@@ -30,6 +30,7 @@ import java.util.stream.Stream;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.message.BodyFetchElement;
 import org.apache.james.imap.api.message.FetchData;
+import org.apache.james.imap.api.message.FetchData.Item;
 import org.apache.james.mailbox.model.FetchGroup;
 import org.apache.james.mailbox.model.FetchGroup.Profile;
 import org.apache.james.mailbox.model.MimePath;
@@ -43,37 +44,37 @@ class FetchDataConverterTest {
 
     static Stream<Arguments> getFetchGroupShouldReturnCorrectValue() {
         return Stream.of(
-            Arguments.arguments(new FetchData(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchBody(), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
-            Arguments.arguments(new FetchData().fetchBodyStructure(), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
-            Arguments.arguments(new FetchData().setChangedSince(0L), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchEnvelope(), FetchGroup.HEADERS),
-            Arguments.arguments(new FetchData().fetchFlags(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchInternalDate(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchModSeq(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().fetchUid(), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().setVanished(true), FetchGroup.MINIMAL),
-            Arguments.arguments(new FetchData().add(BodyFetchElement.createRFC822(), PEEK), FetchGroup.FULL_CONTENT),
-            Arguments.arguments(new FetchData().add(BodyFetchElement.createRFC822Header(), PEEK), FetchGroup.HEADERS),
-            Arguments.arguments(new FetchData().add(BodyFetchElement.createRFC822Text(), PEEK), FetchGroup.BODY_CONTENT),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_HEADER, HEADER, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder(), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.BODY), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
+            Arguments.arguments(FetchData.builder().fetch(Item.BODY_STRUCTURE), FetchGroup.MINIMAL.with(Profile.MIME_DESCRIPTOR)),
+            Arguments.arguments(FetchData.builder().changedSince(0L), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.ENVELOPE), FetchGroup.HEADERS),
+            Arguments.arguments(FetchData.builder().fetch(Item.FLAGS), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.INTERNAL_DATE), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.MODSEQ), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().fetch(Item.UID), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().vanished(true), FetchGroup.MINIMAL),
+            Arguments.arguments(FetchData.builder().add(BodyFetchElement.createRFC822(), PEEK), FetchGroup.FULL_CONTENT),
+            Arguments.arguments(FetchData.builder().add(BodyFetchElement.createRFC822Header(), PEEK), FetchGroup.HEADERS),
+            Arguments.arguments(FetchData.builder().add(BodyFetchElement.createRFC822Text(), PEEK), FetchGroup.BODY_CONTENT),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_HEADER, HEADER, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.HEADERS)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, HEADER, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, HEADER, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.BODY_CONTENT)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, CONTENT, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, CONTENT, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.BODY_CONTENT)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, CONTENT, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, CONTENT, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.MIME_CONTENT)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, MIME, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, MIME, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.MIME_HEADERS)),
-            Arguments.arguments(new FetchData().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, TEXT, PATH, null, null, null), PEEK),
+            Arguments.arguments(FetchData.builder().add(new BodyFetchElement(ImapConstants.FETCH_RFC822_TEXT, TEXT, PATH, null, null, null), PEEK),
                 FetchGroup.MINIMAL.addPartContent(new MimePath(PATH), Profile.BODY_CONTENT)));
     }
 
     @ParameterizedTest
     @MethodSource
-    void getFetchGroupShouldReturnCorrectValue(FetchData initial, FetchGroup expected) {
-        assertThat(FetchDataConverter.getFetchGroup(initial))
+    void getFetchGroupShouldReturnCorrectValue(FetchData.Builder initial, FetchGroup expected) {
+        assertThat(FetchDataConverter.getFetchGroup(initial.build()))
             .isEqualTo(expected);
     }
 }
\ No newline at end of file


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


[james-project] 05/27: [Refactoring] FetchData: Use an enum representing item to fetch

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 776c3ff3ca32dff7700be10100085c443c95be5d
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 10 10:18:55 2019 +0700

    [Refactoring] FetchData: Use an enum representing item to fetch
    
    This avoids a collection of boolean fields
---
 .../apache/james/imap/api/message/FetchData.java   | 173 ++++++++-------------
 1 file changed, 62 insertions(+), 111 deletions(-)

diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java b/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
index bc5095d..da9443c 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/message/FetchData.java
@@ -19,35 +19,32 @@
 package org.apache.james.imap.api.message;
 
 import java.util.Collection;
+import java.util.EnumSet;
 import java.util.HashSet;
+import java.util.Objects;
 import java.util.Set;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 
 public class FetchData {
-    private boolean flags;
-
-    private boolean uid;
-
-    private boolean internalDate;
-
-    private boolean size;
-
-    private boolean envelope;
-
-    private boolean body;
-
-    private boolean bodyStructure;
-
-    private boolean setSeen = false;
-
+    enum Item {
+        FLAGS,
+        UID,
+        INTERNAL_DATE,
+        SIZE,
+        ENVELOPE,
+        BODY,
+        BODY_STRUCTURE,
+        MODSEQ,
+    }
+
+    private final EnumSet<Item> itemToFetch = EnumSet.noneOf(Item.class);
     private final Set<BodyFetchElement> bodyElements = new HashSet<>();
 
-    private boolean modSeq;
-
+    private boolean setSeen = false;
     private long changedSince = -1;
-
     private boolean vanished;
 
     public Collection<BodyFetchElement> getBodyElements() {
@@ -55,65 +52,72 @@ public class FetchData {
     }
 
     public boolean isBody() {
-        return body;
+        return itemToFetch.contains(Item.BODY);
     }
 
     public FetchData setBody(boolean body) {
-        this.body = body;
+        Preconditions.checkArgument(body, "'body' can not be unset");
+        itemToFetch.add(Item.BODY);
         return this;
     }
 
     public boolean isBodyStructure() {
-        return bodyStructure;
+        return itemToFetch.contains(Item.BODY_STRUCTURE);
     }
 
     public FetchData setBodyStructure(boolean bodyStructure) {
-        this.bodyStructure = bodyStructure;
+        Preconditions.checkArgument(bodyStructure, "'bodyStructure' can not be unset");
+        itemToFetch.add(Item.BODY_STRUCTURE);
         return this;
     }
 
     public boolean isEnvelope() {
-        return envelope;
+        return itemToFetch.contains(Item.ENVELOPE);
     }
 
     public FetchData setEnvelope(boolean envelope) {
-        this.envelope = envelope;
+        Preconditions.checkArgument(envelope, "'envelope' can not be unset");
+        itemToFetch.add(Item.ENVELOPE);
         return this;
     }
 
     public boolean isFlags() {
-        return flags;
+        return itemToFetch.contains(Item.FLAGS);
     }
 
     public FetchData setFlags(boolean flags) {
-        this.flags = flags;
+        Preconditions.checkArgument(flags, "'flags' can not be unset");
+        itemToFetch.add(Item.FLAGS);
         return this;
     }
 
     public boolean isInternalDate() {
-        return internalDate;
+        return itemToFetch.contains(Item.INTERNAL_DATE);
     }
 
     public FetchData setInternalDate(boolean internalDate) {
-        this.internalDate = internalDate;
+        Preconditions.checkArgument(internalDate, "'internalDate' can not be unset");
+        itemToFetch.add(Item.INTERNAL_DATE);
         return this;
     }
 
     public boolean isSize() {
-        return size;
+        return itemToFetch.contains(Item.SIZE);
     }
 
     public FetchData setSize(boolean size) {
-        this.size = size;
+        Preconditions.checkArgument(size, "'size' can not be unset");
+        itemToFetch.add(Item.SIZE);
         return this;
     }
 
     public boolean isUid() {
-        return uid;
+        return itemToFetch.contains(Item.UID);
     }
 
     public FetchData setUid(boolean uid) {
-        this.uid = uid;
+        Preconditions.checkArgument(uid, "'uid' can not be unset");
+        itemToFetch.add(Item.UID);
         return this;
     }
 
@@ -123,17 +127,18 @@ public class FetchData {
 
 
     public boolean isModSeq() {
-        return modSeq;
+        return itemToFetch.contains(Item.MODSEQ);
     }
 
     public FetchData setModSeq(boolean modSeq) {
-        this.modSeq = modSeq;
+        Preconditions.checkArgument(modSeq, "'modSeq' can not be unset");
+        itemToFetch.add(Item.MODSEQ);
         return this;
     }
     
     public FetchData setChangedSince(long changedSince) {
         this.changedSince = changedSince;
-        this.modSeq = true;
+        itemToFetch.add(Item.MODSEQ);
         return this;
     }
     
@@ -143,8 +148,6 @@ public class FetchData {
     
     /**
      * Set to true if the VANISHED FETCH modifier was used as stated in <code>QRESYNC</code> extension
-     * 
-     * @param vanished
      */
     public FetchData setVanished(boolean vanished) {
         this.vanished = vanished;
@@ -153,8 +156,6 @@ public class FetchData {
     
     /**
      * Return true if the VANISHED FETCH modifier was used as stated in <code>QRESYNC<code> extension
-     * 
-     * @return vanished
      */
     public boolean getVanished() {
         return vanished;
@@ -168,87 +169,37 @@ public class FetchData {
         return this;
     }
 
-    public int hashCode() {
-        final int PRIME = 31;
-        int result = 1;
-        result = PRIME * result + (body ? 1231 : 1237);
-        result = PRIME * result + ((bodyElements == null) ? 0 : bodyElements.hashCode());
-        result = PRIME * result + (bodyStructure ? 1231 : 1237);
-        result = PRIME * result + (envelope ? 1231 : 1237);
-        result = PRIME * result + (flags ? 1231 : 1237);
-        result = PRIME * result + (internalDate ? 1231 : 1237);
-        result = PRIME * result + (setSeen ? 1231 : 1237);
-        result = PRIME * result + (size ? 1231 : 1237);
-        result = PRIME * result + (uid ? 1231 : 1237);
-        result = PRIME * result + (modSeq ? 1231 : 1237);
-        result = (int) (PRIME * result + changedSince);
-        return result;
+    @Override
+    public final int hashCode() {
+        return Objects.hash(itemToFetch, bodyElements, setSeen, changedSince);
     }
 
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null) {
-            return false;
-        }
-        if (getClass() != obj.getClass()) {
-            return false;
-        }
-        final FetchData other = (FetchData) obj;
-        if (body != other.body) {
-            return false;
-        }
-        if (bodyElements == null) {
-            if (other.bodyElements != null) {
-                return false;
-            }
-        } else if (!bodyElements.equals(other.bodyElements)) {
-            return false;
-        }
-        if (bodyStructure != other.bodyStructure) {
-            return false;
-        }
-        if (envelope != other.envelope) {
-            return false;
-        }
-        if (flags != other.flags) {
-            return false;
-        }
-        if (internalDate != other.internalDate) {
-            return false;
-        }
-        if (setSeen != other.setSeen) {
-            return false;
-        }
-        if (size != other.size) {
-            return false;
-        }
-        if (uid != other.uid) {
-            return false;
-        }
-        if (modSeq != other.modSeq) {
-            return false;
-        }
-        if (changedSince != other.changedSince) {
-            return false;
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof FetchData) {
+            FetchData fetchData = (FetchData) o;
+
+            return Objects.equals(this.setSeen, fetchData.setSeen)
+                && Objects.equals(this.changedSince, fetchData.changedSince)
+                && Objects.equals(this.itemToFetch, fetchData.itemToFetch)
+                && Objects.equals(this.bodyElements, fetchData.bodyElements);
         }
-        return true;
+        return false;
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("flags", flags)
-            .add("uid", uid)
-            .add("internalDate", internalDate)
-            .add("size", size)
-            .add("envelope", envelope)
-            .add("body", body)
-            .add("bodyStructure", bodyStructure)
+            .add("flags", isFlags())
+            .add("uid", isUid())
+            .add("internalDate", isInternalDate())
+            .add("size", isSize())
+            .add("envelope", isEnvelope())
+            .add("body", isBody())
+            .add("bodyStructure", isBodyStructure())
             .add("setSeen", setSeen)
             .add("bodyElements", ImmutableSet.copyOf(bodyElements))
-            .add("modSeq", modSeq)
+            .add("modSeq", isModSeq())
             .add("changedSince", changedSince)
             .add("vanished", vanished)
             .toString();


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