You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2010/08/20 21:23:37 UTC

svn commit: r987606 [22/25] - in /directory/shared/trunk: ./ all/ asn1-codec/ asn1-codec/src/main/java/org/apache/directory/shared/asn1/codec/ asn1/ asn1/src/main/java/org/apache/directory/shared/asn1/ber/grammar/ asn1/src/main/java/org/apache/director...

Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestSubstringTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestSubstringTest.java?rev=987606&r1=987605&r2=987606&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestSubstringTest.java (original)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/codec/search/SearchRequestSubstringTest.java Fri Aug 20 19:23:27 2010
@@ -36,11 +36,13 @@ import org.apache.directory.shared.asn1.
 import org.apache.directory.shared.asn1.ber.IAsn1Container;
 import org.apache.directory.shared.asn1.codec.DecoderException;
 import org.apache.directory.shared.asn1.codec.EncoderException;
-import org.apache.directory.shared.ldap.codec.LdapConstants;
 import org.apache.directory.shared.ldap.codec.LdapMessageContainer;
 import org.apache.directory.shared.ldap.constants.SchemaConstants;
-import org.apache.directory.shared.ldap.entry.EntryAttribute;
 import org.apache.directory.shared.ldap.filter.SearchScope;
+import org.apache.directory.shared.ldap.message.AliasDerefMode;
+import org.apache.directory.shared.ldap.message.LdapProtocolEncoder;
+import org.apache.directory.shared.ldap.message.SearchRequest;
+import org.apache.directory.shared.ldap.message.SearchRequestImpl;
 import org.apache.directory.shared.ldap.message.control.Control;
 import org.apache.directory.shared.ldap.schema.normalizers.DeepTrimToLowerNormalizer;
 import org.apache.directory.shared.ldap.schema.normalizers.OidNormalizer;
