* @return a response based on the contents of the context
*/
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 code = new ArrayList();
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 results = new HashSet();
// at this point, we need to go through all the resources we
// successfully found and start collecting results
Iterator it = resourceResult.getResources().iterator();
while (it.hasNext()) {
// get the next resource, and set it in the EvaluationCtx
AttributeValue resource = (AttributeValue)(it.next());
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 failureMap = resourceResult.getFailures();
it = failureMap.keySet().iterator();
while (it.hasNext()) {
// get the next resource, and use it to get its Status data
AttributeValue resource = (AttributeValue)(it.next());
Status status = (Status)(failureMap.get(resource));
// add a new result
results.add(new Result(Result.DECISION_INDETERMINATE,
status, resource.encode()));
}
// return the set of results
return new ResponseCtx(results);
} else {