renjin
renjin copied to clipboard
ScriptEngine API implementation is incomplete
1.) If I try to call javax.script.ScriptEngine#getContext(), then javax.script.ScriptContext#setAttribute(String, String, int) to set a variable, then it is not visible to a user script (Yields org.renjin.eval.EvalException: object 'msg' not found).
import org.testng.Assert;
import org.testng.annotations.Test;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class RenjinTest1 {
@Test
public void testJavaScriptScriptEngine() throws ScriptException {
testScriptEngine("JavaScript", "print(msg);");
}
@Test
public void testRenjinScriptScriptEngine() throws ScriptException {
testScriptEngine("Renjin", "cat(msg)");
}
private void testScriptEngine(String scriptEngineName, String outputScript) throws ScriptException {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(scriptEngineName);
if (scriptEngine == null) {
throw new IllegalStateException("Could not load ScriptEngine: " + scriptEngineName);
}
ScriptContext context = scriptEngine.getContext();
context.setAttribute("msg", "Hello World", ScriptContext.ENGINE_SCOPE);
scriptEngine.eval(outputScript);
context.removeAttribute("msg", ScriptContext.ENGINE_SCOPE);
try {
scriptEngine.eval(outputScript);
Assert.fail("Should have thrown an exception");
} catch (ScriptException se) {
// expected exception: variable is not defined anymore
}
}
}
2.) If I use javax.script.ScriptEngine#getBindings(int), then javax.script.Bindings#remove(String) throws an UnsupportedOperationException: nyi. (I guess this is not yet implemented?). This would cause issues for us, since a variable added to the context cannot be removed anymore.
import org.testng.Assert;
import org.testng.annotations.Test;
import javax.script.*;
public class RenjinTest2 {
@Test
public void testJavaScriptScriptEngine() throws ScriptException {
testScriptEngine("JavaScript", "print(msg);");
}
@Test
public void testRenjinScriptScriptEngine() throws ScriptException {
testScriptEngine("Renjin", "cat(msg)");
}
private void testScriptEngine(String scriptEngineName, String outputScript) throws ScriptException {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(scriptEngineName);
if (scriptEngine == null) {
throw new IllegalStateException("Could not load ScriptEngine: " + scriptEngineName);
}
Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("msg", "Hello World");
scriptEngine.eval(outputScript);
bindings.remove("msg");
try {
scriptEngine.eval(outputScript);
Assert.fail("Should have thrown an exception");
} catch (ScriptException se) {
// expected exception: variable is not defined anymore
}
}
}