You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2011/03/19 18:51:07 UTC

svn commit: r1083238 [1/2] - in /directory: apacheds/trunk/core/src/test/java/org/apache/directory/server/core/authz/support/ shared/trunk/i18n/src/main/java/org/apache/directory/shared/i18n/ shared/trunk/i18n/src/main/resources/org/apache/directory/sh...

Author: elecharny
Date: Sat Mar 19 17:51:06 2011
New Revision: 1083238

URL: http://svn.apache.org/viewvc?rev=1083238&view=rev
Log:
o Modified some error message
o Correctly injecting the SchemaManager in Rdn when normalizing it
o Fixed the tests to use valid RDN and DN (DN and RDN that can be parsed by a schema manager aware parser)
o Moved some tests in shared-integ

Added:
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/AvaTest.java
      - copied, changed from r1083163, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/AvaTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/DnTest.java
      - copied, changed from r1083106, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/DnTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/MultiThreadedTest.java
      - copied, changed from r1082924, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/MultiThreadedTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareAvaSerializationTest.java
      - copied, changed from r1083011, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareAvaSerializationTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareDnSerializationTest.java
      - copied, changed from r1083106, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareDnSerializationTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnSerializationTest.java
      - copied, changed from r1083011, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareRdnSerializationTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnTest.java
Removed:
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/
Modified:
    directory/apacheds/trunk/core/src/test/java/org/apache/directory/server/core/authz/support/RelatedUserClassFilterTest.java
    directory/shared/trunk/i18n/src/main/java/org/apache/directory/shared/i18n/I18n.java
    directory/shared/trunk/i18n/src/main/resources/org/apache/directory/shared/i18n/errors.properties
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemChekerTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemParserTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/ACIItemSyntaxCheckerTest.java
    directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/subtree/SubtreeSpecificationParserTest.java
    directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/entry/DefaultEntryAttribute.java
    directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/name/ComplexDnParser.java
    directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/name/Dn.java
    directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/name/Rdn.java
    directory/shared/trunk/ldap/model/src/main/java/org/apache/directory/shared/ldap/model/schema/registries/DefaultSchemaObjectRegistry.java

