summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCedric Beust <cedric@beust.com>2012-06-10 18:47:55 -0700
committerCedric Beust <cedric@beust.com>2012-06-10 18:47:55 -0700
commite903207930001edf324f2623b763df0f75e82a3c (patch)
tree0c8b2832ab2089149181d35009454b6b1f25aff1
parent9c2bd65ecd9779540bfde5a200ff71d1d503839c (diff)
downloadplatform_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
-rw-r--r--CHANGELOG1
-rw-r--r--src/main/java/com/beust/jcommander/DynamicParameter.java3
-rw-r--r--src/main/java/com/beust/jcommander/IValueValidator.java14
-rw-r--r--src/main/java/com/beust/jcommander/Parameter.java9
-rw-r--r--src/main/java/com/beust/jcommander/ParameterDescription.java25
-rw-r--r--src/main/java/com/beust/jcommander/WrappedParameter.java9
-rw-r--r--src/main/java/com/beust/jcommander/validators/NoValueValidator.java35
-rw-r--r--src/test/java/com/beust/jcommander/ArgsValidate2.java8
8 files changed, 97 insertions, 7 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 169a0b3..6af59e7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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);
}