diff --git a/README.md b/README.md index 64c8528..1627199 100644 --- a/README.md +++ b/README.md @@ -17,16 +17,21 @@ For adding a library only: com.instancify.scriptify core - 1.0.1-SNAPSHOT + 1.2.0-SNAPSHOT ``` -For adding a library with JS: +For adding a library with JS for Rhino or GraalVM: ```xml com.instancify.scriptify - script-js - 1.0.1-SNAPSHOT + script-js-rhino + 1.2.0-SNAPSHOT + + + com.instancify.scriptify + script-js-graalvm + 1.2.0-SNAPSHOT ``` ## Gradle @@ -40,10 +45,11 @@ maven { For adding a library only: ```groovy -implementation "com.instancify.scriptify:core:1.0.1-SNAPSHOT" +implementation "com.instancify.scriptify:core:1.2.0-SNAPSHOT" ``` -For adding a library with JS: +For adding a library with JS for Rhino or GraalVM: ```groovy -implementation "com.instancify.scriptify:script-js:1.0.1-SNAPSHOT" +implementation "com.instancify.scriptify:script-js-rhino:1.2.0-SNAPSHOT" +implementation "com.instancify.scriptify:script-js-graalvm:1.2.0-SNAPSHOT" ``` \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 84f8e5a..a88906c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ java { allprojects { group = "com.instancify.scriptify" - version = "1.1.3-SNAPSHOT" + version = "1.2.0-SNAPSHOT" } subprojects { @@ -30,7 +30,6 @@ subprojects { annotationProcessor("org.projectlombok:lombok:1.18.36") testImplementation(platform("org.junit:junit-bom:5.10.0")) testImplementation("org.junit.jupiter:junit-jupiter") - api(("org.mozilla:rhino:1.7.15")) } tasks.test { diff --git a/core/src/main/java/com/instancify/scriptify/core/script/function/impl/ScriptFunctionShuffleArray.java b/core/src/main/java/com/instancify/scriptify/core/script/function/impl/ScriptFunctionShuffleArray.java index f00770d..a33ffc1 100644 --- a/core/src/main/java/com/instancify/scriptify/core/script/function/impl/ScriptFunctionShuffleArray.java +++ b/core/src/main/java/com/instancify/scriptify/core/script/function/impl/ScriptFunctionShuffleArray.java @@ -5,7 +5,6 @@ import com.instancify.scriptify.api.exception.ScriptFunctionException; import com.instancify.scriptify.api.script.Script; import com.instancify.scriptify.api.script.function.ScriptFunction; -import org.mozilla.javascript.NativeArray; import java.util.ArrayList; import java.util.Collections; @@ -27,8 +26,8 @@ public Object invoke(Script script, Object[] args) throws ScriptFunctionExceptio throw new ScriptFunctionArgsCountException(1, args.length); } - if (!(args[0] instanceof NativeArray array)) { - throw new ScriptFunctionArgTypeException(NativeArray.class, args[0].getClass()); + if (!(args[0] instanceof List array)) { + throw new ScriptFunctionArgTypeException(List.class, args[0].getClass()); } List list = new ArrayList(array); diff --git a/script-js-graalvm/build.gradle.kts b/script-js-graalvm/build.gradle.kts new file mode 100644 index 0000000..6c13dec --- /dev/null +++ b/script-js-graalvm/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + id("java") +} + +repositories { + mavenCentral() +} + +dependencies { + api(project(":core")) + api("org.graalvm.polyglot:polyglot:24.1.1") + api("org.graalvm.polyglot:js:24.1.1") +} \ No newline at end of file diff --git a/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsFunction.java b/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsFunction.java new file mode 100644 index 0000000..7646ed7 --- /dev/null +++ b/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsFunction.java @@ -0,0 +1,31 @@ +package com.instancify.scriptify.script; + +import com.instancify.scriptify.api.exception.ScriptFunctionException; +import com.instancify.scriptify.api.script.Script; +import com.instancify.scriptify.api.script.function.ScriptFunction; +import org.graalvm.polyglot.proxy.ProxyExecutable; +import org.graalvm.polyglot.Value; + +public class JsFunction implements ProxyExecutable { + + private final Script script; + private final ScriptFunction function; + + public JsFunction(Script script, ScriptFunction function) { + this.script = script; + this.function = function; + } + + @Override + public Object execute(Value... arguments) { + Object[] args = new Object[arguments.length]; + for (int i = 0; i < arguments.length; i++) { + args[i] = arguments[i].as(Object.class); + } + try { + return function.invoke(script, args); + } catch (ScriptFunctionException e) { + throw new RuntimeException(e); + } + } +} diff --git a/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsScript.java b/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsScript.java new file mode 100644 index 0000000..9f3b06a --- /dev/null +++ b/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsScript.java @@ -0,0 +1,54 @@ +package com.instancify.scriptify.script; + +import com.instancify.scriptify.api.script.Script; +import com.instancify.scriptify.api.script.constant.ScriptConstant; +import com.instancify.scriptify.api.script.constant.ScriptConstantManager; +import com.instancify.scriptify.api.script.function.ScriptFunction; +import com.instancify.scriptify.api.script.function.ScriptFunctionManager; +import org.graalvm.polyglot.*; + +public class JsScript implements Script { + + private final Context context = Context.create(); + private ScriptFunctionManager functionManager; + private ScriptConstantManager constantManager; + + @Override + public ScriptFunctionManager getFunctionManager() { + return functionManager; + } + + @Override + public void setFunctionManager(ScriptFunctionManager functionManager) { + this.functionManager = functionManager; + } + + @Override + public ScriptConstantManager getConstantManager() { + return constantManager; + } + + @Override + public void setConstantManager(ScriptConstantManager constantManager) { + this.constantManager = constantManager; + } + + @Override + public void eval(String script) { + Value bindings = context.getBindings("js"); + + if (functionManager != null) { + for (ScriptFunction function : functionManager.getFunctions().values()) { + bindings.putMember(function.getName(), new JsFunction(this, function)); + } + } + + if (constantManager != null) { + for (ScriptConstant constant : constantManager.getConstants().values()) { + bindings.putMember(constant.getName(), constant.getValue()); + } + } + + context.eval("js", script); + } +} diff --git a/script-js/build.gradle.kts b/script-js-rhino/build.gradle.kts similarity index 70% rename from script-js/build.gradle.kts rename to script-js-rhino/build.gradle.kts index 3e38472..9b9455c 100644 --- a/script-js/build.gradle.kts +++ b/script-js-rhino/build.gradle.kts @@ -7,6 +7,6 @@ repositories { } dependencies { - api("org.jetbrains:annotations:26.0.1") api(project(":core")) + api("org.mozilla:rhino:1.7.15") } \ No newline at end of file diff --git a/script-js/src/main/java/com/instancify/scriptify/script/JsFunction.java b/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsFunction.java similarity index 100% rename from script-js/src/main/java/com/instancify/scriptify/script/JsFunction.java rename to script-js-rhino/src/main/java/com/instancify/scriptify/script/JsFunction.java diff --git a/script-js/src/main/java/com/instancify/scriptify/script/JsScript.java b/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsScript.java similarity index 74% rename from script-js/src/main/java/com/instancify/scriptify/script/JsScript.java rename to script-js-rhino/src/main/java/com/instancify/scriptify/script/JsScript.java index 7dd2087..3ef0c9e 100644 --- a/script-js/src/main/java/com/instancify/scriptify/script/JsScript.java +++ b/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsScript.java @@ -37,12 +37,18 @@ public void setConstantManager(ScriptConstantManager constantManager) { @Override public void eval(String script) { - for (ScriptFunction function : functionManager.getFunctions().values()) { - scope.put(function.getName(), scope, new JsFunction(this, function)); + if (functionManager != null) { + for (ScriptFunction function : functionManager.getFunctions().values()) { + scope.put(function.getName(), scope, new JsFunction(this, function)); + } } - for (ScriptConstant constant : constantManager.getConstants().values()) { - ScriptableObject.putConstProperty(scope, constant.getName(), constant.getValue()); + + if (constantManager != null) { + for (ScriptConstant constant : constantManager.getConstants().values()) { + ScriptableObject.putConstProperty(scope, constant.getName(), constant.getValue()); + } } + context.evaluateString(scope, script, null, 1, null); } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 6229439..dfac280 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,5 @@ rootProject.name = "instancify-Scriptify" include("api") include("core") -include("script-js") \ No newline at end of file +include("script-js-graalvm") +include("script-js-rhino") \ No newline at end of file