in core/src/main/java/org/apache/directory/server/core/DefaultOperationManager.java [1624:1838]
public void rename( RenameOperationContext renameContext ) throws LdapException
{
if ( IS_DEBUG )
{
OPERATION_LOG.debug( ">> RenameOperation : {}", renameContext );
}
long opStart = 0L;
if ( IS_TIME )
{
opStart = System.nanoTime();
}
ensureStarted();
// Normalize the renameContext Dn
Dn dn = renameContext.getDn();
if ( !dn.isSchemaAware() )
{
dn = new Dn( directoryService.getSchemaManager(), dn );
renameContext.setDn( dn );
}
// Inject the newDn into the operation context
// Inject the new Dn into the context
if ( !dn.isEmpty() )
{
Dn newDn = dn.getParent();
Rdn newRdn = renameContext.getNewRdn();
if ( !newRdn.isSchemaAware() )
{
newRdn = new Rdn( directoryService.getSchemaManager(), newRdn );
renameContext.setNewRdn( newRdn );
}
newDn = newDn.add( renameContext.getNewRdn() );
renameContext.setNewDn( newDn );
}
// We have to deal with the referral first
directoryService.getReferralManager().lockRead();
try
{
// Check if we have an ancestor for this Dn
Entry parentEntry = directoryService.getReferralManager().getParentReferral( dn );
if ( parentEntry != null )
{
// We have found a parent referral for the current Dn
Dn childDn = dn.getDescendantOf( parentEntry.getDn() );
if ( directoryService.getReferralManager().isReferral( dn ) )
{
// This is a referral. We can delete it if the ManageDsaIt flag is true
// Otherwise, we just throw a LdapReferralException
if ( !renameContext.isReferralIgnored() )
{
// Throw a Referral Exception
throw buildReferralException( parentEntry, childDn );
}
}
else if ( directoryService.getReferralManager().hasParentReferral( dn ) )
{
// We can't delete an entry which has an ancestor referral
// Depending on the Context.REFERRAL property value, we will throw
// a different exception.
if ( renameContext.isReferralIgnored() )
{
throw buildLdapPartialResultException( childDn );
}
else
{
throw buildReferralException( parentEntry, childDn );
}
}
}
}
finally
{
// Unlock the ReferralManager
directoryService.getReferralManager().unlock();
}
lockWrite();
Partition partition = directoryService.getPartitionNexus().getPartition( dn );
// Start a Write transaction right away
PartitionTxn transaction = renameContext.getSession().getTransaction( partition );
// Call the rename method
try
{
if ( transaction == null )
{
transaction = partition.beginWriteTransaction();
if ( renameContext.getSession().hasSessionTransaction() )
{
renameContext.getSession().addTransaction( partition, transaction );
}
}
renameContext.setPartition( partition );
// populate the context with the old entry
PartitionTxn partitionTxn = null;
try
{
partitionTxn = partition.beginReadTransaction();
renameContext.setTransaction( partitionTxn );
eagerlyPopulateFields( renameContext );
}
finally
{
try
{
// Nothing to do
if ( partitionTxn != null )
{
partitionTxn.close();
}
}
catch ( IOException ioe )
{
throw new LdapOtherException( ioe.getMessage(), ioe );
}
}
Entry originalEntry = getOriginalEntry( renameContext );
renameContext.setOriginalEntry( originalEntry );
renameContext.setModifiedEntry( originalEntry.clone() );
Interceptor head = directoryService.getInterceptor( renameContext.getNextInterceptor() );
// Start a Write transaction right away
transaction = renameContext.getSession().getTransaction( partition );
// Call the Rename method
try
{
if ( transaction == null )
{
transaction = partition.beginWriteTransaction();
if ( renameContext.getSession().hasSessionTransaction() )
{
renameContext.getSession().addTransaction( partition, transaction );
}
}
renameContext.setTransaction( transaction );
head.rename( renameContext );
if ( !renameContext.getSession().hasSessionTransaction() )
{
transaction.commit();
}
}
catch ( LdapException le )
{
try
{
if ( transaction != null )
{
transaction.abort();
}
throw le;
}
catch ( IOException ioe )
{
throw new LdapOtherException( ioe.getMessage(), ioe );
}
}
catch ( IOException ioe )
{
try
{
if ( transaction != null )
{
transaction.abort();
}
throw new LdapOtherException( ioe.getMessage(), ioe );
}
catch ( IOException ioe2 )
{
throw new LdapOtherException( ioe2.getMessage(), ioe2 );
}
}
}
finally
{
unlockWrite();
}
if ( IS_DEBUG )
{
OPERATION_LOG.debug( "<< RenameOperation successful" );
}
if ( IS_TIME )
{
OPERATION_TIME.debug( "Rename operation took {} ns", ( System.nanoTime() - opStart ) );
}
}