[java-support] 08/11: JSPT-95 Make Rhino integration Compilable

Rod Widdowson rdw at steadingsoftware.com
Mon May 4 14:38:26 UTC 2020


This is an automated email from the git hooks/post-receive script.

rdw pushed a commit to branch dev/JSPT-95
in repository java-support.

View the commit online:
http://git.shibboleth.net/view/?p=java-support.git;a=commit;h=4252ebab0a81f8d7424a1cbaad6ebcf05ea5b7fe

commit 4252ebab0a81f8d7424a1cbaad6ebcf05ea5b7fe
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/GraalEngine.java        |  8 +--
 .../java/support/scripting/EngineTests.java        | 20 +++++++
 .../java/support/scripting/RhinoEngine.java        | 62 ++++++++++++++++++++--
 4 files changed, 87 insertions(+), 12 deletions(-)

diff --git a/src/main/java/net/shibboleth/utilities/java/support/scripting/AbstractScriptEngine.java b/src/main/java/net/shibboleth/utilities/java/support/scripting/AbstractScriptEngine.java
index 917433c..9fd3aa2 100644
--- a/src/main/java/net/shibboleth/utilities/java/support/scripting/AbstractScriptEngine.java
+++ b/src/main/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/main/java/net/shibboleth/utilities/java/support/scripting/GraalEngine.java b/src/main/java/net/shibboleth/utilities/java/support/scripting/GraalEngine.java
index 90362e7..bb90943 100644
--- a/src/main/java/net/shibboleth/utilities/java/support/scripting/GraalEngine.java
+++ b/src/main/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/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/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