| 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 ); | |
| } | |
| } |