/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package oms3; import groovy.lang.Binding; import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyRuntimeException; import groovy.lang.GroovyShell; import groovy.lang.MissingPropertyException; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.codehaus.groovy.control.MultipleCompilationErrorsException; import org.codehaus.groovy.syntax.SyntaxException; /** * Command Line interface to run simulations. * * @author od */ public class CLI { protected static final Logger log = Logger.getLogger("oms3.sim"); // static final List<String> simExt = Arrays.asList(".sim", ".luca", ".esp", ".fast"); static final List<String> flags = Arrays.asList("-r", "-e", "-d", "-o", "-a", "-s", "-b"); static { if (System.getProperty("java.version").compareTo("1.6") < 0) { throw new RuntimeException("Java 1.6+ required."); } } private CLI() { } /** * Executes a simulation. * * @param file the file to execute * @param ll the log level * @param cmd the command to call (e.g. run) * @throws Exception */ public static Object sim(String file, String ll, String cmd) throws Exception { String f = readFile(file); Object o = createSim(f, false, ll, file); return invoke(o, cmd); } /** * Executed plain groovy. * * @param file the groovy file * @param ll the log level. * @param cmd * @throws Exception */ public static void groovy(String file, String ll, String cmd) throws Exception { String f = readFile(file); Object o = createSim(f, true, ll, file); } /** * Invokes a simulation method. (run | doc | analysis | ...) * * @param target the target simulation object * @param name the name of the method (eg. run()) * @throws Exception */ public static Object invoke(Object target, String name) throws Exception { return target.getClass().getMethod(name).invoke(target); } /** * Read a file and provide its content as String. * * @param name the file name * @return the content as String * @throws IOException something bad happened. */ public static String readFile(String name) { StringBuilder b = new StringBuilder(); try { BufferedReader r = new BufferedReader(new FileReader(name)); String line; while ((line = r.readLine()) != null) { b.append(line).append('\n'); } r.close(); } catch (IOException E) { throw new ComponentException(E.getMessage()); } return b.toString(); } public static Object createSim(String script, boolean groovy, String ll) { return createSim(script, groovy, ll, null); } /** * Create a simulation object. * * @param script the script * @param groovy * @param ll * @return the simulation object. */ public static Object createSim(String script, boolean groovy, String ll, String file) { file = (file == null) ? "unknown" : file; setOMSProperties(); Level.parse(ll); // may throw IAE String prefix = groovy ? "" : "import static oms3.SimConst.*\n" + "def __sb__ = new oms3.SimBuilder(logging:'" + ll + "')\n" + "__sb__."; ClassLoader parent = Thread.currentThread().getContextClassLoader(); Binding b = new Binding(); b.setVariable("oms_version", System.getProperty("oms.version")); b.setVariable("oms_home", System.getProperty("oms.home")); b.setVariable("oms_prj", System.getProperty("oms.prj")); GroovyShell shell = new GroovyShell(new GroovyClassLoader(parent), b); try { String scriptText = prefix + script; System.out.println(scriptText); return shell.evaluate(scriptText); } catch (MultipleCompilationErrorsException E) { int n = E.getErrorCollector().getErrorCount(); if (n > 0) { SyntaxException syn = E.getErrorCollector().getSyntaxError(0); int line = syn.getLine() + (groovy ? 0 : -2); throw new ComponentException(new File(file).getName() + " [line:" + line + " column:" + syn.getStartColumn() + "] " + syn.getOriginalMessage()); } else { throw E; } } catch (MissingPropertyException E) { throw new ComponentException("Cannot handle property '" + E.getProperty() + "' in " + file); } catch (GroovyRuntimeException E) { throw new ComponentException(E.getMessage() + " in '" + file + "'"); } } public static Object evaluateGroovyScript(String file) { String content = readFile(file); return createSim(content, true, "OFF", file); } private static void setOMSProperties() { String oms_work = System.getProperty("oms3.work"); if (oms_work != null) { System.setProperty("oms.prj", oms_work); } System.setProperty("oms.version", oms3.Utils.getVersion()); if (System.getProperty("oms.home") == null) { System.setProperty("oms.home", System.getProperty("user.home") + File.separator + ".oms" + File.separator + oms3.Utils.getVersion()); } } private static void usage() { System.err.println("usage: java -jar oms-all.jar [-l <loglevel> ] [-r|-e|-d|-a|-s|-o] <simfile>"); System.err.println(" Command line access to simulations."); System.err.println(" -r run the <simfile>"); System.err.println(" -e edit parameter in <simfile>"); System.err.println(" -o open the last output folder in desktop <simfile>"); System.err.println(" -d document the <simfile>"); System.err.println(" -a run the <simfile> analysis"); System.err.println(" -s create SHA <simfile> digest"); System.err.println(" -mcp model classpath (jar files not specified in sim)"); System.err.println(" -l <loglevel> set the log level:"); System.err.println(" OFF|ALL|SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST"); } static boolean isSim(String file) { return simExt.contains(file.substring(file.lastIndexOf('.'))); } public static void main(String[] args) { String ll = "OFF"; String cmd = null; String file = null; try { log.setLevel(Level.OFF); for (int i = 0; i < args.length; i++) { if (flags.contains(args[i])) { cmd = args[i]; file = args[++i]; } else if (args[i].equals("-l")) { ll = args[++i]; } else { usage(); return; } } if (file == null) { usage(); return; } try { log.setLevel(Level.parse(ll)); } catch (IllegalArgumentException E) { throw new ComponentException(E.getMessage()); } boolean isgroovy = !isSim(file); Object target = createSim(readFile(file), isgroovy, ll, file); // ignore all if (isgroovy) { return; } if (cmd.equals("-r")) { invoke(target, "run"); } else if (cmd.equals("-e")) { invoke(target, "edit"); } else if (cmd.equals("-d")) { invoke(target, "doc"); } else if (cmd.equals("-o")) { invoke(target, "output"); } else if (cmd.equals("-a")) { invoke(target, "graph"); } else if (cmd.equals("-s")) { invoke(target, "dig"); } else if (cmd.equals("-b")) { invoke(target, "build"); } } catch (Throwable E) { Throwable origE = E; System.err.println(); System.err.print(">>>> Error: "); if (log.getLevel() != Level.OFF) { // print the whole stack E.printStackTrace(System.err); } else { // ..or while (!(E instanceof ComponentException) && E != null) { E = E.getCause(); } if (E == null) { System.err.println("Internal Problem, please report to http://oms.javaforge.com"); origE.printStackTrace(System.err); System.exit(1); } ComponentException ce = (ComponentException) E; if (ce.getCause() != null) { // Exception within the model System.err.println("Exception in component '" + ce.getSource() + "':"); ce.getCause().printStackTrace(System.err); } else { // Exception within the system System.err.println(ce.getMessage()); } } System.exit(1); } } }