in jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmPartition.java [142:281]
private int rebuildIndexes( PartitionTxn partitionTxn ) throws LdapException, IOException
{
Cursor<Tuple<String, Entry>> cursor = getMasterTable().cursor();
int masterTableCount = 0;
int repaired = 0;
System.out.println( "Re-building indices..." );
boolean ctxEntryLoaded = false;
try
{
while ( cursor.next() )
{
masterTableCount++;
Tuple<String, Entry> tuple = cursor.get();
String id = tuple.getKey();
Entry entry = tuple.getValue();
// Start with the RdnIndex
String parentId = entry.get( ApacheSchemaConstants.ENTRY_PARENT_ID_OID ).getString();
System.out.println( "Read entry " + entry.getDn() + " with ID " + id + " and parent ID " + parentId );
Dn dn = entry.getDn();
ParentIdAndRdn parentIdAndRdn = null;
// context entry may have more than one RDN
if ( !ctxEntryLoaded && getSuffixDn().getName().startsWith( dn.getName() ) )
{
// If the read entry is the context entry, inject a tuple that have one or more RDNs
parentIdAndRdn = new ParentIdAndRdn( parentId, getSuffixDn().getRdns() );
ctxEntryLoaded = true;
}
else
{
parentIdAndRdn = new ParentIdAndRdn( parentId, dn.getRdn() );
}
// Inject the parentIdAndRdn in the rdnIndex
rdnIdx.add( partitionTxn, parentIdAndRdn, id );
// Process the ObjectClass index
// Update the ObjectClass index
Attribute objectClass = entry.get( objectClassAT );
if ( objectClass == null )
{
String msg = I18n.err( I18n.ERR_49009_ENTRY_WITHOUT_OBJECT_CLASS, dn, entry );
ResultCodeEnum rc = ResultCodeEnum.OBJECT_CLASS_VIOLATION;
throw new LdapSchemaViolationException( rc, msg );
}
for ( Value value : objectClass )
{
String valueStr = value.getString();
if ( valueStr.equals( SchemaConstants.TOP_OC ) )
{
continue;
}
objectClassIdx.add( partitionTxn, valueStr, id );
}
// The Alias indexes
if ( objectClass.contains( SchemaConstants.ALIAS_OC ) )
{
Attribute aliasAttr = entry.get( aliasedObjectNameAT );
addAliasIndices( partitionTxn, id, dn, new Dn( schemaManager, aliasAttr.getString() ) );
}
// The entryCSN index
// Update the EntryCsn index
Attribute entryCsn = entry.get( entryCsnAT );
if ( entryCsn == null )
{
String msg = I18n.err( I18n.ERR_49010_ENTRY_WITHOUT_ENTRY_CSN, dn, entry );
throw new LdapSchemaViolationException( ResultCodeEnum.OBJECT_CLASS_VIOLATION, msg );
}
entryCsnIdx.add( partitionTxn, entryCsn.getString(), id );
// The AdministrativeRole index
// Update the AdministrativeRole index, if needed
if ( entry.containsAttribute( administrativeRoleAT ) )
{
// We may have more than one role
Attribute adminRoles = entry.get( administrativeRoleAT );
for ( Value value : adminRoles )
{
adminRoleIdx.add( partitionTxn, value.getString(), id );
}
// Adds only those attributes that are indexed
presenceIdx.add( partitionTxn, administrativeRoleAT.getOid(), id );
}
// And the user indexess
// 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( partitionTxn, value.getString(), id );
}
// Adds only those attributes that are indexed
presenceIdx.add( partitionTxn, attributeOid, id );
}
}
}
}
catch ( Exception e )
{
System.out.println( "Exiting after fetching entries " + repaired );
throw new LdapOtherException( e.getMessage(), e );
}
finally
{
cursor.close();
}
return masterTableCount;
}