public List applyPredicate(Predicate predicate, List nodes2Filter, ContextSupport support)
throws JaxenException {
final int nodes2FilterSize = nodes2Filter.size();
List filteredNodes = new ArrayList(nodes2FilterSize);
// Set up a dummy context with a list to hold each node
Context predContext = new Context(support);
List tempList = new ArrayList(1);
predContext.setNodeSet(tempList);
// loop through the current nodes to filter and add to the
// filtered nodes list if the predicate succeeds
for (int i = 0; i < nodes2FilterSize; ++i) {
Object contextNode = nodes2Filter.get(i);
tempList.clear();
tempList.add(contextNode);
predContext.setNodeSet(tempList);
// ????
predContext.setPosition(i + 1);
predContext.setSize(nodes2FilterSize);
Object predResult = predicate.evaluate(predContext);
if (predResult instanceof Number) {
// Here we assume nodes are in forward or reverse order
// as appropriate for axis
int proximity = ((Number) predResult).intValue();
if (proximity == (i + 1)) {
filteredNodes.add(contextNode);
}
}
else {
Boolean includes =
BooleanFunction.evaluate(predResult,
predContext.getNavigator());
if (includes.booleanValue()) {
filteredNodes.add(contextNode);
}
}
}