George Kouzmov George Kouzmov - 6 months ago 18
Java Question

Args4j list arguments that contain space not handled

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

Answer

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;
  }
}
Comments