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

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

The newest version!
package org.jxls.expression;

import java.util.Map;

import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import javax.script.SimpleBindings;

/**
 * JSR 223 based implementation of the {@link ExpressionEvaluator} interface
 */
public class ExpressionEvaluator4JSR223Impl implements ExpressionEvaluator {
	private final String expression;
	private final ScriptEngine scriptEngine;
	
	public ExpressionEvaluator4JSR223Impl(ScriptEngine scriptEngine, String expression) {
		this.scriptEngine = scriptEngine;
		this.expression = expression;
	}
	
    private static class BindingCacheHolder {
        Bindings binding;
        Map context;
    }

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

    @Override
    public Object evaluate(final String expression, final Map context) {
        if (expression == null || context == null) {
            return null;
        }
        final BindingCacheHolder holder = threadLocalCache.get();
        if (holder.binding == null) {
            holder.binding = new SimpleBindings(context);
        }
        if (holder.context == null || holder.context != context) {
            holder.context = context;
            holder.binding.putAll(context);
        }
        try {
            return scriptEngine.eval(expression, holder.binding);
        } catch (ScriptException e) {
            throw new EvaluationException("Evaluate error on: " + expression, e);
        }
    }

	@Override
	public Object evaluate(Map context) {
		return evaluate(expression,context);
	}

	@Override
	public String getExpression() {
		return expression;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy