Skip to content

Implement RhinoJS Engine #65

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion evaluator/build.gradle
Original file line number Diff line number Diff line change
@@ -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'
Expand Down
Binary file added evaluator/libs/rhino-1.7.14.jar
Binary file not shown.
Binary file added evaluator/libs/rhino-engine-1.7.14.jar
Binary file not shown.
Binary file added evaluator/libs/rhino-runtime-1.7.14.jar
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
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;
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,14 @@
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";
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
2 changes: 1 addition & 1 deletion expansion/build.gradle
Original file line number Diff line number Diff line change
@@ -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'
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -87,17 +88,19 @@ public boolean register() {
}

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();
Expand Down Expand Up @@ -168,6 +171,7 @@ public Map<String, Object> getDefaults() {
defaults.put("argument_split", ",");
defaults.put("github_script_downloads", false);
defaults.put("use_quick_js", false);
defaults.put("use_rhino_js", false);
return defaults;
}

Expand All @@ -178,4 +182,12 @@ private static ScriptEvaluatorFactory createNashornEvaluatorFactory() {
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);
}
}
}