diff --git a/evaluator/build.gradle b/evaluator/build.gradle index 38796c0..6d8abce 100644 --- a/evaluator/build.gradle +++ b/evaluator/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'com.github.johnrengelman.shadow' version '7.0.0' + id 'com.github.johnrengelman.shadow' version '7.1.2' } group 'com.extendedclip.papi.expansion.javascript' diff --git a/evaluator/libs/rhino-1.7.14.jar b/evaluator/libs/rhino-1.7.14.jar new file mode 100644 index 0000000..ad47a20 Binary files /dev/null and b/evaluator/libs/rhino-1.7.14.jar differ diff --git a/evaluator/libs/rhino-engine-1.7.14.jar b/evaluator/libs/rhino-engine-1.7.14.jar new file mode 100644 index 0000000..87a2b71 Binary files /dev/null and b/evaluator/libs/rhino-engine-1.7.14.jar differ diff --git a/evaluator/libs/rhino-runtime-1.7.14.jar b/evaluator/libs/rhino-runtime-1.7.14.jar new file mode 100644 index 0000000..894b040 Binary files /dev/null and b/evaluator/libs/rhino-runtime-1.7.14.jar differ diff --git a/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/NashornScriptEvaluator.java b/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/NashornScriptEvaluator.java index 5dcf77b..5cdd837 100644 --- a/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/NashornScriptEvaluator.java +++ b/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/NashornScriptEvaluator.java @@ -1,7 +1,5 @@ package com.extendedclip.papi.expansion.javascript.evaluator; -import com.koushikdutta.quack.QuackContext; -import org.openjdk.nashorn.api.scripting.NashornScriptEngine; import org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory; import javax.script.Bindings; @@ -9,7 +7,6 @@ import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptException; import java.util.Map; -import java.util.stream.Stream; public final class NashornScriptEvaluator implements ScriptEvaluator { private final NashornScriptEngineFactory scriptEngineFactory; diff --git a/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/QuickJsScriptEvaluatorFactory.java b/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/QuickJsScriptEvaluatorFactory.java index 8e67226..cb6b443 100644 --- a/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/QuickJsScriptEvaluatorFactory.java +++ b/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/QuickJsScriptEvaluatorFactory.java @@ -3,19 +3,14 @@ package com.extendedclip.papi.expansion.javascript.evaluator; import com.extendedclip.papi.expansion.javascript.evaluator.util.InjectionUtil; import javax.script.ScriptException; -import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.net.*; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.ReadableByteChannel; -import java.nio.file.StandardOpenOption; +import java.net.URISyntaxException; +import java.net.URL; import java.security.NoSuchAlgorithmException; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; import java.util.function.Function; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; public final class QuickJsScriptEvaluatorFactory implements ScriptEvaluatorFactory { private static final String TEST_EVALUATION_SCRIPT = "10 * 10"; diff --git a/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/RhinoJSScriptEvaluator.java b/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/RhinoJSScriptEvaluator.java new file mode 100644 index 0000000..63a6b79 --- /dev/null +++ b/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/RhinoJSScriptEvaluator.java @@ -0,0 +1,31 @@ +package com.extendedclip.papi.expansion.javascript.evaluator; + +import org.mozilla.javascript.engine.RhinoScriptEngineFactory; + +import javax.script.Bindings; +import javax.script.ScriptContext; +import javax.script.ScriptEngine; +import javax.script.ScriptException; +import java.util.Map; + +public class RhinoJSScriptEvaluator implements ScriptEvaluator { + + private final RhinoScriptEngineFactory scriptEngineFactory; + + private final Map bindings; + + public RhinoJSScriptEvaluator(final RhinoScriptEngineFactory scriptEngineFactory, final Map bindings) { + this.scriptEngineFactory = scriptEngineFactory; + this.bindings = bindings; + } + + @Override + public Object execute(final Map additionalBindings, final String script) throws EvaluatorException, ScriptException { + final ScriptEngine engine = scriptEngineFactory.getScriptEngine(); + final Bindings globalBindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); + globalBindings.putAll(bindings); + globalBindings.putAll(additionalBindings); + engine.setBindings(globalBindings, ScriptContext.GLOBAL_SCOPE); + return engine.eval(script); + } +} diff --git a/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/RhinoJSScriptEvaluatorFactory.java b/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/RhinoJSScriptEvaluatorFactory.java new file mode 100644 index 0000000..e1b731a --- /dev/null +++ b/evaluator/src/main/java/com/extendedclip/papi/expansion/javascript/evaluator/RhinoJSScriptEvaluatorFactory.java @@ -0,0 +1,39 @@ +package com.extendedclip.papi.expansion.javascript.evaluator; + +import com.extendedclip.papi.expansion.javascript.evaluator.util.InjectionUtil; +import org.mozilla.javascript.engine.RhinoScriptEngineFactory; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; + +public class RhinoJSScriptEvaluatorFactory implements ScriptEvaluatorFactory { + + public static final Collection LIBRARIES = Arrays.asList( + "rhino-1.7.14.isolated-jar", + "rhino-runtime-1.7.14.isolated-jar", + "rhino-engine-1.7.14.isolated-jar", + "asm-commons-9.2.isolated-jar", + "asm-util-9.2.isolated-jar", + "asm-9.2.isolated-jar" + ); + + private final RhinoScriptEngineFactory engineFactory; + + private RhinoJSScriptEvaluatorFactory(final RhinoScriptEngineFactory engineFactory) { + this.engineFactory = engineFactory; + } + + @Override + public ScriptEvaluator create(final Map bindings) { + return new RhinoJSScriptEvaluator(engineFactory, bindings); + } + + public static ScriptEvaluatorFactory create() throws URISyntaxException, ReflectiveOperationException, NoSuchAlgorithmException, IOException { + InjectionUtil.inject(LIBRARIES); + return new RhinoJSScriptEvaluatorFactory(new RhinoScriptEngineFactory()); + } +} diff --git a/expansion/build.gradle b/expansion/build.gradle index de28930..9736196 100644 --- a/expansion/build.gradle +++ b/expansion/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'com.github.johnrengelman.shadow' version '7.0.0' + id 'com.github.johnrengelman.shadow' version '7.1.2' id 'com.coditory.manifest' version '0.1.14' } diff --git a/expansion/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java b/expansion/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java index 4372d27..ded4e44 100644 --- a/expansion/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java +++ b/expansion/src/main/java/com/extendedclip/papi/expansion/javascript/JavascriptExpansion.java @@ -56,6 +56,7 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab private String argumentSeparator = ""; private boolean useQuickJS = false; + private boolean useRhinoJS = false; private ScriptLoader loader; private ScriptEvaluatorFactory scriptEvaluatorFactory; private CommandRegistrar commandRegistrar; @@ -87,17 +88,19 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab } useQuickJS = (boolean) get("use_quick_js", false); + useRhinoJS = (boolean) get("use_rhino_js", false); if (useQuickJS) { this.scriptEvaluatorFactory = QuickJsScriptEvaluatorFactory.createWithFallback(i -> { getPlaceholderAPI().getLogger().log(Level.WARNING, "Failed to use QuickJS Engine. Falling back to Nashorn"); return createNashornEvaluatorFactory(); }); + } else if (useRhinoJS) { + this.scriptEvaluatorFactory = createRhinoJSEvaluatorFactory(); } else { this.scriptEvaluatorFactory = createNashornEvaluatorFactory(); } - final HeaderWriter headerWriter = HeaderWriter.fromJar(SELF_JAR_URL); final File dataFolder = getPlaceholderAPI().getDataFolder(); @@ -168,6 +171,7 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab defaults.put("argument_split", ","); defaults.put("github_script_downloads", false); defaults.put("use_quick_js", false); + defaults.put("use_rhino_js", false); return defaults; } @@ -178,4 +182,12 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab throw new RuntimeException("Failed to create fallback evaluator: Nashorn" ,exception); // Unrecoverable } } + + private static ScriptEvaluatorFactory createRhinoJSEvaluatorFactory() { + try { + return RhinoJSScriptEvaluatorFactory.create(); + } catch (ReflectiveOperationException | URISyntaxException | NoSuchAlgorithmException | IOException e) { + throw new RuntimeException("Failed to create fallback evaluator: RhinoJS", e); + } + } }