// We let other mechanisms filter out operational attributes.
// -----------------------------------------------------------
if ( ( ids == null ) || ( ids.size() == 0 ) )
{
Entry rootDse = getRootDse( null );
return new BaseEntryFilteringCursor( new SingletonCursor<Entry>( rootDse ), searchContext,
directoryService.getSchemaManager() );
}
// -----------------------------------------------------------
// Collect all the real attributes besides 1.1, +, and * and
// note if we've seen these special attributes as well.
// -----------------------------------------------------------
Set<String> realIds = new HashSet<String>();
boolean allUserAttributes = searchContext.isAllUserAttributes();
boolean allOperationalAttributes = searchContext.isAllOperationalAttributes();
boolean noAttribute = searchContext.isNoAttributes();
for ( AttributeTypeOptions id : ids )
{
try
{
realIds.add( id.getAttributeType().getOid() );
}
catch ( Exception e )
{
realIds.add( id.getAttributeType().getName() );
}
}
// return nothing
if ( noAttribute )
{
Entry serverEntry = new DefaultEntry( schemaManager, Dn.ROOT_DSE );
return new BaseEntryFilteringCursor( new SingletonCursor<Entry>( serverEntry ), searchContext,
directoryService.getSchemaManager() );
}
// return everything
if ( allUserAttributes && allOperationalAttributes )
{
Entry rootDse = getRootDse( null );
return new BaseEntryFilteringCursor( new SingletonCursor<Entry>( rootDse ), searchContext,
directoryService.getSchemaManager() );
}
Entry serverEntry = new DefaultEntry( schemaManager, Dn.ROOT_DSE );
Entry rootDse = getRootDse( new GetRootDseOperationContext( searchContext.getSession() ) );
for ( Attribute attribute : rootDse )
{
AttributeType type = schemaManager.lookupAttributeTypeRegistry( attribute.getUpId() );
if ( realIds.contains( type.getOid() ) )
{
serverEntry.put( attribute );
}
else if ( allUserAttributes && ( type.getUsage() == UsageEnum.USER_APPLICATIONS ) )
{
serverEntry.put( attribute );
}
else if ( allOperationalAttributes && ( type.getUsage() != UsageEnum.USER_APPLICATIONS ) )
{
serverEntry.put( attribute );
}
}
return new BaseEntryFilteringCursor( new SingletonCursor<Entry>( serverEntry ), searchContext,
directoryService.getSchemaManager() );
}