diff --git a/api/src/main/java/com/instancify/scriptify/api/script/Script.java b/api/src/main/java/com/instancify/scriptify/api/script/Script.java index fb38b95..60036ed 100644 --- a/api/src/main/java/com/instancify/scriptify/api/script/Script.java +++ b/api/src/main/java/com/instancify/scriptify/api/script/Script.java @@ -13,6 +13,14 @@ */ public interface Script { + /** + * Retrieves the security manager associated with this script. + * + * @return The ScriptSecurityManager for this script + * @see ScriptSecurityManager + */ + ScriptSecurityManager getSecurityManager(); + /** * Retrieves the function manager associated with this script. * @@ -46,12 +54,11 @@ public interface Script { void setConstantManager(ScriptConstantManager constantManager); /** - * Retrieves the security manager associated with this script. + * Add an extra script on top of the whole script. * - * @return The ScriptSecurityManager for this script - * @see ScriptSecurityManager + * @param script Extra script */ - ScriptSecurityManager getSecurityManager(); + void addExtraScript(String script); /** * Evaluates and executes this script. diff --git a/build.gradle.kts b/build.gradle.kts index 2fd6d2e..c559b2e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ java { allprojects { group = "com.instancify.scriptify" - version = "1.4.3-SNAPSHOT" + version = "1.4.4-SNAPSHOT" } subprojects { diff --git a/script-js-graalvm/src/main/java/com/instancify/scriptify/js/graalvm/script/JsScript.java b/script-js-graalvm/src/main/java/com/instancify/scriptify/js/graalvm/script/JsScript.java index ab9968d..8858346 100644 --- a/script-js-graalvm/src/main/java/com/instancify/scriptify/js/graalvm/script/JsScript.java +++ b/script-js-graalvm/src/main/java/com/instancify/scriptify/js/graalvm/script/JsScript.java @@ -15,11 +15,20 @@ import org.graalvm.polyglot.HostAccess; import org.graalvm.polyglot.Value; +import java.util.ArrayList; +import java.util.List; + public class JsScript implements Script { private final ScriptSecurityManager securityManager = new StandardSecurityManager(); private ScriptFunctionManager functionManager = new StandardFunctionManager(); private ScriptConstantManager constantManager = new StandardConstantManager(); + private final List extraScript = new ArrayList<>(); + + @Override + public ScriptConstantManager getConstantManager() { + return constantManager; + } @Override public ScriptSecurityManager getSecurityManager() { @@ -37,13 +46,13 @@ public void setFunctionManager(ScriptFunctionManager functionManager) { } @Override - public ScriptConstantManager getConstantManager() { - return constantManager; + public void setConstantManager(ScriptConstantManager constantManager) { + this.constantManager = constantManager; } @Override - public void setConstantManager(ScriptConstantManager constantManager) { - this.constantManager = constantManager; + public void addExtraScript(String script) { + this.extraScript.add(script); } @Override @@ -84,8 +93,15 @@ public Value eval(String script) throws ScriptException { } } + // Building full script including extra script code + StringBuilder fullScript = new StringBuilder(); + for (String extra : extraScript) { + fullScript.append(extra).append("\n"); + } + fullScript.append(script); + try { - return context.eval("js", script); + return context.eval("js", fullScript.toString()); } catch (Exception e) { throw new ScriptException(e); } finally { diff --git a/script-js-rhino/src/main/java/com/instancify/scriptify/js/rhino/script/JsScript.java b/script-js-rhino/src/main/java/com/instancify/scriptify/js/rhino/script/JsScript.java index be474f7..27d5475 100644 --- a/script-js-rhino/src/main/java/com/instancify/scriptify/js/rhino/script/JsScript.java +++ b/script-js-rhino/src/main/java/com/instancify/scriptify/js/rhino/script/JsScript.java @@ -13,12 +13,16 @@ import org.mozilla.javascript.Context; import org.mozilla.javascript.ScriptableObject; +import java.util.ArrayList; +import java.util.List; + public class JsScript implements Script { private final Context context = Context.enter(); private final ScriptSecurityManager securityManager = new StandardSecurityManager(); private ScriptFunctionManager functionManager = new StandardFunctionManager(); private ScriptConstantManager constantManager = new StandardConstantManager(); + private final List extraScript = new ArrayList<>(); public JsScript() { context.setWrapFactory(new JsWrapFactory()); @@ -49,6 +53,11 @@ public void setConstantManager(ScriptConstantManager constantManager) { this.constantManager = constantManager; } + @Override + public void addExtraScript(String script) { + this.extraScript.add(script); + } + @Override public Object eval(String script) throws ScriptException { ScriptableObject scope = context.initStandardObjects(); @@ -71,8 +80,15 @@ public Object eval(String script) throws ScriptException { } } + // Building full script including extra script code + StringBuilder fullScript = new StringBuilder(); + for (String extra : extraScript) { + fullScript.append(extra).append("\n"); + } + fullScript.append(script); + try { - return context.evaluateString(scope, script, null, 1, null); + return context.evaluateString(scope, fullScript.toString(), null, 1, null); } catch (Exception e) { throw new ScriptException(e); } finally {