in xdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/AbstractBTreePartition.java [1761:1902]
private void modifyIncrement( 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 )
{
String valueStr = value.getString();
if ( valueStr.equals( topOCValue.getString() ) )
{
continue;
}
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
Attribute attribute = entry.get( mods.getAttributeType() );
Value[] newValues = new Value[ attribute.size() ];
int increment = 1;
int i = 0;
if ( mods.size() != 0 )
{
increment = Integer.parseInt( mods.getString() );
}
for ( Value value : attribute )
{
int intValue = Integer.parseInt( value.getNormalized() );
if ( intValue >= Integer.MAX_VALUE - increment )
{
throw new IllegalArgumentException( "Increment operation overflow for attribute"
+ attributeType );
}
newValues[i++] = new Value( Integer.toString( intValue + increment ) );
attribute.remove( value );
}
attribute.add( newValues );
if ( modsOid.equals( aliasAttributeOid ) && mods.size() > 0 )
{
Dn entryDn = getEntryDn( partitionTxn, id );
addAliasIndices( partitionTxn, id, entryDn, new Dn( schemaManager, mods.getString() ) );
}
}