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 */ 007package jline; 008 009import java.io.*; 010import 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 */ 019public class ConsoleRunner { 020 private static ConsoleReader reader; 021 022 public static ConsoleReader getReader() { return reader; } 023 024 public static final String property = "jline.history"; 025 026 public static void main(final String[] args) throws Exception { 027 String historyFileName = null; 028 029 List argList = new ArrayList(Arrays.asList(args)); 030 031 if (argList.size() == 0) { 032 usage(); 033 034 return; 035 } 036 037 historyFileName = System.getProperty(ConsoleRunner.property, null); 038 039 // invoke the main() method 040 String mainClass = (String) argList.remove(0); 041 042 // setup the inpout stream 043 reader = new ConsoleReader(); 044 045 if (historyFileName != null) { 046 reader.setHistory(new History (new File 047 (System.getProperty("user.home"), 048 ".jline-" + mainClass 049 + "." + historyFileName + ".history"))); 050 } else { 051 reader.setHistory(new History(new File 052 (System.getProperty("user.home"), 053 ".jline-" + mainClass + ".history"))); 054 } 055 056 String completors = System.getProperty 057 (ConsoleRunner.class.getName() + ".completors", ""); 058 List completorList = new ArrayList(); 059 060 for (StringTokenizer tok = new StringTokenizer(completors, ","); 061 tok.hasMoreTokens();) { 062 completorList.add 063 ((Completor) Class.forName(tok.nextToken()).newInstance()); 064 } 065 066 if (completorList.size() > 0) { 067 reader.addCompletor(new ArgumentCompletor(completorList)); 068 } 069 070 ConsoleReaderInputStream.setIn(reader); 071 072 try { 073 Class.forName(mainClass). 074 getMethod("main", new Class[] { String[].class }). 075 invoke(null, new Object[] { argList.toArray(new String[0]) }); 076 } finally { 077 // just in case this main method is called from another program 078 ConsoleReaderInputStream.restoreIn(); 079 } 080 } 081 082 private static void usage() { 083 System.out.println("Usage: \n java " + "[-Djline.history='name'] " 084 + ConsoleRunner.class.getName() 085 + " <target class name> [args]" 086 + "\n\nThe -Djline.history option will avoid history" 087 + "\nmangling when running ConsoleRunner on the same application." 088 + "\n\nargs will be passed directly to the target class name."); 089 } 090}