Implement RhinoJS Engine

This commit is contained in:
darbyjack 2022-06-03 10:00:07 -05:00
parent 94cf20c709
commit 386bab0d8e
No known key found for this signature in database
GPG Key ID: F4B1016988371117
10 changed files with 90 additions and 16 deletions

View File

@ -1,6 +1,6 @@
plugins { plugins {
id 'java' 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' group 'com.extendedclip.papi.expansion.javascript'

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,7 +1,5 @@
package com.extendedclip.papi.expansion.javascript.evaluator; 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 org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory;
import javax.script.Bindings; import javax.script.Bindings;
@ -9,7 +7,6 @@ import javax.script.ScriptContext;
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
import javax.script.ScriptException; import javax.script.ScriptException;
import java.util.Map; import java.util.Map;
import java.util.stream.Stream;
public final class NashornScriptEvaluator implements ScriptEvaluator { public final class NashornScriptEvaluator implements ScriptEvaluator {
private final NashornScriptEngineFactory scriptEngineFactory; private final NashornScriptEngineFactory scriptEngineFactory;

View File

@ -3,19 +3,14 @@ package com.extendedclip.papi.expansion.javascript.evaluator;
import com.extendedclip.papi.expansion.javascript.evaluator.util.InjectionUtil; import com.extendedclip.papi.expansion.javascript.evaluator.util.InjectionUtil;
import javax.script.ScriptException; import javax.script.ScriptException;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.net.URISyntaxException;
import java.net.*; import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.nio.file.StandardOpenOption;
import java.security.NoSuchAlgorithmException; 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.function.Function;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
public final class QuickJsScriptEvaluatorFactory implements ScriptEvaluatorFactory { public final class QuickJsScriptEvaluatorFactory implements ScriptEvaluatorFactory {
private static final String TEST_EVALUATION_SCRIPT = "10 * 10"; private static final String TEST_EVALUATION_SCRIPT = "10 * 10";

View File

@ -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<String, Object> bindings;
public RhinoJSScriptEvaluator(final RhinoScriptEngineFactory scriptEngineFactory, final Map<String, Object> bindings) {
this.scriptEngineFactory = scriptEngineFactory;
this.bindings = bindings;
}
@Override
public Object execute(final Map<String, Object> 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);
}
}

View File

@ -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<String> 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<String, Object> bindings) {
return new RhinoJSScriptEvaluator(engineFactory, bindings);
}
public static ScriptEvaluatorFactory create() throws URISyntaxException, ReflectiveOperationException, NoSuchAlgorithmException, IOException {
InjectionUtil.inject(LIBRARIES);
return new RhinoJSScriptEvaluatorFactory(new RhinoScriptEngineFactory());
}
}

View File

@ -1,6 +1,6 @@
plugins { plugins {
id 'java' 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' id 'com.coditory.manifest' version '0.1.14'
} }

View File

@ -56,6 +56,7 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
private String argumentSeparator = ""; private String argumentSeparator = "";
private boolean useQuickJS = false; private boolean useQuickJS = false;
private boolean useRhinoJS = false;
private ScriptLoader loader; private ScriptLoader loader;
private ScriptEvaluatorFactory scriptEvaluatorFactory; private ScriptEvaluatorFactory scriptEvaluatorFactory;
private CommandRegistrar commandRegistrar; private CommandRegistrar commandRegistrar;
@ -87,17 +88,19 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
} }
useQuickJS = (boolean) get("use_quick_js", false); useQuickJS = (boolean) get("use_quick_js", false);
useRhinoJS = (boolean) get("use_rhino_js", false);
if (useQuickJS) { if (useQuickJS) {
this.scriptEvaluatorFactory = QuickJsScriptEvaluatorFactory.createWithFallback(i -> { this.scriptEvaluatorFactory = QuickJsScriptEvaluatorFactory.createWithFallback(i -> {
getPlaceholderAPI().getLogger().log(Level.WARNING, "Failed to use QuickJS Engine. Falling back to Nashorn"); getPlaceholderAPI().getLogger().log(Level.WARNING, "Failed to use QuickJS Engine. Falling back to Nashorn");
return createNashornEvaluatorFactory(); return createNashornEvaluatorFactory();
}); });
} else if (useRhinoJS) {
this.scriptEvaluatorFactory = createRhinoJSEvaluatorFactory();
} else { } else {
this.scriptEvaluatorFactory = createNashornEvaluatorFactory(); this.scriptEvaluatorFactory = createNashornEvaluatorFactory();
} }
final HeaderWriter headerWriter = HeaderWriter.fromJar(SELF_JAR_URL); final HeaderWriter headerWriter = HeaderWriter.fromJar(SELF_JAR_URL);
final File dataFolder = getPlaceholderAPI().getDataFolder(); final File dataFolder = getPlaceholderAPI().getDataFolder();
@ -168,6 +171,7 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
defaults.put("argument_split", ","); defaults.put("argument_split", ",");
defaults.put("github_script_downloads", false); defaults.put("github_script_downloads", false);
defaults.put("use_quick_js", false); defaults.put("use_quick_js", false);
defaults.put("use_rhino_js", false);
return defaults; return defaults;
} }
@ -178,4 +182,12 @@ public class JavascriptExpansion extends PlaceholderExpansion implements Cacheab
throw new RuntimeException("Failed to create fallback evaluator: Nashorn" ,exception); // Unrecoverable 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);
}
}
} }