1 /* 2 * Copyright (c) 2002-2007, Marc Prud'hommeaux. All rights reserved. 3 * 4 * This software is distributable under the BSD license. See the terms of the 5 * BSD license in the documentation provided with this software. 6 */ 7 package jline; 8 9 import java.io.*; 10 import java.util.*; 11 12 /** 13 * <p> 14 * A pass-through application that sets the system input stream to a 15 * {@link ConsoleReader} and invokes the specified main method. 16 * </p> 17 * @author <a href="mailto:mwp1 (at) cornell.edu">Marc Prud'hommeaux</a> 18 */ 19 public class ConsoleRunner { 20 private static ConsoleReader reader; 21 22 public static ConsoleReader getReader() { return reader; } 23 24 public static final String property = "jline.history"; 25 26 public static void main(final String[] args) throws Exception { 27 String historyFileName = null; 28 29 List argList = new ArrayList(Arrays.asList(args)); 30 31 if (argList.size() == 0) { 32 usage(); 33 34 return; 35 } 36 37 historyFileName = System.getProperty(ConsoleRunner.property, null); 38 39 // invoke the main() method 40 String mainClass = (String) argList.remove(0); 41 42 // setup the inpout stream 43 reader = new ConsoleReader(); 44 45 if (historyFileName != null) { 46 reader.setHistory(new History (new File 47 (System.getProperty("user.home"), 48 ".jline-" + mainClass 49 + "." + historyFileName + ".history"))); 50 } else { 51 reader.setHistory(new History(new File 52 (System.getProperty("user.home"), 53 ".jline-" + mainClass + ".history"))); 54 } 55 56 String completors = System.getProperty 57 (ConsoleRunner.class.getName() + ".completors", ""); 58 List completorList = new ArrayList(); 59 60 for (StringTokenizer tok = new StringTokenizer(completors, ","); 61 tok.hasMoreTokens();) { 62 completorList.add 63 ((Completor) Class.forName(tok.nextToken()).newInstance()); 64 } 65 66 if (completorList.size() > 0) { 67 reader.addCompletor(new ArgumentCompletor(completorList)); 68 } 69 70 ConsoleReaderInputStream.setIn(reader); 71 72 try { 73 Class.forName(mainClass). 74 getMethod("main", new Class[] { String[].class }). 75 invoke(null, new Object[] { argList.toArray(new String[0]) }); 76 } finally { 77 // just in case this main method is called from another program 78 ConsoleReaderInputStream.restoreIn(); 79 } 80 } 81 82 private static void usage() { 83 System.out.println("Usage: \n java " + "[-Djline.history='name'] " 84 + ConsoleRunner.class.getName() 85 + " <target class name> [args]" 86 + "\n\nThe -Djline.history option will avoid history" 87 + "\nmangling when running ConsoleRunner on the same application." 88 + "\n\nargs will be passed directly to the target class name."); 89 } 90 } 91