13aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens/*
23aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens * Copyright (c) 2002-2007, Marc Prud'hommeaux. All rights reserved.
33aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens *
43aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens * This software is distributable under the BSD license. See the terms of the
53aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens * BSD license in the documentation provided with this software.
63aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens */
73aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephenspackage jline;
83aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
93aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephensimport java.io.*;
103aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephensimport java.util.*;
113aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
123aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens/**
133aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens *  <p>
143aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens *  A pass-through application that sets the system input stream to a
153aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens *  {@link ConsoleReader} and invokes the specified main method.
163aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens *  </p>
173aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
183aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens */
193aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephenspublic class ConsoleRunner {
203aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens    private static ConsoleReader reader;
213aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
223aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens    public static ConsoleReader getReader() { return reader; }
233aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
243aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens    public static final String property = "jline.history";
253aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
263aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens    public static void main(final String[] args) throws Exception {
273aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        String historyFileName = null;
283aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
293aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        List argList = new ArrayList(Arrays.asList(args));
303aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
313aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        if (argList.size() == 0) {
323aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            usage();
333aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
343aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            return;
353aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        }
363aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
373aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        historyFileName = System.getProperty(ConsoleRunner.property, null);
383aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
393aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        // invoke the main() method
403aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        String mainClass = (String) argList.remove(0);
413aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
423aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        // setup the inpout stream
433aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        reader = new ConsoleReader();
443aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
453aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        if (historyFileName != null) {
463aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            reader.setHistory(new History (new File
473aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens                (System.getProperty("user.home"),
483aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens                    ".jline-" + mainClass
493aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens                        + "." + historyFileName + ".history")));
503aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        } else {
513aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            reader.setHistory(new History(new File
523aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens                (System.getProperty("user.home"),
533aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens                    ".jline-" + mainClass + ".history")));
543aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        }
553aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
563aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        String completors = System.getProperty
573aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            (ConsoleRunner.class.getName() + ".completors", "");
583aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        List completorList = new ArrayList();
593aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
603aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        for (StringTokenizer tok = new StringTokenizer(completors, ",");
613aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            tok.hasMoreTokens();) {
623aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            completorList.add
633aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens                ((Completor) Class.forName(tok.nextToken()).newInstance());
643aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        }
653aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
663aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        if (completorList.size() > 0) {
673aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            reader.addCompletor(new ArgumentCompletor(completorList));
683aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        }
693aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
703aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        ConsoleReaderInputStream.setIn(reader);
713aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
723aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        try {
733aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            Class.forName(mainClass).
743aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens                getMethod("main", new Class[] { String[].class }).
753aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens                invoke(null, new Object[] { argList.toArray(new String[0]) });
763aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        } finally {
773aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            // just in case this main method is called from another program
783aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            ConsoleReaderInputStream.restoreIn();
793aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        }
803aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens    }
813aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens
823aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens    private static void usage() {
833aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens        System.out.println("Usage: \n   java " + "[-Djline.history='name'] "
843aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            + ConsoleRunner.class.getName()
853aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            + " <target class name> [args]"
863aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            + "\n\nThe -Djline.history option will avoid history"
873aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            + "\nmangling when running ConsoleRunner on the same application."
883aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens            + "\n\nargs will be passed directly to the target class name.");
893aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens    }
903aa4d1f0c4f24e2d2788ec9886de8a5ca3cd806bOmari Stephens}
91