o Slightly fixed the testRenameEscaped() test
o Reworked the rename() operation in AbstractStore

git-svn-id: https://svn.apache.org/repos/asf/directory/apacheds/branches/apacheds-no-reverse-index@1142155 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java b/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
index 3d0c8ce..89cf2a1 100644
--- a/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
+++ b/jdbm-partition/src/test/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmStoreTest.java
@@ -745,7 +745,7 @@
         Long id = store.getEntryId( dn2 );
         assertNotNull( id );
         Entry entry2 = store.lookup( id );
-        assertEquals( "ja+es", entry2.get( "sn" ).getString() );
+        assertEquals( "Ja\\+es", entry2.get( "sn" ).getString() );
     }
 
 
diff --git a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java
index 807e4e5..fa2ac59 100644
--- a/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java
+++ b/xdbm-partition/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java
@@ -1272,7 +1272,7 @@
             entry = lookup( id );
         }
 
-        Dn updn = entry.getDn();
+        Dn entryDn = entry.getDn();
 
         newRdn.apply( schemaManager );
 
@@ -1284,15 +1284,12 @@
          * Also we make sure that the presence index shows the existence of the
          * new Rdn attribute within this entry.
          */
-
         for ( Ava newAtav : newRdn )
         {
             String newNormType = newAtav.getNormType();
             Object newNormValue = newAtav.getNormValue().getValue();
 
-            AttributeType newRdnAttrType = schemaManager.lookupAttributeTypeRegistry( newNormType );
-
-            entry.add( newRdnAttrType, newAtav.getNormValue() );
+            entry.add( newAtav.getAttributeType(), newAtav.getUpValue() );
 
             if ( hasUserIndexOn( newNormType ) )
             {
@@ -1326,7 +1323,7 @@
 
         if ( deleteOldRdn )
         {
-            Rdn oldRdn = updn.getRdn();
+            Rdn oldRdn = entryDn.getRdn();
 
             for ( Ava oldAtav : oldRdn )
             {
@@ -1347,9 +1344,10 @@
                 {
                     String oldNormType = oldAtav.getNormType();
                     String oldNormValue = oldAtav.getNormValue().getString();
-                    AttributeType oldRdnAttrType = schemaManager.lookupAttributeTypeRegistry( oldNormType );
-                    entry.remove( oldRdnAttrType, oldNormValue );
+                    AttributeType oldRdnAttrType = oldAtav.getAttributeType();
+                    entry.remove( oldRdnAttrType, oldAtav.getNormValue() );
 
+                    // Remove the RDN value from the user index, if any
                     if ( hasUserIndexOn( oldNormType ) )
                     {
                         Index<?, E, ID> index = getUserIndex( oldNormType );
@@ -1359,7 +1357,7 @@
                          * If there is no value for id in this index due to our
                          * drop above we remove the oldRdnAttr from the presence idx
                          */
-                        if ( null == index.reverseLookup( id ) )
+                        if ( presenceIdx.forward( oldNormValue, id ) )
                         {
                             presenceIdx.drop( oldNormType, id );
                         }
@@ -1375,11 +1373,22 @@
          * We only need to update the Rdn index.
          * No need to calculate the new Dn.
          */
+        List<ID> parentIds = getParentIds( entryDn );
+        ID rootId = getRootId();
+        ID parentId = rootId;
+        
+        if ( parentIds.size() > 2 )
+        {
+            parentId = parentIds.get( parentIds.size() - 1 );
+        }
 
-        ID parentId = getParentId( id );
-        rdnIdx.drop( id );
-        ParentIdAndRdn<ID> key = new ParentIdAndRdn<ID>( parentId, newRdn );
-        rdnIdx.add( key, id );
+        // Drop the RDN
+        ParentIdAndRdn<ID> key = new ParentIdAndRdn<ID>( parentId, entryDn.getRdn() );
+
+        rdnIdx.drop( key, id );
+
+        ParentIdAndRdn<ID> newKey = new ParentIdAndRdn<ID>( parentId, newRdn );
+        rdnIdx.add( newKey, id );
 
         master.put( id, entry );