diff options
author | Cedric Beust <cedric@beust.com> | 2012-06-10 18:47:55 -0700 |
---|---|---|
committer | Cedric Beust <cedric@beust.com> | 2012-06-10 18:47:55 -0700 |
commit | e903207930001edf324f2623b763df0f75e82a3c (patch) | |
tree | 0c8b2832ab2089149181d35009454b6b1f25aff1 | |
parent | 9c2bd65ecd9779540bfde5a200ff71d1d503839c (diff) | |
download | platform_external_jcommander-e903207930001edf324f2623b763df0f75e82a3c.tar.gz platform_external_jcommander-e903207930001edf324f2623b763df0f75e82a3c.tar.bz2 platform_external_jcommander-e903207930001edf324f2623b763df0f75e82a3c.zip |
Added: IValueValidator to validate parameter values (typed) as oppoed to IParameterValidator which validates strings
8 files changed, 97 insertions, 7 deletions
@@ -1,5 +1,6 @@ Current +Added: IValueValidator to validate parameter values (typed) as oppoed to IParameterValidator which validates strings Added: echoInput, used when password=true to echo the characters (Jason Wheeler) Fixed: if using a different option prefix, unknown option are mistakenly reported as "no main parameter defined" (kurmasz) Fixed: 113: getCommandDescription() returns the description of the main parameter instead of that of the command diff --git a/src/main/java/com/beust/jcommander/DynamicParameter.java b/src/main/java/com/beust/jcommander/DynamicParameter.java index 77b8632..2159c1f 100644 --- a/src/main/java/com/beust/jcommander/DynamicParameter.java +++ b/src/main/java/com/beust/jcommander/DynamicParameter.java @@ -3,6 +3,7 @@ package com.beust.jcommander; import static java.lang.annotation.ElementType.FIELD; import com.beust.jcommander.validators.NoValidator; +import com.beust.jcommander.validators.NoValueValidator; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -44,4 +45,6 @@ public @interface DynamicParameter { * The character(s) used to assign the values. */ String assignment() default "="; + + Class<? extends IValueValidator> validateValueWith() default NoValueValidator.class; } diff --git a/src/main/java/com/beust/jcommander/IValueValidator.java b/src/main/java/com/beust/jcommander/IValueValidator.java new file mode 100644 index 0000000..feed25d --- /dev/null +++ b/src/main/java/com/beust/jcommander/IValueValidator.java @@ -0,0 +1,14 @@ +package com.beust.jcommander; + +public interface IValueValidator<T> { + /** + * Validate the parameter. + * + * @param name The name of the parameter (e.g. "-host"). + * @param value The value of the parameter that we need to validate + * + * @throws ParameterException Thrown if the value of the parameter is invalid. + */ + void validate(String name, T value) throws ParameterException; + +} diff --git a/src/main/java/com/beust/jcommander/Parameter.java b/src/main/java/com/beust/jcommander/Parameter.java index 0d19dc4..c73d69b 100644 --- a/src/main/java/com/beust/jcommander/Parameter.java +++ b/src/main/java/com/beust/jcommander/Parameter.java @@ -24,6 +24,7 @@ import com.beust.jcommander.converters.CommaParameterSplitter; import com.beust.jcommander.converters.IParameterSplitter; import com.beust.jcommander.converters.NoConverter; import com.beust.jcommander.validators.NoValidator; +import com.beust.jcommander.validators.NoValueValidator; import java.lang.annotation.Retention; import java.lang.annotation.Target; @@ -86,11 +87,16 @@ public @interface Parameter { boolean hidden() default false; /** - * The validation class to use. + * Validate the parameter found on the command line. */ Class<? extends IParameterValidator> validateWith() default NoValidator.class; /** + * Validate the value for this parameter. + */ + Class<? extends IValueValidator> validateValueWith() default NoValueValidator.class; + + /** * @return true if this parameter has a variable arity. See @{IVariableArity} */ boolean variableArity() default false; @@ -106,4 +112,5 @@ public @interface Parameter { * Used in conjunction with password = true */ boolean echoInput() default false; + } diff --git a/src/main/java/com/beust/jcommander/ParameterDescription.java b/src/main/java/com/beust/jcommander/ParameterDescription.java index 832a25b..9299e59 100644 --- a/src/main/java/com/beust/jcommander/ParameterDescription.java +++ b/src/main/java/com/beust/jcommander/ParameterDescription.java @@ -19,6 +19,7 @@ package com.beust.jcommander; import com.beust.jcommander.validators.NoValidator; +import com.beust.jcommander.validators.NoValueValidator; import java.lang.reflect.Field; import java.util.ArrayList; @@ -159,7 +160,7 @@ public class ParameterDescription { private void validateDefaultValues(String[] names) { String name = names.length > 0 ? names[0] : ""; - validateParameter(name, m_default.toString()); + validateValueParameter(name, m_default); } public String getLongestName() { @@ -241,6 +242,7 @@ public class ParameterDescription { Class<?> type = m_field.getType(); Object convertedValue = m_jCommander.convertValue(this, value); + validateValueParameter(name, convertedValue); boolean isCollection = Collection.class.isAssignableFrom(type); try { @@ -275,6 +277,27 @@ public class ParameterDescription { } } + private void validateValueParameter(String name, Object value) { + Class<? extends IValueValidator> validator = m_wrappedParameter.validateValueWith(); + if (validator != null) { + validateValueParameter(validator, name, value); + } + } + + public static void validateValueParameter(Class<? extends IValueValidator> validator, + String name, Object value) { + try { + if (validator != NoValueValidator.class) { + p("Validating value parameter:" + name + " value:" + value + " validator:" + validator); + } + validator.newInstance().validate(name, value); + } catch (InstantiationException e) { + throw new ParameterException("Can't instantiate validator:" + e); + } catch (IllegalAccessException e) { + throw new ParameterException("Can't instantiate validator:" + e); + } + } + public static void validateParameter(Class<? extends IParameterValidator> validator, String name, String value) { try { diff --git a/src/main/java/com/beust/jcommander/WrappedParameter.java b/src/main/java/com/beust/jcommander/WrappedParameter.java index 991f132..d49205d 100644 --- a/src/main/java/com/beust/jcommander/WrappedParameter.java +++ b/src/main/java/com/beust/jcommander/WrappedParameter.java @@ -46,7 +46,13 @@ public class WrappedParameter { public Class<? extends IParameterValidator> validateWith() { return m_parameter != null ? m_parameter.validateWith() : m_dynamicParameter.validateWith(); } - + + public Class<? extends IValueValidator> validateValueWith() { + return m_parameter != null + ? m_parameter.validateValueWith() + : m_dynamicParameter.validateValueWith(); + } + public boolean echoInput() { return m_parameter != null ? m_parameter.echoInput() : false; } @@ -92,4 +98,5 @@ public class WrappedParameter { public String getAssignment() { return m_dynamicParameter != null ? m_dynamicParameter.assignment() : ""; } + } diff --git a/src/main/java/com/beust/jcommander/validators/NoValueValidator.java b/src/main/java/com/beust/jcommander/validators/NoValueValidator.java new file mode 100644 index 0000000..21fa820 --- /dev/null +++ b/src/main/java/com/beust/jcommander/validators/NoValueValidator.java @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2011 the original author or authors. + * See the notice.md file distributed with this work for additional + * information regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.beust.jcommander.validators; + +import com.beust.jcommander.IValueValidator; +import com.beust.jcommander.ParameterException; + +/** + * This is the default value of the validateValueWith attribute. + * + * @author Cedric Beust <cedric@beust.com> + */ +public class NoValueValidator<T> implements IValueValidator<T> { + + public void validate(String parameterName, T parameterValue) + throws ParameterException { + } + +} diff --git a/src/test/java/com/beust/jcommander/ArgsValidate2.java b/src/test/java/com/beust/jcommander/ArgsValidate2.java index f45f5df..2b8f07b 100644 --- a/src/test/java/com/beust/jcommander/ArgsValidate2.java +++ b/src/test/java/com/beust/jcommander/ArgsValidate2.java @@ -5,20 +5,20 @@ import com.beust.jcommander.converters.FileConverter; import java.io.File; public class ArgsValidate2 { - public static class FailingValidator implements IParameterValidator { + public static class FailingValidator implements IValueValidator<File> { - public void validate(String name, String value) throws ParameterException { + public void validate(String name, File value) throws ParameterException { throw new ParameterException("Validation will always fail:" + name + " " + value); } } - public static final String POSSIBLE_TEMPLATE_FILE = "mayOrMayNotExist.tempalate"; + public static final String POSSIBLE_TEMPLATE_FILE = "mayOrMayNotExist.template"; @Parameter(names = { "-template"}, description = "The default file may or may not exist", converter = FileConverter.class, - validateWith = FailingValidator.class + validateValueWith = FailingValidator.class ) public File template = new File(POSSIBLE_TEMPLATE_FILE); } |