// We let other mechanisms filter out operational attributes.
// -----------------------------------------------------------
if ( ( ids == null ) || ( ids.length == 0 ) )
{
Entry rootDSE = getRootDSE( null );
return new BaseEntryFilteringCursor( new SingletonCursor<Entry>( rootDSE ), searchContext );
}
// -----------------------------------------------------------
// 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 ( String id : ids )
{
String idTrimmed = id.trim();
try
{
realIds.add( schemaManager.getAttributeTypeRegistry().getOidByName( idTrimmed ) );
}
catch ( Exception e )
{
realIds.add( idTrimmed );
}
}
// return nothing
if ( noAttribute )
{
Entry serverEntry = new DefaultEntry( schemaManager, Dn.ROOT_DSE );
return new BaseEntryFilteringCursor( new SingletonCursor<Entry>( serverEntry ), searchContext );
}
// return everything
if ( allUserAttributes && allOperationalAttributes )
{
Entry rootDSE = getRootDSE( null );
return new BaseEntryFilteringCursor( new SingletonCursor<Entry>( rootDSE ), searchContext );
}
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 );
}