import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import java.io.IOException;
import java.io.File;
import java.util.List;
import java.util.Vector;
import java.util.TreeMap;
/**
* Showing the Ant command line interface as args4j annotations.
*
* @author
* Jan Materne
*/
// Field are are access by args4j per reflection. The compiler does not know that.
// So catch these compiler warnings.
@SuppressWarnings("unused")
public class SampleAnt {
// 'normal' use
@Option(name="-help",usage="print this message")
private boolean help = false;
// Ant uses abbreviations - a second option to set the
// same attribute. Because only one @Option is allowed per element,
// we use a workaround: a setter gets the abbreviation
// A 'usage' would duplicate the info message, but without the possibility
// of '-h' is hidden.
@Option(name="-h")
private void setHelp(boolean h) { help = h; }
@Option(name="-projecthelp",usage="print project help information")
private boolean projecthelp;
@Option(name="-p")
private void setProjecthelp(boolean p) { projecthelp = p; }
@Option(name="-version",usage="print the version information and exit")
private boolean version;
@Option(name="-diagnostics",usage="print information that might be helpful to\ndiagnose or report problems.")
private boolean diagnostics;
@Option(name="-quiet",usage="be extra quiet")
private boolean quiet;
@Option(name="-q")
private void setQuiet(boolean q) { quiet = q; }
@Option(name="-verbose",usage="be extra verbose")
private boolean verbose;
@Option(name="-v")
private void setVerbose(boolean v) { verbose = v; }
@Option(name="-debug",usage="print debugging information")
private boolean debug;
@Option(name="-d")
private void setDebug(boolean d) { debug = d; }
@Option(name="-emacs",usage="produce logging information without adornments")
private boolean emacs;
@Option(name="-e")
private void setEmacs(boolean e) { emacs = e; }
@Option(name="-lib",usage="specifies a path to search for jars and classes",metaVar="<path>")
private void setLib(String s) {
String[] files = s.split(System.getProperty("path.separator"));
for (int i=0; i<files.length; i++) {
lib.add(new File(files[i]));
}
}
private List<File> lib = new Vector<File>();
@Option(name="-logger",usage="the class which is to perform logging",metaVar="<classname>")
private String logger;
@Option(name="-listener",usage="the class which is to perform",metaVar="<classname>")
private String listener;
@Option(name="-noinput",usage="do not allow interactive input")
private boolean noinput;
@Option(name="-buildfile",usage="use given buildfile",metaVar="<file>")
private File buildfile;
// Ant's original is
// -buildfile <file> use given buildfile
// -file <file> ''
// -f <file> ''
// How to handle this? Args4J prints the arguments sorted alphabetically.
@Option(name="-file",usage=" ''",metaVar="<file>")
private void setBuildfile1(File f) { buildfile = f; }
@Option(name="-f",usage=" ''",metaVar="<file>")
private void setBuildfile2(File f) { buildfile = f; }
//TODO: How to handle that?
// -D<property>=<value> use value for given property
private TreeMap<String,String> props = new TreeMap<String,String>();
@Option(name="-keep-going",usage="execute all targets that do not depend\non failed target(s)")
private boolean keepGoing;
@Option(name="-k")
private void setKeepGoing(boolean kg) { keepGoing = kg; }
@Option(name="-propertyfile",usage="load all properties from file with -D\nproperties taking precedence",metaVar="<name>")
private File propertyfile;
@Option(name="-inputhandler",usage="the class which will handle input requests",metaVar="<class>")
private String inputhandler;
//TODO: Another problem
// -find <file> (s)earch for buildfile towards the root of
// -s <file> the filesystem and use it
//problem is: info text has two lines and there are two lines for different option strings
@Option(name="-find",usage="(s)earch for buildfile towards the root of\nthe filesystem and use it",metaVar="<file>")
private File file;
@Option(name="-s",metaVar="<file>")
private void setFile(File f) { file = f; }
@Option(name="-nice",usage="A niceness value for the main thread:\n1 (lowest) to 10 (highest); 5 is the default")
private void setNice(int n) {
if (n>0 && n<11) nice = n;
}
private int nice = 5;
@Option(name="-nouserlib",usage="Run ant without using the jar files from\n${user.home}/.ant/lib")
private boolean nouserlib;
@Option(name="-noclasspath",usage="Run ant without using CLASSPATH")
private boolean noclasspath;
@Argument
private List<String> targets;
public static void main(String[] args) throws IOException {
SampleAnt bean = new SampleAnt();
try {
bean.parseArgs(args);
bean.showResult();
} catch (IOException ioe) {
//no-op
}
}
public void parseArgs(String[] args) throws IOException {
CmdLineParser parser = new CmdLineParser(this);
try {
parser.parseArgument(args);
} catch( CmdLineException e ) {
int start = e.getMessage().indexOf('"')+1;
int end = e.getMessage().lastIndexOf('"');
String wrongArgument = e.getMessage().substring(start, end);
System.err.println("Unknown argument: " + wrongArgument);
System.err.println("ant [options] [target [target2 [target3] ...]]");
parser.printUsage(System.err);
System.err.println();
throw new IOException();
}
}
public void showResult() {
System.out.println("SampleAnt was configured with...");
System.out.println(" help : " + help);
System.out.println(" projecthelp : " + projecthelp);
System.out.println(" version : " + version);
System.out.println(" diagnostics : " + diagnostics);
System.out.println(" quiet : " + quiet);
System.out.println(" verbose : " + verbose);
System.out.println(" debug : " + debug);
System.out.println(" emacs : " + emacs);
System.out.println(" lib");
for (File f : lib) {
System.out.println(" - " + f);
}
System.out.println(" logger : " + logger);
System.out.println(" listener : " + listener);
System.out.println(" noinput : " + noinput);
System.out.println(" buildfile : " + buildfile);
System.out.println(" properties");
for (String key : props.keySet()) {
System.out.println(" - " + key + " = " + props.get(key));
}
System.out.println(" keepGoing : " + keepGoing);
System.out.println(" propertyfile : " + propertyfile);
System.out.println(" inputhandler : " + inputhandler);
System.out.println(" buildfile : " + file);
System.out.println(" nice : " + nice);
System.out.println(" nouserlib : " + nouserlib);
System.out.println(" noclasspath : " + noclasspath);
System.out.println("");
System.out.println(" targets");
for (String t : targets) {
System.out.println(" - " + t);
}
System.out.println("");
}
}