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