| |
| public class Runner { |
| |
| /** The root node from where validation should be started */ |
| INode fRoot; |
| |
| /** The query interface to our model */ |
| IModelQuery fModelQuery; |
| |
| /** empty list of problems */ |
| IProblem[] fProblems = {}; |
| |
| |
| /** |
| * Return a brand new shiny instance of a runner. The runner's purpose is to validate |
| * the nodes in the tree starting at node passed. |
| * |
| * @param query the model query |
| * @param root the root node. |
| */ |
| |
| public Runner ( IModelQuery query, INode root) { |
| |
| fRoot = root ; |
| fModelQuery = query; |
| } |
| |
| |
| /** |
| * Perform the validation run. |
| * |
| * @return list of problems found. |
| */ |
| |
| |
| public IProblem[] run () { |
| |
| // Create a depth first iteration from the root node |
| ArrayList<INode> iteratorList = new ArrayList<INode>(32); |
| ArrayList<Validator> validatorList = new ArrayList<Validator>(256); |
| |
| // start at the root node |
| iteratorList.add(fRoot); |
| |
| // 1. Generate the list of validators to call, in order |
| while (iteratorList.size() > 0) { |
| |
| INode nextNode = iteratorList.remove(0); |
| |
| Validator validator = nextNode.nodeValidator(); |
| |
| if (validator != null) { |
| validatorList.add(validator); |
| validator.setModelQuery(fModelQuery); |
| } |
| |
| // the facaded object will tell us what children to include in the walk |
| List<INode> children = nextNode.children(); |
| if (children.size() > 0) { |
| iteratorList.addAll(0, children); |
| } |
| } |
| |
| |
| // Pass 1 |
| for(Validator validator : validatorList) { |
| validator.validate(Validator.PASS1); |
| } |
| |
| ArrayList<IProblem> problems = new ArrayList<IProblem>( 64 ); |
| |
| // Pass 2 |
| // On the validators that have been run, perform the final rule pass. |
| for(Validator validator : validatorList) { |
| validator.validate(Validator.PASS2); |
| |
| for(IProblem problem : validator.getProblems() ) { |
| problems.add (problem); |
| } |
| } |
| |
| return problems.toArray( fProblems ); |
| } |
| } |