package org.zalando.catwatch.backend.util;
import javax.script.Bindings;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.HashMap;
import java.util.Map;
public class JavaScriptExecutor {
private String jsCode;
private ScriptEngine engine;
private Bindings bindings;
/**
* @param jsCode
* JavaScript code. Contains usually an assignment to <code>result.value</code>.
*/
public static JavaScriptExecutor newExecutor(String jsCode) {
return new JavaScriptExecutor(jsCode);
}
private JavaScriptExecutor(String jsCode) {
super();
this.jsCode = jsCode;
ScriptEngineManager mgr = new ScriptEngineManager();
engine = mgr.getEngineByName("JavaScript");
bindings = engine.createBindings();
}
public JavaScriptExecutor bind(String key, Object value) {
bindings.put(key, value);
return this;
}
/**
* @return Returns <code>result.value</code>.
*/
@SuppressWarnings("unchecked")
public <T> T execute() {
try {
Map<String, Object> map = new HashMap<>();
bindings.put("result", map);
engine.eval(jsCode, bindings);
return (T) map.get("value");
} catch (ScriptException e) {
throw new RuntimeException(e);
}
}
}