You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Emmanuel Bourg (JIRA)" <ji...@apache.org> on 2010/07/14 00:01:57 UTC

[jira] Updated: (CLI-196) Annotation based option specification

     [ https://issues.apache.org/jira/browse/CLI-196?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Emmanuel Bourg updated CLI-196:
-------------------------------

    Fix Version/s: 1.4
         Priority: Major  (was: Minor)

> Annotation based option specification
> -------------------------------------
>
>                 Key: CLI-196
>                 URL: https://issues.apache.org/jira/browse/CLI-196
>             Project: Commons CLI
>          Issue Type: New Feature
>          Components: CLI-1.x
>            Reporter: Kevin Holloway
>             Fix For: 1.4
>
>
> This is a proposal for an alternative way of specifying command line options, using annotations.  It's implementation wraps Commons CLI code and uses reflection.
> From a user perspective, the following is a example of a mythical program that takes three arguments:
> -utc, reports the date in terms of UTC.
> -offset <integer>, adds an offset to the reference date.
> -reference <amount>, the reference amount (whatever that is).
> The Java code for the options is as follows:
> {code}
> public class XyzOptions {
>   private boolean utc;
>   private int offset;
>   private BigDecimal reference;
>   @Option (name="utc", description="Reports the date in terms of UTC")
>   void setUTC (boolean utc) {
>     this.utc = utc;
>   }
>   @Option (name="offset", description="Adds an offset to the reference date")
>   void setOffset (int offset) {
>     this.offset = offset;
>   }
>   @Option (name="reference", required=true, description="The reference amount")
>   void setReferenceAmount (BigDecimal amount) {
>     this.reference = amount;
>   }
>   // get methods omitted
> }
> {code}
> @Option is an annotation that provides CLI option details.  The @Option annotates set methods of the options class.
> The Java code that uses these options is as follows:
> {code}
> public static void main (String[] args) {
>   XyzOptions options = CommandLine.parse(args, XyzOptions.class, "dateCommand");
>   
>   // the program options can then be accessed using get methods or field access on the options object.
> }
> {code}
> The "CommandLine" class is the class that builds the CLI Options instance using the @Option annotations and reflection.  
> The @Option annotation allows the following to be specified:
> * name.  The short name of the option.
> * longForm.  The long form of the option.
> * description.  The description of the option.  This is the description that appears in the help text.
> * required.  true if this option is required.  This defaults to false, meaning the option is optional.
> * argOptional.  true if the option argument is optional.  This defaults to false, meaning the option argument is mandatory.
> The remaining information is obtained by reflection on the set method parameter.
> * If the set method parameter is boolean or Boolean, the option is assumed to take no argument.  It is a simple switch.
> * If the set method parameter takes any other type, the option is assumed to take an argument of that type.
> ** If the parameter type is String, the option argument is used as-is.
> ** If the parameter type is a primitive type (or the class equivalent), the option argument is converted to that type and passed to the set method.
> ** If the parameter type is something else (such as BigDecimal), the command line parser looks for a class constructor that takes a String argument.  If this is found, and instance of the object is created an passed to the set method.  Any class that has a constructor that takes a single String argument can be used.
> Option arguments can be validated in the set methods.  For example, if a File needs to be a directory, the set method could be as follows:
> {code}
>   @Option (name="dir", description="The output directory")
>   void setOutputDir (File file) {
>     if (!file.isDirectory()) {
>       throw new IllegalArgumentException ("'dir' option must specify a directory");
>     }
>     this.file = file;
> }
> {code}
> The code for what is described here is available if anyone wants it.
> This is the idea.  There are some issues to resolve, but the first question is: does anyone think it worth pursuing this?

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.