if ( objectClass == null )
{
String msg = I18n.err( I18n.ERR_217, entryDn.getName(), entry );
ResultCodeEnum rc = ResultCodeEnum.OBJECT_CLASS_VIOLATION;
LdapSchemaViolationException e = new LdapSchemaViolationException( rc, msg );
//e.setResolvedName( entryDn );
throw e;
}
for ( Value<?> value : objectClass )
{
String valueStr = ( String ) value.getNormValue();
if ( valueStr.equals( SchemaConstants.TOP_OC ) )
{
continue;
}
objectClassIdx.add( valueStr, id );
}
if ( objectClass.contains( SchemaConstants.ALIAS_OC ) )
{
Attribute aliasAttr = entry.get( ALIASED_OBJECT_NAME_AT );
addAliasIndices( id, entryDn, new Dn( schemaManager, aliasAttr.getString() ) );
}
// Update the EntryCsn index
Attribute entryCsn = entry.get( ENTRY_CSN_AT );
if ( entryCsn == null )
{
String msg = I18n.err( I18n.ERR_219, entryDn.getName(), entry );
throw new LdapSchemaViolationException( ResultCodeEnum.OBJECT_CLASS_VIOLATION, msg );
}
entryCsnIdx.add( entryCsn.getString(), id );
// Update the AdministrativeRole index, if needed
if ( entry.containsAttribute( ADMINISTRATIVE_ROLE_AT ) )
{
// We may have more than one role
Attribute adminRoles = entry.get( ADMINISTRATIVE_ROLE_AT );
for ( Value<?> value : adminRoles )
{
adminRoleIdx.add( ( String ) value.getNormValue(), id );
}
// Adds only those attributes that are indexed
presenceIdx.add( ADMINISTRATIVE_ROLE_AT.getOid(), id );
}
// Now work on the user defined userIndices
for ( Attribute attribute : entry )
{
AttributeType attributeType = attribute.getAttributeType();
String attributeOid = attributeType.getOid();
if ( hasUserIndexOn( attributeType ) )
{
Index<Object, String> idx = ( Index<Object, String> ) getUserIndex( attributeType );
// here lookup by attributeId is OK since we got attributeId from
// the entry via the enumeration - it's in there as is for sure
for ( Value<?> value : attribute )
{
idx.add( value.getNormValue(), id );
}
// Adds only those attributes that are indexed
presenceIdx.add( attributeOid, id );
}
}
// Add the parentId in the entry
entry.put( SchemaConstants.ENTRY_PARENT_ID_AT, parentId );
lockWrite();
try
{
// Update the RDN index
rdnIdx.add( key, id );
// Update the parent's nbChildren and nbDescendants values
if ( parentId != Partition.ROOT_ID )
{
updateRdnIdx( parentId, ADD_CHILD, 0 );
}
// Remove the EntryDN attribute
entry.removeAttributes( ENTRY_DN_AT );
Attribute at = entry.get( SchemaConstants.ENTRY_CSN_AT );
setContextCsn( at.getString() );
// And finally add the entry into the master table
master.put( id, entry );
}
finally
{
unlockWrite();
}
if ( isSyncOnWrite.get() )
{
sync();
}
}
catch ( LdapException le )
{
throw le;
}
catch ( Exception e )
{
e.printStackTrace();
throw new LdapException( e );
}
}