package org.concordion.internal;
import java.util.ArrayList;
import java.util.List;
public class SimpleEvaluator extends OgnlEvaluator {
public SimpleEvaluator(Object fixture) {
super(fixture);
}
@Override
public Object evaluate(String expression) {
validateEvaluationExpression(expression);
return super.evaluate(expression);
}
@Override
public void setVariable(String expression, Object value) {
validateSetVariableExpression(expression);
super.setVariable(expression, value);
}
private static String METHOD_NAME_PATTERN = "[a-z][a-zA-Z0-9_]*";
private static String PROPERTY_NAME_PATTERN = "[a-z][a-zA-Z0-9_]*";
private static String STRING_PATTERN = "'[^']+'";
private static String LHS_VARIABLE_PATTERN = "#" + METHOD_NAME_PATTERN;
private static String RHS_VARIABLE_PATTERN = "(" + LHS_VARIABLE_PATTERN + "|#TEXT|#HREF)";
public static void validateEvaluationExpression(String expression) {
// Examples of possible expressions in test.concordion.internal.ExpressionTest
String METHOD_CALL_PARAMS = METHOD_NAME_PATTERN + " *\\( *" + RHS_VARIABLE_PATTERN + "(, *" + RHS_VARIABLE_PATTERN + " *)*\\)";
String METHOD_CALL_NO_PARAMS = METHOD_NAME_PATTERN + " *\\( *\\)";
String TERNARY_STRING_RESULT = " \\? " + STRING_PATTERN + " : " + STRING_PATTERN;
List<String> regexs = new ArrayList<String>();
regexs.add(PROPERTY_NAME_PATTERN);
regexs.add(METHOD_CALL_NO_PARAMS);
regexs.add(METHOD_CALL_PARAMS);
regexs.add(RHS_VARIABLE_PATTERN);
regexs.add(LHS_VARIABLE_PATTERN + "(\\." + PROPERTY_NAME_PATTERN + ")+");
regexs.add(LHS_VARIABLE_PATTERN + " *= *" + PROPERTY_NAME_PATTERN);
regexs.add(LHS_VARIABLE_PATTERN + " *= *" + METHOD_CALL_NO_PARAMS);
regexs.add(LHS_VARIABLE_PATTERN + " *= *" + METHOD_CALL_PARAMS);
regexs.add(LHS_VARIABLE_PATTERN + TERNARY_STRING_RESULT);
regexs.add(PROPERTY_NAME_PATTERN + TERNARY_STRING_RESULT);
regexs.add(METHOD_CALL_NO_PARAMS + TERNARY_STRING_RESULT);
regexs.add(METHOD_CALL_PARAMS + TERNARY_STRING_RESULT);
regexs.add(LHS_VARIABLE_PATTERN + "\\." + METHOD_CALL_NO_PARAMS);
regexs.add(LHS_VARIABLE_PATTERN + "\\." + METHOD_CALL_PARAMS);
expression = expression.trim();
for (String regex : regexs) {
if (expression.matches(regex)) {
return;
}
}
throw new RuntimeException("Invalid expression [" + expression + "]");
}
public static void validateSetVariableExpression(String expression) {
// #var VARIABLE
// #var = myProp VARIABLE = PROPERTY
// #var = myMethod() VARIABLE = METHOD
// #var = myMethod(var1) VARIABLE = METHOD_WITH_PARAM
// #var = myMethod(var1, var2) VARIABLE = METHOD_WITH_MULTIPLE_PARAMS
List<String> regexs = new ArrayList<String>();
regexs.add(RHS_VARIABLE_PATTERN);
regexs.add(LHS_VARIABLE_PATTERN + "\\." + PROPERTY_NAME_PATTERN);
regexs.add(LHS_VARIABLE_PATTERN + " *= *" + PROPERTY_NAME_PATTERN);
regexs.add(LHS_VARIABLE_PATTERN + " *= *" + METHOD_NAME_PATTERN + " *\\( *\\)");
regexs.add(LHS_VARIABLE_PATTERN + " *= *" + METHOD_NAME_PATTERN + " *\\( *" + RHS_VARIABLE_PATTERN + "(, *" + RHS_VARIABLE_PATTERN + " *)*\\)");
expression = expression.trim();
for (String regex : regexs) {
if (expression.matches(regex)) {
return;
}
}
throw new RuntimeException("Invalid 'set' expression [" + expression + "]");
}
}