Many of our applications require scripting support (allowing users to create scripts to customize workflow within the application). Java provides very straightforward scripting via the javax.script script-engine library. A simple integration is shown below where a Javascript onSave method provided by the user is called, if available, passing a business-logic object “item”:
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Scripting extends Base {
private ScriptEngineManager mgr;
private ScriptEngine engine;
private Invocable invocable;
private boolean initialize (String script) {
mgr = new ScriptEngineManager();
engine = mgr.getEngineByName("js");
try {
engine.eval(script);
} catch (ScriptException e) {
warn("The script could not be loaded: " + e.getMessage());
return false;
}
invocable = (Invocable)engine;
return true;
}
public void onSave(Item item) {
try {
invocable.invokeFunction("onSave", item);
} catch (ScriptException e) {
warn("The onSave method of the script caused an error: " + e.getMessage());
} catch (NoSuchMethodException e) {
// no onSave method provided by the user - that's OK, just ignore it
}
}
}
Note: the javax.script library supports multiple scripting engines including javascript, python, groovy and java. Javascript was the easiest to get working because the Rhino Javascript engine is included in JDK 6.