You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2008/06/11 16:56:21 UTC
svn commit: r666691 - in /directory/shared/trunk/ldap/src:
main/java/org/apache/directory/shared/ldap/name/Rdn.java
test/java/org/apache/directory/shared/ldap/name/RdnTest.java
Author: seelmann
Date: Wed Jun 11 07:56:21 2008
New Revision: 666691
URL: http://svn.apache.org/viewvc?rev=666691&view=rev
Log:
Fix for DIRSHARED-3: Rdn.compareTo() should be invertable
Modified:
directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/Rdn.java
directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java
Modified: directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/Rdn.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/Rdn.java?rev=666691&r1=666690&r2=666691&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/Rdn.java (original)
+++ directory/shared/trunk/ldap/src/main/java/org/apache/directory/shared/ldap/name/Rdn.java Wed Jun 11 07:56:21 2008
@@ -752,43 +752,28 @@
// We have more than one value. We will
// go through all of them.
- for ( AttributeTypeAndValue current:atavs )
+ // the types are already normalized and sorted in the atavs TreeSet
+ // so we could compare the 1st with the 1st, then the 2nd with the 2nd, etc.
+ Iterator<AttributeTypeAndValue> localIterator = atavs.iterator();
+ Iterator<AttributeTypeAndValue> paramIterator = rdn.atavs.iterator();
+
+ while(localIterator.hasNext() || paramIterator.hasNext())
{
- String type = current.getNormType();
-
- if ( rdn.atavTypes.containsKey( type ) )
+ if(!localIterator.hasNext())
{
- List<AttributeTypeAndValue> atavLocalList = ( List<AttributeTypeAndValue> ) atavTypes.get( type );
- List<AttributeTypeAndValue> atavParamList = ( List<AttributeTypeAndValue> ) rdn.atavTypes.get( type );
-
- // We have to verify that each value of the
- // first list are present in
- // the second list
- for ( AttributeTypeAndValue atavLocal:atavLocalList )
- {
- boolean found = false;
-
- for ( AttributeTypeAndValue atavParam:atavParamList )
- {
- if ( atavLocal.compareTo( atavParam ) == EQUAL )
- {
- found = true;
- break;
- }
- }
-
- if ( !found )
- {
- // The ATAV does not exist in the second RDN
- return SUPERIOR;
- }
- }
+ return SUPERIOR;
}
- else
+ if(!paramIterator.hasNext())
{
- // We can't find an atav in the rdn : the current
- // one is superior
- return SUPERIOR;
+ return INFERIOR;
+ }
+
+ AttributeTypeAndValue localAtav = localIterator.next();
+ AttributeTypeAndValue paramAtav = paramIterator.next();
+ int result = localAtav.compareTo( paramAtav );
+ if ( result != EQUAL )
+ {
+ return result;
}
}
Modified: directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java?rev=666691&r1=666690&r2=666691&view=diff
==============================================================================
--- directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java (original)
+++ directory/shared/trunk/ldap/src/test/java/org/apache/directory/shared/ldap/name/RdnTest.java Wed Jun 11 07:56:21 2008
@@ -316,7 +316,7 @@
{
Rdn rdn1 = new Rdn( " a = b + c = d + a = f + g = h " );
Rdn rdn2 = null;
- assertEquals( 1, rdn1.compareTo( rdn2 ) );
+ assertTrue( rdn1.compareTo( rdn2 ) > 0 );
}
@@ -390,8 +390,9 @@
Rdn rdn1 = new Rdn( " a = f + g = h + c = d " );
Rdn rdn2 = new Rdn( " c = d + a = h + g = h " );
- assertEquals( 1, rdn1.compareTo( rdn2 ) );
- assertEquals( 1, rdn2.compareTo( rdn1 ) );
+ assertTrue( rdn1.compareTo( rdn2 ) < 0 );
+ assertTrue( rdn2.compareTo( rdn1 ) > 0 );
+ assertEquals( 0, rdn1.compareTo( rdn2 ) + rdn2.compareTo( rdn1 ) );
}
@@ -402,34 +403,40 @@
* @throws InvalidNameException
*/
@Test
- public void test_DIRSHARED_2() throws InvalidNameException
+ public void testCompareSecondAtav() throws InvalidNameException
{
// the second ATAV differs
Rdn rdn1 = new Rdn( " a = b + c = d " );
Rdn rdn2 = new Rdn( " a = b + c = y " );
- assertTrue( rdn1.compareTo( rdn2 ) != 0 );
+ assertTrue( rdn1.compareTo( rdn2 ) < 0 );
+ assertTrue( rdn2.compareTo( rdn1 ) > 0 );
+ assertEquals( 0, rdn1.compareTo( rdn2 ) + rdn2.compareTo( rdn1 ) );
// the third ATAV differs
Rdn rdn3 = new Rdn( " a = b + c = d + e = f " );
Rdn rdn4 = new Rdn( " a = b + c = d + e = y " );
- assertTrue( rdn3.compareTo( rdn4 ) != 0 );
+ assertTrue( rdn3.compareTo( rdn4 ) < 0 );
+ assertTrue( rdn4.compareTo( rdn3 ) > 0 );
+ assertEquals( 0, rdn3.compareTo( rdn4 ) + rdn4.compareTo( rdn3 ) );
// the second ATAV differs in value only
Rdn rdn5 = new Rdn( " a = b + a = c " );
Rdn rdn6 = new Rdn( " a = b + a = y " );
- assertTrue( rdn5.compareTo( rdn6 ) != 0 );
+ assertTrue( rdn5.compareTo( rdn6 ) < 0 );
+ assertTrue( rdn6.compareTo( rdn5 ) > 0 );
+ assertEquals( 0, rdn5.compareTo( rdn6 ) + rdn6.compareTo( rdn5 ) );
}
/**
- * Test for DIRSHARED-3.
+ * Test for DIRSHARED-2.
* The compare operation should return a correct value (1 or -1)
* depending on the ATAVs, not on their position.
*
* @throws InvalidNameException
*/
@Test
- public void test_DIRSHARED_3() throws InvalidNameException
+ public void testCompareIndependentFromOrder() throws InvalidNameException
{
Rdn rdn1 = new Rdn( " a = b + c = d " );
Rdn rdn2 = new Rdn( " c = d + a = b " );
@@ -437,14 +444,84 @@
rdn1 = new Rdn( " a = b + c = e " );
rdn2 = new Rdn( " c = d + a = b " );
- assertEquals( 1, rdn1.compareTo( rdn2 ) );
- assertEquals( 1, rdn2.compareTo( rdn1 ) );
+ assertTrue( rdn1.compareTo( rdn2 ) > 0 );
+ assertTrue( rdn2.compareTo( rdn1 ) < 0 );
+ assertEquals( 0, rdn1.compareTo( rdn2 ) + rdn2.compareTo( rdn1 ) );
rdn1 = new Rdn( " a = b + c = d " );
rdn2 = new Rdn( " e = f + g = h " );
- assertEquals( 1, rdn1.compareTo( rdn2 ) );
- assertEquals( 1, rdn2.compareTo( rdn1 ) );
+ assertTrue( rdn1.compareTo( rdn2 ) < 0 );
+ assertTrue( rdn2.compareTo( rdn1 ) > 0 );
+ assertEquals( 0, rdn1.compareTo( rdn2 ) + rdn2.compareTo( rdn1 ) );
+ }
+
+
+ /**
+ * Test for DIRSHARED-3.
+ * Tests that compareTo() is invertable for single-valued RDNs.
+ *
+ * @throws InvalidNameException
+ */
+ @Test
+ public void testCompareInvertableNC2NC() throws InvalidNameException
+ {
+ Rdn rdn1 = new Rdn( " a = b " );
+ Rdn rdn2 = new Rdn( " a = c " );
+ assertTrue( rdn1.compareTo( rdn2 ) < 0 );
+ assertTrue( rdn2.compareTo( rdn1 ) > 0 );
+ assertEquals( 0, rdn1.compareTo( rdn2 ) + rdn2.compareTo( rdn1 ) );
+
+ }
+
+
+ /**
+ * Test for DIRSHARED-3.
+ * Tests that compareTo() is invertable for multi-valued RDNs with different values.
+ *
+ * @throws InvalidNameException
+ */
+ @Test
+ public void testCompareInvertableNCS2NCSDifferentValues() throws InvalidNameException
+ {
+ Rdn rdn1 = new Rdn( " a = b + a = c " );
+ Rdn rdn2 = new Rdn( " a = b + a = y " );
+ assertTrue( rdn1.compareTo( rdn2 ) < 0 );
+ assertTrue( rdn2.compareTo( rdn1 ) > 0 );
+ assertEquals( 0, rdn1.compareTo( rdn2 ) + rdn2.compareTo( rdn1 ) );
+ }
+
+
+ /**
+ * Test for DIRSHARED-3.
+ * Tests that compareTo() is invertable for multi-valued RDNs with different types.
+ *
+ * @throws InvalidNameException
+ */
+ @Test
+ public void testCompareInvertableNCS2NCSDifferentTypes() throws InvalidNameException
+ {
+ Rdn rdn1 = new Rdn( " a = b + c = d " );
+ Rdn rdn2 = new Rdn( " e = f + g = h " );
+ assertTrue( rdn1.compareTo( rdn2 ) < 0 );
+ assertTrue( rdn2.compareTo( rdn1 ) > 0 );
+ assertEquals( 0, rdn1.compareTo( rdn2 ) + rdn2.compareTo( rdn1 ) );
+ }
+
+ /**
+ * Test for DIRSHARED-3.
+ * Tests that compareTo() is invertable for multi-valued RDNs with different order.
+ *
+ * @throws InvalidNameException
+ */
+ @Test
+ public void testCompareInvertableNCS2NCSUnordered() throws InvalidNameException
+ {
+ Rdn rdn1 = new Rdn( " c = d + a = b " );
+ Rdn rdn2 = new Rdn( " a = b + e = f " );
+ assertTrue( rdn1.compareTo( rdn2 ) < 0 );
+ assertTrue( rdn2.compareTo( rdn1 ) > 0 );
+ assertEquals( 0, rdn1.compareTo( rdn2 ) + rdn2.compareTo( rdn1 ) );
}