boolean searchRecurringParent = false;
boolean searchRecurringTasks = false;
DN baseDN = searchOperation.getBaseDN();
SearchScope searchScope = searchOperation.getScope();
SearchFilter searchFilter = searchOperation.getFilter();
if (baseDN.equals(taskRootDN))
{
switch (searchScope)
{
case BASE_OBJECT:
searchRoot = true;
break;
case SINGLE_LEVEL:
searchScheduledParent = true;
searchRecurringParent = true;
break;
case WHOLE_SUBTREE:
searchRoot = true;
searchScheduledParent = true;
searchRecurringParent = true;
searchScheduledTasks = true;
searchRecurringTasks = true;
break;
case SUBORDINATE_SUBTREE:
searchScheduledParent = true;
searchRecurringParent = true;
searchScheduledTasks = true;
searchRecurringTasks = true;
break;
}
}
else if (baseDN.equals(scheduledTaskParentDN))
{
switch (searchScope)
{
case BASE_OBJECT:
searchScheduledParent = true;
break;
case SINGLE_LEVEL:
searchScheduledTasks = true;
break;
case WHOLE_SUBTREE:
searchScheduledParent = true;
searchScheduledTasks = true;
break;
case SUBORDINATE_SUBTREE:
searchScheduledTasks = true;
break;
}
}
else if (baseDN.equals(recurringTaskParentDN))
{
switch (searchScope)
{
case BASE_OBJECT:
searchRecurringParent = true;
break;
case SINGLE_LEVEL:
searchRecurringTasks = true;
break;
case WHOLE_SUBTREE:
searchRecurringParent = true;
searchRecurringTasks = true;
break;
case SUBORDINATE_SUBTREE:
searchRecurringTasks = true;
break;
}
}
else
{
DN parentDN = baseDN.getParentDNInSuffix();
if (parentDN == null)
{
Message message =
ERR_TASKBE_SEARCH_INVALID_BASE.get(String.valueOf(baseDN));
throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message);
}
else if (parentDN.equals(scheduledTaskParentDN))
{
Lock lock = taskScheduler.readLockEntry(baseDN);
try
{
Entry e = taskScheduler.getScheduledTaskEntry(baseDN);
if (e == null)
{
Message message =
ERR_TASKBE_SEARCH_NO_SUCH_TASK.get(String.valueOf(baseDN));
throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message,
scheduledTaskParentDN, null);
}
if (((searchScope == SearchScope.BASE_OBJECT) ||
(searchScope == SearchScope.WHOLE_SUBTREE)) &&
searchFilter.matchesEntry(e))
{
searchOperation.returnEntry(e, null);
}
return;
}
finally
{
taskScheduler.unlockEntry(baseDN, lock);
}
}
else if (parentDN.equals(recurringTaskParentDN))
{
Lock lock = taskScheduler.readLockEntry(baseDN);
try
{
Entry e = taskScheduler.getRecurringTaskEntry(baseDN);
if (e == null)
{
Message message = ERR_TASKBE_SEARCH_NO_SUCH_RECURRING_TASK.get(
String.valueOf(baseDN));
throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message,
recurringTaskParentDN, null);
}
if (((searchScope == SearchScope.BASE_OBJECT) ||
(searchScope == SearchScope.WHOLE_SUBTREE)) &&
searchFilter.matchesEntry(e))
{
searchOperation.returnEntry(e, null);
}
return;
}
finally
{
taskScheduler.unlockEntry(baseDN, lock);
}
}
else
{
Message message =
ERR_TASKBE_SEARCH_INVALID_BASE.get(String.valueOf(baseDN));
throw new DirectoryException(ResultCode.NO_SUCH_OBJECT, message);
}
}
if (searchRoot)
{
Entry e = taskScheduler.getTaskRootEntry();
if (searchFilter.matchesEntry(e))
{
if (! searchOperation.returnEntry(e, null))
{
return;
}
}
}
if (searchScheduledParent)
{
Entry e = taskScheduler.getScheduledTaskParentEntry();
if (searchFilter.matchesEntry(e))
{
if (! searchOperation.returnEntry(e, null))
{
return;
}
}
}
if (searchScheduledTasks)
{
if (! taskScheduler.searchScheduledTasks(searchOperation))
{
return;
}
}
if (searchRecurringParent)
{
Entry e = taskScheduler.getRecurringTaskParentEntry();
if (searchFilter.matchesEntry(e))
{
if (! searchOperation.returnEntry(e, null))
{
return;
}