blob: 86705be80dbef01576c21076ed7774540cc7a321 [file] [log] [blame]
/*******************************************************************************
* 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 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.validator.model;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import org.eclipse.bpel.validator.model.Rules.IndexFilter;
import org.eclipse.bpel.validator.model.Rules.Rule;
/**
* @author Michal Chmielewski (michal.chmielewski@oracle.com)
* @date Aug 13, 2007
*
*/
public class RuleRunner {
/** The rules which a validator class exposes to be run. */
Rules fRules;
/** Currently executing rules ... */
Stack<Rule> fRuleStack = new Stack<Rule>();
/** The currently executing rule */
Rule fCurrentRule = null;
/** Tells us which rules to skip */
List<IFilter<Rule>> fRuleFilter = new ArrayList<IFilter<Rule>>(4) ;
/** the validator on which this runner runs the rules */
Validator fValidator = null;
/**
* @param validator
*/
public RuleRunner (Validator validator) {
fValidator = validator;
fRules = Rules.getRules(validator.getClass());
}
/**
* Run the rules in the order intended. This is simply an iteration over
* the rules discovered for the given class.
* <p>
* Each of the validator classes can dynamically disabled a rule from being
* run.
* <p>
*
* @param tag the tag used on the rules.
* @param args to pass to the rules (if any).
*/
public void runRules ( String tag, Object ... args ) {
for (Rule rule: fRules.mRules) {
// Filter away rules that make no sense in this context.
if (tag.equals(rule.getTag()) == false) {
continue ;
}
if (isDisabled(rule)) {
continue;
}
try {
fCurrentRule = fRuleStack.push(rule);
rule.invoke (fValidator, args);
} catch (Throwable t) {
log (fValidator, rule, t);
} finally {
fCurrentRule = fRuleStack.empty() ? null : fRuleStack.pop();
}
}
}
/**
* Log any errors during rule execution.
*
* @param context
* @param rule
* @param t
*/
void log ( Validator context, Rule rule , Throwable t) {
context.internalProblem(rule, t);
Rules.p("Problem executing rule {0}, stack trace shown below",rule.getFullName()); //$NON-NLS-1$
t.printStackTrace( System.out );
}
/**
* @param indexFilter
*/
public void addFilter(IndexFilter indexFilter) {
fRuleFilter.add( indexFilter );
}
/**
*
*/
public void start() {
fRuleFilter.clear();
}
/**
* Called just before rules are run on this class.
*
* @param nextRule the next rule which will be run
* @return true if the nextRule can be run, false otherwise.
*/
boolean isDisabled ( Rule nextRule ) {
if (fRuleFilter.size() > 0) {
for(IFilter<Rule> f: fRuleFilter) {
if (f.select(nextRule)) {
return true;
}
}
}
return false;
}
/**
* @return the currently executing rule.
*/
public Rule getExecutingRule ( ) {
return fCurrentRule;
}
}