cbeust/jcommander

An IParametersValidator on an ParametersDelegate should not be lifted to the top-level object

Opened this issue · 2 comments

Take the following example:

  @Parameters(parametersValidators = MyValidator.class)
  static final class SubGroup {
    @Parameter(names = "--arg1")
    private boolean arg1;

    @Parameter(names = "--arg2")
    private String arg2;
  }

  static final class ArgsTop {
    @Parameter(names = "--argtop")
    private boolean argtop;

    @ParametersDelegate
    private SubGroup subGroup = new SubGroup();
  }

  public static void main(String[] args) {
    var args = new ArgsTop();
    JCommander.newBuilder().addObject(args).build();  // MyValidator::validate invoked reflectively here.
  }

When MyValidator::validate is invoked, it should only see entries for arg1 and arg2, not argtop.
This would make it much easier to implement generic mutex groups. I think it would also be more intuitive.

Feel free to contribute a PR including a test, but note that we must stay backwards compatible unless we move on to jCommander 2.x. OTOH I think we could safely say that it is a bug that MyValidator can see argtop. So I would rate your contribution as a bug fix, which we can include in 1.x.

@ekpdt Elan, still looking forward to receive your PR. Still working on it?