A Simple Extensible Command-Line Interpreter in Java
I’ve found command-line interpreters are useful tools. Especially interpreter’s that can read commands from both files and keyboard. I’ve used such interpreter’s for printer manipulation, database and object creation, and other tasks. I can hear someone saying, ‘Use Ant’, but creating Ant tasks can be a daunting proposition at first. So the class presented here is simple, simple, simple so that beginning java developers can use it.
This simple command-line interpreter is extensible and easy-to-use as shown in test code below. The source code for the command line class is about 500 lines and is available at http://www.codebits.com/java/CommandLine.java.
CommandLineTest.java
package com.affy.utils.cmdline; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.InputStreamReader; import java.io.Reader; import java.io.StreamTokenizer; import java.util.Vector; /** * This class shows how the CommandLine class * can be used. It initialized a CommandLine object * and defines a FOO command. Notice that this class * (CommandLineTest) acts as both test harness and * command executor. When run, you'll be presented with * a command-line prompt. Type 'foo bar baz' and you'll * see the output from the doIt() method. Type 'aaa aaa aaa' * and you'll see an error message. Command-line parameters * with spaces need to be quoted. * * @author medined * Created on May 20, 2003 */ public class CommandLineTest implements CommandLine.ICommand { /** * Shows how to use the CommandLine class. * @param args The command-line parameters * @throws FileNotFoundException */ public static void main(String[] args) throws FileNotFoundException { // This technique of reading from either // a script file or // from the console was 'borrowed' from BeanShell. Reader inputSrc = null; if ( args.length > 0 ) { inputSrc = new BufferedReader( new FileReader(args[0]) ); } else { inputSrc = new InputStreamReader(System.in); } // initialize the command line object. CommandLine jr = new CommandLine(); jr.setCommandLinePrompt("Command> "); jr.setCommandLineVersion("Command Line v.01"); jr.assignClassToCommnd("foo", "com.affy.utils.cmdline.CommandLineTest"); jr.init(); if ( args.length > 0 ) { jr.setIsInteractive(false); } // parse and execute commands. jr.parseStream(new StreamTokenizer(inputSrc)); System.out.println("\nDone."); } /** * This method is invoked when the FOO command is * used. */ public boolean doIt(Vector v) { System.out.println( "Inside CommandLineTest.doIt(); v=" + v ); return true; } }