Java commons-cli, опции со списком возможных значений - PullRequest
11 голосов
/ 28 ноября 2009

Как сделать так, чтобы опция принимала только некоторые указанные значения, как в следующем примере:

$ java -jar Mumu.jar -a foo
OK
$ java -jar Mumu.jar -a bar
OK
$ java -jar Mumu.jar -a foobar
foobar is not a valid value for -a

Ответы [ 3 ]

8 голосов
/ 09 августа 2010

Другим способом может быть расширение класса Option. На работе мы сделали это:

    public static class ChoiceOption extends Option {
        private final String[] choices;

        public ChoiceOption(
            final String opt,
            final String longOpt,
            final boolean hasArg,
            final String description,
            final String... choices) throws IllegalArgumentException {
        super(opt, longOpt, hasArg, description + ' ' + Arrays.toString(choices));
        this.choices = choices;
       }

      public String getChoiceValue() throws RuntimeException {
        final String value = super.getValue();
        if (value == null) {
            return value;
        }
        if (ArrayUtils.contains(choices, value)) {
            return value;
        }
        throw new RuntimeException( value " + describe(this) + " should be one of " + Arrays.toString(choices));
     }

      @Override
      public boolean equals(final Object o) {
        if (this == o) {
            return true;
        } else if (o == null || getClass() != o.getClass()) {
            return false;
        }
        return new EqualsBuilder().appendSuper(super.equals(o))
                .append(choices, ((ChoiceOption) o).choices)
                .isEquals();
     }

      @Override
      public int hashCode() {
        return new ashCodeBuilder().appendSuper(super.hashCode()).append(choices).toHashCode();
      }
  }
6 голосов
/ 28 ноября 2009

Раньше я хотел такого поведения, и никогда не сталкивался с таким способом с помощью уже предоставленного метода. Это не значит, что его не существует. Отчасти неудачный способ - добавить код самостоятельно, например:

private void checkSuitableValue(CommandLine line) {
    if(line.hasOption("a")) {
        String value = line.getOptionValue("a");
        if("foo".equals(value)) {
            println("OK");
        } else if("bar".equals(value)) {
            println("OK");
        } else {
            println(value + "is not a valid value for -a");
            System.exit(1);
        }
     }
 }

Очевидно, что есть более хорошие способы сделать это, чем длинный if / else, возможно, с enum, но это должно быть все, что вам нужно. Также я не скомпилировал это, но я считаю, что это должно работать.

Этот пример также не делает переключатель "-a" обязательным, так как это не было указано в вопросе.

6 голосов
/ 28 ноября 2009

Поскольку commons-cli не поддерживает это напрямую, простейшим решением, вероятно, является проверка значения параметра при его получении.

...