package org.overture.interpreter.debug; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; import java.util.List; import java.util.Vector; import org.overture.interpreter.commands.ClassCommandReader; import org.overture.interpreter.commands.ModuleCommandReader; import org.overture.interpreter.messages.rtlog.RTLogger; import org.overture.interpreter.runtime.ClassInterpreter; import org.overture.interpreter.runtime.DebuggerException; import org.overture.interpreter.runtime.Interpreter; import org.overture.interpreter.runtime.ModuleInterpreter; import org.overture.interpreter.util.ExitStatus; import org.overture.parser.messages.VDMErrorsException; import org.overture.parser.syntax.ParserException; public class DBGPExecProcesser { public static class DBGPExecResult { public final String result; public final boolean quit; public DBGPExecResult(boolean quit, String result) { this.quit = quit; this.result = result; } } static boolean quitRequest = false; public static DBGPExecResult process(DBGPReader reader, Interpreter interpreter, String command) { Interpreter i = interpreter; final DBGPReader d = reader; List<File> fileList = new Vector<File>(i.getSourceFiles()); final Writer result = new StringWriter(); final Reader input = new StringReader(command); // System.out.println("Command session started in " + new File(".").getAbsolutePath()); if (i instanceof ClassInterpreter) { new ClassCommandReader((ClassInterpreter) i, "", true) { private PrintWriter stdout = new PrintWriter(result, true); private BufferedReader stdin = new BufferedReader(input); @Override protected PrintWriter getStdout() { return stdout; } @Override protected BufferedReader getStdin() { return stdin; } @Override protected boolean notAvailable(String line) { println("Command not available from here"); return true; } protected boolean doEvaluate(String line) { line = line.substring(line.indexOf(' ') + 1); try { // long before = System.currentTimeMillis(); println("= " + interpreter.execute(line, d)); // long after = System.currentTimeMillis(); // println("Executed in " + (double)(after-before)/1000 + " secs. "); if (RTLogger.getLogSize() > 0) { println("Dumped RT events"); RTLogger.dump(false); } } catch (ParserException e) { println("Syntax: " + e.getMessage()); } catch (DebuggerException e) { println("Debug: " + e.getMessage()); } catch (RuntimeException e) { println("Runtime: " + e); } catch (VDMErrorsException e) { println(e.toString()); } catch (Exception e) { println("Error: " + e.getMessage()); } return true; } @Override protected boolean doRuntrace(String line, boolean debug) { if (!debug) { return super.doRuntrace(line, debug); } return notAvailable(line); } @Override protected boolean doReLoad(String line) { return notAvailable(line); } @Override protected boolean doLoad(String line, List<File> filenames) { return notAvailable(line); } @Override protected boolean doRemove(String line) { return notAvailable(line); } @Override protected boolean doList(String line) { return notAvailable(line); } @Override protected boolean doSource(String line) { return notAvailable(line); } @Override protected boolean doBreak(String line) throws Exception { return notAvailable(line); } @Override protected boolean doTrace(String line) throws Exception { return notAvailable(line); } @Override protected boolean doStep(String line) { return notAvailable(line); } @Override protected boolean doNext(String line) { return notAvailable(line); } @Override protected boolean doOut(String line) { return notAvailable(line); } @Override protected boolean doStack(String line) { return notAvailable(line); } @Override protected boolean doUp(String line) { return notAvailable(line); } @Override protected boolean doDown(String line) { return notAvailable(line); } @Override protected boolean doContinue(String line) { return notAvailable(line); } // @Override // protected boolean doThreads(String line) // { // return notAvailable(line); // } @Override public ExitStatus run(List<File> filenames) { Interpreter.setTraceOutput(stdout); setDebugReader(d); return super.run(filenames); } @Override protected boolean doQuit(String line) { boolean ok = super.doQuit(line); d.complete(ok ? DBGPReason.OK : DBGPReason.ERROR, null); quitRequest = true; return ok; } @Override protected void doHelp(String line) { println("classes - list the loaded class names"); println("default <class> - set the default class name"); println("create <id> := <exp> - create a named variable"); println("print <expression> - evaluate expression"); println("runtrace <name> [test number] - run CT trace(s)"); println("filter %age | <reduction type> - reduce CT trace(s)"); println("assert <file> - run assertions from a file"); println("init - re-initialize the global environment"); println("env - list the global symbols in the default environment"); println("pog [<function/operation>] - generate proof obligations"); println("coverage clear|write <dir>|merge <dir>|<filenames> - handle line coverage"); println("latex|latexdoc [<files>] - generate LaTeX line coverage files"); println("word [<files>] - generate Word HTML line coverage files"); println("files - list files in the current specification"); println("set [<pre|post|inv|dtc|measures> <on|off>] - set runtime checks"); println("quit - leave the interpreter"); } }.run(fileList); } else { new ModuleCommandReader((ModuleInterpreter) i, "", true) { private PrintWriter stdout = new PrintWriter(result, true); private BufferedReader stdin = new BufferedReader(input); @Override protected PrintWriter getStdout() { return stdout; } @Override protected BufferedReader getStdin() { return stdin; } @Override protected boolean notAvailable(String line) { println("Command not available from here"); return true; } protected boolean doEvaluate(String line) { line = line.substring(line.indexOf(' ') + 1); try { // long before = System.currentTimeMillis(); println("= " + interpreter.execute(line, d)); // long after = System.currentTimeMillis(); // println("Executed in " + (double)(after-before)/1000 + " secs. "); if (RTLogger.getLogSize() > 0) { println("Dumped RT events"); RTLogger.dump(false); } } catch (ParserException e) { println("Syntax: " + e.getMessage()); } catch (DebuggerException e) { println("Debug: " + e.getMessage()); } catch (RuntimeException e) { println("Runtime: " + e); } catch (VDMErrorsException e) { println(e.toString()); } catch (Exception e) { println("Error: " + e.getMessage()); } return true; } @Override protected boolean doRuntrace(String line, boolean debug) { if (!debug) { return super.doRuntrace(line, debug); } return notAvailable(line); } @Override protected boolean doReLoad(String line) { return notAvailable(line); } @Override protected boolean doLoad(String line, List<File> filenames) { return notAvailable(line); } @Override protected boolean doRemove(String line) { return notAvailable(line); } @Override protected boolean doList(String line) { return notAvailable(line); } @Override protected boolean doSource(String line) { return notAvailable(line); } @Override protected boolean doBreak(String line) throws Exception { return notAvailable(line); } @Override protected boolean doTrace(String line) throws Exception { return notAvailable(line); } @Override protected boolean doStep(String line) { return notAvailable(line); } @Override protected boolean doNext(String line) { return notAvailable(line); } @Override protected boolean doOut(String line) { return notAvailable(line); } @Override protected boolean doStack(String line) { return notAvailable(line); } @Override protected boolean doUp(String line) { return notAvailable(line); } @Override protected boolean doDown(String line) { return notAvailable(line); } @Override protected boolean doContinue(String line) { return notAvailable(line); } @Override protected boolean doThreads(String line) { return notAvailable(line); } @Override public ExitStatus run(List<File> filenames) { Interpreter.setTraceOutput(stdout); setDebugReader(d); return super.run(filenames); } @Override protected boolean doQuit(String line) { boolean ok = super.doQuit(line); d.complete(ok ? DBGPReason.OK : DBGPReason.ERROR, null); quitRequest = true; return ok; } @Override protected void doHelp(String line) { println("modules - list the loaded module names"); println("default <module> - set the default module name"); println("state - show the default module state"); println("print <expression> - evaluate expression"); println("runtrace <name> [test number] - run CT trace(s)"); println("filter %age | <reduction type> - reduce CT trace(s)"); println("assert <file> - run assertions from a file"); println("init - re-initialize the global environment"); println("env - list the global symbols in the default environment"); println("pog [<function/operation>] - generate proof obligations"); println("coverage clear|write <dir>|merge <dir>|<filenames> - handle line coverage"); println("latex|latexdoc [<files>] - generate LaTeX line coverage files"); println("word [<files>] - generate Word HTML line coverage files"); println("files - list files in the current specification"); println("set [<pre|post|inv|dtc|measures> <on|off>] - set runtime checks"); println("quit - leave the interpreter"); } }.run(fileList); } try { result.flush(); result.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return new DBGPExecResult(quitRequest, result.toString()); } }