mirror of
https://github.com/PlaceholderAPI/Javascript-Expansion.git
synced 2025-05-23 10:39:04 +00:00
Implement RhinoJS Engine
This commit is contained in:
parent
94cf20c709
commit
386bab0d8e
@ -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'
|
||||
|
BIN
evaluator/libs/rhino-1.7.14.jar
Normal file
BIN
evaluator/libs/rhino-1.7.14.jar
Normal file
Binary file not shown.
BIN
evaluator/libs/rhino-engine-1.7.14.jar
Normal file
BIN
evaluator/libs/rhino-engine-1.7.14.jar
Normal file
Binary file not shown.
BIN
evaluator/libs/rhino-runtime-1.7.14.jar
Normal file
BIN
evaluator/libs/rhino-runtime-1.7.14.jar
Normal file
Binary file not shown.
@ -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;
|
||||
|
@ -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";
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
@ -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'
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user