mirror of
https://github.com/PlaceholderAPI/Javascript-Expansion.git
synced 2025-05-23 18:42:44 +00:00
Implement RhinoJS Engine
This commit is contained in:
parent
94cf20c709
commit
386bab0d8e
@ -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'
|
||||||
|
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;
|
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;
|
||||||
|
@ -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";
|
||||||
|
@ -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 {
|
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'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user