[java-support] 06/10: JSPT-95 Clean up GraalVm support code

Rod Widdowson rdw at steadingsoftware.com
Tue May 12 15:34:20 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=b3b9a1501e8bf981082cda5200539e3e57756fd3

commit b3b9a1501e8bf981082cda5200539e3e57756fd3
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Sat Apr 4 14:09:37 2020 +0100

    JSPT-95 Clean up GraalVm support code
    
    https://issues.shibboleth.net/jira/browse/JSPT-95
---
 .../java/support/scripting/GraalEngine.java        | 95 ++++++++++++++--------
 .../java/support/scripting/GraalFactory.java       |  8 +-
 2 files changed, 63 insertions(+), 40 deletions(-)

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 07f3a86..90362e7 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
@@ -19,6 +19,8 @@ package net.shibboleth.utilities.java.support.scripting;
 
 import java.io.Reader;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.script.Bindings;
 import javax.script.Compilable;
 import javax.script.CompiledScript;
@@ -51,56 +53,77 @@ public class GraalEngine extends AbstractScriptEngine implements ScriptEngine, C
             }
             final Source s = Source.newBuilder("js", script, "embedded").buildLiteral();
             final Value v = context.eval(s);
-            if (v.isHostObject()) {
-                return v.asHostObject();
-            } else if (v.isProxyObject()) { 
-                return v.asProxyObject();
-            }
-            return v.as(Object.class);
+            return processValue(v);
         }  catch (final RuntimeException e) {
             throw new ScriptException(e);
         }
     }
 
     /** {@inheritDoc} */
-    public CompiledScript compile(String script) throws ScriptException {
+    public CompiledScript compile(final String script) throws ScriptException {
 
-        final ScriptEngine parent = this;
-        return new CompiledScript() {
-            final Source source = Source.newBuilder("js", script, "embedded").buildLiteral();
+        return new GraalVMCompiledScript(script);
+    }
 
-            public ScriptEngine getEngine() {
-                return parent;
-            }
+    /** Convert the output from {@link Context#eval(String, CharSequence)} or
+     * {@link Context#eval(String, CharSequence)} into a java {@link Object}.
+     * @param value what to consider
+     * @return The output
+     */
+    @Nullable protected static Object processValue(@Nonnull final Value value) {
+        if (value.isNull()) {
+            return null;
+        } else if (value.isHostObject()) {
+            return value.asHostObject();
+        } else if (value.isProxyObject()) {
+            return value.asProxyObject();
+        } else {
+            return  value.as(Object.class);
+        }
+    }
+
+    private class GraalVMCompiledScript extends CompiledScript {
+        
+        /** The compiled source. */
+        private final Source source;
 
-            public Object eval(ScriptContext scriptContext) throws ScriptException {
-
-                try (final Context context = Context.newBuilder().allowExperimentalOptions(true).
-                        option("js.nashorn-compat", "true").
-                        allowAllAccess(true).
-                        build()) {
-
-                    final Bindings scriptBindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
-                    final Value bindings  = context.getBindings("js");
-                    for (final String name: scriptBindings.keySet()) {
-                        bindings.putMember(name, scriptBindings.get(name));
-                    }
-                    final Value v = context.eval(source);
-                    if (v.isHostObject()) {
-                        return v.asHostObject();
-                    } else if (v.isProxyObject()) {
-                        return v.asProxyObject();
-                    }
-                    return v.as(Object.class);
-                }  catch (final RuntimeException e) {
-                    throw new ScriptException(e);
+        /**
+         * Constructor.
+         *
+         * @param script the script (as text)
+         */
+        protected GraalVMCompiledScript(final String script) {
+            source = Source.newBuilder("js", script, "embedded").buildLiteral();
+        }
+
+        /** {@inheritDoc} */
+        public ScriptEngine getEngine() {
+            return GraalEngine.this;
+        }
+
+        /** {@inheritDoc} */
+        public Object eval(final ScriptContext scriptContext) throws ScriptException {
+
+            try (final Context context = Context.newBuilder().allowExperimentalOptions(true).
+                    option("js.nashorn-compat", "true").
+                    allowAllAccess(true).
+                    build()) {
+
+                final Bindings scriptBindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
+                final Value bindings  = context.getBindings("js");
+                for (final String name: scriptBindings.keySet()) {
+                    bindings.putMember(name, scriptBindings.get(name));
                 }
+                final Value v = context.eval(source);
+                return processValue(v);
+            }  catch (final RuntimeException e) {
+                throw new ScriptException(e);
             }
-        };
+        }
     }
 
     /** {@inheritDoc} */
-    public CompiledScript compile(Reader script) throws ScriptException {
+    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/GraalFactory.java b/src/test/java/net/shibboleth/utilities/java/support/scripting/GraalFactory.java
index 83f406c..59e6069 100644
--- a/src/test/java/net/shibboleth/utilities/java/support/scripting/GraalFactory.java
+++ b/src/test/java/net/shibboleth/utilities/java/support/scripting/GraalFactory.java
@@ -68,22 +68,22 @@ public class GraalFactory implements ScriptEngineFactory {
     }
 
     /** {@inheritDoc} */
-    public Object getParameter(String key) {
+    public Object getParameter(final String key) {
         throw new RuntimeScriptingException("Unsupported method getMethodCallSyntax");
     }
 
     /** {@inheritDoc} */
-    public String getMethodCallSyntax(String obj, String m, String... args) {
+    public String getMethodCallSyntax(final String obj, final String m, final String... args) {
         throw new RuntimeScriptingException("Unsupported method getMethodCallSyntax");
     }
 
     /** {@inheritDoc} */
-    public String getOutputStatement(String toDisplay) {
+    public String getOutputStatement(final String toDisplay) {
         throw new RuntimeScriptingException("Unsupported method getMethodCallSyntax");
     }
 
     /** {@inheritDoc} */
-    public String getProgram(String... statements) {
+    public String getProgram(final String... statements) {
         throw new RuntimeScriptingException("Unsupported method getMethodCallSyntax");
     }
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list