001 /** 002 * jline - Java console input library 003 * Copyright (c) 2002,2003 Marc Prud'hommeaux mwp1@cornell.edu 004 * 005 * This library is free software; you can redistribute it and/or 006 * modify it under the terms of the GNU Lesser General Public 007 * License as published by the Free Software Foundation; either 008 * version 2.1 of the License, or (at your option) any later version. 009 * 010 * This library is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013 * Lesser General Public License for more details. 014 * 015 * You should have received a copy of the GNU Lesser General Public 016 * License along with this library; if not, write to the Free Software 017 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 018 */ 019 package jline; 020 021 import java.io.*; 022 import java.util.*; 023 import java.text.MessageFormat; 024 025 026 /** 027 * <p> 028 * A pass-through application that sets the system input stream to a 029 * {@link ConsoleReader} and invokes the specified main method. 030 * </p> 031 * 032 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a> 033 */ 034 public class ConsoleRunner 035 { 036 public static void main (final String[] args) 037 throws Exception 038 { 039 List argList = new ArrayList (Arrays.asList (args)); 040 if (argList.size () == 0) 041 { 042 usage (); 043 return; 044 } 045 046 // invoke the main() method 047 String mainClass = (String)argList.remove (0); 048 049 // setup the inpout stream 050 ConsoleReader reader = new ConsoleReader (); 051 reader.setHistory (new History (new File ( 052 System.getProperty ("user.home"), ".jline-" + mainClass 053 + ".history"))); 054 055 String completors = System.getProperty (ConsoleRunner.class.getName () 056 + ".completors", ""); 057 List completorList = new ArrayList (); 058 for (StringTokenizer tok = new StringTokenizer (completors, ","); 059 tok.hasMoreTokens (); ) 060 { 061 completorList.add ((Completor)Class.forName (tok.nextToken ()) 062 .newInstance ()); 063 } 064 065 if (completorList.size () > 0) 066 reader.addCompletor (new ArgumentCompletor (completorList)); 067 068 ConsoleReaderInputStream.setIn (reader); 069 try 070 { 071 Class.forName (mainClass) 072 .getMethod ("main", new Class[] { String[].class}) 073 .invoke (null, new Object[] { argList.toArray (new String[0])}); 074 } 075 finally 076 { 077 // just in case this main method is called from another program 078 ConsoleReaderInputStream.restoreIn (); 079 } 080 } 081 082 083 private static void usage () 084 { 085 throw new IllegalArgumentException ("Usage: java " 086 + ConsoleRunner.class.getName () 087 + " <target class name> [args]"); 088 } 089 } 090