001package scpc.model.support;
002
003import javax.script.Bindings;
004import javax.script.ScriptEngine;
005import javax.script.ScriptEngineManager;
006import javax.script.ScriptException;
007import javax.script.SimpleBindings;
008
009/**
010 * A JavaScript formula evaluator using JDK build in JS Engin.
011 * <br>使用JDK內建的JS引擎做為公式解譯工具
012 *
013 * @author Kent Yeh
014 * @param <T> type of real cart item.
015 */
016public abstract class JsEvalHelper<T> extends EvalHelper<T> {
017
018    private static final ScriptEngineManager SMGR = new ScriptEngineManager();
019    private Bindings bindings = null;
020
021    protected ScriptEngine getScriptEngine() {
022        return SMGR.getEngineByName("JavaScript");
023    }
024
025    /**
026     * @see EvalHelper#bindVarValue(java.lang.String, java.lang.Object)
027     * @param variable
028     * @param value
029     * @return
030     */
031    @Override
032    public EvalHelper<T> bindVarValue(String variable, Object value) {
033        bindings.put(variable, value);
034        return this;
035    }
036
037    /**
038     * @see EvalHelper#purgeBind()
039     */
040    @Override
041    protected void purgeBind() {
042        bindings = new SimpleBindings();
043    }
044
045    /**
046     * @see EvalHelper#eval(java.lang.String)
047     * @param formula
048     * @return
049     * @throws ScriptException
050     */
051    @Override
052    public Object eval(String formula) throws ScriptException {
053        validateJSVariable();
054        return getScriptEngine().eval(formula, bindings);
055    }
056
057}