You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2010/02/28 15:15:31 UTC
svn commit: r917183 -
/directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java
Author: kayyagari
Date: Sun Feb 28 14:15:31 2010
New Revision: 917183
URL: http://svn.apache.org/viewvc?rev=917183&view=rev
Log:
an efficient fix for DIRSERVER-1401
Modified:
directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java
Modified: directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java?rev=917183&r1=917182&r2=917183&view=diff
==============================================================================
--- directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java (original)
+++ directory/apacheds/trunk/xdbm-base/src/main/java/org/apache/directory/server/xdbm/AbstractXdbmPartition.java Sun Feb 28 14:15:31 2010
@@ -38,6 +38,7 @@
import org.apache.directory.shared.ldap.exception.LdapOperationNotSupportedException;
import org.apache.directory.shared.ldap.message.ResultCodeEnum;
import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.name.RDN;
/**
@@ -394,34 +395,35 @@
*/
private void checkIsValidMove( LdapDN oldChildDn, LdapDN newParentDn ) throws Exception
{
- Long newParentId = getEntryId( newParentDn.toString() );
- Long childId = getEntryId( oldChildDn.toString() );
- Long oldParentId = getParentId( childId );
-
- if( childId.longValue() == newParentId.longValue() )
- {
- throw new LdapOperationNotSupportedException( "child entry DN cannot be same as parent entry DN", ResultCodeEnum.UNWILLING_TO_PERFORM );
- }
-
- IndexCursor idxCursor = getSubLevelIndex().forwardCursor( childId );
boolean invalid = false;
- while( idxCursor.next() )
+
+ LdapDN newParentDNClone = ( LdapDN ) newParentDn.clone();
+ newParentDNClone.remove( newParentDNClone.size() - 1 );
+
+ if( newParentDn.size() >= oldChildDn.size() )
{
- ForwardIndexEntry<Long, Long> fwdIdxEntry = ( ForwardIndexEntry<Long, Long> ) idxCursor.get();
-
- if( fwdIdxEntry.getId().equals( newParentId ) )
+ for( int i=0; i < oldChildDn.size(); i++ )
{
- invalid = true;
- break;
+ RDN nameRdn = oldChildDn.getRdn( i );
+ RDN ldapRdn = newParentDn.getRdn( i );
+
+ if ( nameRdn.compareTo( ldapRdn ) == 0 )
+ {
+ invalid = true;
+ }
+ else
+ {
+ invalid = false;
+ break;
+ }
}
}
-
- idxCursor.close();
- if ( invalid )
+ if( invalid )
{
throw new LdapOperationNotSupportedException( "cannot place an entry below itself", ResultCodeEnum.UNWILLING_TO_PERFORM );
}
+
}