risposta

4

Dal commons-cli non supporta che direttamente, il la soluzione più semplice è probabilmente quella di verificare il valore di un'opzione quando lo si ottiene.

+1

È ancora vero? – ksl

6

Ho voluto questo tipo di comportamento prima e non ho mai trovato un modo per farlo con un metodo già fornito. Questo non vuol dire che non esiste. Una sorta di modo zoppo, è quello di aggiungere il codice da soli come ad esempio:

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

Ovviamente ci sarebbero modi più belli per fare questo che il lungo if/else, possibilmente con un enum, ma che dovrebbe essere tutto ciò che' d bisogno. Inoltre non ho compilato questo, ma penso che dovrebbe funzionare.

Questo esempio non rende obbligatorio l'interruttore "-a", poiché non è stato specificato nella domanda.

6

L'altro modo può essere l'estensione della classe Option. Al lavoro abbiamo fatto ciò:

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(); 
     } 
    }