Modified: directory/apacheds/trunk/core/src/test/java/org/apache/directory/server/core/authz/support/RelatedUserClassFilterTest.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/test/java/org/apache/directory/server/core/authz/support/RelatedUserClassFilterTest.java?rev=1083238&r1=1083237&r2=1083238&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/test/java/org/apache/directory/server/core/authz/support/RelatedUserClassFilterTest.java (original)
+++ directory/apacheds/trunk/core/src/test/java/org/apache/directory/server/core/authz/support/RelatedUserClassFilterTest.java Sat Mar 19 17:51:06 2011
@@ -290,7 +290,7 @@ public class RelatedUserClassFilterTest
             
             try
             {
-                names.add( new Dn( schemaManager, "dummy=dummy" ) );
+                names.add( new Dn( schemaManager, "cn=dummy" ) );
             }
             catch ( LdapInvalidDnException e )
             {

Modified: directory/shared/trunk/i18n/src/main/java/org/apache/directory/shared/i18n/I18n.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/i18n/src/main/java/org/apache/directory/shared/i18n/I18n.java?rev=1083238&r1=1083237&r2=1083238&view=diff
==============================================================================
--- directory/shared/trunk/i18n/src/main/java/org/apache/directory/shared/i18n/I18n.java (original)
+++ directory/shared/trunk/i18n/src/main/java/org/apache/directory/shared/i18n/I18n.java Sat Mar 19 17:51:06 2011
@@ -343,7 +343,7 @@ public enum I18n
     ERR_04206( "ERR_04206" ),
     ERR_04207( "ERR_04207" ),
     ERR_04208( "ERR_04208" ),
-    ERR_04209( "ERR_04209" ),
+    ERR_04209_EMPTY_TYPE_NOT_ALLOWED( "ERR_04209_EMPTY_TYPE_NOT_ALLOWED" ),
     ERR_04210( "ERR_04210" ),
     ERR_04211( "ERR_04211" ),
     ERR_04212( "ERR_04212" ),
@@ -402,7 +402,7 @@ public enum I18n
     ERR_04265( "ERR_04265" ),
     ERR_04266( "ERR_04266" ),
     ERR_04267( "ERR_04267" ),
-    ERR_04268( "ERR_04268" ),
+    ERR_04268_OID_NOT_FOUND( "ERR_04268_OID_NOT_FOUND" ),
     ERR_04269( "ERR_04269" ),
     ERR_04270( "ERR_04270" ),
     ERR_04271( "ERR_04271" ),
@@ -576,7 +576,7 @@ public enum I18n
     ERR_04439( "ERR_04439" ),
     ERR_04440( "ERR_04440" ),
     ERR_04441( "ERR_04441" ),
-    ERR_04442_NULL_AT_NOT_ALLOWED( "ERR_04442_NULL_AT_NOT_ALLOWED" ),
+    ERR_04442_NOT_EXISTING_ATRIBUTE_TYPE( "ERR_04442_NOT_EXISTING_ATRIBUTE_TYPE" ),
     ERR_04443( "ERR_04443" ),
     ERR_04444( "ERR_04444" ),
     ERR_04445( "ERR_04445" ),

Modified: directory/shared/trunk/i18n/src/main/resources/org/apache/directory/shared/i18n/errors.properties
URL: http://svn.apache.org/viewvc/directory/shared/trunk/i18n/src/main/resources/org/apache/directory/shared/i18n/errors.properties?rev=1083238&r1=1083237&r2=1083238&view=diff
==============================================================================
--- directory/shared/trunk/i18n/src/main/resources/org/apache/directory/shared/i18n/errors.properties (original)
+++ directory/shared/trunk/i18n/src/main/resources/org/apache/directory/shared/i18n/errors.properties Sat Mar 19 17:51:06 2011
@@ -308,7 +308,7 @@ ERR_04182=Count not invoke the Provider'
 ERR_04183=Count not invoke the Provider's factory method: {0}.getProvider() - it does seem to be a public method!
 ERR_04184=Call to Provider's factory method\: {0}.getProvider() threw the following exception\:\n{1}
 ERR_04185=RFC 2251 [Section 4.11]: Abandon, Bind, Unbind, and StartTLS operations cannot be abandoned.
-ERR_04186=Unrecogniced value ''{0}'' for {1} JNDI property.\nExpected a value of either always, never, searching, or finding.
+ERR_04186=Unrecognized value ''{0}'' for {1} JNDI property.\nExpected a value of either always, never, searching, or finding.
 ERR_04187=Class has bug: check for valid enumeration values
 ERR_04188=The type cannot be empty or null
 ERR_04189=The User Provided type cannot be empty or null
@@ -331,7 +331,7 @@ ERR_04205=Exceeded number of elements in
 ERR_04206=The posn({0}) should be in the range [0, {1}]
 ERR_04207=The clone operation has failed
 ERR_04208=Assertion failure : cannot clone the object
-ERR_04209=Empty type not allowed in a DN
+ERR_04209_EMPTY_TYPE_NOT_ALLOWED=Empty type not allowed in a DN
 ERR_04210=Cannot serialize a NULL DN
 ERR_04211=The DN should have been normalized before being serialized
 ERR_04212=The DN should have been normalized before being serialized {0}
@@ -390,7 +390,7 @@ ERR_04264=DITStructureRule with RuleId {
 ERR_04265=DITStructureRule for ruleId {0} does not exist!
 ERR_04266=name cannot be null
 ERR_04267=Looks like the arg is not a numeric OID
-ERR_04268=OID {0} not found in oid to schema name map!
+ERR_04268_OID_NOT_FOUND=OID '{0}' not found in oid to schema name map!
 ERR_04269={0} for OID {1} does not exist!
 ERR_04270={0} with OID {1} already registered!
 ERR_04271={0} with name {1} already registered!
@@ -564,7 +564,7 @@ ERR_04438=The style must not be null
 ERR_04439=Usage - java org.mortbay.util.UnixCrypt <key> <salt>
 ERR_04440=Crypt={0}
 ERR_04441=Cannot modify the SchemaObject {0}, it has been locked
-ERR_04442_NULL_AT_NOT_ALLOWED=The AttributeType parameter should not be null
+ERR_04442_NOT_EXISTING_ATRIBUTE_TYPE=The AttributeType {0} does not exist
 ERR_04443=Failed to compare normalized values for {0} and {1}
 ERR_04444=I don't really know how to compare anything other than ServerBinaryValues at this point in time.
 ERR_04445=There is no Syntax associated with this attributeType

Modified: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemChekerTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemChekerTest.java?rev=1083238&r1=1083237&r2=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemChekerTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemChekerTest.java Sat Mar 19 17:51:06 2011
@@ -25,8 +25,6 @@ import static org.junit.Assert.fail;
 
 import java.text.ParseException;
 
-import com.mycila.junit.concurrent.Concurrency;
-import com.mycila.junit.concurrent.ConcurrentJunitRunner;
 import org.apache.directory.shared.ldap.model.schema.SchemaManager;
 import org.apache.directory.shared.ldap.schemaloader.JarLdifSchemaLoader;
 import org.apache.directory.shared.ldap.schemamanager.impl.DefaultSchemaManager;
@@ -34,6 +32,9 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import com.mycila.junit.concurrent.Concurrency;
+import com.mycila.junit.concurrent.ConcurrentJunitRunner;
+
 
 /**
  * Unit tests class for ACIItem checker (wrapper).
@@ -93,7 +94,7 @@ public class ACIItemChekerTest
             "         userClasses " +
             "         {" +
             "           allUsers  , " +
-            "           userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } ," +
+            "           userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } ," +
             "           subtree { { base \"ou=people\" } } " +
             "         }   , " +
             "         grantsAndDenials  {  denyCompare  , grantModify } " +
@@ -103,7 +104,7 @@ public class ACIItemChekerTest
             "         userClasses " +
             "         {" +
             "           allUsers  , " +
-            "           userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } ," +
+            "           userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } ," +
             "           subtree { { base \"ou=people\" } } " +
             "         }   , " +
             "         grantsAndDenials  {  denyCompare  , grantModify } " +
@@ -126,7 +127,7 @@ public class ACIItemChekerTest
             + "itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
             + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
             + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
+            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {cn=y,sn=n,dc=l} , "
             + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }  }   ";
 
         checker.parse( spec );
@@ -162,9 +163,9 @@ public class ACIItemChekerTest
             + "itemOrUserFirst itemFirst  :{ protectedItems  { attributeType { 1.2.3    , ou }, entry , "
             + " rangeOfValues (cn=ErsinEr) , attributeValue { ou=people  , cn=Ersin  },"
             + "classes and : { item: xyz , or:{item:X,item:Y}   }}  , "
-            + "itemPermissions { { userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "itemPermissions { { userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } },"
-            + "{ precedence 10, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "{ precedence 10, userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } } } }}";
 
         checker.parse( spec );
@@ -178,7 +179,7 @@ public class ACIItemChekerTest
             + "itemOrUserFirst userFirst:  { userClasses {  name { \"ou=people,cn=ersin\" }, allUsers, "
             + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
             + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
+            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {dc=y,sn=n,dc=l} , "
             + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }  }   ";
 
         checker.parse( spec );
@@ -192,9 +193,9 @@ public class ACIItemChekerTest
             + "itemOrUserFirst itemFirst  :{ protectedItems  { attributeType { 1.2.3    , ou }, entry , "
             + " rangeOfValues (cn=ErsinEr) , attributeValue { ou=people  , cn=Ersin  },"
             + "classes and : { item: xyz , or:{item:X,item:Y}   }}  , "
-            + "itemPermissions { { grantsAndDenials  {  denyCompare  , grantModify }, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "itemPermissions { { grantsAndDenials  {  denyCompare  , grantModify }, userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   },"
-            + "{ precedence 10, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "{ precedence 10, userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } } } }}";
 
         checker.parse( spec );
@@ -208,7 +209,7 @@ public class ACIItemChekerTest
             + "itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
             + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
             + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { grantsAndDenials { grantBrowse }, protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
+            + "userPermissions { { grantsAndDenials { grantBrowse }, protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {cn=y,sn=n,dc=l} , "
             + "rangeOfValues (cn=ErsinEr) }  } } }  }   ";
 
         checker.parse( spec );
@@ -221,7 +222,7 @@ public class ACIItemChekerTest
         String spec = "{   itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
             + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
             + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
+            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {cn=y,sn=n,dc=l} , "
             + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }, "
             + " identificationTag \"id2\"   , authenticationLevel none, precedence 14 }   ";
 

Modified: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemParserTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemParserTest.java?rev=1083238&r1=1083237&r2=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemParserTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/aci/ACIItemParserTest.java Sat Mar 19 17:51:06 2011
@@ -27,8 +27,6 @@ import static org.junit.Assert.fail;
 
 import java.text.ParseException;
 
-import com.mycila.junit.concurrent.Concurrency;
-import com.mycila.junit.concurrent.ConcurrentJunitRunner;
 import org.apache.directory.shared.ldap.model.schema.SchemaManager;
 import org.apache.directory.shared.ldap.schemaloader.JarLdifSchemaLoader;
 import org.apache.directory.shared.ldap.schemamanager.impl.DefaultSchemaManager;
@@ -36,6 +34,9 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import com.mycila.junit.concurrent.Concurrency;
+import com.mycila.junit.concurrent.ConcurrentJunitRunner;
+
 /**
  * Unit tests class for ACIItem parser (wrapper).
  * 
@@ -120,7 +121,7 @@ public class ACIItemParserTest
             "      userClasses " +
             "        {" +
             "          allUsers  , " +
-            "          userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } , " +
+            "          userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } , " +
             "          subtree { { base \"ou=people\" } } " +
             "        }   , " +
             "      grantsAndDenials  {  denyCompare  , grantModify } " +
@@ -130,7 +131,7 @@ public class ACIItemParserTest
             "      userClasses " +
             "      {" +
             "        allUsers  , " +
-            "        userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } ," +
+            "        userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } ," +
             "        subtree { { base \"ou=people\" } } " +
             "      }   , " +
             "      grantsAndDenials  {  denyCompare  , grantModify } } " +
@@ -149,12 +150,42 @@ public class ACIItemParserTest
     @Test 
     public void testUserFirst() throws Exception
     {
-        String spec = "{ identificationTag \"id2\"   , precedence 14, authenticationLevel none  , "
-            + "itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
-            + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
-            + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
-            + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }  }   ";
+        String spec = 
+            "{ " +
+            "  identificationTag \"id2\"   , " +
+            "  precedence 14, " +
+            "  authenticationLevel none  , " +
+            "  itemOrUserFirst userFirst:  " +
+            "  { " +
+            "    userClasses " +
+            "    {  " +
+            "      allUsers  , " +
+            "      name { \"ou=people,cn=ersin\" }, " +
+            "      subtree " +
+            "      {" +
+            "        { base \"ou=system\" }, " +
+            "        { " +
+            "          base \"ou=ORGANIZATIONUNIT\"," +
+            "          minimum  1, " +
+            "          maximum   2 " +
+            "        } " +
+            "      } " +
+            "    }  , " +
+            "    userPermissions " +
+            "    { " +
+            "      { " +
+            "        protectedItems" +
+            "        { " +
+            "          entry  , " +
+            "          attributeType { cn  , ou }  , " +
+            "          attributeValue {cn=y,sn=n,dc=l} , " +
+            "          rangeOfValues (cn=ErsinEr) " +
+            "        }  , " +
+            "        grantsAndDenials { grantBrowse } " +
+            "      } " +
+            "    } " +
+            "  }  " +
+            "}   ";
 
         ACIItem item = parser.parse( spec );
         checkItemToString( spec, item );
@@ -188,14 +219,54 @@ public class ACIItemParserTest
     @Test 
     public void testOrderOfProtectedItemsDoesNotMatter() throws Exception
     {
-        String spec = " {  identificationTag  \"id1\" , precedence 114  , authenticationLevel simple  , "
-            + "itemOrUserFirst itemFirst  :{ protectedItems  { attributeType { 1.2.3    , ou }, entry , "
-            + " rangeOfValues (cn=ErsinEr) , attributeValue { ou=people  , cn=Ersin  },"
-            + "classes and : { item: xyz , or:{item:X,item:Y}   }}  , "
-            + "itemPermissions { { userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
-            + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } },"
-            + "{ precedence 10, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
-            + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } } } }}";
+        String spec = 
+            " {  " +
+            "   identificationTag  \"id1\" , " +
+            "   precedence 114  , " +
+            "   authenticationLevel simple  , " +
+            "   itemOrUserFirst itemFirst  :" +
+            "   { " +
+            "     protectedItems  " +
+            "     { " +
+            "       attributeType { 2.5.4.3    , ou }, " +
+            "       entry , " +
+            "       rangeOfValues (cn=ErsinEr) , " +
+            "       attributeValue { ou=people  , cn=Ersin  }," +
+            "       classes and : " +
+            "       { item: xyz , or:{item:X,item:Y}   }" +
+            "     }  , " +
+            "     itemPermissions " +
+            "     { " +
+            "       { " +
+            "         userClasses " +
+            "         {" +
+            "           allUsers  , " +
+            "           userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,sn=d\" } " +
+            "           , " +
+            "           subtree " +
+            "           { " +
+            "             { base \"ou=people\" } " +
+            "           } " +
+            "         }   , " +
+            "         grantsAndDenials  " +
+            "         {  " +
+            "           denyCompare  , " +
+            "           grantModify " +
+            "         } " +
+            "       }," +
+            "       { " +
+            "         precedence 10, " +
+            "         userClasses " +
+            "         {" +
+            "           allUsers  , " +
+            "           userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } " +
+            "           , subtree { { base \"ou=people\" } } " +
+            "         }   , " +
+            "         grantsAndDenials  {  denyCompare  , grantModify } " +
+            "       } " +
+            "     } " +
+            "   }" +
+            " }";
 
         ACIItem item = parser.parse( spec );
         checkItemToString( spec, item );
@@ -205,12 +276,42 @@ public class ACIItemParserTest
     @Test 
     public void testOrderOfUserClassesDoesNotMatter() throws Exception
     {
-        String spec = "{ identificationTag \"id2\"   , precedence 14, authenticationLevel none  , "
-            + "itemOrUserFirst userFirst:  { userClasses {  name { \"ou=people,cn=ersin\" }, allUsers, "
-            + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
-            + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
-            + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }  }   ";
+        String spec = 
+            "{ " +
+            "  identificationTag \"id2\"   , " +
+            "  precedence 14, " +
+            "  authenticationLevel none  , " +
+            "  itemOrUserFirst userFirst:  " +
+            "  { " +
+            "    userClasses " +
+            "    {  " +
+            "      name { \"ou=people,cn=ersin\" }, " +
+            "      allUsers, " +
+            "      subtree " +
+            "      {" +
+            "        { base \"ou=system\" }, " +
+            "        { " +
+            "          base \"ou=ORGANIZATIONUNIT\"," +
+            "          minimum  1, " +
+            "          maximum   2 " +
+            "        } " +
+            "      } " +
+            "    }  , " +
+            "    userPermissions " +
+            "    { " +
+            "      { " +
+            "        protectedItems" +
+            "        { " +
+            "          entry  , " +
+            "          attributeType { cn  , ou }  , " +
+            "          attributeValue {cn=y,sn=n,dc=l} , " +
+            "          rangeOfValues (cn=ErsinEr) " +
+            "        }  , " +
+            "        grantsAndDenials { grantBrowse } " +
+            "      } " +
+            "    } " +
+            "  }  " +
+            "}";
 
         ACIItem item = parser.parse( spec );
         checkItemToString( spec, item );
@@ -266,14 +367,48 @@ public class ACIItemParserTest
     @Test 
     public void testItemPermissionComponentsOrderDoesNotMatter() throws Exception
     {
-        String spec = " {  identificationTag  \"id1\" , precedence 114  , authenticationLevel simple  , "
-            + "itemOrUserFirst itemFirst  :{ protectedItems  { attributeType { 1.2.3    , ou }, entry , "
-            + " rangeOfValues (cn=ErsinEr) , attributeValue { ou=people  , cn=Ersin  },"
-            + "classes and : { item: xyz , or:{item:X,item:Y}   }}  , "
-            + "itemPermissions { { grantsAndDenials  {  denyCompare  , grantModify }, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
-            + " , subtree { { base \"ou=people\" } } }   },"
-            + "{ precedence 10, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
-            + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } } } }}";
+        String spec = 
+            " {  " +
+            "   identificationTag  \"id1\" , " +
+            "   precedence 114  , " +
+            "   authenticationLevel simple  , " +
+            "   itemOrUserFirst itemFirst  :" +
+            "   { " +
+            "     protectedItems  " +
+            "     { " +
+            "       attributeType { 2.5.4.3    , ou }, " +
+            "       entry , " +
+            "       rangeOfValues (cn=ErsinEr) , " +
+            "       attributeValue { ou=people  , cn=Ersin  }," +
+            "       classes and : { item: xyz , or:{item:X,item:Y}   }" +
+            "     }  , " +
+            "     itemPermissions " +
+            "     { " +
+            "       { " +
+            "         grantsAndDenials  " +
+            "         {  " +
+            "           denyCompare  , grantModify " +
+            "         }, " +
+            "         userClasses " +
+            "         {" +
+            "           allUsers  , " +
+            "           userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } " +
+            "           , subtree { { base \"ou=people\" } } " +
+            "         }   " +
+            "       }," +
+            "       { " +
+            "         precedence 10, " +
+            "         userClasses " +
+            "         {" +
+            "           allUsers  , " +
+            "           userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } " +
+            "           , subtree { { base \"ou=people\" } } " +
+            "         }   , " +
+            "         grantsAndDenials  {  denyCompare  , grantModify } " +
+            "       } " +
+            "     } " +
+            "   }" +
+            " }";
 
         ACIItem item = parser.parse( spec );
         checkItemToString( spec, item );
@@ -308,12 +443,42 @@ public class ACIItemParserTest
     @Test 
     public void testUserPermissionComponentsOrderDoesNotMatter() throws Exception
     {
-        String spec = "{ identificationTag \"id2\"   , precedence 14, authenticationLevel none  , "
-            + "itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
-            + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
-            + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { grantsAndDenials { grantBrowse }, protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
-            + "rangeOfValues (cn=ErsinEr) }  } } }  }   ";
+        String spec = 
+            "{ " +
+            "  identificationTag \"id2\"   , " +
+            "  precedence 14, " +
+            "  authenticationLevel none  , " +
+            "  itemOrUserFirst userFirst:  " +
+            "  { " +
+            "    userClasses " +
+            "    {  " +
+            "      allUsers  , " +
+            "      name { \"ou=people,cn=ersin\" }, " +
+            "      subtree " +
+            "      {" +
+            "        { base \"ou=system\" }, " +
+            "        { " +
+            "          base \"ou=ORGANIZATIONUNIT\"," +
+            "          minimum  1, " +
+            "          maximum   2 " +
+            "        } " +
+            "      } " +
+            "    }  , " +
+            "    userPermissions " +
+            "    { " +
+            "      { " +
+            "        grantsAndDenials { grantBrowse }, " +
+            "        protectedItems" +
+            "        { " +
+            "          entry  , " +
+            "          attributeType { cn  , ou }  , " +
+            "          attributeValue {cn=y,sn=n,dc=l} , " +
+            "          rangeOfValues (cn=ErsinEr) " +
+            "        }  " +
+            "      } " +
+            "    } " +
+            "  }  " +
+            "}   ";
 
         ACIItem item = parser.parse( spec );
         checkItemToString( spec, item );
@@ -345,12 +510,42 @@ public class ACIItemParserTest
     @Test 
     public void testOrderOfMainACIComponentsDoesNotMatter() throws Exception
     {
-        String spec = "{   itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
-            + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
-            + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
-            + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }, "
-            + " identificationTag \"id2\"   , authenticationLevel none, precedence 14 }   ";
+        String spec = 
+            "{   " +
+            "  itemOrUserFirst userFirst:  " +
+            "  { " +
+            "    userClasses " +
+            "    {  " +
+            "      allUsers  , " +
+            "      name { \"ou=people,cn=ersin\" }, " +
+            "      subtree " +
+            "      {" +
+            "        { base \"ou=system\" }, " +
+            "        { " +
+            "          base \"ou=ORGANIZATIONUNIT\"," +
+            "          minimum  1, " +
+            "          maximum   2 " +
+            "        } " +
+            "      } " +
+            "    }  , " +
+            "    userPermissions " +
+            "    { " +
+            "      { " +
+            "        protectedItems" +
+            "        { " +
+            "          entry  , " +
+            "          attributeType { cn  , ou }  , " +
+            "          attributeValue {cn=y,sn=n,dc=l} , " +
+            "          rangeOfValues (cn=ErsinEr) " +
+            "        }  , " +
+            "        grantsAndDenials { grantBrowse } " +
+            "      } " +
+            "    } " +
+            "  }, " +
+            "  identificationTag \"id2\"   , " +
+            "  authenticationLevel none, " +
+            "  precedence 14 " +
+            "}   ";
 
         ACIItem item = parser.parse( spec );
         checkItemToString( spec, item );
@@ -536,12 +731,42 @@ public class ACIItemParserTest
     @Test 
     public void testUserClassParentOfEntry() throws Exception
     {
-        String spec = "{ identificationTag \"id\"   , precedence 10, authenticationLevel none  , "
-            + "itemOrUserFirst userFirst:  { userClasses {  parentOfEntry  , name { \"cn=ersin,ou=people\" }, "
-            + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
-            + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
-            + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }  }   ";
+        String spec = 
+            "{ " +
+            "  identificationTag \"id\"   , " +
+            "  precedence 10, " +
+            "  authenticationLevel none  , " +
+            "  itemOrUserFirst userFirst:  " +
+            "  { " +
+            "    userClasses " +
+            "    {  " +
+            "      parentOfEntry  , " +
+            "      name { \"cn=ersin,ou=people\" }, " +
+            "      subtree " +
+            "      {" +
+            "        { base \"ou=system\" }, " +
+            "        { " +
+            "          base \"ou=ORGANIZATIONUNIT\"," +
+            "          minimum  1, " +
+            "          maximum   2 " +
+            "        } " +
+            "      } " +
+            "    }  , " +
+            "    userPermissions " +
+            "    { " +
+            "      { " +
+            "        protectedItems" +
+            "        { " +
+            "          entry  , " +
+            "          attributeType { cn  , ou }  , " +
+            "          attributeValue {cn=y,sn=n,dc=l} , " +
+            "          rangeOfValues (cn=ErsinEr) " +
+            "        }  , " +
+            "        grantsAndDenials { grantBrowse } " +
+            "      } " +
+            "    } " +
+            "  } " +
+            "}   ";
 
         ACIItem item = parser.parse( spec );
         checkItemToString( spec, item );

Copied: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/AvaTest.java (from r1083163, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/AvaTest.java)
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/AvaTest.java?p2=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/AvaTest.java&p1=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/AvaTest.java&r1=1083163&r2=1083238&rev=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/AvaTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/AvaTest.java Sat Mar 19 17:51:06 2011
@@ -17,7 +17,7 @@
  *  under the License. 
  *  
  */
-package org.apache.directory.shared.ldap.name;
+package org.apache.directory.shared.ldap.model.name;
 
 
 import static org.junit.Assert.assertEquals;

Copied: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/DnTest.java (from r1083106, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/DnTest.java)
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/DnTest.java?p2=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/DnTest.java&p1=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/DnTest.java&r1=1083106&r2=1083238&rev=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/DnTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/DnTest.java Sat Mar 19 17:51:06 2011
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.directory.shared.ldap.name;
+package org.apache.directory.shared.ldap.model.name;
 
 
 import static junit.framework.Assert.assertNotNull;

Copied: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/MultiThreadedTest.java (from r1082924, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/MultiThreadedTest.java)
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/MultiThreadedTest.java?p2=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/MultiThreadedTest.java&p1=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/MultiThreadedTest.java&r1=1082924&r2=1083238&rev=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/MultiThreadedTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/MultiThreadedTest.java Sat Mar 19 17:51:06 2011
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.directory.shared.ldap.name;
+package org.apache.directory.shared.ldap.model.name;
 
 
 import static org.junit.Assert.assertEquals;

Copied: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareAvaSerializationTest.java (from r1083011, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareAvaSerializationTest.java)
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareAvaSerializationTest.java?p2=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareAvaSerializationTest.java&p1=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareAvaSerializationTest.java&r1=1083011&r2=1083238&rev=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareAvaSerializationTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareAvaSerializationTest.java Sat Mar 19 17:51:06 2011
@@ -17,7 +17,7 @@
  *  under the License. 
  *  
  */
-package org.apache.directory.shared.ldap.name;
+package org.apache.directory.shared.ldap.model.name;
 
 
 import static org.junit.Assert.assertEquals;

Copied: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareDnSerializationTest.java (from r1083106, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareDnSerializationTest.java)
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareDnSerializationTest.java?p2=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareDnSerializationTest.java&p1=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareDnSerializationTest.java&r1=1083106&r2=1083238&rev=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareDnSerializationTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareDnSerializationTest.java Sat Mar 19 17:51:06 2011
@@ -17,7 +17,7 @@
  *  under the License. 
  *  
  */
-package org.apache.directory.shared.ldap.name;
+package org.apache.directory.shared.ldap.model.name;
 
 import static org.junit.Assert.assertEquals;
 

Copied: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnSerializationTest.java (from r1083011, directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareRdnSerializationTest.java)
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnSerializationTest.java?p2=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnSerializationTest.java&p1=directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareRdnSerializationTest.java&r1=1083011&r2=1083238&rev=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/name/SchemaAwareRdnSerializationTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnSerializationTest.java Sat Mar 19 17:51:06 2011
@@ -17,7 +17,7 @@
  *  under the License. 
  *  
  */
-package org.apache.directory.shared.ldap.name;
+package org.apache.directory.shared.ldap.model.name;
 
 import static org.junit.Assert.assertEquals;
 

Added: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnTest.java?rev=1083238&view=auto
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnTest.java (added)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/model/name/SchemaAwareRdnTest.java Sat Mar 19 17:51:06 2011
@@ -0,0 +1,1227 @@
+/*
+ *  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.directory.shared.ldap.model.name;
+
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Iterator;
+
+import org.apache.directory.shared.ldap.model.exception.LdapException;
+import org.apache.directory.shared.ldap.model.schema.SchemaManager;
+import org.apache.directory.shared.ldap.schemamanager.impl.DefaultSchemaManager;
+import org.apache.directory.shared.util.Strings;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import com.mycila.junit.concurrent.Concurrency;
+import com.mycila.junit.concurrent.ConcurrentJunitRunner;
+
+
+/**
+ * Test the Schema aware Rdn class
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+@RunWith(ConcurrentJunitRunner.class)
+@Concurrency()
+public class SchemaAwareRdnTest
+{
+    /** A null schemaManager used in tests */
+    private static SchemaManager schemaManager;
+    
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        schemaManager = new DefaultSchemaManager();
+    }
+    
+
+    /**
+     * Test a null Rdn
+     */
+    @Test
+    public void testRdnNull()
+    {
+        assertEquals( "", new Rdn( schemaManager ).toString() );
+    }
+
+
+    /**
+     * test an empty Rdn
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnEmpty() throws LdapException
+    {
+        assertEquals( "", new Rdn( schemaManager, "" ).toString() );
+    }
+
+
+    /**
+     * test a simple Rdn : cn = b
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnSimple() throws LdapException
+    {
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn = b" ).getNormName() );
+    }
+
+
+    /**
+     * test a composite Rdn : cn = b, sn = e
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnComposite() throws LdapException
+    {
+        assertEquals( "2.5.4.3=b+2.5.4.4=d", new Rdn( schemaManager, "cn = b + sn = d" ).getNormName() );
+    }
+
+
+    /**
+     * test a composite Rdn with or without spaces: cn=b, cn =b, cn= b, cn = b, cn =
+     * b
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnCompositeWithSpace() throws LdapException
+    {
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn=b" ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, " cn=b" ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn =b" ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn= b" ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn=b " ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, " cn =b" ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, " cn= b" ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, " cn=b " ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn = b" ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn =b " ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn= b " ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, " cn = b" ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, " cn =b " ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, " cn= b " ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, "cn = b " ).getNormName() );
+        assertEquals( "2.5.4.3=b", new Rdn( schemaManager, " cn = b " ).getNormName() );
+    }
+
+
+    /**
+     * test a simple Rdn with differents separators : cn = b + sn = d
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnSimpleMultivaluedAttribute() throws LdapException
+    {
+        String result = new Rdn( schemaManager, "cn = b + sn = d" ).getNormName();
+        assertEquals( "2.5.4.3=b+2.5.4.4=d", result );
+    }
+
+
+    /**
+     * test a composite Rdn with differents separators : cn=b+sn=d, gn=f + l=h +
+     * c=j
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnCompositeMultivaluedAttribute() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager, "cn =b+sn=d + gn=f + l  =h + c =j " );
+
+        // NameComponent are not ordered
+        assertEquals( "b", rdn.getValue( "CommonName" ) );
+        assertEquals( "d", rdn.getValue( "2.5.4.4" ) );
+        assertEquals( "f", rdn.getValue( "  gn  " ) );
+        assertEquals( "h", rdn.getValue( "L" ) );
+        assertEquals( "j", rdn.getValue( "c" ) );
+    }
+
+
+    /**
+     * test a simple Rdn with an oid prefix (uppercase) : OID.2.5.4.3 = azerty
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnOidUpper() throws LdapException
+    {
+        assertEquals( "2.5.4.3=azerty", new Rdn( schemaManager, "OID.2.5.4.3 =  azerty" ).getNormName() );
+    }
+
+
+    /**
+     * test a simple Rdn with an oid prefix (lowercase) : oid.12.34.56 = azerty
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnOidLower() throws LdapException
+    {
+        assertEquals( "2.5.4.3=azerty", new Rdn( schemaManager, "oid.2.5.4.3 = azerty" ).getNormName() );
+    }
+
+
+    /**
+     * test a simple Rdn with an oid attribut wiithout oid prefix : 2.5.4.3 =
+     * azerty
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnOidWithoutPrefix() throws LdapException
+    {
+        assertEquals( "2.5.4.3=azerty", new Rdn( schemaManager, "2.5.4.3 = azerty" ).getNormName() );
+    }
+
+
+    /**
+     * test a composite Rdn with an oid attribut wiithout oid prefix : 2.5.4.3 =
+     * azerty; 2.5.4.4 = test
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnCompositeOidWithoutPrefix() throws LdapException
+    {
+        String result = new Rdn( schemaManager, "2.5.4.3 = azerty + 2.5.4.4 = test" ).getNormName();
+        assertEquals( "2.5.4.3=azerty+2.5.4.4=test", result );
+    }
+
+
+    /**
+     * test a simple Rdn with pair char attribute value : l = \,\=\+\<\>\#\;\\\"\C3\A9"
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnPairCharAttributeValue() throws LdapException
+    {
+        String rdn = Strings.utf8ToString(new byte[]
+                {'l', '=', '\\', ',', '=', '\\', '+', '\\', '<', '\\', '>', '#', '\\', ';', '\\', '\\', '\\', '"', '\\',
+                        'C', '3', '\\', 'A', '9'});
+        assertEquals( "2.5.4.7=\\,=\\+\\<\\>#\\;\\\\\\\"\u00E9", new Rdn( schemaManager, rdn ).getNormName() );
+    }
+
+
+    /**
+     * test a simple Rdn with hexString attribute value : userCertificate = #0010A0AAFF
+     */
+    @Test
+    public void testRdnHexStringAttributeValue() throws LdapException
+    {
+        assertEquals( "2.5.4.36=#0010A0AAFF", new Rdn( schemaManager, "userCertificate = #0010A0AAFF" ).getNormName() );
+    }
+
+    /**
+     * test exception from illegal hexString attribute value : cn=#zz.
+     */
+    @Test
+    public void testBadRdnHexStringAttributeValue() throws LdapException
+    {
+        try
+        {
+            new Rdn( schemaManager, "cn=#zz" );
+            fail();
+        }
+        catch ( LdapException ine )
+        {
+            assertTrue( true );
+        }
+    }
+
+    /**
+     * test a simple Rdn with quoted attribute value : cn = "quoted \"value"
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRdnQuotedAttributeValue() throws LdapException
+    {
+        assertEquals( "2.5.4.3=quoted \\\"value", new Rdn( schemaManager, "cn = quoted \\\"value" ).getNormName() );
+    }
+
+
+    /**
+     * Test the clone method for a Rdn.
+     */
+    @Test
+    public void testParseRDNNull()
+    {
+        Rdn rdn = null;
+
+        try
+        {
+            RdnParser.parse( "cn=d", rdn );
+            fail();
+        }
+        catch ( LdapException ine )
+        {
+            assertTrue( true );
+        }
+    }
+
+
+    /**
+     * Test the clone method for a Rdn.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCloningOneNameComponent() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager, "CN", "cn", "B", "b" );
+
+        Rdn rdnClone = (Rdn) rdn.clone();
+
+        RdnParser.parse( "cn=d", rdn );
+
+        assertEquals( "b", rdnClone.getValue( "Cn" ) );
+    }
+
+
+    /**
+     * Test teh creation of a new Rdn
+     * 
+     * @throws org.apache.directory.shared.ldap.model.exception.LdapException
+     */
+    @Test
+    public void testRDNCreation() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager, "CN", "  b  " );
+        assertEquals( "2.5.4.3=b", rdn.getNormName() );
+        assertEquals( "CN=  b  ", rdn.getName() );
+    }
+
+
+    /**
+     * Test the clone method for a Rdn.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCloningTwoNameComponent() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager, "cn = b + sn = bb" );
+
+        Rdn rdnClone = (Rdn) rdn.clone();
+
+        rdn.clear();
+        RdnParser.parse( "l=d", rdn );
+
+        assertEquals( "b", rdnClone.getValue( "2.5.4.3" ) );
+        assertEquals( "bb", rdnClone.getValue( "SN" ) );
+        assertEquals( "", rdnClone.getValue( "l" ) );
+    }
+
+
+    /**
+     * Test the equals method for a Rdn.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNull() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager, " cn = b + sn = d + l = f + gn = h " );
+        Rdn rdn2 = null;
+        assertFalse( rdn1.equals( rdn2 ) );
+    }
+
+
+    /**
+     * Compares a composite NC to a single NC.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNCS2NC() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager, " cn = b + sn = d + l = f + gn = h " );
+        Rdn rdn2 = new Rdn( schemaManager, " cn = b " );
+        assertFalse( rdn1.equals( rdn2 ) );
+    }
+
+
+    /**
+     * Compares a single NC to a composite NC.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNC2NCS() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager, " sn = b " );
+        Rdn rdn2 = new Rdn( schemaManager, " cn = b + sn = d + l = f + gn = h " );
+
+        assertFalse( rdn1.equals( rdn2 ) );
+    }
+
+
+    /**
+     * Compares a composite NCS to a composite NCS in the same order.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNCS2NCSOrdered() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager, " cn = b + sn = d + gn = f + l = h " );
+        Rdn rdn2 = new Rdn( schemaManager, " cn = b + sn = d + gn = f + l = h " );
+
+        assertTrue( rdn1.equals( rdn2 ) );
+    }
+
+
+    /**
+     * Compares a composite NCS to a composite NCS in a different order.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNCS2NCSUnordered() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager, " cn = b + gn = f + l = h + sn = d " );
+        Rdn rdn2 = new Rdn( schemaManager, " cn = b + sn = d + gn = f + l = h " );
+
+        assertTrue( rdn1.equals( rdn2 ) );
+    }
+
+
+    /**
+     * Compares a composite NCS to a different composite NCS.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNCS2NCSNotEquals() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager, " cn = f + sn = h + l = d " );
+        Rdn rdn2 = new Rdn( schemaManager, " l = d + cn = h + sn = h " );
+
+        assertFalse( rdn1.equals( rdn2 ) );
+        assertFalse( rdn2.equals( rdn1 ) );
+    }
+
+
+    /**
+     * Test for DIRSHARED-2.
+     * The first ATAV is equal, the second or following ATAV differs.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testCompareSecondAtav() throws LdapException
+    {
+        // the second ATAV differs
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b + sn = d " );
+        Rdn rdn2 = new Rdn( schemaManager,  " cn = b + sn = y " );
+        assertFalse( rdn1.equals( rdn2 ) );
+        assertFalse( rdn2.equals( rdn1 ) );
+
+        // the third ATAV differs
+        Rdn rdn3 = new Rdn( schemaManager,  " cn = b + sn = d + l = f " );
+        Rdn rdn4 = new Rdn( schemaManager,  " cn = b + sn = d + l = y " );
+        assertFalse( rdn3.equals( rdn4 ) );
+        assertFalse( rdn4.equals( rdn3 ) );
+
+        // the second ATAV differs in value only
+        Rdn rdn5 = new Rdn( schemaManager,  " cn = b + sn = c " );
+        Rdn rdn6 = new Rdn( schemaManager,  " cn = b + sn = y " );
+        assertFalse( rdn5.equals( rdn6 ) );
+        assertFalse( rdn6.equals( rdn5 ) );
+    }
+
+
+    /**
+     * Test for DIRSHARED-2.
+     * The compare operation should return a correct value (1 or -1)
+     * depending on the ATAVs, not on their position.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testCompareIndependentFromOrder() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b + sn = d " );
+        Rdn rdn2 = new Rdn( schemaManager,  " sn = d + cn = b " );
+        assertTrue( rdn1.equals( rdn2 ) );
+
+        rdn1 = new Rdn( schemaManager,  " cn = b + sn = e " );
+        rdn2 = new Rdn( schemaManager,  " sn = d + cn = b " );
+        assertFalse( rdn1.equals( rdn2 ) );
+        assertFalse( rdn2.equals( rdn1 ) );
+
+        rdn1 = new Rdn( schemaManager,  " cn = b + sn = d " );
+        rdn2 = new Rdn( schemaManager,  " l = f + gn = h " );
+        assertFalse( rdn1.equals( rdn2 ) );
+        assertFalse( rdn2.equals( rdn1 ) );
+    }
+
+
+    /**
+     * Test for DIRSHARED-3.
+     * Tests that equals() is invertable for single-valued RDNs.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testCompareInvertableNC2NC() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b " );
+        Rdn rdn2 = new Rdn( schemaManager,  " cn = c " );
+        assertFalse( rdn1.equals( rdn2 ) );
+        assertFalse( rdn2.equals( rdn1 ) );
+
+    }
+
+
+    /**
+     * Test for DIRSHARED-3.
+     * Tests that equals() is invertable for multi-valued RDNs with different values.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testCompareInvertableNCS2NCSDifferentValues() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b + sn = c " );
+        Rdn rdn2 = new Rdn( schemaManager,  " cn = b + sn = y " );
+        assertFalse( rdn1.equals( rdn2 ) );
+        assertFalse( rdn2.equals( rdn1 ) );
+    }
+
+
+    /**
+     * Test for DIRSHARED-3.
+     * Tests that equals() is invertable for multi-valued RDNs with different types.
+     * 
+     * @throws org.apache.directory.shared.ldap.model.exception.LdapException
+     */
+    @Test
+    public void testCompareInvertableNCS2NCSDifferentTypes() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b + sn = d  " );
+        Rdn rdn2 = new Rdn( schemaManager,  " l = f + gn = h " );
+        assertFalse( rdn1.equals( rdn2 ) );
+        assertFalse( rdn2.equals( rdn1 ) );
+    }
+
+
+    /**
+     * Test for DIRSHARED-3.
+     * Tests that equals() is invertable for multi-valued RDNs with different order.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testCompareInvertableNCS2NCSUnordered() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " sn = d + cn = b " );
+        Rdn rdn2 = new Rdn( schemaManager,  " cn = b + l = f " );
+        assertFalse( rdn1.equals( rdn2 ) );
+        assertFalse( rdn2.equals( rdn1 ) );
+    }
+
+
+    /**
+     * Compares with a null Rdn.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNullRdn() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b " );
+
+        assertFalse( rdn1.equals( null ) );
+    }
+
+
+    /**
+     * Compares a simple NC to a simple NC.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNC2NC() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b " );
+        Rdn rdn2 = new Rdn( schemaManager,  " cn = b " );
+
+        assertTrue( rdn1.equals( rdn2 ) );
+    }
+
+
+    /**
+     * Compares a simple NC to a simple NC in UperCase.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNC2NCUperCase() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b " );
+        Rdn rdn2 = new Rdn( schemaManager,  " CN = b " );
+
+        assertTrue( rdn1.equals( rdn2 ) );
+    }
+
+
+    /**
+     * Compares a simple NC to a different simple NC.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testRDNCompareToNC2NCNotEquals() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  " cn = b " );
+        Rdn rdn2 = new Rdn( schemaManager,  " CN = d " );
+
+        assertFalse( rdn1.equals( rdn2 ) );
+    }
+
+
+    /**
+     * 
+     * Test the getValue method.
+     *
+     * @throws LdapException
+     */
+    @Test
+    public void testGetValue() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " cn = b + sn = f + gn = h + l = d " );
+
+        assertEquals( "b", rdn.getNormValue().getString() );
+    }
+
+
+    /**
+     * 
+     * Test the getType method.
+     *
+     * @throws LdapException
+     */
+    @Test
+    public void testGetType() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " cn = b + sn = f + gn = h + l = d " );
+
+        assertEquals( "2.5.4.3", rdn.getNormType() );
+    }
+
+
+    /**
+     * Test the getSize method.
+     *
+     * @throws LdapException
+     */
+    @Test
+    public void testGetSize() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " cn = b + sn = f + gn = h + l = d " );
+
+        assertEquals( 4, rdn.size() );
+    }
+
+
+    /**
+     * Test the getSize method.
+     *
+     */
+    @Test
+    public void testGetSize0()
+    {
+        Rdn rdn = new Rdn( schemaManager );
+
+        assertEquals( 0, rdn.size() );
+    }
+
+
+    /**
+     * Test the equals method
+     *
+     * @throws LdapException
+     */
+    @Test
+    public void testEquals() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  "cn=b + sn=d + gn=f" );
+
+        assertFalse( rdn.equals( null ) );
+        assertFalse( rdn.equals( "test" ) );
+        assertFalse( rdn.equals( new Rdn( schemaManager,  "cn=c + sn=d + gn=f" ) ) );
+        assertFalse( rdn.equals( new Rdn( schemaManager,  "cn=b" ) ) );
+        assertTrue( rdn.equals( new Rdn( schemaManager,  "cn=b + sn=d + gn=f" ) ) );
+        assertTrue( rdn.equals( new Rdn( schemaManager,  "cn=b + SN=d + GN=f" ) ) );
+        assertTrue( rdn.equals( new Rdn( schemaManager,  "sn=d + gn=f + CN=b" ) ) );
+    }
+
+
+    @Test
+    public void testUnescapeValueHexa()
+    {
+        byte[] res = ( byte[] ) Rdn.unescapeValue("#fF");
+
+        assertEquals( "0xFF ", Strings.dumpBytes(res) );
+
+        res = ( byte[] ) Rdn.unescapeValue("#0123456789aBCDEF");
+        assertEquals( "0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF ", Strings.dumpBytes(res) );
+    }
+
+
+    @Test
+    public void testUnescapeValueHexaWrong()
+    {
+        try
+        {
+            Rdn.unescapeValue("#fF1");
+            fail(); // Should not happen
+        }
+        catch ( IllegalArgumentException iae )
+        {
+            assertTrue( true );
+        }
+    }
+
+
+    @Test
+    public void testUnescapeValueString()
+    {
+        String res = ( String ) Rdn.unescapeValue("azerty");
+
+        assertEquals( "azerty", res );
+    }
+
+
+    @Test
+    public void testUnescapeValueStringSpecial()
+    {
+        String res = ( String ) Rdn.unescapeValue("\\\\\\#\\,\\+\\;\\<\\>\\=\\\"\\ ");
+
+        assertEquals( "\\#,+;<>=\" ", res );
+    }
+
+
+    @Test
+    public void testUnescapeValueStringWithSpaceInTheMiddle()
+    {
+        String res = ( String ) Rdn.unescapeValue("a b");
+
+        assertEquals( "a b", res );
+    }
+
+
+    @Test
+    public void testUnescapeValueStringWithSpaceInAtTheBeginning()
+    {
+        String res = ( String ) Rdn.unescapeValue("\\ a b");
+
+        assertEquals( " a b", res );
+    }
+
+
+    @Test
+    public void testUnescapeValueStringWithSpaceInAtTheEnd()
+    {
+        String res = ( String ) Rdn.unescapeValue("a b\\ ");
+
+        assertEquals( "a b ", res );
+    }
+    
+    
+    @Test
+    public void testUnescapeValueStringWithPoundInTheMiddle()
+    {
+        String res = ( String ) Rdn.unescapeValue("a#b");
+
+        assertEquals( "a#b", res );
+    }
+    
+    
+    @Test
+    public void testUnescapeValueStringWithPoundAtTheEnd()
+    {
+        String res = ( String ) Rdn.unescapeValue("ab#");
+
+        assertEquals( "ab#", res );
+    }
+    
+    
+    @Test
+    public void testEscapeValueString()
+    {
+        String res = Rdn.escapeValue(Strings.getBytesUtf8("azerty"));
+
+        assertEquals( "azerty", res );
+    }
+
+
+    @Test
+    public void testEscapeValueStringSpecial()
+    {
+        String res = Rdn.escapeValue(Strings.getBytesUtf8("\\#,+;<>=\" "));
+
+        assertEquals( "\\\\#\\,\\+\\;\\<\\>\\=\\\"\\ ", res );
+    }
+
+
+    @Test
+    public void testEscapeValueNumeric()
+    {
+        String res = Rdn.escapeValue(new byte[]
+                {'-', 0x00, '-', 0x1F, '-', 0x7F, '-'});
+
+        assertEquals( "-\\00-\\1F-\\7F-", res );
+    }
+
+
+    @Test
+    public void testEscapeValueMix()
+    {
+        String res = Rdn.escapeValue(new byte[]
+                {'\\', 0x00, '-', '+', '#', 0x7F, '-'});
+
+        assertEquals( "\\\\\\00-\\+#\\7F-", res );
+    }
+
+
+    @Test
+    public void testDIRSERVER_703() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  "cn=Kate Bush+sn=Bush" );
+        assertEquals( "cn=Kate Bush+sn=Bush", rdn.getName() );
+    }
+
+
+    @Test
+    public void testMultiValuedIterator() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  "cn=Kate Bush+sn=Bush" );
+        Iterator<Ava> iterator = rdn.iterator();
+        assertNotNull( iterator );
+        assertTrue( iterator.hasNext() );
+        assertNotNull( iterator.next() );
+        assertTrue( iterator.hasNext() );
+        assertNotNull( iterator.next() );
+        assertFalse( iterator.hasNext() );
+    }
+
+
+    @Test
+    public void testSingleValuedIterator() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  "cn=Kate Bush" );
+        Iterator<Ava> iterator = rdn.iterator();
+        assertNotNull( iterator );
+        assertTrue( iterator.hasNext() );
+        assertNotNull( iterator.next() );
+        assertFalse( iterator.hasNext() );
+    }
+
+
+    @Test
+    public void testEmptyIterator()
+    {
+        Rdn rdn = new Rdn( schemaManager );
+        Iterator<Ava> iterator = rdn.iterator();
+        assertNotNull( iterator );
+        assertFalse( iterator.hasNext() );
+    }
+
+
+    @Test
+    public void testRdnWithSpaces() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  "cn=a\\ b\\ c" );
+        assertEquals( "2.5.4.3=a b c", rdn.getNormName() );
+    }
+
+
+    @Test
+    public void testEscapedSpaceInValue() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  "cn=a b c" );
+        Rdn rdn2 = new Rdn( schemaManager,  "cn=a\\ b\\ c" );
+        assertEquals( "2.5.4.3=a b c", rdn1.getNormName() );
+        assertEquals( "2.5.4.3=a b c", rdn2.getNormName() );
+        assertTrue( rdn1.equals( rdn2 ) );
+
+        Rdn rdn3 = new Rdn( schemaManager,  "cn=\\ a b c\\ " );
+        Rdn rdn4 = new Rdn( schemaManager,  "cn=\\ a\\ b\\ c\\ " );
+        assertEquals( "2.5.4.3=a b c", rdn3.getNormName() );
+        assertEquals( "cn=\\ a b c\\ ", rdn3.getName() );
+        assertEquals( "2.5.4.3=a b c", rdn4.getNormName() );
+        assertEquals( "cn=\\ a\\ b\\ c\\ ", rdn4.getName() );
+        assertTrue( rdn3.equals( rdn4 ) );
+    }
+
+
+    @Test
+    public void testEscapedHashInValue() throws LdapException
+    {
+        Rdn rdn1 = new Rdn( schemaManager,  "cn=a#b#c" );
+        Rdn rdn2 = new Rdn( schemaManager,  "cn=a\\#b\\#c" );
+        assertEquals( "2.5.4.3=a#b#c", rdn1.getNormName() );
+        assertEquals( "2.5.4.3=a#b#c", rdn2.getNormName() );
+        assertTrue( rdn1.equals( rdn2 ) );
+
+        Rdn rdn3 = new Rdn( schemaManager,  "cn=\\#a#b#c\\#" );
+        Rdn rdn4 = new Rdn( schemaManager,  "cn=\\#a\\#b\\#c\\#" );
+        assertEquals( "2.5.4.3=\\#a#b#c#", rdn3.getNormName() );
+        assertEquals( "2.5.4.3=\\#a#b#c#", rdn4.getNormName() );
+        assertTrue( rdn3.equals( rdn4 ) );
+    }
+
+
+    @Test
+    public void testEscapedAttributeValue()
+    {
+        // space doesn't need to be escaped in the middle of a string
+        assertEquals( "a b", Rdn.escapeValue("a b") );
+        assertEquals( "a b c", Rdn.escapeValue("a b c") );
+        assertEquals( "a b c d", Rdn.escapeValue("a b c d") );
+
+        // space must be escaped at the beginning and the end of a string
+        assertEquals( "\\ a b", Rdn.escapeValue(" a b") );
+        assertEquals( "a b\\ ", Rdn.escapeValue("a b ") );
+        assertEquals( "\\ a b\\ ", Rdn.escapeValue(" a b ") );
+        assertEquals( "\\  a  b \\ ", Rdn.escapeValue("  a  b  ") );
+
+        // hash doesn't need to be escaped in the middle and the end of a string
+        assertEquals( "a#b", Rdn.escapeValue("a#b") );
+        assertEquals( "a#b#", Rdn.escapeValue("a#b#") );
+        assertEquals( "a#b#c", Rdn.escapeValue("a#b#c") );
+        assertEquals( "a#b#c#", Rdn.escapeValue("a#b#c#") );
+        assertEquals( "a#b#c#d", Rdn.escapeValue("a#b#c#d") );
+        assertEquals( "a#b#c#d#", Rdn.escapeValue("a#b#c#d#") );
+
+        // hash must be escaped at the beginning of a string
+        assertEquals( "\\#a#b", Rdn.escapeValue("#a#b") );
+        assertEquals( "\\##a#b", Rdn.escapeValue("##a#b") );
+    }
+
+
+    /** Serialization tests ------------------------------------------------- */
+
+    /**
+     * Test serialization of an empty Rdn
+     */
+    @Test
+    public void testEmptyRDNSerialization() throws LdapException, IOException, ClassNotFoundException
+    {
+        Rdn rdn = new Rdn( schemaManager,  "" );
+
+        rdn.normalize();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream( baos );
+
+        out.writeObject( rdn );
+
+        ObjectInputStream in = null;
+
+        byte[] data = baos.toByteArray();
+        in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+        Rdn rdn2 = (Rdn)in.readObject();
+
+        assertEquals( rdn, rdn2 );
+    }
+
+
+    @Test
+    public void testNullRdnSerialization() throws IOException, ClassNotFoundException
+    {
+        Rdn rdn = new Rdn( schemaManager );
+
+        rdn.normalize();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream( baos );
+
+        out.writeObject( rdn );
+
+        ObjectInputStream in = null;
+
+        byte[] data = baos.toByteArray();
+        in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+        Rdn rdn2 = (Rdn)in.readObject();
+
+        assertEquals( rdn, rdn2 );
+    }
+
+
+    /**
+     * Test serialization of a simple Rdn
+     */
+    @Test
+    public void testSimpleRdnSerialization() throws LdapException, IOException, ClassNotFoundException
+    {
+        Rdn rdn = new Rdn( schemaManager,  "cn=b" );
+        rdn.normalize();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream( baos );
+
+        rdn.writeExternal( out );
+
+        ObjectInputStream in = null;
+
+        byte[] data = baos.toByteArray();
+        in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+        Rdn rdn2 = new Rdn( schemaManager );
+        rdn2.readExternal( in );
+
+        assertEquals( rdn, rdn2 );
+    }
+
+
+    /**
+     * Test serialization of a simple Rdn
+     */
+    @Test
+    public void testSimpleRdn2Serialization() throws LdapException, IOException, ClassNotFoundException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " CN  = DEF " );
+        rdn.normalize();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream( baos );
+
+        rdn.writeExternal( out );
+
+        ObjectInputStream in = null;
+
+        byte[] data = baos.toByteArray();
+        in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+        Rdn rdn2 = new Rdn( schemaManager );
+        rdn2.readExternal( in );
+
+        assertEquals( rdn, rdn2 );
+    }
+
+
+    /**
+     * Test serialization of a simple Rdn with no value
+     */
+    @Test
+    public void testSimpleRdnNoValueSerialization() throws LdapException, IOException, ClassNotFoundException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " CN  =" );
+        rdn.normalize();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream( baos );
+
+        rdn.writeExternal( out );
+
+        ObjectInputStream in = null;
+
+        byte[] data = baos.toByteArray();
+        in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+        Rdn rdn2 = new Rdn( schemaManager );
+        rdn2.readExternal( in );
+
+        assertEquals( rdn, rdn2 );
+    }
+
+
+    /**
+     * Test serialization of a simple Rdn with one value
+     */
+    @Test
+    public void testSimpleRdnOneValueSerialization() throws LdapException, IOException, ClassNotFoundException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " CN  = def " );
+        rdn.normalize();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream( baos );
+
+        rdn.writeExternal( out );
+
+        ObjectInputStream in = null;
+
+        byte[] data = baos.toByteArray();
+        in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+        Rdn rdn2 = new Rdn( schemaManager );
+        rdn2.readExternal( in );
+
+        assertEquals( rdn, rdn2 );
+    }
+
+
+    /**
+     * Test serialization of a simple Rdn with three values
+     */
+    @Test
+    public void testSimpleRdnThreeValuesSerialization() throws LdapException, IOException, ClassNotFoundException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " CN = a + SN = b + GN = c " );
+        rdn.normalize();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream( baos );
+
+        rdn.writeExternal( out );
+
+        ObjectInputStream in = null;
+
+        byte[] data = baos.toByteArray();
+        in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+        Rdn rdn2 = new Rdn( schemaManager );
+        rdn2.readExternal( in );
+
+        assertEquals( rdn, rdn2 );
+    }
+
+
+    /**
+     * Test serialization of a simple Rdn with three unordered values
+     */
+    @Test
+    public void testSimpleRdnThreeValuesUnorderedSerialization() throws LdapException, IOException,
+        ClassNotFoundException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " CN = b + SN = a + GN = c " );
+        rdn.normalize();
+
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream( baos );
+
+        rdn.writeExternal( out );
+
+        ObjectInputStream in = null;
+
+        byte[] data = baos.toByteArray();
+        in = new ObjectInputStream( new ByteArrayInputStream( data ) );
+
+        Rdn rdn2 = new Rdn( schemaManager );
+        rdn2.readExternal( in );
+
+        assertEquals( rdn, rdn2 );
+    }
+
+
+    /**
+     * test an Rdn with empty value
+     */
+    @Test
+    public void testRdnWithEmptyValue() throws LdapException
+    {
+        assertTrue( RdnParser.isValid("cn=") );
+        assertTrue( RdnParser.isValid( "cn=\"\"" ) );
+        assertEquals( "2.5.4.3=", new Rdn( schemaManager,  "cn=\"\"" ).getNormName() );
+        assertEquals( "2.5.4.3=", new Rdn( schemaManager,  "cn=" ).getNormName() );
+    }
+
+
+    /**
+     * test an Rdn with escaped comma
+     */
+    @Test
+    public void testRdnWithEscapedComa() throws LdapException
+    {
+        assertTrue( RdnParser.isValid( "cn=b\\,c" ) );
+        assertEquals( "2.5.4.3=b\\,c", new Rdn( schemaManager,  "cn=b\\,c" ).getNormName() );
+
+        assertTrue( RdnParser.isValid( "cn=\"b,c\"" ) );
+        assertEquals( "2.5.4.3=b\\,c", new Rdn( schemaManager,  "cn=\"b,c\"" ).getNormName() );
+        assertEquals( "cn=\"b,c\"", new Rdn( schemaManager,  "cn=\"b,c\"" ).getName() );
+
+        assertTrue( RdnParser.isValid( "cn=\"b\\,c\"" ) );
+        Rdn rdn = new Rdn( schemaManager,  "cn=\"b\\,c\"" );
+        assertEquals( "cn=\"b\\,c\"", rdn.getName() );
+        assertEquals( "2.5.4.3=b\\,c", rdn.getNormName() );
+    }
+
+
+    /**
+     * Tests the equals and equals results of cloned multi-valued RDNs.
+     * Test for DIRSHARED-9.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testComparingOfClonedMultiValuedRDNs() throws LdapException
+    {
+        // Use upper case attribute types to test if normalized types are used 
+        // for comparison
+        Rdn rdn = new Rdn( schemaManager,  " CN = b + SN = d" );
+        Rdn clonedRdn = (Rdn) rdn.clone();
+
+        assertTrue( rdn.equals( clonedRdn ) );
+    }
+
+
+    /**
+     * Tests the equals and equals results of copy constructed multi-valued RDNs.
+     * Test for DIRSHARED-9.
+     * 
+     * @throws LdapException
+     */
+    @Test
+    public void testComparingOfCopyConstructedMultiValuedRDNs() throws LdapException
+    {
+        // Use upper case attribute types to test if normalized types are used 
+        // for comparison
+        Rdn rdn = new Rdn( schemaManager,  " CN = b + SN = d" );
+        Rdn copiedRdn = new Rdn( rdn );
+
+        assertTrue( rdn.equals( copiedRdn ) );
+    }
+
+
+    /**
+     * test the UpName method on a Rdn with more than one atav
+     */
+    @Test 
+    public void testGetUpNameMultipleAtav() throws LdapException
+    {
+        Rdn rdn = new Rdn( schemaManager,  " CN = b + SN = d " );
+        
+        assertEquals( " CN = b + SN = d ", rdn.getName() );
+    }
+}

