package org.openflow.example.cli;
import java.io.PrintStream;
/**
* Very basic command line interface
*
* (really should be something in java.* for this; only implementing this to
* remove external dependencies)
*
* Modeled after org.apache.common.cli .
*
* @author Rob Sherwood (rob.sherwood@stanford.edu)
*
*/
public class SimpleCLI {
private static final String NAME_WIDTH = "-15";
private static final String VALUE_WIDTH = "-20";
private static final String FORMAT_STRING = "%1$" + NAME_WIDTH + "s%2$"
+ VALUE_WIDTH + "s%3$s\n";
Options options;
int optind;
/**
* Need to use SimpleCLI.parse() instead
*
* @param options
*/
private SimpleCLI(Options options) {
this.options = options;
}
/**
* @return the index of the last parsed option
*
* Useful for finding options that don't start with "-" or "--"
*/
public int getOptind() {
return optind;
}
/**
* @param optind
* the optind to set
*/
public void setOptind(int optind) {
this.optind = optind;
}
public boolean hasOption(String shortName) {
Option option = this.options.getOption(shortName);
if (option == null)
return false;
return option.specified;
}
public String getOptionValue(String shortName) {
Option option = this.options.getOption(shortName);
if (option == null)
return null;
if (!option.specified)
return option.defaultVal.toString();
else
return option.val;
}
public static SimpleCLI parse(Options options, String[] args)
throws ParseException {
SimpleCLI simpleCLI = new SimpleCLI(options);
int i;
for (i = 0; i < args.length; i++) {
if (!args[i].startsWith("-"))
break; // not a short or long option
String optName = args[i].replaceFirst("^-*", ""); // remove leading
// "--"
Option option;
if (args[i].startsWith("--"))
option = options.getOptionByLongName(optName);
else
option = options.getOption(optName);
if (option == null)
throw new ParseException("unknown option: " + optName);
option.specified = true;
if (option.needsArg()) {
if ((i + 1) >= args.length)
throw new ParseException("option " + optName
+ " requires an argument:: " + option.comment);
option.val = args[i + 1];
i++; // skip next element; we've parsed it
}
}
simpleCLI.setOptind(i);
return simpleCLI;
}
public static void printHelp(String canonicalName, Options options) {
printHelp(canonicalName, options, System.err);
}
private static void printHelp(String helpString, Options options,
PrintStream err) {
err.println(helpString);
err.format(FORMAT_STRING, "\toption", "type [default]", "usage");
for (Option option : options.getOptions()) {
String msg = "\t";
if (option.shortOpt != null)
msg += "-" + option.shortOpt;
if (option.longOpt != null) {
if (!msg.equals("\t"))
msg += "|";
msg += "--" + option.longOpt;
}
String val = "";
if (option.defaultVal != null)
val += option.defaultVal.getClass().getSimpleName() + " ["
+ option.defaultVal.toString() + "]";
String comment;
if (option.comment != null)
comment = option.comment;
else
comment = "";
err.format(FORMAT_STRING, msg, val, comment);
}
err.println(""); // print blank line at the end, to look pretty
}
}