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