From 7234fd04b63e69756670e3605a4e778cbe6cf871 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Mon, 28 Jul 2014 12:23:52 +0200 Subject: Support pre-compilation of scripts if supported by the engine. Also does this during testing to catch script syntax errors during build. Client shell detects these error and declares them pre-execution. --- src/main/java/com/c2kernel/scripting/Script.java | 35 +++++++++++++++++------- 1 file changed, 25 insertions(+), 10 deletions(-) (limited to 'src/main/java/com/c2kernel/scripting/Script.java') diff --git a/src/main/java/com/c2kernel/scripting/Script.java b/src/main/java/com/c2kernel/scripting/Script.java index 349a1a4..dfdd477 100644 --- a/src/main/java/com/c2kernel/scripting/Script.java +++ b/src/main/java/com/c2kernel/scripting/Script.java @@ -7,6 +7,8 @@ import java.util.ArrayList; import java.util.HashMap; import javax.script.Bindings; +import javax.script.Compilable; +import javax.script.CompiledScript; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; @@ -42,8 +44,9 @@ import com.c2kernel.utils.Resource; public class Script { String mScript = ""; + CompiledScript mCompScript = null; String mName; - String mVersion; + int mVersion; HashMap mInputParams = new HashMap(); HashMap mAllInputParams = new HashMap(); HashMap mOutputParams = new HashMap(); @@ -56,7 +59,8 @@ public class Script * @throws ScriptParsingException * @throws ParameterException */ - public Script(String xml) throws ScriptParsingException, ParameterException { + public Script(String name, int version, String xml) throws ScriptParsingException, ParameterException { + mName = name; mVersion = version; parseScriptXML(xml); } /** @@ -79,7 +83,7 @@ public class Script public Script(String scriptName, int scriptVersion) throws ScriptingEngineException { mName = scriptName; - mVersion = String.valueOf(scriptVersion); + mVersion = scriptVersion; if (!scriptName.equals("")) loadScript(mName, mVersion); } @@ -92,9 +96,9 @@ public class Script { mName = ""; setScriptEngine(lang); - mVersion = ""; + mVersion = 0; addOutput(null, returnType); - mScript = expr; + setScript(expr); } /** @@ -183,13 +187,13 @@ public class Script engine.setContext(context); } - private void loadScript(String scriptName, String scriptVersion) throws ScriptingEngineException + private void loadScript(String scriptName, int scriptVersion) throws ScriptingEngineException { try { mName = scriptName; mVersion = scriptVersion; - parseScriptXML(LocalObjectLoader.getScript(scriptName, scriptVersion)); + parseScriptXML(LocalObjectLoader.getScript(scriptName, String.valueOf(scriptVersion))); } catch (ObjectNotFoundException e) { @@ -293,7 +297,7 @@ public class Script if (scriptChildNodes.getLength() != 1) throw new ScriptParsingException("More than one child element found under script tag. Script characters may need escaping - suggest convert to CDATA section"); if (scriptChildNodes.item(0) instanceof Text) - mScript = ((Text) scriptChildNodes.item(0)).getData(); + setScript(((Text) scriptChildNodes.item(0)).getData()); else throw new ScriptParsingException("Child element of script tag was not text"); Logger.msg(6, "Script.parseScriptXML() - script:" + mScript); @@ -476,7 +480,10 @@ public class Script if (engine == null) throw new ScriptingEngineException("Script engine not set. Cannot execute scripts."); engine.put(ScriptEngine.FILENAME, mName); - returnValue = engine.eval(mScript); + if (mCompScript != null) + returnValue = mCompScript.eval(); + else + returnValue = engine.eval(mScript); Logger.msg(7, "Script.execute() - script returned \"" + returnValue + "\""); } catch (Throwable ex) @@ -517,8 +524,16 @@ public class Script return outputs; } - public void setScript(String script) { + public void setScript(String script) throws ScriptParsingException { mScript = script; + if (engine instanceof Compilable) { + try { + Logger.debug("Compiling script "+mName); + mCompScript = ((Compilable)engine).compile(mScript); + } catch (ScriptException e) { + throw new ScriptParsingException(e.getMessage()); + } + } } static public void main(String[] args) { -- cgit v1.2.3