import java.io.File; import java.io.IOException; import java.util.List; import java.util.TreeMap; import java.util.Vector; import ch.systemsx.cisd.args4j.Argument; import ch.systemsx.cisd.args4j.CmdLineException; import ch.systemsx.cisd.args4j.CmdLineParser; import ch.systemsx.cisd.args4j.Option; /** * 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 = "") 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 lib = new Vector(); @Option(name = "-logger", usage = "the class which is to perform logging", metaVar = "") private String logger; @Option(name = "-listener", usage = "the class which is to perform", metaVar = "") private String listener; @Option(name = "-noinput", usage = "do not allow interactive input") private boolean noinput; @Option(name = "-buildfile", usage = "use given buildfile", metaVar = "") private File buildfile; // Ant's original is // -buildfile use given buildfile // -file '' // -f '' // How to handle this? Args4J prints the arguments sorted alphabetically. @Option(name = "-file", usage = " ''", metaVar = "") private void setBuildfile1(File f) { buildfile = f; } @Option(name = "-f", usage = " ''", metaVar = "") private void setBuildfile2(File f) { buildfile = f; } // TODO 2008-06-15, Christian Ribeaud: How to handle that? // -D= use value for given property private TreeMap props = new TreeMap(); @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 = "") private File propertyfile; @Option(name = "-inputhandler", usage = "the class which will handle input requests", metaVar = "") private String inputhandler; // TODO 2008-06-15, Christian Ribeaud: Another problem // -find (s)earch for buildfile towards the root of // -s 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 = "") private File file; @Option(name = "-s", metaVar = "") 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 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(""); } }