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 2010/05/22 20:30:55 UTC

svn commit: r947320 - /directory/apacheds/trunk/xdbm-search/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java

Author: seelmann
Date: Sat May 22 18:30:55 2010
New Revision: 947320

URL: http://svn.apache.org/viewvc?rev=947320&view=rev
Log:
Refactorings:
o no need to set the entry DN after rename/move
o removed unused methods
o less lookups during move operation

Modified:
    directory/apacheds/trunk/xdbm-search/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java

Modified: directory/apacheds/trunk/xdbm-search/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-search/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java?rev=947320&r1=947319&r2=947320&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-search/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java (original)
+++ directory/apacheds/trunk/xdbm-search/src/main/java/org/apache/directory/server/xdbm/AbstractStore.java Sat May 22 18:30:55 2010
@@ -1002,7 +1002,6 @@ public abstract class AbstractStore<E, I
     public synchronized void delete( ID id ) throws Exception
     {
         Entry entry = master.get( id );
-        ID parentId = getParentId( id );
 
         EntryAttribute objectClass = entry.get( OBJECT_CLASS_AT );
 
@@ -1018,21 +1017,10 @@ public abstract class AbstractStore<E, I
 
         rdnIdx.drop( id );
         oneLevelIdx.drop( id );
+        subLevelIdx.drop( id );
         entryCsnIdx.drop( id );
         entryUuidIdx.drop( id );
 
-        if ( !id.equals( getSuffixId() ) )
-        {
-            subLevelIdx.drop( id );
-        }
-
-        // Remove parent's reference to entry only if entry is not the suffix
-        if ( !parentId.equals( getRootId() ) )
-        {
-            // TODO: is this duplicate to oneLevelIdx.drop( id ) ???
-            oneLevelIdx.drop( parentId, id );
-        }
-
         for ( EntryAttribute attribute : entry )
         {
             String attributeOid = attribute.getAttributeType().getOid();
@@ -1198,23 +1186,11 @@ public abstract class AbstractStore<E, I
     }
 
 
-    /*
-     * The move operation severs a child from a parent creating a new parent
-     * child relationship.  As a consequence the relationships between the 
-     * old ancestors of the child and its descendants change.  A descendant is
-     *   
-     */
-
     public void move( DN oldChildDn, DN newParentDn, RDN newRdn, boolean deleteOldRdn ) throws Exception
     {
         ID childId = getEntryId( oldChildDn );
         rename( oldChildDn, newRdn, deleteOldRdn );
-        DN newUpdn = move( oldChildDn, childId, newParentDn );
-
-        // Update the current entry
-        Entry entry = master.get( childId );
-        entry.setDn( newUpdn );
-        master.put( childId, entry );
+        move( oldChildDn, childId, newParentDn, newRdn );
 
         if ( isSyncOnWrite )
         {
@@ -1226,12 +1202,7 @@ public abstract class AbstractStore<E, I
     public void move( DN oldChildDn, DN newParentDn ) throws Exception
     {
         ID childId = getEntryId( oldChildDn );
-        DN newUpdn = move( oldChildDn, childId, newParentDn );
-
-        // Update the current entry
-        Entry entry = master.get( childId );
-        entry.setDn( newUpdn );
-        master.put( childId, entry );
+        move( oldChildDn, childId, newParentDn, oldChildDn.getRdn() );
 
         if ( isSyncOnWrite )
         {
@@ -1276,39 +1247,6 @@ public abstract class AbstractStore<E, I
 
 
     /**
-     * 
-     * contructs a normalized DN using the RDN index. This is useful
-     * to identify in cases like finding the parent entry's id
-     * (cause that will be stored in the RDN of the entry identified by the given DN in string form)
-     *
-     * @param dn the DN of the entry in string form
-     * @return DN object build after fetching all the RDNs from RDN index
-     * @throws Exception
-     */
-    protected DN buildEntryDn( String dn ) throws Exception
-    {
-        // TODO: what is this for???
-        DN normDN = new DN( dn );
-        normDN.normalize( schemaManager.getNormalizerMapping() );
-
-        int dnSize = normDN.size();
-        int i = suffixDn.size();
-
-        ParentIdAndRdn<ID> key = new ParentIdAndRdn<ID>( getRootId(), suffixDn.getRdns() );
-
-        ID curEntryId = rdnIdx.forwardLookup( key );
-
-        for ( ; i < dnSize; i++ )
-        {
-            key = new ParentIdAndRdn<ID>( curEntryId, normDN.getRdn( i ) );
-            curEntryId = rdnIdx.forwardLookup( key );
-        }
-
-        return normDN;
-    }
-
-
-    /**
      * Adds a set of attribute values while affecting the appropriate userIndices.
      * The entry is not persisted: it is only changed in anticipation for a put 
      * into the master table.
@@ -1704,6 +1642,14 @@ public abstract class AbstractStore<E, I
     {
         String targetDn = aliasIdx.reverseLookup( aliasId );
         ID targetId = getEntryId( new DN( targetDn ).normalize( schemaManager.getNormalizerMapping() ) );
+
+        if ( targetId == null )
+        {
+            // the entry doesn't exist, probably it has been deleted or renamed
+            // TODO: this is just a workaround for now, the alias indices should be updated when target entry is deleted or removed
+            return;
+        }
+
         DN aliasDN = getEntryDn( aliasId );
 
         DN ancestorDn = ( DN ) aliasDN.clone();
@@ -1747,33 +1693,12 @@ public abstract class AbstractStore<E, I
      */
     protected void dropMovedAliasIndices( final DN movedBase ) throws Exception
     {
-        //        // Find all the aliases from movedBase down
-        //        IndexAssertion<Object,E> isBaseDescendant = new IndexAssertion<Object,E>()
-        //        {
-        //            public boolean assertCandidate( IndexEntry<Object,E> rec ) throws Exception
-        //            {
-        //                String dn = getEntryDn( rec.getId() );
-        //                return dn.endsWith( movedBase.toString() );
-        //            }
-        //        };
-
         ID movedBaseId = getEntryId( movedBase );
 
         if ( aliasIdx.reverseLookup( movedBaseId ) != null )
         {
             dropAliasIndices( movedBaseId, movedBase );
         }
-
-        //        throw new NotImplementedException( "Fix the code below this line" );
-
-        //        NamingEnumeration<ForwardIndexEntry> aliases =
-        //                new IndexAssertionEnumeration( aliasIdx.listIndices( movedBase.toString(), true ), isBaseDescendant );
-        //
-        //        while ( aliases.hasMore() )
-        //        {
-        //            ForwardIndexEntry entry = aliases.next();
-        //            dropAliasIndices( (Long)entry.getId(), movedBase );
-        //        }
     }
 
 
@@ -1828,55 +1753,6 @@ public abstract class AbstractStore<E, I
 
 
     /**
-     * Recursively modifies the distinguished name of an entry and the names of
-     * its descendants calling itself in the recursion.
-     *
-     * @param id the primary key of the entry
-     * @param updn User provided distinguished name to set as the new DN
-     * @param isMove whether or not the name change is due to a move operation
-     * which affects alias userIndices.
-     * @throws Exception if something goes wrong
-     */
-    protected void modifyDn( ID id, DN updn, boolean isMove ) throws Exception
-    {
-        String aliasTarget;
-
-        //updated the RDN index
-        rdnIdx.drop( id );
-
-        if ( !updn.isNormalized() )
-        {
-            // just normalize the RDN alone
-            updn.getRdn().normalize( schemaManager.getNormalizerMapping() );
-        }
-
-        ID parentId = getEntryId( updn.getParent() );
-        ParentIdAndRdn<ID> key = new ParentIdAndRdn<ID>( parentId, updn.getRdn() );
-        rdnIdx.add( key, id );
-
-        /* 
-         * Read Alias Index Tuples
-         * 
-         * If this is a name change due to a move operation then the one and
-         * subtree userIndices for aliases were purged before the aliases were
-         * moved.  Now we must add them for each alias entry we have moved.  
-         * 
-         * aliasTarget is used as a marker to tell us if we're moving an 
-         * alias.  If it is null then the moved entry is not an alias.
-         */
-        if ( isMove )
-        {
-            aliasTarget = aliasIdx.reverseLookup( id );
-
-            if ( null != aliasTarget )
-            {
-                addAliasIndices( id, buildEntryDn( id ), aliasTarget );
-            }
-        }
-    }
-
-
-    /**
      * Moves an entry under a new parent.  The operation causes a shift in the
      * parent child relationships between the old parent, new parent and the 
      * child moved.  All other descendant entries under the child never change
@@ -1890,7 +1766,7 @@ public abstract class AbstractStore<E, I
      * @param newParentDn the normalized dn of the new parent for the child
      * @throws Exception if something goes wrong
      */
-    protected DN move( DN oldChildDn, ID childId, DN newParentDn ) throws Exception
+    protected void move( DN oldChildDn, ID childId, DN newParentDn, RDN newRdn ) throws Exception
     {
         // Get the child and the new parent to be entries and Ids
         ID newParentId = getEntryId( newParentDn );
@@ -1916,19 +1792,28 @@ public abstract class AbstractStore<E, I
         updateSubLevelIndex( childId, oldParentId, newParentId );
 
         /*
-         * Build the new user provided DN (updn) for the child using the child's
-         * user provided RDN & the new parent's UPDN.  Basically add the child's
-         * UpRdn String to the tail of the new parent's Updn Name.
-         */
-        DN childUpdn = buildEntryDn( childId );
-        RDN childRdn = childUpdn.getRdn( childUpdn.size() - 1 );
-        DN newUpdn = buildEntryDn( newParentId );
-        newUpdn.add( childRdn );
+         * Update the RDN index
+         */
+        rdnIdx.drop( childId );
+        ParentIdAndRdn<ID> key = new ParentIdAndRdn<ID>( newParentId, newRdn );
+        rdnIdx.add( key, childId );
 
-        // Call the modifyDn operation with the new updn
-        modifyDn( childId, newUpdn, true );
+        /* 
+         * Read Alias Index Tuples
+         * 
+         * If this is a name change due to a move operation then the one and
+         * subtree userIndices for aliases were purged before the aliases were
+         * moved.  Now we must add them for each alias entry we have moved.  
+         * 
+         * aliasTarget is used as a marker to tell us if we're moving an 
+         * alias.  If it is null then the moved entry is not an alias.
+         */
+        String aliasTarget = aliasIdx.reverseLookup( childId );
 
-        return newUpdn;
+        if ( null != aliasTarget )
+        {
+            addAliasIndices( childId, buildEntryDn( childId ), aliasTarget );
+        }
     }