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 2008/06/07 01:35:31 UTC
svn commit: r664194 -
/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
Author: elecharny
Date: Fri Jun 6 16:35:31 2008
New Revision: 664194
URL: http://svn.apache.org/viewvc?rev=664194&view=rev
Log:
Make ExceptionSeviceIT test happy by fixing the way MODDN/MODRDN revert was handled
Modified:
directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
Modified: directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java
URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java?rev=664194&r1=664193&r2=664194&view=diff
==============================================================================
--- directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java (original)
+++ directory/apacheds/branches/bigbang/core/src/main/java/org/apache/directory/server/core/DefaultDirectoryService.java Fri Jun 6 16:35:31 2008
@@ -81,6 +81,7 @@
import org.apache.directory.shared.ldap.constants.AuthenticationLevel;
import org.apache.directory.shared.ldap.constants.SchemaConstants;
import org.apache.directory.shared.ldap.exception.LdapNamingException;
+import org.apache.directory.shared.ldap.exception.LdapNoPermissionException;
import org.apache.directory.shared.ldap.ldif.ChangeType;
import org.apache.directory.shared.ldap.ldif.LdifEntry;
import org.apache.directory.shared.ldap.ldif.LdifReader;
@@ -648,6 +649,55 @@
}
+ /**
+ * We handle the ModDN/ModRDN operation for the revert here.
+ */
+ private void moddn( LdapDN oldDn, LdapDN newDn, boolean delOldRdn ) throws Exception
+ {
+ if ( oldDn.size() == 0 )
+ {
+ throw new LdapNoPermissionException( "can't rename the rootDSE" );
+ }
+
+ // calculate parents
+ LdapDN oldBase = ( LdapDN ) oldDn.clone();
+ oldBase.remove( oldDn.size() - 1 );
+ LdapDN newBase = ( LdapDN ) newDn.clone();
+ newBase.remove( newDn.size() - 1 );
+
+ // Compute the RDN for each of the DN
+ Rdn newRdn = newDn.getRdn( newDn.size() - 1 );
+ Rdn oldRdn = oldDn.getRdn( oldDn.size() - 1 );
+
+ /*
+ * We need to determine if this rename operation corresponds to a simple
+ * RDN name change or a move operation. If the two names are the same
+ * except for the RDN then it is a simple modifyRdn operation. If the
+ * names differ in size or have a different baseDN then the operation is
+ * a move operation. Furthermore if the RDN in the move operation
+ * changes it is both an RDN change and a move operation.
+ */
+ if ( ( oldDn.size() == newDn.size() ) && oldBase.equals( newBase ) )
+ {
+ adminSession.rename( oldDn, newRdn, delOldRdn );
+ }
+ else
+ {
+ LdapDN target = ( LdapDN ) newDn.clone();
+ target.remove( newDn.size() - 1 );
+
+ if ( newRdn.equals( oldRdn ) )
+ {
+ adminSession.move( oldDn, target );
+ }
+ else
+ {
+ adminSession.moveAndRename( oldDn, target, new Rdn( newRdn ), delOldRdn );
+ }
+ }
+ }
+
+
public long revert( long revision ) throws Exception
{
if ( changeLog == null || ! changeLog.isEnabled() )
@@ -678,12 +728,15 @@
*
* First of all just stop using JNDI and construct the operations to
* feed into the interceptor pipeline.
+ *
+ * TODO review this code.
*/
try
{
LOG.warn( PARTIAL_IMPL_WARNING );
cursor.afterLast();
+
while ( cursor.previous() ) // apply ldifs in reverse order
{
ChangeLogEvent event = cursor.get();
@@ -695,31 +748,30 @@
adminSession.add( ServerEntryUtils.toServerEntry( reverse.getAttributes(),
new LdapDN( reverse.getDn() ), registries ) );
break;
+
case( ChangeType.DELETE_ORDINAL ):
adminSession.delete( new LdapDN ( reverse.getDn() ) );
break;
+
case( ChangeType.MODIFY_ORDINAL ):
adminSession.modify( new LdapDN( reverse.getDn() ),
ServerEntryUtils.toServerModification( reverse.getModificationItemsArray(),
registries.getAttributeTypeRegistry() ) );
break;
+
case( ChangeType.MODDN_ORDINAL ):
- if ( reverse.getNewRdn() != null )
- {
- adminSession.moveAndRename( new LdapDN( reverse.getDn() ),
- new LdapDN( reverse.getNewSuperior() ), new Rdn( reverse.getNewRdn() ),
- reverse.isDeleteOldRdn() );
- }
- else
- {
- adminSession.move( new LdapDN( reverse.getDn() ),
- new LdapDN( reverse.getNewSuperior() ) );
- }
+ // NO BREAK - both ModDN and ModRDN handling is the same
+
case( ChangeType.MODRDN_ORDINAL ):
- adminSession.rename( new LdapDN( reverse.getDn() ),
- new Rdn( reverse.getNewRdn() ), reverse.isDeleteOldRdn() );
+ LdapDN forwardDn = new LdapDN( event.getForwardLdif().getDn() );
+ LdapDN reverseDn = new LdapDN( event.getReverseLdif().getDn() );
+
+ moddn( reverseDn, forwardDn, reverse.isDeleteOldRdn() );
+
break;
+
default:
+ LOG.error( "ChangeType unknown" );
throw new NotImplementedException( "Reverts of change type " + reverse.getChangeType()
+ " has not yet been implemented!");
}
@@ -727,8 +779,10 @@
}
catch ( IOException e )
{
- throw new NamingException( "Encountered a failure while trying to revert to a previous revision: "
- + revision );
+ String message = "Encountered a failure while trying to revert to a previous revision: "
+ + revision;
+ LOG.error( message );
+ throw new NamingException( message );
}
return changeLog.getCurrentRevision();