in xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java [1619:1744]
private void modifyReplace( PartitionTxn partitionTxn, String id, Entry entry, Attribute mods )
throws LdapException, IndexNotFoundException
{
if ( entry instanceof ClonedServerEntry )
{
throw new LdapOtherException( I18n.err( I18n.ERR_49007_CANNOT_STORE_CLONED_SERVER_ENTRY ) );
}
String modsOid = schemaManager.getAttributeTypeRegistry().getOidByName( mods.getId() );
AttributeType attributeType = mods.getAttributeType();
// Special case for the ObjectClass index
if ( attributeType.equals( objectClassAT ) )
{
// if the id exists in the index drop all existing attribute
// value index entries and add new ones
for ( Value value : entry.get( objectClassAT ) )
{
if ( value.equals( topOCValue ) )
{
continue;
}
String normalizedOc = objectClassNormalizer.normalize( value.getString() );
objectClassIdx.drop( partitionTxn, normalizedOc, id );
}
for ( Value value : mods )
{
if ( value.equals( topOCValue ) )
{
continue;
}
String normalizedOc = objectClassNormalizer.normalize( value.getString() );
objectClassIdx.add( partitionTxn, normalizedOc, id );
}
}
else if ( hasUserIndexOn( attributeType ) )
{
Index<?, String> userIndex = getUserIndex( attributeType );
// Drop all the previous values
Attribute oldAttribute = entry.get( mods.getAttributeType() );
if ( oldAttribute != null )
{
for ( Value value : oldAttribute )
{
String normalized = value.getNormalized();
( ( Index<Object, String> ) userIndex ).drop( partitionTxn, normalized, id );
}
}
// And add the new ones
for ( Value value : mods )
{
String normalized = value.getNormalized();
( ( Index ) userIndex ).add( partitionTxn, normalized, id );
}
/*
* If we have no new value, we have to drop the AT fro the presence index
*/
if ( mods.size() == 0 )
{
presenceIdx.drop( partitionTxn, modsOid, id );
}
}
// Special case for the AdministrativeRole index
else if ( attributeType.equals( administrativeRoleAT ) )
{
// Remove the previous values
for ( Value value : entry.get( administrativeRoleAT ) )
{
if ( value.equals( topOCValue ) )
{
continue;
}
String normalizedOc = objectClassNormalizer.normalize( value.getString() );
objectClassIdx.drop( partitionTxn, normalizedOc, id );
}
// And add the new ones
for ( Value value : mods )
{
if ( value.equals( topOCValue ) )
{
continue;
}
String valueStr = value.getString();
adminRoleIdx.add( partitionTxn, valueStr, id );
}
}
String aliasAttributeOid = schemaManager.getAttributeTypeRegistry().getOidByName(
SchemaConstants.ALIASED_OBJECT_NAME_AT );
if ( mods.getAttributeType().equals( aliasedObjectNameAT ) )
{
dropAliasIndices( partitionTxn, id );
}
// replaces old attributes with new modified ones if they exist
if ( mods.size() > 0 )
{
entry.put( mods );
}
else
// removes old attributes if new replacements do not exist
{
entry.remove( mods );
}
if ( modsOid.equals( aliasAttributeOid ) && mods.size() > 0 )
{
Dn entryDn = getEntryDn( partitionTxn, id );
addAliasIndices( partitionTxn, id, entryDn, new Dn( schemaManager, mods.getString() ) );
}
}