//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.uima.utils.select;
/**
* Collects a list of elements that match the supplied criteria.
*/
public class Collector {
private Collector() {}
/**
* Build a list of elements, by visiting root and every descendant of root, and testing it against
* the evaluator.
*
* @param eval Evaluator to test elements against
* @param root root of tree to descend
* @return list of matches; empty if none
*/
public static <T> Nodes<T> collect(Evaluator<T> eval, Node<T> root) {
Nodes<T> elements = new Nodes<>();
new NodeTraversor<>(new Accumulator<>(root, elements, eval)).traverse(root);
return elements;
}
/**
* An internal accumulator, implements Node visitor to evaluate the nodes
*
*/
private static class Accumulator<T> implements NodeVisitor<T> {
private final Node<T> root;
private final Nodes<T> nodes;
private final Evaluator<T> eval;
/**
* Constructor for the Accumulator
*
* @param root the root node
* @param nodes the nodes to populate with successful matches
* @param eval the evaluator to use
*/
Accumulator(Node<T> root, Nodes<T> nodes, Evaluator<T> eval) {
this.root = root;
this.nodes = nodes;
this.eval = eval;
}
@Override
public void head(Node<T> node, int depth) {
Node<T> el = node;
if (eval.matches(root, el)) {
nodes.add(el);
}
}
}
}