3

I am dealing with a strange args4j bug. I am handling list command line arguments

aaa.jar -list special_date=2015-05-05 "special_name=bob the builder"

This is handled with StringArrayOptionHandler

. And when I retreive the arguments of the list what i get is

[special_date=2015-05-05, special_name=bob, the, builder]

Java docs say that this should work

 java -jar aaa.jar -s banan hruska jablko
 java -jar aaa.jar -s banan "hruska jablko"
 java -jar aaa.jar -s "banan hruska jablko"
 java -jar aaa.jar -s banan hruska jablko -l 4 -r
 java -jar aaa.jar -t 222 -s banan hruska jablko -r

There is no bug when handling a single argument with quotes.

aaa.jar -a "bob the builder"

Works perfectly fine

Thank you

George Kouzmov
  • 319
  • 4
  • 15
  • You're misreading the javadoc; it says "*All of [these examples] result in a single string array that contains three tokens: `banan`, `hruska`, and `jablko`.*" – dimo414 Apr 11 '16 at 05:10

2 Answers2

3

The implementation of StringArrayOptionHandler is fairly straightforward, you could adjust it for your own purposes easily enough. Something like this should work:

public class WellBehavedStringArrayOptionHandler extends OptionHandler<String> {
  public WellBehavedStringArrayOptionHandler(
      CmdLineParser parser, OptionDef option, Setter<String> setter) {
    super(parser, option, setter);
  }

  @Override
  public String getDefaultMetaVariable() {
    return Messages.DEFAULT_META_STRING_ARRAY_OPTION_HANDLER.format();            
  }

  @Override
  public int parseArguments(Parameters params) throws CmdLineException {
    int counter;
    for (counter = 0; counter < params.size(); counter++) {
      String param = params.getParameter(counter);
      if(param.startsWith("-")) {
        break;
      }
      setter.addValue(param);
    }
    return counter;
  }
}
dimo414
  • 47,227
  • 18
  • 148
  • 244
2

The most simple answer is to use the default args4j builtin StringArrayOptionHandler:

import org.kohsuke.args4j.spi.StringArrayOptionHandler;

/.../

@Option (name = "-o", aliases = {"--amoreclarifyingoptionname"}, 
    handler=StringArrayOptionHandler.class, 
    usage = "How to use it")
private String[] option;

Then join the pieces of option:

String getOption() {
    StringBuilder cmd = new StringBuilder();
    for (int i = 0; i < option.length; i++) {
        cmd.append(option[i]);
        cmd.append(" ");
    }
    return cmd.toString().trim();
}
Mike
  • 397
  • 2
  • 16