/******************************************************************************* * Copyright (c) 2006 Oracle Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Oracle Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.validator.model; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * * @author Michal Chmielewski (michal.chmielewski@oracle.com) * @date Jan 2, 2007 * */ @SuppressWarnings("nls") 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 = {}; /** The list of validators to run */ List<Validator> fValidators = new ArrayList<Validator>(256); /** A set which collects the SA checks that the validators makes */ Set<ARule> fSAChecks = new HashSet<ARule>(); /** * 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; } void init () { fValidators.clear(); // Create a depth first iteration from the root node ArrayList<INode> iteratorList = new ArrayList<INode>(32); // 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) { validator.setModelQuery(fModelQuery); validator.setSAChecks(fSAChecks); fValidators.add(validator); } // 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); } } } /** * Perform the validation run. * * @return list of problems found. */ public IProblem[] run ( ) { fSAChecks.clear(); if (fValidators.size() < 1) { init(); } // Pass 1 for(Validator validator : fValidators) { validator.validate(Validator.PASS1); } ArrayList<IProblem> problems = new ArrayList<IProblem>( 64 ); // Pass 2 for(Validator validator : fValidators) { validator.validate(Validator.PASS2); for(IProblem problem : validator.getProblems() ) { problems.add (problem); } } return problems.toArray( fProblems ); } /** * Return the list of SA checks performed on this validation run. * @return Return the list of SA checks performed on this validation run. */ public Set<ARule> getSAChecks () { return fSAChecks; } }