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:33 UTC

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

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