001 /**
002 * jline - Java console input library
003 * Copyright (c) 2002-2006, Marc Prud'hommeaux <mwp1@cornell.edu>
004 * All rights reserved.
005 *
006 * Redistribution and use in source and binary forms, with or
007 * without modification, are permitted provided that the following
008 * conditions are met:
009 *
010 * Redistributions of source code must retain the above copyright
011 * notice, this list of conditions and the following disclaimer.
012 *
013 * Redistributions in binary form must reproduce the above copyright
014 * notice, this list of conditions and the following disclaimer
015 * in the documentation and/or other materials provided with
016 * the distribution.
017 *
018 * Neither the name of JLine nor the names of its contributors
019 * may be used to endorse or promote products derived from this
020 * software without specific prior written permission.
021 *
022 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
023 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
024 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
025 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
026 * EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
027 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
028 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
029 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
030 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
031 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
032 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
033 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
034 * OF THE POSSIBILITY OF SUCH DAMAGE.
035 */
036 package jline;
037
038 import java.io.*;
039 import java.util.*;
040
041 /**
042 * <p>
043 * A pass-through application that sets the system input stream to a
044 * {@link ConsoleReader} and invokes the specified main method.
045 * </p>
046 *
047 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
048 */
049 public class ConsoleRunner
050 {
051 public static final String property = "jline.history";
052
053 public static void main (final String[] args)
054 throws Exception
055 {
056 String historyFileName = null;
057
058 List argList = new ArrayList (Arrays.asList (args));
059 if (argList.size () == 0)
060 {
061 usage ();
062 return;
063 }
064
065 historyFileName = System.getProperty(ConsoleRunner.property, null);
066
067 // invoke the main() method
068 String mainClass = (String)argList.remove (0);
069
070 // setup the inpout stream
071 ConsoleReader reader = new ConsoleReader ();
072 if (historyFileName != null)
073 {
074 reader.setHistory (new History (new File (
075 System.getProperty ("user.home"), ".jline-" + mainClass
076 + "." + historyFileName + ".history")));
077 }
078 else
079 {
080 reader.setHistory (new History (new File (
081 System.getProperty ("user.home"), ".jline-" + mainClass
082 + ".history")));
083 }
084
085 String completors = System.getProperty (ConsoleRunner.class.getName ()
086 + ".completors", "");
087 List completorList = new ArrayList ();
088 for (StringTokenizer tok = new StringTokenizer (completors, ",");
089 tok.hasMoreTokens (); )
090 {
091 completorList.add ((Completor)Class.forName (tok.nextToken ())
092 .newInstance ());
093 }
094
095 if (completorList.size () > 0)
096 reader.addCompletor (new ArgumentCompletor (completorList));
097
098 ConsoleReaderInputStream.setIn (reader);
099 try
100 {
101 Class.forName (mainClass)
102 .getMethod ("main", new Class[] { String[].class})
103 .invoke (null, new Object[] { argList.toArray (new String[0])});
104 }
105 finally
106 {
107 // just in case this main method is called from another program
108 ConsoleReaderInputStream.restoreIn ();
109 }
110 }
111
112
113 private static void usage ()
114 {
115 System.out.println ("Usage: \n java "
116 + "[-Djline.history='name'] "
117 + ConsoleRunner.class.getName ()
118 + " <target class name> [args]"
119 + "\n\nThe -Djline.history option will avoid history"
120 + "\nmangling when running ConsoleRunner on the same application."
121 + "\n\nargs will be passed directly to the target class name.");
122 }
123 }
124