diff options
author | Pierre Lindenbaum <plindenbaum@yahoo.fr> | 2017-03-25 15:27:56 +0100 |
---|---|---|
committer | Pierre Lindenbaum <plindenbaum@yahoo.fr> | 2017-03-25 15:27:56 +0100 |
commit | c4ab9804b0b0958a999ceb43fe226ca17ce26e3b (patch) | |
tree | b05c6b10c369911cee8b7c5f6a79c3a64912758d | |
parent | 6c11c138a571052c0d6d20dce2490972e93129fe (diff) | |
download | jcommander-c4ab9804b0b0958a999ceb43fe226ca17ce26e3b.tar.gz |
multiple validation
8 files changed, 92 insertions, 16 deletions
diff --git a/doc/index.adoc b/doc/index.adoc index 533828e..6709b7e 100644 --- a/doc/index.adoc +++ b/doc/index.adoc @@ -483,6 +483,15 @@ private Integer age; Attempting to pass a negative integer to this option will cause a ParameterException to be thrown. +Multiple validators may be specified: + +[source,java] +---- +@Parameter(names = "-count", validateWith = { PositiveInteger.class, CustomOddNumberValidator.class }) +private Integer value; +---- + + === Global parameter validation After parsing your parameters with JCommander, you might want to perform additional validation across these parameters, such as making sure that two mutually exclusive parameters are not both specified. Because of all the potential combinations involved in such validation, JCommander does not provide any annotation-based solution to perform this validation because such an approach would necessarily be very limited by the very nature of Java annotations. Instead, you should simply perform this validation in Java on all the arguments that JCommander just parsed. diff --git a/src/main/java/com/beust/jcommander/DynamicParameter.java b/src/main/java/com/beust/jcommander/DynamicParameter.java index 2159c1f..bdb5010 100644 --- a/src/main/java/com/beust/jcommander/DynamicParameter.java +++ b/src/main/java/com/beust/jcommander/DynamicParameter.java @@ -37,14 +37,14 @@ public @interface DynamicParameter { boolean hidden() default false; /** - * The validation class to use. + * The validation classes to use. */ - Class<? extends IParameterValidator> validateWith() default NoValidator.class; + Class<? extends IParameterValidator>[] validateWith() default NoValidator.class; /** * The character(s) used to assign the values. */ String assignment() default "="; - Class<? extends IValueValidator> validateValueWith() default NoValueValidator.class; + Class<? extends IValueValidator>[] validateValueWith() default NoValueValidator.class; } diff --git a/src/main/java/com/beust/jcommander/JCommander.java b/src/main/java/com/beust/jcommander/JCommander.java index 6d11082..99846f7 100644 --- a/src/main/java/com/beust/jcommander/JCommander.java +++ b/src/main/java/com/beust/jcommander/JCommander.java @@ -727,10 +727,12 @@ public class JCommander { convertedValue = convertValue(mainParameter, (Class) cls, null, value); } } - - ParameterDescription.validateParameter(mainParameterDescription, - mainParameterAnnotation.validateWith(), + + for(final Class<? extends IParameterValidator> validator : mainParameterAnnotation.validateWith() ) { + ParameterDescription.validateParameter(mainParameterDescription, + validator, "Default", value); + } mainParameterDescription.setAssigned(true); mp.add(convertedValue); diff --git a/src/main/java/com/beust/jcommander/Parameter.java b/src/main/java/com/beust/jcommander/Parameter.java index 3f6f5f5..2fc00c5 100644 --- a/src/main/java/com/beust/jcommander/Parameter.java +++ b/src/main/java/com/beust/jcommander/Parameter.java @@ -90,12 +90,12 @@ public @interface Parameter { /** * Validate the parameter found on the command line. */ - Class<? extends IParameterValidator> validateWith() default NoValidator.class; + Class<? extends IParameterValidator>[] validateWith() default NoValidator.class; /** * Validate the value for this parameter. */ - Class<? extends IValueValidator> validateValueWith() default NoValueValidator.class; + Class<? extends IValueValidator>[] validateValueWith() default NoValueValidator.class; /** * @return true if this parameter has a variable arity. See @{IVariableArity} diff --git a/src/main/java/com/beust/jcommander/ParameterDescription.java b/src/main/java/com/beust/jcommander/ParameterDescription.java index fcd7042..7e653f4 100644 --- a/src/main/java/com/beust/jcommander/ParameterDescription.java +++ b/src/main/java/com/beust/jcommander/ParameterDescription.java @@ -327,16 +327,20 @@ public class ParameterDescription { } private void validateParameter(String name, String value) { - Class<? extends IParameterValidator> validator = wrappedParameter.validateWith(); - if (validator != null) { - validateParameter(this, validator, name, value); + Class<? extends IParameterValidator> validators[] = wrappedParameter.validateWith(); + if (validators != null && validators.length>0) { + for(final Class<? extends IParameterValidator> validator: validators) { + validateParameter(this, validator, name, value); + } } } void validateValueParameter(String name, Object value) { - Class<? extends IValueValidator> validator = wrappedParameter.validateValueWith(); - if (validator != null) { - validateValueParameter(validator, name, value); + Class<? extends IValueValidator> validators[] = wrappedParameter.validateValueWith(); + if (validators != null && validators.length>0) { + for(final Class<? extends IValueValidator> validator: validators) { + validateValueParameter(validator, name, value); + } } } @@ -356,6 +360,7 @@ public class ParameterDescription { Class<? extends IParameterValidator> validator, String name, String value) { try { + if (validator != NoValidator.class) { p("Validating parameter:" + name + " value:" + value + " validator:" + validator); } diff --git a/src/main/java/com/beust/jcommander/WrappedParameter.java b/src/main/java/com/beust/jcommander/WrappedParameter.java index 6d72209..e49245a 100644 --- a/src/main/java/com/beust/jcommander/WrappedParameter.java +++ b/src/main/java/com/beust/jcommander/WrappedParameter.java @@ -51,11 +51,11 @@ public class WrappedParameter { return parameter != null ? parameter.variableArity() : false; } - public Class<? extends IParameterValidator> validateWith() { + public Class<? extends IParameterValidator>[] validateWith() { return parameter != null ? parameter.validateWith() : dynamicParameter.validateWith(); } - public Class<? extends IValueValidator> validateValueWith() { + public Class<? extends IValueValidator>[] validateValueWith() { return parameter != null ? parameter.validateValueWith() : dynamicParameter.validateValueWith(); diff --git a/src/test/java/com/beust/jcommander/JCommanderTest.java b/src/test/java/com/beust/jcommander/JCommanderTest.java index 1c0e45c..dded490 100644 --- a/src/test/java/com/beust/jcommander/JCommanderTest.java +++ b/src/test/java/com/beust/jcommander/JCommanderTest.java @@ -590,6 +590,30 @@ public class JCommanderTest { ArgsValidate2 a = new ArgsValidate2(); new JCommander(a).usage(); } + + @Test + public void multipleValidators() { + for(int i=1;i< 100;i+=2) { + ArgsMultiValidate a = new ArgsMultiValidate(); + JCommander jc = new JCommander(a); + jc.parse("-age", String.valueOf(i)); + } + } + @Test(expectedExceptions=ParameterException.class) + public void multipleValidatorsFails1() + { + ArgsMultiValidate a = new ArgsMultiValidate(); + JCommander jc = new JCommander(a); + jc.parse("-age", "131"); + } + + @Test(expectedExceptions=ParameterException.class) + public void multipleValidatorsFails2() + { + ArgsMultiValidate a = new ArgsMultiValidate(); + JCommander jc = new JCommander(a); + jc.parse("-age", "0"); + } @Test(expectedExceptions = ParameterException.class) public void validationShouldWork2() { diff --git a/src/test/java/com/beust/jcommander/args/ArgsMultiValidate.java b/src/test/java/com/beust/jcommander/args/ArgsMultiValidate.java new file mode 100644 index 0000000..e8b5bc1 --- /dev/null +++ b/src/test/java/com/beust/jcommander/args/ArgsMultiValidate.java @@ -0,0 +1,36 @@ +package com.beust.jcommander.args; + +import com.beust.jcommander.IParameterValidator; +import com.beust.jcommander.IValueValidator; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.ParameterException; +import com.beust.jcommander.validators.PositiveInteger; + +public class ArgsMultiValidate { + public static class OddIntegerParameterValidator implements IParameterValidator { + @Override + public void validate(String name, String value) throws ParameterException { + if(Integer.parseInt(value)%2!=1) throw new ParameterException("param "+name+"="+value+" is not odd"); + } + } + + public static class LowerThan100VvalueValidator implements IValueValidator<Integer> { + @Override + public void validate(String name, Integer value) throws ParameterException { + if(value>=100) throw new ParameterException("param "+name+"="+value+" is greater than 100"); + } + } + + public static class GreaterTha0VvalueValidator implements IValueValidator<Integer> { + @Override + public void validate(String name, Integer value) throws ParameterException { + System.err.println(name+"="+value+"######################"); + if(value<=0) throw new ParameterException("param "+name+"="+value+" is lower than 1"); + } + } + + @Parameter(names = "-age", + validateWith = {PositiveInteger.class,OddIntegerParameterValidator.class}, + validateValueWith={GreaterTha0VvalueValidator.class,LowerThan100VvalueValidator.class}) + public int age=29; +} |