@@ -59,32 +61,35 @@ import org.junit.runner.RunWith;
 @Concurrent()
 public class SearchRequestSubstringTest
 {
+    /** The encoder instance */
+    LdapProtocolEncoder encoder = new LdapProtocolEncoder();
+
     static Map<String, OidNormalizer> oids = new HashMap<String, OidNormalizer>();
 
+
     @BeforeClass
     public static void setUp() throws Exception
     {
         // DC normalizer
-        OidNormalizer dcOidNormalizer = new OidNormalizer( "dc",
-            new DeepTrimToLowerNormalizer( SchemaConstants.DOMAIN_COMPONENT_AT_OID ) );
-        
+        OidNormalizer dcOidNormalizer = new OidNormalizer( "dc", new DeepTrimToLowerNormalizer(
+            SchemaConstants.DOMAIN_COMPONENT_AT_OID ) );
+
         oids.put( "dc", dcOidNormalizer );
         oids.put( "domaincomponent", dcOidNormalizer );
         oids.put( "0.9.2342.19200300.100.1.25", dcOidNormalizer );
-        
-        
+
         // OU normalizer
-        OidNormalizer ouOidNormalizer = new OidNormalizer( "ou",
-            new DeepTrimToLowerNormalizer( SchemaConstants.OU_AT_OID ) );
-        
+        OidNormalizer ouOidNormalizer = new OidNormalizer( "ou", new DeepTrimToLowerNormalizer(
+            SchemaConstants.OU_AT_OID ) );
+
         oids.put( "ou", ouOidNormalizer );
         oids.put( "organizationalUnitName", ouOidNormalizer );
         oids.put( "2.5.4.11", ouOidNormalizer );
 
         // ObjectClass normalizer
-        OidNormalizer objectClassOidNormalizer = new OidNormalizer( "objectClass",
-            new DeepTrimToLowerNormalizer( SchemaConstants.OBJECT_CLASS_AT_OID ) );
-        
+        OidNormalizer objectClassOidNormalizer = new OidNormalizer( "objectClass", new DeepTrimToLowerNormalizer(
+            SchemaConstants.OBJECT_CLASS_AT_OID ) );
+
         oids.put( "objectclass", objectClassOidNormalizer );
         oids.put( "2.5.4.0", objectClassOidNormalizer );
     }
@@ -101,46 +106,46 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x64 );
         stream.put( new byte[]
-            { 
-            0x30, 0x62,                     // LDAPMessage ::=SEQUENCE {
-              0x02, 0x01, 0x01,             //      messageID MessageID
-              0x63, 0x5D,                   //      CHOICE { ..., 
-                                            //          searchRequest SearchRequest, ...
-                                            // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F,                 //      baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                0x0A, 0x01, 0x01,           //      scope ENUMERATED {
-                                            //          baseObject      (0),
-                                            //          singleLevel     (1),
-                                            //          wholeSubtree    (2) },
-                0x0A, 0x01, 0x03,           //      derefAliases ENUMERATED {
-                                            //          neverDerefAliases   (0),
-                                            //          derefInSearching    (1),
-                                            //          derefFindingBaseObj (2),
-                                            //          derefAlways         (3) },
-                0x02, 0x02, 0x03, ( byte ) 0xE8,    //      sizeLimit INTEGER (0 .. maxInt), (1000)
-                0x02, 0x02, 0x03, ( byte ) 0xE8,    // timeLimit INTEGER (0 .. maxInt), (1000) 
+            { 0x30,
+                0x62, // LDAPMessage ::=SEQUENCE {
+                0x02, 0x01,
+                0x01, //      messageID MessageID
+                0x63,
+                0x5D, //      CHOICE { ..., 
+                //          searchRequest SearchRequest, ...
+                // SearchRequest ::= APPLICATION[3] SEQUENCE {
+                0x04,
+                0x1F, //      baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, //      scope ENUMERATED {
+                //          baseObject      (0),
+                //          singleLevel     (1),
+                //          wholeSubtree    (2) },
+                0x0A, 0x01, 0x03, //      derefAliases ENUMERATED {
+                //          neverDerefAliases   (0),
+                //          derefInSearching    (1),
+                //          derefFindingBaseObj (2),
+                //          derefAlways         (3) },
+                0x02, 0x02, 0x03, ( byte ) 0xE8, //      sizeLimit INTEGER (0 .. maxInt), (1000)
+                0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000) 
                 0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
                 ( byte ) 0xA4, 0x12, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
                 // }
                 // SubstringFilter ::= SEQUENCE {
-                  0x04, 0x0B, // type AttributeDescription,
-                    'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 
-                  0x30, 0x03, 
-                    ( byte ) 0x80, 0x01, 't', //
+                0x04, 0x0B, // type AttributeDescription,
+                'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x03, ( byte ) 0x80, 0x01, 't', //
                 0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
-                  0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
-                  0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
-                  0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
-                                                    // LDAPString
+                // AttributeDescription
+                0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
+                // ::= LDAPString
+                0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
+                // ::= LDAPString
+                0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
+            // LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -159,40 +164,41 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
         assertEquals( "t", substringFilter.getInitialSubstrings() );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x64, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x64, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -217,19 +223,35 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x0081 );
         stream.put( new byte[]
-            { 0x30, 0x7F, // LDAPMessage ::=SEQUENCE {
-                0x02, 0x01, 0x01, // messageID MessageID
-                0x63, 0x5D, // CHOICE { ..., searchRequest SearchRequest, ...
+            {
+                0x30,
+                0x7F, // LDAPMessage ::=SEQUENCE {
+                0x02,
+                0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x5D, // CHOICE { ..., searchRequest SearchRequest, ...
                 // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F, // baseObject LDAPDN,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
-                                                                                            // ENUMERATED
-                                                                                            // {
+                'm', 'p', 'l', 'e', ',', 'd',
+                'c',
+                '=',
+                'c',
+                'o',
+                'm',
+                0x0A,
+                0x01,
+                0x01, // scope
+                // ENUMERATED
+                // {
                 // baseObject (0),
                 // singleLevel (1),
                 // wholeSubtree (2) },
-                0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
+                0x0A,
+                0x01,
+                0x03, // derefAliases ENUMERATED {
                 // neverDerefAliases (0),
                 // derefInSearching (1),
                 // derefFindingBaseObj (2),
@@ -237,30 +259,40 @@ public class SearchRequestSubstringTest
                 // sizeLimit INTEGER (0 .. maxInt), (1000)
                 0x02, 0x02, 0x03, ( byte ) 0xE8,
                 // timeLimit INTEGER (0 .. maxInt), (1000)
-                0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                0x02, 0x02,
+                0x03,
+                ( byte ) 0xE8,
+                0x01,
+                0x01,
+                ( byte ) 0xFF, // typesOnly
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
-                ( byte ) 0xA4, 0x12, // Filter ::= CHOICE {
+                ( byte ) 0xA4,
+                0x12, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
                 // }
                 // SubstringFilter ::= SEQUENCE {
-                0x04, 0x0B, // type AttributeDescription,
-                'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x03, ( byte ) 0x80, 0x01, 't', //
-                0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
-                0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
-                0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
-                0x04, 0x05, 'a', 't', 't', 'r', '2', // AttributeDescription
-                                                        // ::= LDAPString
-                ( byte ) 0xA0, 0x1B, // A control
-                  0x30, 0x19, 
-                    0x04, 0x17, 
-                      0x32, 0x2E, 0x31, 0x36, 0x2E, 0x38, 0x34, 0x30, 
-                      0x2E, 0x31, 0x2E, 0x31, 0x31, 0x33, 0x37, 0x33, 
-                      0x30, 0x2E, 0x33, 0x2E, 0x34, 0x2E, 0x32 } );
+                0x04,
+                0x0B, // type AttributeDescription,
+                'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x03, ( byte ) 0x80, 0x01,
+                't', //
+                0x30,
+                0x15, // AttributeDescriptionList ::= SEQUENCE OF
+                // AttributeDescription
+                0x04, 0x05, 'a', 't', 't', 'r',
+                '0', // AttributeDescription
+                // ::= LDAPString
+                0x04, 0x05, 'a', 't', 't', 'r',
+                '1', // AttributeDescription
+                // ::= LDAPString
+                0x04, 0x05, 'a', 't', 't', 'r',
+                '2', // AttributeDescription
+                // ::= LDAPString
+                ( byte ) 0xA0,
+                0x1B, // A control
+                0x30, 0x19, 0x04, 0x17, 0x32, 0x2E, 0x31, 0x36, 0x2E, 0x38, 0x34, 0x30, 0x2E, 0x31, 0x2E, 0x31, 0x31,
+                0x33, 0x37, 0x33, 0x30, 0x2E, 0x33, 0x2E, 0x34, 0x2E, 0x32 } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
         stream.flip();
@@ -278,49 +310,50 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
         assertEquals( "t", substringFilter.getInitialSubstrings() );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
         // Check the Control
-        List<Control> controls = searchRequest.getControls();
+        Map<String, Control> controls = searchRequest.getControls();
 
         assertEquals( 1, controls.size() );
 
-        Control control = searchRequest.getControls( 0 );
+        Control control = searchRequest.getControl( "2.16.840.1.113730.3.4.2" );
         assertEquals( "2.16.840.1.113730.3.4.2", control.getOid() );
         assertEquals( "", StringTools.dumpBytes( ( byte[] ) control.getValue() ) );
 
-        // Check the length
-        assertEquals( 0x0081, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x0081, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -345,51 +378,48 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x64 );
         stream.put( new byte[]
-            { 0x30, 0x62, // LDAPMessage ::=SEQUENCE {
-                0x02, 0x01, 0x01, // messageID MessageID
-                0x63, 0x5D, // CHOICE { ..., searchRequest SearchRequest, ...
+            { 0x30,
+                0x62, // LDAPMessage ::=SEQUENCE {
+                0x02, 0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x5D, // CHOICE { ..., searchRequest SearchRequest, ...
                 // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                  0x04, 0x1F, // baseObject LDAPDN,
-                    'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                    'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                  0x0A, 0x01, 0x01, // scope
-                                                                                            // ENUMERATED
-                                                                                            // {
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
+                // ENUMERATED
+                // {
                 // baseObject (0),
                 // singleLevel (1),
                 // wholeSubtree (2) },
-                  0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
+                0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
                 // neverDerefAliases (0),
                 // derefInSearching (1),
                 // derefFindingBaseObj (2),
                 // derefAlways (3) },
                 // sizeLimit INTEGER (0 .. maxInt), (1000)
-                  0x02, 0x02, 0x03, ( byte ) 0xE8,
+                0x02, 0x02, 0x03, ( byte ) 0xE8,
                 // timeLimit INTEGER (0 .. maxInt), (1000)
-                  0x02, 0x02, 0x03, ( byte ) 0xE8, 
-                  0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
-                  ( byte ) 0xA4, 0x12, // Filter ::= CHOICE {
+                ( byte ) 0xA4, 0x12, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
                 // }
                 // SubstringFilter ::= SEQUENCE {
-                    0x04, 0x0B, // type AttributeDescription,
-                      'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 
-                    0x30, 0x03, 
-                      ( byte ) 0x81, 0x01, 't', //
-                      0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
-                        0x04, 0x05, 
-                          'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
-                        0x04, 0x05, 
-                          'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
-                        0x04, 0x05, 
-                          'a', 't', 't', 'r', '2' // AttributeDescription ::=
-                                                    // LDAPString
+                0x04, 0x0B, // type AttributeDescription,
+                'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x03, ( byte ) 0x81, 0x01, 't', //
+                0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
+                // AttributeDescription
+                0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
+                // ::= LDAPString
+                0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
+                // ::= LDAPString
+                0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
+            // LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -408,18 +438,19 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
@@ -428,22 +459,22 @@ public class SearchRequestSubstringTest
         assertEquals( null, substringFilter.getFinalSubstrings() );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x64, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x64, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -468,15 +499,19 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x67 );
         stream.put( new byte[]
-            { 0x30, 0x65, // LDAPMessage ::=SEQUENCE {
-                0x02, 0x01, 0x01, // messageID MessageID
-                0x63, 0x60, // CHOICE { ..., searchRequest SearchRequest, ...
+            { 0x30,
+                0x65, // LDAPMessage ::=SEQUENCE {
+                0x02, 0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x60, // CHOICE { ..., searchRequest SearchRequest, ...
                 // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F, // baseObject LDAPDN,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
-                                                                                            // ENUMERATED
-                                                                                            // {
+                // ENUMERATED
+                // {
                 // baseObject (0),
                 // singleLevel (1),
                 // wholeSubtree (2) },
@@ -489,8 +524,8 @@ public class SearchRequestSubstringTest
                 0x02, 0x02, 0x03, ( byte ) 0xE8,
                 // timeLimit INTEGER (0 .. maxInt), (1000)
                 0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
                 ( byte ) 0xA4, 0x15, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
@@ -500,13 +535,13 @@ public class SearchRequestSubstringTest
                 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x06, ( byte ) 0x81, 0x01, 't', //
                 ( byte ) 0x82, 0x01, 't', //
                 0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
+                // AttributeDescription
                 0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
-                                                    // LDAPString
+            // LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -525,18 +560,19 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
@@ -545,22 +581,22 @@ public class SearchRequestSubstringTest
         assertEquals( "t", substringFilter.getFinalSubstrings() );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x67, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x67, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -585,15 +621,19 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x6A );
         stream.put( new byte[]
-            { 0x30, 0x68, // LDAPMessage ::=SEQUENCE {
-                0x02, 0x01, 0x01, // messageID MessageID
-                0x63, 0x63, // CHOICE { ..., searchRequest SearchRequest, ...
+            { 0x30,
+                0x68, // LDAPMessage ::=SEQUENCE {
+                0x02, 0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x63, // CHOICE { ..., searchRequest SearchRequest, ...
                 // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F, // baseObject LDAPDN,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
-                                                                                            // ENUMERATED
-                                                                                            // {
+                // ENUMERATED
+                // {
                 // baseObject (0),
                 // singleLevel (1),
                 // wholeSubtree (2) },
@@ -606,8 +646,8 @@ public class SearchRequestSubstringTest
                 0x02, 0x02, 0x03, ( byte ) 0xE8,
                 // timeLimit INTEGER (0 .. maxInt), (1000)
                 0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
                 ( byte ) 0xA4, 0x18, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
@@ -618,13 +658,13 @@ public class SearchRequestSubstringTest
                 ( byte ) 0x81, 0x01, 't', //
                 ( byte ) 0x82, 0x01, 't', //
                 0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
+                // AttributeDescription
                 0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
-                                                    // LDAPString
+            // LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -643,18 +683,19 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
@@ -663,22 +704,22 @@ public class SearchRequestSubstringTest
         assertEquals( "t", substringFilter.getFinalSubstrings() );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x6A, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x6A, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -703,15 +744,19 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x67 );
         stream.put( new byte[]
-            { 0x30, 0x65, // LDAPMessage ::=SEQUENCE {
-                0x02, 0x01, 0x01, // messageID MessageID
-                0x63, 0x60, // CHOICE { ..., searchRequest SearchRequest, ...
+            { 0x30,
+                0x65, // LDAPMessage ::=SEQUENCE {
+                0x02, 0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x60, // CHOICE { ..., searchRequest SearchRequest, ...
                 // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F, // baseObject LDAPDN,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
-                                                                                            // ENUMERATED
-                                                                                            // {
+                // ENUMERATED
+                // {
                 // baseObject (0),
                 // singleLevel (1),
                 // wholeSubtree (2) },
@@ -724,8 +769,8 @@ public class SearchRequestSubstringTest
                 0x02, 0x02, 0x03, ( byte ) 0xE8,
                 // timeLimit INTEGER (0 .. maxInt), (1000)
                 0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
                 ( byte ) 0xA4, 0x15, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
@@ -735,13 +780,13 @@ public class SearchRequestSubstringTest
                 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x06, ( byte ) 0x80, 0x01, 't', //
                 ( byte ) 0x81, 0x01, 't', //
                 0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
+                // AttributeDescription
                 0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
-                                                    // LDAPString
+            // LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -760,18 +805,19 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
@@ -779,22 +825,22 @@ public class SearchRequestSubstringTest
         assertEquals( "t", substringFilter.getAnySubstrings().get( 0 ) );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x67, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x67, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -819,40 +865,53 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x6A );
         stream.put( new byte[]
-            { 
-            0x30, 0x68,                     // LDAPMessage ::=SEQUENCE {
-              0x02, 0x01, 0x01,             // messageID MessageID
-              0x63, 0x63,                   // CHOICE { ..., searchRequest SearchRequest, ...
-                                            // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F,                 // baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                0x0A, 0x01, 0x01,           // scope ENUMERATED {
-                                            // baseObject (0),
-                                            // singleLevel (1),
-                                            // wholeSubtree (2) },
-                0x0A, 0x01, 0x03,           // derefAliases ENUMERATED {
-                                            // neverDerefAliases (0),
-                                            // derefInSearching (1),
-                                            // derefFindingBaseObj (2),
-                                            // derefAlways (3) },
-                0x02, 0x02, 0x03, ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
-                0x02, 0x02, 0x03, ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
-                0x01, 0x01, ( byte ) 0xFF,  // typesOnly BOOLEAN, (TRUE)
-                                            // filter Filter,
-                ( byte ) 0xA4, 0x18,        // Filter ::= CHOICE {
-                                            // substrings [4] SubstringFilter }
-                                            // SubstringFilter ::= SEQUENCE {
-                  0x04, 0x0B,               // type AttributeDescription,
-                    'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 
-                  0x30, 0x09, 
-                    ( byte ) 0x81, 0x01, 't',
-                    ( byte ) 0x81, 0x01, 't',
-                    ( byte ) 0x82, 0x01, 't',
-                0x30, 0x15,                 // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
-                  0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
-                  0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
-                  0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
+            {
+                0x30,
+                0x68, // LDAPMessage ::=SEQUENCE {
+                0x02,
+                0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x63, // CHOICE { ..., searchRequest SearchRequest, ...
+                // SearchRequest ::= APPLICATION[3] SEQUENCE {
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c',
+                'o',
+                'm',
+                0x0A,
+                0x01,
+                0x01, // scope ENUMERATED {
+                // baseObject (0),
+                // singleLevel (1),
+                // wholeSubtree (2) },
+                0x0A,
+                0x01,
+                0x03, // derefAliases ENUMERATED {
+                // neverDerefAliases (0),
+                // derefInSearching (1),
+                // derefFindingBaseObj (2),
+                // derefAlways (3) },
+                0x02, 0x02, 0x03,
+                ( byte ) 0xE8, // sizeLimit INTEGER (0 .. maxInt), (1000)
+                0x02, 0x02, 0x03,
+                ( byte ) 0xE8, // timeLimit INTEGER (0 .. maxInt), (1000)
+                0x01,
+                0x01,
+                ( byte ) 0xFF, // typesOnly BOOLEAN, (TRUE)
+                // filter Filter,
+                ( byte ) 0xA4,
+                0x18, // Filter ::= CHOICE {
+                // substrings [4] SubstringFilter }
+                // SubstringFilter ::= SEQUENCE {
+                0x04,
+                0x0B, // type AttributeDescription,
+                'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x09, ( byte ) 0x81, 0x01, 't',
+                ( byte ) 0x81, 0x01, 't', ( byte ) 0x82, 0x01, 't', 0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
+                0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription ::= LDAPString
+                0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription ::= LDAPString
+                0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::= LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -871,18 +930,19 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
@@ -892,22 +952,22 @@ public class SearchRequestSubstringTest
         assertEquals( "t", substringFilter.getFinalSubstrings() );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x6A, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x6A, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -932,15 +992,19 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x67 );
         stream.put( new byte[]
-            { 0x30, 0x65, // LDAPMessage ::=SEQUENCE {
-                0x02, 0x01, 0x01, // messageID MessageID
-                0x63, 0x60, // CHOICE { ..., searchRequest SearchRequest, ...
+            { 0x30,
+                0x65, // LDAPMessage ::=SEQUENCE {
+                0x02, 0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x60, // CHOICE { ..., searchRequest SearchRequest, ...
                 // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F, // baseObject LDAPDN,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
-                                                                                            // ENUMERATED
-                                                                                            // {
+                // ENUMERATED
+                // {
                 // baseObject (0),
                 // singleLevel (1),
                 // wholeSubtree (2) },
@@ -953,8 +1017,8 @@ public class SearchRequestSubstringTest
                 0x02, 0x02, 0x03, ( byte ) 0xE8,
                 // timeLimit INTEGER (0 .. maxInt), (1000)
                 0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
                 ( byte ) 0xA4, 0x15, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
@@ -964,13 +1028,13 @@ public class SearchRequestSubstringTest
                 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x06, ( byte ) 0x80, 0x01, 't', //
                 ( byte ) 0x81, 0x01, '*', //
                 0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
+                // AttributeDescription
                 0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
-                                                    // LDAPString
+            // LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -989,18 +1053,19 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
@@ -1008,22 +1073,22 @@ public class SearchRequestSubstringTest
         assertEquals( "*", substringFilter.getAnySubstrings().get( 0 ) );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x67, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x67, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -1048,15 +1113,19 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x6A );
         stream.put( new byte[]
-            { 0x30, 0x68, // LDAPMessage ::=SEQUENCE {
-                0x02, 0x01, 0x01, // messageID MessageID
-                0x63, 0x63, // CHOICE { ..., searchRequest SearchRequest, ...
+            { 0x30,
+                0x68, // LDAPMessage ::=SEQUENCE {
+                0x02, 0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x63, // CHOICE { ..., searchRequest SearchRequest, ...
                 // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F, // baseObject LDAPDN,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
-                                                                                            // ENUMERATED
-                                                                                            // {
+                // ENUMERATED
+                // {
                 // baseObject (0),
                 // singleLevel (1),
                 // wholeSubtree (2) },
@@ -1069,8 +1138,8 @@ public class SearchRequestSubstringTest
                 0x02, 0x02, 0x03, ( byte ) 0xE8,
                 // timeLimit INTEGER (0 .. maxInt), (1000)
                 0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
                 ( byte ) 0xA4, 0x18, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
@@ -1081,13 +1150,13 @@ public class SearchRequestSubstringTest
                 ( byte ) 0x81, 0x01, 't', //
                 ( byte ) 0x81, 0x01, 't', //
                 0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
+                // AttributeDescription
                 0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
-                                                    // LDAPString
+            // LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -1106,18 +1175,19 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
@@ -1128,22 +1198,22 @@ public class SearchRequestSubstringTest
         assertEquals( null, substringFilter.getFinalSubstrings() );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x6A, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x6A, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -1168,19 +1238,35 @@ public class SearchRequestSubstringTest
 
         ByteBuffer stream = ByteBuffer.allocate( 0x67 );
         stream.put( new byte[]
-            { 0x30, 0x65, // LDAPMessage ::=SEQUENCE {
-                0x02, 0x01, 0x01, // messageID MessageID
-                0x63, 0x60, // CHOICE { ..., searchRequest SearchRequest, ...
+            {
+                0x30,
+                0x65, // LDAPMessage ::=SEQUENCE {
+                0x02,
+                0x01,
+                0x01, // messageID MessageID
+                0x63,
+                0x60, // CHOICE { ..., searchRequest SearchRequest, ...
                 // SearchRequest ::= APPLICATION[3] SEQUENCE {
-                0x04, 0x1F, // baseObject LDAPDN,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, // scope
-                                                                                            // ENUMERATED
-                                                                                            // {
+                'm', 'p', 'l', 'e', ',', 'd',
+                'c',
+                '=',
+                'c',
+                'o',
+                'm',
+                0x0A,
+                0x01,
+                0x01, // scope
+                // ENUMERATED
+                // {
                 // baseObject (0),
                 // singleLevel (1),
                 // wholeSubtree (2) },
-                0x0A, 0x01, 0x03, // derefAliases ENUMERATED {
+                0x0A,
+                0x01,
+                0x03, // derefAliases ENUMERATED {
                 // neverDerefAliases (0),
                 // derefInSearching (1),
                 // derefFindingBaseObj (2),
@@ -1188,25 +1274,32 @@ public class SearchRequestSubstringTest
                 // sizeLimit INTEGER (0 .. maxInt), (1000)
                 0x02, 0x02, 0x03, ( byte ) 0xE8,
                 // timeLimit INTEGER (0 .. maxInt), (1000)
-                0x02, 0x02, 0x03, ( byte ) 0xE8, 0x01, 0x01, ( byte ) 0xFF, // typesOnly
-                                                                            // BOOLEAN,
-                                                                            // (TRUE)
+                0x02, 0x02,
+                0x03,
+                ( byte ) 0xE8,
+                0x01,
+                0x01,
+                ( byte ) 0xFF, // typesOnly
+                // BOOLEAN,
+                // (TRUE)
                 // filter Filter,
-                ( byte ) 0xA4, 0x15, // Filter ::= CHOICE {
+                ( byte ) 0xA4,
+                0x15, // Filter ::= CHOICE {
                 // substrings [4] SubstringFilter
                 // }
                 // SubstringFilter ::= SEQUENCE {
-                0x04, 0x0B, // type AttributeDescription,
+                0x04,
+                0x0B, // type AttributeDescription,
                 'o', 'b', 'j', 'e', 'c', 't', 'c', 'l', 'a', 's', 's', 0x30, 0x06, ( byte ) 0x82, 0x04, 'A', 'm', 'o',
                 's', //
                 0x30, 0x15, // AttributeDescriptionList ::= SEQUENCE OF
-                            // AttributeDescription
+                // AttributeDescription
                 0x04, 0x05, 'a', 't', 't', 'r', '0', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '1', // AttributeDescription
-                                                        // ::= LDAPString
+                // ::= LDAPString
                 0x04, 0x05, 'a', 't', 't', 'r', '2' // AttributeDescription ::=
-                                                    // LDAPString
+            // LDAPString
             } );
 
         String decodedPdu = StringTools.dumpBytes( stream.array() );
@@ -1225,18 +1318,19 @@ public class SearchRequestSubstringTest
             fail( de.getMessage() );
         }
 
-        SearchRequestCodec searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
+        SearchRequest searchRequest = ( ( LdapMessageContainer ) ldapMessageContainer ).getSearchRequest();
 
         assertEquals( 1, searchRequest.getMessageId() );
-        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBaseObject().toString() );
+        assertEquals( "uid=akarasulu,dc=example,dc=com", searchRequest.getBase().toString() );
         assertEquals( SearchScope.ONELEVEL, searchRequest.getScope() );
-        assertEquals( LdapConstants.DEREF_ALWAYS, searchRequest.getDerefAliases() );
+        assertEquals( AliasDerefMode.DEREF_ALWAYS, searchRequest.getDerefAliases() );
         assertEquals( 1000, searchRequest.getSizeLimit() );
         assertEquals( 1000, searchRequest.getTimeLimit() );
-        assertEquals( true, searchRequest.isTypesOnly() );
+        assertEquals( true, searchRequest.getTypesOnly() );
 
         // (objectclass=t*)
-        SubstringFilter substringFilter = ( SubstringFilter ) searchRequest.getFilter();
+        Filter filter = ( ( SearchRequestImpl ) searchRequest ).getCurrentFilter();
+        SubstringFilter substringFilter = ( SubstringFilter ) filter;
         assertNotNull( substringFilter );
 
         assertEquals( "objectclass", substringFilter.getType() );
@@ -1245,22 +1339,22 @@ public class SearchRequestSubstringTest
         assertEquals( "Amos", substringFilter.getFinalSubstrings() );
 
         // The attributes
-        List<EntryAttribute> attributes = searchRequest.getAttributes();
+        List<String> attributes = searchRequest.getAttributes();
 
-        for ( EntryAttribute attribute:attributes )
+        for ( String attribute : attributes )
         {
             assertNotNull( attribute );
         }
 
-        // Check the length
-        assertEquals( 0x67, searchRequest.computeLength() );
-
         // Check the encoding
         // We won't check the whole PDU, as it may differs because
         // attributes may have been reordered
         try
         {
-            ByteBuffer bb = searchRequest.encode();
+            ByteBuffer bb = encoder.encodeMessage( searchRequest );
+
+            // Check the length
+            assertEquals( 0x67, bb.limit() );
 
             String encodedPdu = StringTools.dumpBytes( bb.array() );
 
@@ -1281,22 +1375,16 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestEmptySubstringFilter()
     {
         byte[] asn1BER = new byte[]
-            { 
-            0x30, 0x3B, 
-              0x02, 0x01, 0x04,                 // messageID
-              0x63, 0x36, 
-                0x04, 0x1F,                     // baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                0x0A, 0x01, 0x01, 
-                0x0A, 0x01, 0x03, 
-                0x02, 0x01, 0x00, 
-                0x02, 0x01, 0x00, 
-                0x01, 0x01, ( byte ) 0xFF, 
-                ( byte ) 0xA4, 0x00, 
-                0x30, 0x02,                     // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
-                  0x04, 0x00 
-            };
+            { 0x30, 0x3B, 0x02,
+                0x01,
+                0x04, // messageID
+                0x63, 0x36,
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
+                0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x00, 0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
+                0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
 
@@ -1330,23 +1418,16 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterEmptyType()
     {
         byte[] asn1BER = new byte[]
-            { 
-            0x30, 0x3D, 
-              0x02, 0x01, 0x04, // messageID
-              0x63, 0x38, 
-                0x04, 0x1F, // baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                0x0A, 0x01, 0x01, 
-                0x0A, 0x01, 0x03, 
-                0x02, 0x01, 0x00, 
-                0x02, 0x01, 0x00, 
-                0x01, 0x01, ( byte ) 0xFF, 
-                ( byte ) 0xA4, 0x02, 
-                  0x04, 0x00, 
-                0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
-                  0x04, 0x00 
-            };
+            { 0x30, 0x3D, 0x02,
+                0x01,
+                0x04, // messageID
+                0x63, 0x38,
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
+                0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x02, 0x04, 0x00, 0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
+                0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
 
@@ -1380,23 +1461,19 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterNoSubstrings()
     {
         byte[] asn1BER = new byte[]
-            { 
-            0x30, 0x41, 
-              0x02, 0x01, 0x04,                 // messageID
-              0x63, 0x3D, 
-                0x04, 0x1F,                     // baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                  0x0A, 0x01, 0x01, 
-                  0x0A, 0x01, 0x03, 
-                  0x02, 0x01, 0x00, 
-                  0x02, 0x01, 0x00, 
-                  0x01, 0x01, ( byte ) 0xFF, 
-                  ( byte ) 0xA4, 0x06, 0x04, 
-                    0x04, 't', 'e', 's', 't',
-                0x30, 0x02,                     // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
-                  0x04, 0x00 
-            };
+            { 0x30, 0x41,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x3D,
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
+                0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x06, 0x04, 0x04, 't', 'e', 's', 't',
+                0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
+                0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
 
@@ -1430,24 +1507,19 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterEmptySubstrings()
     {
         byte[] asn1BER = new byte[]
-            { 
-            0x30, 0x43, 
-              0x02, 0x01, 0x04,                 // messageID
-              0x63, 0x3E, 
-                0x04, 0x1F,                     // baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                0x0A, 0x01, 0x01, 
-                0x0A, 0x01, 0x03, 
-                0x02, 0x01, 0x00, 
-                0x02, 0x01, 0x00, 
-                0x01, 0x01, ( byte ) 0xFF, 
-                ( byte ) 0xA4, 0x08, 
-                  0x04, 0x04, 't', 'e', 's', 't',
-                  0x30, 0x00, 
-                0x30, 0x02,                     // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
-                  0x04, 0x00 
-            };
+            { 0x30, 0x43,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x3E,
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
+                0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x08, 0x04, 0x04, 't', 'e', 's', 't',
+                0x30, 0x00, 0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
+                0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
 
@@ -1481,25 +1553,19 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterEmptyInitial()
     {
         byte[] asn1BER = new byte[]
-            { 
-            0x30, 0x45, 
-              0x02, 0x01, 0x04,                 // messageID
-              0x63, 0x40, 
-                0x04, 0x1F,                     // baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                0x0A, 0x01, 0x01, 
-                0x0A, 0x01, 0x03, 
-                0x02, 0x01, 0x00, 
-                0x02, 0x01, 0x00, 
-                0x01, 0x01, ( byte ) 0xFF, 
-                ( byte ) 0xA4, 0x0A, 
-                  0x04, 0x04, 't', 'e', 's', 't',
-                  0x30, 0x02, 
-                    ( byte ) 0x80, 0x00, 
-                0x30, 0x02,                     // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
-                  0x04, 0x00 
-            };
+            { 0x30, 0x45,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x40,
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
+                0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x0A, 0x04, 0x04, 't', 'e', 's', 't',
+                0x30, 0x02, ( byte ) 0x80, 0x00, 0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
+                0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
 
@@ -1533,25 +1599,19 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterEmptyAny()
     {
         byte[] asn1BER = new byte[]
-            { 
-            0x30, 0x45, 
-              0x02, 0x01, 0x04,                 // messageID
-              0x63, 0x40, 
-                0x04, 0x1F,                     // baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                0x0A, 0x01, 0x01, 
-                0x0A, 0x01, 0x03, 
-                0x02, 0x01, 0x00, 
-                0x02, 0x01, 0x00, 
-                0x01, 0x01, ( byte ) 0xFF, 
-                ( byte ) 0xA4, 0x0A, 
-                  0x04, 0x04, 't', 'e', 's', 't',
-                  0x30, 0x02, 
-                    ( byte ) 0x81, 0x00, 
-                0x30, 0x02,                     // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
-                  0x04, 0x00 
-            };
+            { 0x30, 0x45,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x40,
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
+                0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x0A, 0x04, 0x04, 't', 'e', 's', 't',
+                0x30, 0x02, ( byte ) 0x81, 0x00, 0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
+                0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
 
@@ -1585,25 +1645,19 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterEmptyFinal()
     {
         byte[] asn1BER = new byte[]
-            { 
-            0x30, 0x45, 
-              0x02, 0x01, 0x04,                 // messageID
-              0x63, 0x40, 
-                0x04, 0x1F,                     // baseObject LDAPDN,
-                  'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
-                  'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 
-                0x0A, 0x01, 0x01, 
-                0x0A, 0x01, 0x03, 
-                0x02, 0x01, 0x00, 
-                0x02, 0x01, 0x00, 
-                0x01, 0x01, ( byte ) 0xFF, 
-                ( byte ) 0xA4, 0x0A, 
-                  0x04, 0x04, 't', 'e', 's', 't',
-                  0x30, 0x02, 
-                    ( byte ) 0x82, 0x00, 
-                0x30, 0x02,                     // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
-                  0x04, 0x00 
-            };
+            { 0x30, 0x45,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x40,
+                0x04,
+                0x1F, // baseObject LDAPDN,
+                'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
+                'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
+                0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x0A, 0x04, 0x04, 't', 'e', 's', 't',
+                0x30, 0x02, ( byte ) 0x82, 0x00, 0x30, 0x02, // AttributeDescriptionList ::= SEQUENCE OF AttributeDescription
+                0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
 
@@ -1637,16 +1691,22 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterAnyInitial()
     {
         byte[] asn1BER = new byte[]
-            { 0x30, 0x49, 0x02, 0x01, 0x04, // messageID
-                0x63, 0x44, 0x04, 0x1F, // baseObject LDAPDN,
+            { 0x30, 0x49,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x44,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
                 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x0E, 0x04, 0x04, 't', 'e', 's', 't',
                 0x30, 0x06, ( byte ) 0x81, 0x01, 'a', ( byte ) 0x80, 0x01, 'b', 0x30, 0x02, // AttributeDescriptionList
-                                                                                            // ::=
-                                                                                            // SEQUENCE
-                                                                                            // OF
-                                                                                            // AttributeDescription
+                // ::=
+                // SEQUENCE
+                // OF
+                // AttributeDescription
                 0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
@@ -1681,16 +1741,22 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterFinalInitial()
     {
         byte[] asn1BER = new byte[]
-            { 0x30, 0x49, 0x02, 0x01, 0x04, // messageID
-                0x63, 0x44, 0x04, 0x1F, // baseObject LDAPDN,
+            { 0x30, 0x49,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x44,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
                 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x0E, 0x04, 0x04, 't', 'e', 's', 't',
                 0x30, 0x06, ( byte ) 0x82, 0x01, 'a', ( byte ) 0x80, 0x01, 'b', 0x30, 0x02, // AttributeDescriptionList
-                                                                                            // ::=
-                                                                                            // SEQUENCE
-                                                                                            // OF
-                                                                                            // AttributeDescription
+                // ::=
+                // SEQUENCE
+                // OF
+                // AttributeDescription
                 0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
@@ -1725,16 +1791,22 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterFinalAny()
     {
         byte[] asn1BER = new byte[]
-            { 0x30, 0x49, 0x02, 0x01, 0x04, // messageID
-                0x63, 0x44, 0x04, 0x1F, // baseObject LDAPDN,
+            { 0x30, 0x49,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x44,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
                 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x0E, 0x04, 0x04, 't', 'e', 's', 't',
                 0x30, 0x06, ( byte ) 0x82, 0x01, 'a', ( byte ) 0x81, 0x01, 'b', 0x30, 0x02, // AttributeDescriptionList
-                                                                                            // ::=
-                                                                                            // SEQUENCE
-                                                                                            // OF
-                                                                                            // AttributeDescription
+                // ::=
+                // SEQUENCE
+                // OF
+                // AttributeDescription
                 0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
@@ -1768,16 +1840,22 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterTwoInitials()
     {
         byte[] asn1BER = new byte[]
-            { 0x30, 0x49, 0x02, 0x01, 0x04, // messageID
-                0x63, 0x44, 0x04, 0x1F, // baseObject LDAPDN,
+            { 0x30, 0x49,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x44,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
                 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x0E, 0x04, 0x04, 't', 'e', 's', 't',
                 0x30, 0x06, ( byte ) 0x80, 0x01, 'a', ( byte ) 0x80, 0x01, 'b', 0x30, 0x02, // AttributeDescriptionList
-                                                                                            // ::=
-                                                                                            // SEQUENCE
-                                                                                            // OF
-                                                                                            // AttributeDescription
+                // ::=
+                // SEQUENCE
+                // OF
+                // AttributeDescription
                 0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();
@@ -1811,16 +1889,22 @@ public class SearchRequestSubstringTest
     public void testDecodeSearchRequestSubstringFilterTwoFinals()
     {
         byte[] asn1BER = new byte[]
-            { 0x30, 0x49, 0x02, 0x01, 0x04, // messageID
-                0x63, 0x44, 0x04, 0x1F, // baseObject LDAPDN,
+            { 0x30, 0x49,
+                0x02,
+                0x01,
+                0x04, // messageID
+                0x63,
+                0x44,
+                0x04,
+                0x1F, // baseObject LDAPDN,
                 'u', 'i', 'd', '=', 'a', 'k', 'a', 'r', 'a', 's', 'u', 'l', 'u', ',', 'd', 'c', '=', 'e', 'x', 'a',
                 'm', 'p', 'l', 'e', ',', 'd', 'c', '=', 'c', 'o', 'm', 0x0A, 0x01, 0x01, 0x0A, 0x01, 0x03, 0x02, 0x01,
                 0x00, 0x02, 0x01, 0x00, 0x01, 0x01, ( byte ) 0xFF, ( byte ) 0xA4, 0x0E, 0x04, 0x04, 't', 'e', 's', 't',
                 0x30, 0x06, ( byte ) 0x82, 0x01, 'a', ( byte ) 0x82, 0x01, 'b', 0x30, 0x02, // AttributeDescriptionList
-                                                                                            // ::=
-                                                                                            // SEQUENCE
-                                                                                            // OF
-                                                                                            // AttributeDescription
+                // ::=
+                // SEQUENCE
+                // OF
+                // AttributeDescription
                 0x04, 0x00 };
 
         Asn1Decoder ldapDecoder = new Asn1Decoder();