package de.neuland.jade4j.expression; import org.apache.commons.jexl2.Expression; import org.apache.commons.jexl2.JadeJexlEngine; import org.apache.commons.jexl2.JexlEngine; import org.apache.commons.jexl2.MapContext; import de.neuland.jade4j.exceptions.ExpressionException; import de.neuland.jade4j.model.JadeModel; import org.apache.commons.lang3.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; public class JexlExpressionHandler implements ExpressionHandler { private static final int MAX_ENTRIES = 5000; public static Pattern plusplus = Pattern.compile("([a-zA-Z0-9-_]*[a-zA-Z0-9])\\+\\+\\s*;{0,1}\\s*$"); public static Pattern isplusplus = Pattern.compile("\\+\\+\\s*;{0,1}\\s*$"); public static Pattern minusminus = Pattern.compile("([a-zA-Z0-9-_]*[a-zA-Z0-9])--\\s*;{0,1}\\s*$"); public static Pattern isminusminus = Pattern.compile("--\\s*;{0,1}\\s*$"); private JexlEngine jexl; public JexlExpressionHandler() { jexl = new JadeJexlEngine(); jexl.setCache(MAX_ENTRIES); } public Boolean evaluateBooleanExpression(String expression, JadeModel model) throws ExpressionException { return BooleanUtil.convert(evaluateExpression(expression, model)); } public Object evaluateExpression(String expression, JadeModel model) throws ExpressionException { try { // if(expression.startsWith("{")) { // return expression; // }else{ if(expression.contains("\n")) { String[] split = StringUtils.split(expression,"\n"); for (String s : split) { evaluateExpression(s,model); } return null; }else { expression = removeVar(expression); if (isplusplus.matcher(expression).find()) { expression = convertPlusPlusExpression(expression); } if (isminusminus.matcher(expression).find()) { expression = convertMinusMinusExpression(expression); } Expression e = jexl.createExpression(expression); Object evaluate = e.evaluate(new MapContext(model)); return evaluate; } // } } catch (Exception e) { throw new ExpressionException(expression, e); } } private String convertMinusMinusExpression(String expression) { Matcher matcher = minusminus.matcher(expression); if (matcher.find(0) && matcher.groupCount() == 1) { String a = matcher.group(1); expression = a + " = " + a + " - 1"; } return expression; } private String convertPlusPlusExpression(String expression) { Matcher matcher = plusplus.matcher(expression); if (matcher.find(0) && matcher.groupCount() == 1) { String a = matcher.group(1); expression = a + " = " + a + " + 1"; } return expression; } private String removeVar(String expression) { expression = expression.replace("var ",""); // expression = expression.replace("\n",";"); // if(expression.startsWith("var ")){ // expression = expression.substring(4); // } return expression; } public void assertExpression(String expression) throws ExpressionException { try { jexl.createExpression("return (" + expression + ")"); } catch (Exception e) { throw new ExpressionException(expression, e); } } public String evaluateStringExpression(String expression, JadeModel model) throws ExpressionException { Object result = evaluateExpression(expression, model); return result == null ? "" : result.toString(); } public void setCache(boolean cache) { jexl.setCache(cache ? MAX_ENTRIES : 0); } public void clearCache() { jexl.clearCache(); } }