001 package toolbus.commandline; 002 003 import java.io.BufferedReader; 004 import java.io.IOException; 005 import java.io.InputStream; 006 import java.io.InputStreamReader; 007 import toolbus.ToolBus; 008 import toolbus.logging.ILogger; 009 import toolbus.logging.IToolBusLoggerConstants; 010 import toolbus.logging.LoggerFactory; 011 012 public class CommandLine{ 013 private final ToolBusInputStreamHandler toolBusInputStreamHandler; 014 015 private CommandLine(ToolBus toolbus, InputStream is, boolean closeStreamWhenDone){ 016 super(); 017 018 toolBusInputStreamHandler = new ToolBusInputStreamHandler(toolbus, is == null ? System.in : is, closeStreamWhenDone); 019 } 020 021 private void startHandling(){ 022 Thread toolBusInputStreamHandlerThread = new Thread(toolBusInputStreamHandler); 023 toolBusInputStreamHandlerThread.setName("ToolBus inputstream handler"); 024 toolBusInputStreamHandlerThread.setDaemon(true); 025 toolBusInputStreamHandlerThread.start(); 026 } 027 028 public static CommandLine createCommandLine(ToolBus toolbus, InputStream is, boolean closeStreamWhenDone){ 029 CommandLine commandLine = new CommandLine(toolbus, is, closeStreamWhenDone); 030 commandLine.startHandling(); 031 return commandLine; 032 } 033 034 public static class ToolBusInputStreamHandler implements Runnable{ 035 private final ToolBus toolbus; 036 private final BufferedReader reader; 037 private final boolean closeStreamWhenDone; 038 039 public ToolBusInputStreamHandler(ToolBus toolbus, InputStream inputStream, boolean closeStreamWhenDone){ 040 this.toolbus = toolbus; 041 reader = new BufferedReader(new InputStreamReader(inputStream)); 042 this.closeStreamWhenDone = closeStreamWhenDone; 043 } 044 045 public void run(){ 046 String line = null; 047 try{ 048 while((line = reader.readLine()) != null){ 049 if(line.equals("dump unhandled messages")){ 050 toolbus.dumpUnhandledMessages(); 051 }else if(line.equals("dump performance stats")){ 052 toolbus.dumpPerformanceStats(); 053 }else if(line.equals("dump tools status")){ 054 toolbus.getToolInstanceManager().showStatus(); 055 }else if(line.equals("dump queued messages")){ 056 toolbus.getToolInstanceManager().printQueueTerms(); 057 }else if(line.equals("dump toolbus state")){ 058 toolbus.showStatus(); 059 }else if(line.equals("dump partnerless communication atoms")){ 060 toolbus.getMatchStore().printPartnerlessCommunicationAtoms(); 061 }else if(line.equals("shutdown")){ 062 toolbus.shutdown(toolbus.getTBTermFactory().makeList()); 063 }else if(line.equals("help")){ 064 System.err.println("dump unhandled messages: Prints all (currently) unhandled messages and enqueued notes."); 065 System.err.println("dump performance stats: Prints some performance statistics related to the execution of the ToolBus."); 066 System.err.println("dump tools status: Prints a listing of currently connected tools with their corresponding state."); 067 System.err.println("dump queued messages: Prints all (currently) queued values and events."); 068 System.err.println("dump toolbus state: Dumps all available information about the current state of the process logic to the command line."); 069 System.err.println("dump partnerless communication atoms: Prints a list of all communication atoms of which we can guarantee that they can never be executed."); 070 System.err.println("shutdown: Initiates the forcefull termination of the ToolBus."); 071 }else if(line.equals("")){ 072 // Ignore this. 073 }else{ 074 System.err.println("Unknown ToolBus command: '"+line+"'.\nEnter 'help' for a list of available ToolBus commands."); 075 } 076 } 077 }catch(IOException ioex){ 078 LoggerFactory.log("An IOException occured while reading from the ToolBus's inputstream.", ioex, ILogger.ERROR, IToolBusLoggerConstants.EXECUTE); 079 }catch(RuntimeException rex){ 080 LoggerFactory.log("An RuntimeException occured while reading from the ToolBus's inputstream.", rex, ILogger.ERROR, IToolBusLoggerConstants.EXECUTE); 081 }finally{ 082 if(closeStreamWhenDone){ 083 try{ 084 reader.close(); 085 }catch(IOException ioex){ 086 LoggerFactory.log("Unable to close the ToolBus's input stream.", ILogger.FATAL, IToolBusLoggerConstants.TOOLINSTANCE); 087 } 088 } 089 } 090 } 091 } 092 }