--- /dev/null 2015-04-26 06:51:08.003313989 -0700 +++ new/jdk/src/jdk.jline/share/classes/jdk/internal/jline/console/internal/ConsoleRunner.java 2015-06-18 03:05:25.726961021 -0700 @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2002-2012, the original author or authors. + * + * This software is distributable under the BSD license. See the terms of the + * BSD license in the documentation provided with this software. + * + * http://www.opensource.org/licenses/bsd-license.php + */ +package jline.console.internal; + +import jline.console.ConsoleReader; +import jline.console.completer.ArgumentCompleter; +import jline.console.completer.Completer; +import jline.console.history.FileHistory; +import jline.internal.Configuration; + +import java.io.File; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringTokenizer; + +// FIXME: Clean up API and move to jline.console.runner package + +/** + * A pass-through application that sets the system input stream to a + * {@link ConsoleReader} and invokes the specified main method. + * + * @author Marc Prud'hommeaux + * @since 2.7 + */ +public class ConsoleRunner +{ + public static final String property = "jline.history"; + + // FIXME: This is really ugly... re-write this + + public static void main(final String[] args) throws Exception { + List argList = new ArrayList(Arrays.asList(args)); + if (argList.size() == 0) { + usage(); + return; + } + + String historyFileName = System.getProperty(ConsoleRunner.property, null); + + String mainClass = argList.remove(0); + ConsoleReader reader = new ConsoleReader(); + + if (historyFileName != null) { + reader.setHistory(new FileHistory(new File(Configuration.getUserHome(), + String.format(".jline-%s.%s.history", mainClass, historyFileName)))); + } + else { + reader.setHistory(new FileHistory(new File(Configuration.getUserHome(), + String.format(".jline-%s.history", mainClass)))); + } + + String completors = System.getProperty(ConsoleRunner.class.getName() + ".completers", ""); + List completorList = new ArrayList(); + + for (StringTokenizer tok = new StringTokenizer(completors, ","); tok.hasMoreTokens();) { + Object obj = Class.forName(tok.nextToken()).newInstance(); + completorList.add((Completer) obj); + } + + if (completorList.size() > 0) { + reader.addCompleter(new ArgumentCompleter(completorList)); + } + + ConsoleReaderInputStream.setIn(reader); + + try { + Class type = Class.forName(mainClass); + Method method = type.getMethod("main", new Class[]{String[].class}); + method.invoke(null); + } + finally { + // just in case this main method is called from another program + ConsoleReaderInputStream.restoreIn(); + } + } + + private static void usage() { + System.out.println("Usage: \n java " + "[-Djline.history='name'] " + + ConsoleRunner.class.getName() + + " [args]" + + "\n\nThe -Djline.history option will avoid history" + + "\nmangling when running ConsoleRunner on the same application." + + "\n\nargs will be passed directly to the target class name."); + } +}