Modified: directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/ACIItemSyntaxCheckerTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/ACIItemSyntaxCheckerTest.java?rev=1083238&r1=1083237&r2=1083238&view=diff
==============================================================================
--- directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/ACIItemSyntaxCheckerTest.java (original)
+++ directory/shared/trunk/integ/src/test/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/ACIItemSyntaxCheckerTest.java Sat Mar 19 17:51:06 2011
@@ -23,16 +23,17 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import com.mycila.junit.concurrent.Concurrency;
-import com.mycila.junit.concurrent.ConcurrentJunitRunner;
-import org.apache.directory.shared.ldap.model.schema.SchemaManager;
 import org.apache.directory.shared.ldap.aci.ACIItemSyntaxChecker;
+import org.apache.directory.shared.ldap.model.schema.SchemaManager;
 import org.apache.directory.shared.ldap.schemaloader.JarLdifSchemaLoader;
 import org.apache.directory.shared.ldap.schemamanager.impl.DefaultSchemaManager;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import com.mycila.junit.concurrent.Concurrency;
+import com.mycila.junit.concurrent.ConcurrentJunitRunner;
+
 
 /**
  * Test cases for ACIItemSyntaxChecker.
@@ -89,9 +90,9 @@ public class ACIItemSyntaxCheckerTest
             + "itemOrUserFirst itemFirst  :{ protectedItems  { entry  , attributeType { 1.2.3    , ou }  , "
             + " attributeValue { ou=people  , cn=Ersin  }  , rangeOfValues (cn=ErsinEr) , "
             + "classes and : { item: xyz , or:{item:X,item:Y}   }}  , "
-            + "itemPermissions { { userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "itemPermissions { { userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } },"
-            + "{ precedence 10, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "{ precedence 10, userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } } } }}";
 
         assertTrue( checker.isValidSyntax( spec ) );
@@ -108,7 +109,7 @@ public class ACIItemSyntaxCheckerTest
             + "itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
             + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
             + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
+            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {cn=y,sn=n,dc=l} , "
             + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }  }   ";
 
         assertTrue( checker.isValidSyntax( spec ) );
@@ -144,9 +145,9 @@ public class ACIItemSyntaxCheckerTest
             + "itemOrUserFirst itemFirst  :{ protectedItems  { attributeType { 1.2.3    , ou }, entry , "
             + " rangeOfValues (cn=ErsinEr) , attributeValue { ou=people  , cn=Ersin  },"
             + "classes and : { item: xyz , or:{item:X,item:Y}   }}  , "
-            + "itemPermissions { { userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "itemPermissions { { userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } },"
-            + "{ precedence 10, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "{ precedence 10, userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } } } }}";
 
         assertTrue( checker.isValidSyntax( spec ) );
@@ -160,7 +161,7 @@ public class ACIItemSyntaxCheckerTest
             + "itemOrUserFirst userFirst:  { userClasses {  name { \"ou=people,cn=ersin\" }, allUsers, "
             + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
             + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
+            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {cn=y,sn=n,dc=l} , "
             + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }  }   ";
 
         assertTrue( checker.isValidSyntax( spec ) );
@@ -174,9 +175,9 @@ public class ACIItemSyntaxCheckerTest
             + "itemOrUserFirst itemFirst  :{ protectedItems  { attributeType { 1.2.3    , ou }, entry , "
             + " rangeOfValues (cn=ErsinEr) , attributeValue { ou=people  , cn=Ersin  },"
             + "classes and : { item: xyz , or:{item:X,item:Y}   }}  , "
-            + "itemPermissions { { grantsAndDenials  {  denyCompare  , grantModify }, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "itemPermissions { { grantsAndDenials  {  denyCompare  , grantModify }, userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   },"
-            + "{ precedence 10, userClasses {allUsers  , userGroup { \"1.2=y,z=t\"  , \"a=b,c=d\" } "
+            + "{ precedence 10, userClasses {allUsers  , userGroup { \"2.5.4.3=y,dc=t\"  , \"cn=b,dc=d\" } "
             + " , subtree { { base \"ou=people\" } } }   , grantsAndDenials  {  denyCompare  , grantModify } } } }}";
 
         assertTrue( checker.isValidSyntax( spec ) );
@@ -190,7 +191,7 @@ public class ACIItemSyntaxCheckerTest
             + "itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
             + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
             + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { grantsAndDenials { grantBrowse }, protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
+            + "userPermissions { { grantsAndDenials { grantBrowse }, protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {cn=y,sn=n,dc=l} , "
             + "rangeOfValues (cn=ErsinEr) }  } } }  }   ";
 
         assertTrue( checker.isValidSyntax( spec ) );
@@ -203,7 +204,7 @@ public class ACIItemSyntaxCheckerTest
         String spec = "{   itemOrUserFirst userFirst:  { userClasses {  allUsers  , name { \"ou=people,cn=ersin\" }, "
             + "subtree {{ base \"ou=system\" }, { base \"ou=ORGANIZATIONUNIT\","
             + "minimum  1, maximum   2 } } }  , "
-            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {x=y,m=n,k=l} , "
+            + "userPermissions { { protectedItems{ entry  , attributeType { cn  , ou }  , attributeValue {cn=y,sn=n,dc=l} , "
             + "rangeOfValues (cn=ErsinEr) }  , grantsAndDenials { grantBrowse } } } }, "
             + " identificationTag \"id2\"   , authenticationLevel none, precedence 14 }   ";