blob: ff2b70b4ab9022a7f81899229b2b3f6055e8eac3 [file] [log] [blame]
package org.testng.internal;
import bsh.EvalError;
import bsh.Interpreter;
import org.testng.ITestNGMethod;
import org.testng.TestNGException;
import org.testng.collections.Maps;
import java.lang.reflect.Method;
import java.util.Map;
public class Bsh implements IBsh {
private static Interpreter s_interpreter;
@Override
public boolean includeMethodFromExpression(String expression, ITestNGMethod tm) {
boolean result = false;
Interpreter interpreter = getInterpreter();
try {
Map<String, String> groups = Maps.newHashMap();
for (String group : tm.getGroups()) {
groups.put(group, group);
}
setContext(interpreter, tm.getMethod(), groups, tm);
Object evalResult = interpreter.eval(expression);
result = ((Boolean) evalResult).booleanValue();
}
catch (EvalError evalError) {
Utils.log("bsh.Interpreter", 2, "Cannot evaluate expression:"
+ expression + ":" + evalError.getMessage());
}
finally {
resetContext(interpreter);
}
return result;
}
private static Interpreter getInterpreter() {
if(null == s_interpreter) {
s_interpreter= new Interpreter();
}
return s_interpreter;
}
private void setContext(Interpreter interpreter, Method method, Map<String, String> groups, ITestNGMethod tm) {
try {
interpreter.set("method", method);
interpreter.set("groups", groups);
interpreter.set("testngMethod", tm);
}
catch(EvalError evalError) {
throw new TestNGException("Cannot set BSH interpreter", evalError);
}
}
private void resetContext(Interpreter interpreter) {
try {
interpreter.unset("method");
interpreter.unset("groups");
interpreter.unset("testngMethod");
}
catch(EvalError evalError) {
Utils.log("bsh.Interpreter", 2, "Cannot reset interpreter:" + evalError.getMessage());
}
}
}