001 /* 002 * Copyright (c) 2002-2007, Marc Prud'hommeaux. All rights reserved. 003 * 004 * This software is distributable under the BSD license. See the terms of the 005 * BSD license in the documentation provided with this software. 006 */ 007 package jline; 008 009 import java.io.*; 010 import java.util.*; 011 012 /** 013 * <p> 014 * A pass-through application that sets the system input stream to a 015 * {@link ConsoleReader} and invokes the specified main method. 016 * </p> 017 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a> 018 */ 019 public class ConsoleRunner { 020 public static final String property = "jline.history"; 021 022 public static void main(final String[] args) throws Exception { 023 String historyFileName = null; 024 025 List argList = new ArrayList(Arrays.asList(args)); 026 027 if (argList.size() == 0) { 028 usage(); 029 030 return; 031 } 032 033 historyFileName = System.getProperty(ConsoleRunner.property, null); 034 035 // invoke the main() method 036 String mainClass = (String) argList.remove(0); 037 038 // setup the inpout stream 039 ConsoleReader reader = new ConsoleReader(); 040 041 if (historyFileName != null) { 042 reader.setHistory(new History (new File 043 (System.getProperty("user.home"), 044 ".jline-" + mainClass 045 + "." + historyFileName + ".history"))); 046 } else { 047 reader.setHistory(new History(new File 048 (System.getProperty("user.home"), 049 ".jline-" + mainClass + ".history"))); 050 } 051 052 String completors = System.getProperty 053 (ConsoleRunner.class.getName() + ".completors", ""); 054 List completorList = new ArrayList(); 055 056 for (StringTokenizer tok = new StringTokenizer(completors, ","); 057 tok.hasMoreTokens();) { 058 completorList.add 059 ((Completor) Class.forName(tok.nextToken()).newInstance()); 060 } 061 062 if (completorList.size() > 0) { 063 reader.addCompletor(new ArgumentCompletor(completorList)); 064 } 065 066 ConsoleReaderInputStream.setIn(reader); 067 068 try { 069 Class.forName(mainClass). 070 getMethod("main", new Class[] { String[].class }). 071 invoke(null, new Object[] { argList.toArray(new String[0]) }); 072 } finally { 073 // just in case this main method is called from another program 074 ConsoleReaderInputStream.restoreIn(); 075 } 076 } 077 078 private static void usage() { 079 System.out.println("Usage: \n java " + "[-Djline.history='name'] " 080 + ConsoleRunner.class.getName() 081 + " <target class name> [args]" 082 + "\n\nThe -Djline.history option will avoid history" 083 + "\nmangling when running ConsoleRunner on the same application." 084 + "\n\nargs will be passed directly to the target class name."); 085 } 086 }