[cli] Cannot combine Option with multiple Values with arguments using Apache Commons CLI V1.2

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[cli] Cannot combine Option with multiple Values with arguments using Apache Commons CLI V1.2

adalbert.perbandt
Hi there,

I'm trying to implement a command line parser using Apache Commons CLI v. 1.2 (unfortunately I am forced to use that version). The syntax to be accepted is quite simple:

MyProg [ -x path[:path]... ] [ file1 ... ]

Option '-x' should accept a search path like sequence of directories (separated by ':') optionally followed by zero or more file names. My code looks as follows:

Option dbPath = OptionBuilder.withLongOpt("db_path")
                             .withDescription("DB search path")
                             .hasArgs()
                             .withValueSeparator(':')
                             .withArgName("Path[:Path]...")
                             .create('x');
Options opts = new Options();
opts.addOption(dbPath);

String[] args = new String[] { "-x", "path1:path2", "file1", "file2" };

CommandLineParser parser = new PosixParser();
CommandLine cmdLine = null;
try {
    cmdLine = parser.parse(opts, args);
} catch (ParseException ex) {
    System.out.println("Syntax error: " + ex.getMessage());
    return;
}
if (cmdLine.hasOption('x')) {
    for (String path : cmdLine.getOptionValues('x'))
        System.out.println("path: " + path);
}
for (Object file : cmdLine.getArgList()) {
    System.out.println("file: " + file);
}

Surprisingly this doesn't function as expected. This is the output I get:

path: path1
path: path2
path: file1
path: file2

Not only the two '-x' option values ('path1', 'path2') but also the file arguments are returned when the getOptionValues('x') function is called. No matter which parser class I use (BasicParser, GnuParser or PosixParser), the result is always the same.

What am I doing wrong?

Adalbert.

Reply | Threaded
Open this post in threaded view
|

Re: [cli] Cannot combine Option with multiple Values with arguments using Apache Commons CLI V1.2

Benedikt Ritter-4
Hello Adalbert,

> Am 14.03.2017 um 15:36 schrieb [hidden email]:
>
> Hi there,
>
> I'm trying to implement a command line parser using Apache Commons CLI v. 1.2 (unfortunately I am forced to use that version). The syntax to be accepted is quite simple:
>
> MyProg [ -x path[:path]... ] [ file1 ... ]
>
> Option '-x' should accept a search path like sequence of directories (separated by ':') optionally followed by zero or more file names. My code looks as follows:
>
> Option dbPath = OptionBuilder.withLongOpt("db_path")
>                             .withDescription("DB search path")
>                             .hasArgs()
>                             .withValueSeparator(':')
>                             .withArgName("Path[:Path]...")
>                             .create('x');
> Options opts = new Options();
> opts.addOption(dbPath);
>
> String[] args = new String[] { "-x", "path1:path2", "file1", "file2" };
>
> CommandLineParser parser = new PosixParser();
> CommandLine cmdLine = null;
> try {
>    cmdLine = parser.parse(opts, args);
> } catch (ParseException ex) {
>    System.out.println("Syntax error: " + ex.getMessage());
>    return;
> }
> if (cmdLine.hasOption('x')) {
>    for (String path : cmdLine.getOptionValues('x'))
>        System.out.println("path: " + path);
> }
> for (Object file : cmdLine.getArgList()) {
>    System.out.println("file: " + file);
> }
>
> Surprisingly this doesn't function as expected. This is the output I get:
>
> path: path1
> path: path2
> path: file1
> path: file2
>
> Not only the two '-x' option values ('path1', 'path2') but also the file arguments are returned when the getOptionValues('x') function is called. No matter which parser class I use (BasicParser, GnuParser or PosixParser), the result is always the same.
>
> What am I doing wrong?

I think what you’re trying to achieve is currently not possible with CLI. Here’s the JavaDoc of withValueSeparator(char):

 Option opt = OptionBuilder.withValueSeparator('=')
                           .create('D');

 String args = "-Dkey=value";
 CommandLine line = parser.parse(args);
 String propertyName = opt.getValue(0);  // will be "key"
 String propertyValue = opt.getValue(1); // will be "value"
So the value separator is used to define key-value pair options.

Benedikt

>
> Adalbert.
>