*/
public ResponseCtx evaluate(EvaluationCtx context) {
// see if we need to call the resource finder
if (context.getScope() != EvaluationCtx.SCOPE_IMMEDIATE) {
AttributeValue parent = context.getResourceId();
ResourceFinderResult resourceResult = null;
if (context.getScope() == EvaluationCtx.SCOPE_CHILDREN)
resourceResult = resourceFinder.findChildResources(parent, context);
else
resourceResult = resourceFinder.findDescendantResources(parent, context);
// see if we actually found anything
if (resourceResult.isEmpty()) {
// this is a problem, since we couldn't find any resources
// to work on...the spec is not explicit about what kind of
// error this is, so we're treating it as a processing error
ArrayList<String> code = new ArrayList<String>();
code.add(Status.STATUS_PROCESSING_ERROR);
String msg = "Couldn't find any resources to work on.";
return new ResponseCtx(new Result(Result.DECISION_INDETERMINATE, new Status(code,
msg), context.getResourceId().encode()));
}
// setup a set to keep track of the results
HashSet<Result> results = new HashSet<Result>();
// at this point, we need to go through all the resources we
// successfully found and start collecting results
for (AttributeValue resource : resourceResult.getResources()) {
// get the next resource, and set it in the EvaluationCtx
context.setResourceId(resource);
// do the evaluation, and set the resource in the result
Result result = evaluateContext(context);
result.setResource(resource.encode());
// add the result
results.add(result);
}
// now that we've done all the successes, we add all the failures
// from the finder result
Map<AttributeValue, Status> failureMap = resourceResult.getFailures();
for (AttributeValue resource : failureMap.keySet()) {
// get the next resource, and use it to get its Status data
Status status = (failureMap.get(resource));
// add a new result