[java-support] 07/10: JSPT-95 Make Rhino integration Compilable
Rod Widdowson
rdw at steadingsoftware.com
Wed Jun 10 14:21:56 UTC 2020
This is an automated email from the git hooks/post-receive script.
rdw pushed a commit to branch master
in repository java-support.
View the commit online:
http://git.shibboleth.net/view/?p=java-support.git;a=commit;h=3ef91c247e33d2c5bbbdf5fc6ff15491069b4348
commit 3ef91c247e33d2c5bbbdf5fc6ff15491069b4348
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Sat Apr 4 14:16:55 2020 +0100
JSPT-95 Make Rhino integration Compilable
https://issues.shibboleth.net/jira/browse/JSPT-95
---
.../support/scripting/AbstractScriptEngine.java | 9 +++-
.../java/support/scripting/EngineTests.java | 20 +++++++
.../java/support/scripting/GraalEngine.java | 8 +--
.../java/support/scripting/RhinoEngine.java | 62 ++++++++++++++++++++--
4 files changed, 87 insertions(+), 12 deletions(-)
diff --git a/src/test/java/net/shibboleth/utilities/java/support/scripting/AbstractScriptEngine.java b/src/test/java/net/shibboleth/utilities/java/support/scripting/AbstractScriptEngine.java
index 304ccb8..9c00efd 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/scripting/AbstractScriptEngine.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/scripting/AbstractScriptEngine.java
@@ -20,6 +20,8 @@ package net.shibboleth.utilities.java.support.scripting;
import java.io.Reader;
import javax.script.Bindings;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
@@ -28,7 +30,7 @@ import javax.script.ScriptException;
/**
* Enough boiler plate to allow us to implement a {@link ScriptEngine} sufficient for our own use.
*/
-public abstract class AbstractScriptEngine implements ScriptEngine {
+public abstract class AbstractScriptEngine implements ScriptEngine, Compilable {
/** {@inheritDoc} */
public Object eval(final String script, final ScriptContext context) throws ScriptException {
@@ -101,4 +103,9 @@ public abstract class AbstractScriptEngine implements ScriptEngine {
throw new RuntimeScriptingException("Unsupported method getFactory");
}
+ /** {@inheritDoc} */
+ public CompiledScript compile(final Reader script) throws ScriptException {
+ throw new ScriptException("Cannot compile from a reader");
+ }
+
}
diff --git a/src/test/java/net/shibboleth/utilities/java/support/scripting/EngineTests.java b/src/test/java/net/shibboleth/utilities/java/support/scripting/EngineTests.java
index 529ba31..7089f33 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/scripting/EngineTests.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/scripting/EngineTests.java
@@ -52,6 +52,26 @@ public class EngineTests {
assertEquals(map.get("a"), this);
}
+ @Test public void testRhinoCompiled() throws ScriptException {
+ final ScriptEngineManager engineManager = new ScriptEngineManager();
+ final ScriptEngine scriptEngine = engineManager.getEngineByName("shibboleth-rhino");
+ final Compilable compiler = (Compilable) scriptEngine;
+
+
+ final ScriptContext ctx = new SimpleScriptContext();
+ final String script = "var s = new java.util.HashMap(2); s.put('a',b); s";
+
+ ctx.setAttribute("b", this, ScriptContext.ENGINE_SCOPE);
+
+ final CompiledScript compiled = compiler.compile(script);
+ final Object o = compiled.eval(ctx);
+
+ assertTrue(o instanceof Map);
+ final Map map = (Map) o;
+ assertEquals(map.size(), 1);
+ assertEquals(map.get("a"), this);
+ }
+
@Test public void testGraal() throws ScriptException {
final ScriptEngineManager engineManager = new ScriptEngineManager();
final ScriptEngine scriptEngine = engineManager.getEngineByName("shibboleth-nashorn");
diff --git a/src/test/java/net/shibboleth/utilities/java/support/scripting/GraalEngine.java b/src/test/java/net/shibboleth/utilities/java/support/scripting/GraalEngine.java
index 90362e7..bb90943 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/scripting/GraalEngine.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/scripting/GraalEngine.java
@@ -17,8 +17,6 @@
package net.shibboleth.utilities.java.support.scripting;
-import java.io.Reader;
-
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.script.Bindings;
@@ -82,6 +80,7 @@ public class GraalEngine extends AbstractScriptEngine implements ScriptEngine, C
}
}
+ /** GraalVM {@link CompiledScript} implementation. */
private class GraalVMCompiledScript extends CompiledScript {
/** The compiled source. */
@@ -121,9 +120,4 @@ public class GraalEngine extends AbstractScriptEngine implements ScriptEngine, C
}
}
}
-
- /** {@inheritDoc} */
- public CompiledScript compile(final Reader script) throws ScriptException {
- throw new ScriptException("Cannot compile from a reader");
- }
}
diff --git a/src/test/java/net/shibboleth/utilities/java/support/scripting/RhinoEngine.java b/src/test/java/net/shibboleth/utilities/java/support/scripting/RhinoEngine.java
index af3ebbd..296b5ba 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/scripting/RhinoEngine.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/scripting/RhinoEngine.java
@@ -18,10 +18,14 @@
package net.shibboleth.utilities.java.support.scripting;
import javax.script.Bindings;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Script;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
@@ -31,16 +35,16 @@ import org.mozilla.javascript.ScriptableObject;
*
* NOTE that this does not (currently) implement {@link javax.script.Compilable}.
*/
-public class RhinoEngine extends AbstractScriptEngine implements ScriptEngine {
+public class RhinoEngine extends AbstractScriptEngine implements ScriptEngine, Compilable {
/** {@inheritDoc} */
- public Object eval(final String script, final Bindings binding) throws ScriptException {
+ public Object eval(final String script, final Bindings bindings) throws ScriptException {
final Context ctx = Context.enter();
try {
final Scriptable scope = ctx.initStandardObjects();
- for (final String name: binding.keySet()) {
- final Object jsObj = Context.javaToJS(binding.get(name), scope);
+ for (final String name: bindings.keySet()) {
+ final Object jsObj = Context.javaToJS(bindings.get(name), scope);
ScriptableObject.putProperty(scope, name, jsObj);
}
final Object o = ctx.evaluateString(scope, script, "rhino source", 1, null);
@@ -52,4 +56,54 @@ public class RhinoEngine extends AbstractScriptEngine implements ScriptEngine {
Context.exit();
}
}
+
+ /** {@inheritDoc} */
+ public CompiledScript compile(final String script) throws ScriptException {
+ return new CompiledScriptImpl(script);
+ }
+
+ /** Rhino {@link CompiledScript}. */
+ private class CompiledScriptImpl extends CompiledScript {
+
+ /** The compiled script. */
+ private final Script script;
+
+ /** Constructor.
+ *
+ * @param source what to compile up.
+ */
+ public CompiledScriptImpl(final String source) {
+ final Context ctx = Context.enter();
+ try {
+ script = ctx.compileString(source, "Script", 1, null);
+ } finally {
+ Context.exit();
+ }
+ }
+
+ /** {@inheritDoc} */
+ public Object eval(final ScriptContext context) throws ScriptException {
+ final Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
+ final Context ctx = Context.enter();
+ try {
+ final Scriptable scope = ctx.initStandardObjects();
+
+ for (final String name: bindings.keySet()) {
+ final Object jsObj = Context.javaToJS(bindings.get(name), scope);
+ ScriptableObject.putProperty(scope, name, jsObj);
+ }
+ final Object o = script.exec(ctx, scope);
+ return Context.jsToJava(o, Object.class);
+ }
+ finally {
+ Context.exit();
+ }
+
+ }
+
+ /** {@inheritDoc} */
+ public ScriptEngine getEngine() {
+ return RhinoEngine.this;
+ }
+ }
}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list