001    package nl.cwi.sen1.consolegrabber;
002    
003    import java.io.BufferedReader;
004    import java.io.InputStreamReader;
005    import java.io.IOException;
006    import java.util.Scanner;
007    import java.util.regex.MatchResult;
008    
009    import aterm.ATerm;
010    import aterm.pure.PureFactory;
011    
012    public class ConsoleGrabber implements ConsoleGrabberTif {
013            private ConsoleGrabberBridge bridge;
014    
015            private PureFactory pureFactory = new PureFactory();
016    
017            public ConsoleGrabber(String[] args) {
018                    bridge = new ConsoleGrabberBridge(pureFactory, this);
019                    try {
020                            bridge.init(args);
021                            bridge.connect();
022                    } catch (IOException e) {
023                            System.err.println("Could not establish connection to ToolBus: "+ e);
024                            System.exit(1);
025                    }
026    
027                    Thread thread = new Thread(new Runnable() {
028                            public void run() {
029                                    try {
030                                            bridge.run();
031                                    } catch (java.lang.RuntimeException e) {
032                                            e.printStackTrace();
033                                    }
034                            }
035                    });
036                    thread.setName("ConsoleGrabber");
037                    thread.start();
038            }
039    
040            public void sendMessage(String message) {
041                    ATerm event = pureFactory.make("console-message(<str>)", message);
042                    bridge.postEvent(event);
043            }
044    
045            public static void main(String[] args) throws IOException{
046                    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
047                    String line = null;
048                    int maxTries = 100;
049                    
050                    while (maxTries-- > 0 && (line = br.readLine()) != null) {
051                            try {
052                                    Scanner s = new Scanner(line);
053                                    s.findInLine("The ToolBus server allocated port \\((\\d+)\\)");
054                                    MatchResult result = s.match();
055                                    
056                                    System.out.println(line); // Print the message we matched on.
057                                    
058                                    String port = result.group(1);
059                                    args = buildToolArgs(port);
060    
061                                    ConsoleGrabber grabber = new ConsoleGrabber(args);
062    
063                                    // Eat up all input and send it line by line to the ToolBus
064                                    while((line = br.readLine()) != null) {
065                                            grabber.sendMessage(line + "\n");
066                                    }
067    
068                                    break; // End of file
069                            } catch (IllegalStateException e) {
070                                    // ToolBus port not yet found, echo the input to stderr
071                                    System.err.println(line);
072                            }
073                    }
074    
075                    if (maxTries == 0) {
076                            System.err.println("console-grabber: failed to find ToolBus port. Continuing to print on stderr...");
077    
078                            // If we have something to print left, simply print it
079                            while((line = br.readLine()) != null){
080                                    System.err.print(line);
081                            }
082                    }
083    
084                    br.close();
085            }
086    
087            private static String[] buildToolArgs(String port) {
088                    String[] args;
089                    args = new String[6];
090                    args[0] = "-TB_HOST";
091                    args[1] = "localhost";
092                    args[2] = "-TB_PORT";
093                    args[3] = port;
094                    args[4] = "-TB_TOOL_NAME";
095                    args[5] = "console-grabber";
096                    return args;
097            }
098    
099            public void recTerminate(ATerm t0) {
100                    //System.exit(0);
101            }
102    
103            public void recAckEvent(ATerm t0) {
104            }
105    }