All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jxls.expression.JexlExpressionEvaluator Maven / Gradle / Ivy

There is a newer version: 3.0.0
Show newest version
package org.jxls.expression;




import org.apache.commons.jexl2.Expression;
import org.apache.commons.jexl2.JexlContext;
import org.apache.commons.jexl2.JexlEngine;
import org.apache.commons.jexl2.MapContext;

import java.util.HashMap;
import java.util.Map;

/**
 * Date: Nov 2, 2009
 *
 * @author Leonid Vysochyn
 */
public class JexlExpressionEvaluator implements ExpressionEvaluator{
    private Expression jexlExpression;
    private JexlContext jexlContext;

    private static final ThreadLocal jexlThreadLocal = new ThreadLocal(){
        @Override
        protected JexlEngine initialValue() {
            return new JexlEngine();
        }
    };

    private static final ThreadLocal> expressionMapThreadLocal = new ThreadLocal>(){
        @Override
        protected Map initialValue() {
            return new HashMap<>();
        }
    };

    public JexlExpressionEvaluator() {
    }

    public JexlExpressionEvaluator(String expression) {
        JexlEngine jexl = jexlThreadLocal.get();
        jexlExpression = jexl.createExpression( expression );
    }

    public JexlExpressionEvaluator(Map context) {
        jexlContext = new MapContext(context);
    }

    public JexlExpressionEvaluator(JexlContext jexlContext) {
        this.jexlContext = jexlContext;
    }

    @Override
    public Object evaluate(String expression, Map context) {
        JexlContext jexlContext = new MapContext(context);
        try {
            JexlEngine jexl = jexlThreadLocal.get();
            Map expressionMap = expressionMapThreadLocal.get();
            Expression jexlExpression =  expressionMap.get(expression);
            if( jexlExpression == null ){
                jexlExpression = jexl.createExpression( expression );
                expressionMap.put(expression, jexlExpression);
            }
            return jexlExpression.evaluate(jexlContext);
        } catch (Exception e) {
            throw new EvaluationException("An error occurred when evaluating expression " + expression, e);
        }
    }

    public Object evaluate(Map context){
        jexlContext = new MapContext(context);
        try {
            return jexlExpression.evaluate( jexlContext );
        } catch (Exception e) {
            throw new EvaluationException("An error occurred when evaluating expression " + jexlExpression.getExpression(), e);
        }
    }

    public Expression getJexlExpression() {
        return jexlExpression;
    }

    public JexlEngine getJexlEngine() {
        return jexlThreadLocal.get();
    }

	@Override
	public String getExpression() {
		return jexlExpression == null ? null : jexlExpression.getExpression();
	}    
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy