From 1028dee4dfcd89e914d66d4fe92aaa8fcfbfd494 Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Mon, 28 Jul 2014 12:30:16 +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. Conflicts: src/main/java/com/c2kernel/scripting/Script.java src/test/java/MainTest.java --- .../java/com/c2kernel/process/ClientShell.java | 5 ++++- src/main/java/com/c2kernel/scripting/Script.java | 25 +++++++++++++++++----- src/test/java/MainTest.java | 16 ++++++++------ 3 files changed, 33 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/main/java/com/c2kernel/process/ClientShell.java b/src/main/java/com/c2kernel/process/ClientShell.java index 9f1d3ab..eeeb07f 100644 --- a/src/main/java/com/c2kernel/process/ClientShell.java +++ b/src/main/java/com/c2kernel/process/ClientShell.java @@ -5,6 +5,7 @@ import java.util.Scanner; import com.c2kernel.entity.proxy.AgentProxy; import com.c2kernel.process.auth.ProxyLogin; import com.c2kernel.scripting.Script; +import com.c2kernel.scripting.ScriptParsingException; public class ClientShell extends StandardClient { @@ -21,13 +22,15 @@ public class ClientShell extends StandardClient { System.out.print("> "); while (scan.hasNextLine()) { String command = scan.nextLine(); - console.setScript(command); try { + console.setScript(command); Object response = console.execute(); if (response == null) System.out.println("Ok"); else System.out.println(response); + } catch (ScriptParsingException e) { + System.err.println("Syntax error: "+e.getMessage()); } catch (Throwable ex) { ex.printStackTrace(); } diff --git a/src/main/java/com/c2kernel/scripting/Script.java b/src/main/java/com/c2kernel/scripting/Script.java index 83849d9..d3b24ee 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; @@ -41,6 +43,7 @@ import com.c2kernel.utils.Logger; public class Script { String mScript = ""; + CompiledScript mCompScript = null; String mName; Integer mVersion; HashMap mInputParams = new HashMap(); @@ -55,7 +58,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); } /** @@ -93,7 +97,7 @@ public class Script setScriptEngine(lang); mVersion = null; addOutput(null, returnType); - mScript = expr; + setScript(expr); } /** @@ -292,7 +296,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); @@ -475,7 +479,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) @@ -516,8 +523,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.msg(1, "Compiling script "+mName); + mCompScript = ((Compilable)engine).compile(mScript); + } catch (ScriptException e) { + throw new ScriptParsingException(e.getMessage()); + } + } } static public void main(String[] args) { diff --git a/src/test/java/MainTest.java b/src/test/java/MainTest.java index 26898ac..431c4c0 100644 --- a/src/test/java/MainTest.java +++ b/src/test/java/MainTest.java @@ -12,6 +12,7 @@ import com.c2kernel.persistency.outcome.SchemaValidator; import com.c2kernel.process.Gateway; import com.c2kernel.scripting.Script; import com.c2kernel.utils.CastorXMLUtility; +import com.c2kernel.scripting.ScriptParsingException; import com.c2kernel.utils.FileStringUtility; import com.c2kernel.utils.Logger; @@ -58,7 +59,6 @@ public class MainTest { String bootItems = FileStringUtility.url2String(Gateway.getResource().getKernelResourceURL("boot/allbootitems.txt")); StringTokenizer str = new StringTokenizer(bootItems, "\n\r"); - long castorTime=0; while (str.hasMoreTokens()) { String thisItem = str.nextToken(); Logger.msg(1, "Validating "+thisItem); @@ -79,7 +79,6 @@ public class MainTest { String remarshalled = Gateway.getMarshaller().marshall(unmarshalled); long now = System.currentTimeMillis(); Logger.msg("Marshall/remarshall of "+thisItem+" took "+(now-then)+"ms"); - castorTime+=(now-then); errors = validator.validate(remarshalled); assert errors.length()==0 : "Remarshalled resource "+thisItem+" has errors :"+errors+"\nRemarshalled form:\n"+remarshalled; @@ -91,8 +90,12 @@ public class MainTest { // } // assert xmlDiff.identical(); } - } - Logger.msg("Total Castor marshall time: "+castorTime+"ms"); + + if (itemType.equals("SC")) { + Logger.msg(1, "Parsing script "+thisItem); + new Script(thisItem, 0, data); + } + } } private static Schema getSchema(String name, int version, String resPath) throws ObjectNotFoundException { @@ -104,11 +107,10 @@ public class MainTest { String testScriptString = FileStringUtility.url2String(MainTest.class.getResource("TestScript.xml")); String errors = valid.validate(testScriptString); assert errors.length()==0 : "Test script not valid to schema: "+errors; - - Script testScript = new Script(testScriptString); + + Script testScript = new Script("TestScript", 0, testScriptString); assert testScript.getInputParams().size()==1 : "Script input param count wrong"; assert testScript.getInputParams().get("test")!=null : "Could not retrieve script input param value"; - testScript.setInputParamValue("test", "Test"); assert testScript.getInputParams().get("test").getInitialised() : "Script is not initialized when it should be"; -- cgit v1.2.3