renjin icon indicating copy to clipboard operation
renjin copied to clipboard

ScriptEngine API implementation is incomplete

Open akbertram opened this issue 8 years ago • 0 comments

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
        }
    }
}

akbertram avatar Jul 04 '16 14:07 akbertram