From 7e61564f82df628cc2d746c7f62e0c006fd0d491 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Sun, 17 Mar 2013 13:25:41 +0000 Subject: [PATCH] WW-4002 Improves CustomValidator annotation git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@1457442 13f79535-47bb-0310-9956-ffa450edef68 --- ...otationValidationConfigurationBuilder.java | 1 + .../annotations/CustomValidator.java | 15 ++- .../validator/AnnotationValidationAction.java | 8 ++ ...ionValidationConfigurationBuilderTest.java | 18 +++- .../AnnotationValidationExpAction.java | 8 ++ .../xwork2/validator/MyValidator.java | 96 +++++++++++++++++++ 6 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 xwork-core/src/test/java/com/opensymphony/xwork2/validator/MyValidator.java diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java index f62998fdd..d26e5b410 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java @@ -423,6 +423,7 @@ public class AnnotationValidationConfigurationBuilder { .shortCircuit(v.shortCircuit()) .defaultMessage(v.message()) .messageKey(v.key()) + .messageParams(v.messageParams()) .build(); } diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/CustomValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/CustomValidator.java index 240a2d92a..27d63b241 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/CustomValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/CustomValidator.java @@ -55,6 +55,12 @@ import java.lang.annotation.Target; * i18n key from language specific properties file. * * + * messageParams + * no + *   + * Additional params to be used to customize message - will be evaluated against the Value Stack + * + * * fieldName * no *   @@ -69,8 +75,8 @@ import java.lang.annotation.Target; * * type * yes - * ValidatorType.FIELD - * Enum value from ValidatorType. Either FIELD or SIMPLE can be used here. + * name of validator + * Simple string which identifies that validator among other * * * @@ -106,6 +112,11 @@ public @interface CustomValidator { String key() default ""; + /** + * Additional params to be used to customize message - will be evaluated against the Value Stack + */ + String[] messageParams() default {}; + public ValidationParameter[] parameters() default {}; boolean shortCircuit() default false; diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java index f2cbc49a8..62608fe63 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java @@ -3,7 +3,9 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.validator.annotations.ConditionalVisitorFieldValidator; import com.opensymphony.xwork2.validator.annotations.ConversionErrorFieldValidator; +import com.opensymphony.xwork2.validator.annotations.CustomValidator; import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator; +import com.opensymphony.xwork2.validator.annotations.ValidationParameter; /** * Sets up all available validation annotations @@ -18,6 +20,12 @@ public class AnnotationValidationAction extends ActionSupport { messageParams = {"one", "two", "three"}) @ConversionErrorFieldValidator(fieldName = "bar", key = "conversion.key", message = "Foo conversion error!", shortCircuit = true, repopulateField = true, messageParams = {"one", "three"}) + @CustomValidator(type = "myValidator", fieldName = "foo", key = "foo.invalid", message = "Foo is invalid!", + shortCircuit = true, messageParams = {"one", "two", "three"}, + parameters = { + @ValidationParameter(name = "value", value = "1") + } + ) public String execute() { return SUCCESS; } diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java index d82f23a6d..e957d2106 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java @@ -36,7 +36,7 @@ public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase List validators = manager.getValidators(AnnotationValidationAction.class, null); // then - assertEquals(validators.size(), 3); + assertEquals(validators.size(), 4); for (Validator validator : validators) { validate(validator); } @@ -53,7 +53,7 @@ public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase ValueStack valueStack = container.getInstance(ValueStackFactory.class).createValueStack(); valueStack.push(new AnnotationValidationExpAction()); - assertEquals(validators.size(), 3); + assertEquals(validators.size(), 4); for (Validator validator : validators) { validator.setValueStack(valueStack); validate(validator); @@ -67,9 +67,20 @@ public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase validateConditionalFieldVisitorValidator((ConditionalVisitorFieldValidator) validator); } else if (validator.getValidatorType().equals("conversion")) { validateConversionFieldErrorVisitorValidator((ConversionErrorFieldValidator) validator); + } else if (validator.getValidatorType().equals("myValidator")) { + validateMyValidator((MyValidator) validator); } } + private void validateMyValidator(MyValidator validator) { + assertEquals("Foo is invalid!", validator.getDefaultMessage()); + assertEquals("foo", validator.getFieldName()); + assertEquals("foo.invalid", validator.getMessageKey()); + assertTrue(Arrays.equals(new String[]{"one", "two", "three"}, validator.getMessageParameters())); + assertEquals(true, validator.isShortCircuit()); + assertEquals(1, validator.getValue()); + } + private void validateConversionFieldErrorVisitorValidator(ConversionErrorFieldValidator validator) { assertEquals("bar", validator.getFieldName()); assertEquals("conversion.key", validator.getMessageKey()); @@ -134,6 +145,9 @@ public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase AnnotationActionValidatorManager manager = new AnnotationActionValidatorManager(); container.inject(manager); + ValidatorFactory vf = container.getInstance(ValidatorFactory.class); + vf.registerValidator("myValidator", MyValidator.class.getName()); + return manager; } diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java index 5da04420c..c18a7f91d 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java @@ -3,7 +3,9 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.validator.annotations.ConditionalVisitorFieldValidator; import com.opensymphony.xwork2.validator.annotations.ConversionErrorFieldValidator; +import com.opensymphony.xwork2.validator.annotations.CustomValidator; import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator; +import com.opensymphony.xwork2.validator.annotations.ValidationParameter; /** * Sets up all available validation annotations with params as expressions @@ -18,6 +20,12 @@ public class AnnotationValidationExpAction extends ActionSupport { messageParams = {"one", "two", "three"}) @ConversionErrorFieldValidator(fieldName = "bar", key = "conversion.key", message = "Foo conversion error!", shortCircuit = true, repopulateField = true, messageParams = {"one", "three"}) + @CustomValidator(type = "myValidator", fieldName = "foo", key = "foo.invalid", message = "Foo is invalid!", + shortCircuit = true, messageParams = {"one", "two", "three"}, + parameters = { + @ValidationParameter(name = "value", value = "1") + } + ) public String execute() { return SUCCESS; } diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/validator/MyValidator.java b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/MyValidator.java new file mode 100644 index 000000000..82f1f2b00 --- /dev/null +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/validator/MyValidator.java @@ -0,0 +1,96 @@ +package com.opensymphony.xwork2.validator; + +import com.opensymphony.xwork2.util.ValueStack; + +/** + * TODO lukaszlenart: write a JavaDoc + */ +public class MyValidator implements FieldValidator, ShortCircuitableValidator { + + private String message; + private String fieldName; + private String key; + private String[] messageParameters; + private ValidatorContext validatorContext; + private String type; + private ValueStack stack; + private boolean shortcircuit; + + private int value; + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldName() { + return fieldName; + } + + public void setDefaultMessage(String message) { + this.message = message; + } + + public String getDefaultMessage() { + return message; + } + + public String getMessage(Object object) { + return "Message"; + } + + public void setMessageKey(String key) { + this.key = key; + } + + public String getMessageKey() { + return key; + } + + public void setMessageParameters(String[] messageParameters) { + this.messageParameters = messageParameters; + } + + public String[] getMessageParameters() { + return messageParameters; + } + + public void setValidatorContext(ValidatorContext validatorContext) { + this.validatorContext = validatorContext; + } + + public ValidatorContext getValidatorContext() { + return validatorContext; + } + + public void validate(Object object) throws ValidationException { + // pass + } + + public void setValidatorType(String type) { + this.type = type; + } + + public String getValidatorType() { + return type; + } + + public void setValueStack(ValueStack stack) { + this.stack = stack; + } + + public void setShortCircuit(boolean shortcircuit) { + this.shortcircuit = shortcircuit; + } + + public boolean isShortCircuit() { + return shortcircuit; + } +}