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 {
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'

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;
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;

View File

@ -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";

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 {
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'
}

View File

@ -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);
}
}
}