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 6e0449d15..3cd54835e 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 @@ -392,8 +392,8 @@ public class AnnotationValidationConfigurationBuilder { .shortCircuit(v.shortCircuit()) .defaultMessage(v.message()) .messageKey(v.key()) + .messageParams(v.messageParams()) .build(); - } private ValidatorConfig processCustomValidatorAnnotation(CustomValidator v, String fieldName, String methodName) { diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/ExpressionValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/ExpressionValidator.java index 52768462e..804938817 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/ExpressionValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/ExpressionValidator.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 + * + * * shortCircuit * no * false @@ -101,6 +107,11 @@ public @interface ExpressionValidator { */ String key() default ""; + /** + * Additional params to be used to customize message - will be evaluated against the Value Stack + */ + String[] messageParams() default {}; + /** * If this is activated, the validator will be used as short-circuit. * diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ExpressionValidator.java b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ExpressionValidator.java index 1ea3b0ac8..15a5858c3 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ExpressionValidator.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ExpressionValidator.java @@ -17,7 +17,6 @@ package com.opensymphony.xwork2.validator.validators; import com.opensymphony.xwork2.validator.ValidationException; - /** * * A Non-Field Level validator that validates based on regular expression supplied. @@ -44,12 +43,10 @@ import com.opensymphony.xwork2.validator.ValidationException; * * @author Jason Carreira */ -// START SNIPPET: global-level-validator public class ExpressionValidator extends ValidatorSupport { private String expression; - public void setExpression(String expression) { this.expression = expression; } @@ -73,14 +70,14 @@ public class ExpressionValidator extends ValidatorSupport { if ((obj != null) && (obj instanceof Boolean)) { answer = (Boolean) obj; } else { - log.warn("Got result of " + obj + " when trying to get Boolean."); + log.warn("Got result of [#0] when trying to get Boolean.", obj); } - if (!answer.booleanValue()) { - if (log.isDebugEnabled()) log.debug("Validation failed on expression " + expression + " with validated object "+ object); + if (!answer) { + if (log.isDebugEnabled()) { + log.debug("Validation failed on expression [#0] with validated object [#1]", expression, object); + } addActionError(object); } } } -// END SNIPPET: global-level-validator - 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 afc9eee9c..a68328d1b 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 @@ -7,6 +7,7 @@ import com.opensymphony.xwork2.validator.annotations.CustomValidator; import com.opensymphony.xwork2.validator.annotations.DateRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.DoubleRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.EmailValidator; +import com.opensymphony.xwork2.validator.annotations.ExpressionValidator; import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator; import com.opensymphony.xwork2.validator.annotations.ValidationParameter; @@ -36,6 +37,8 @@ public class AnnotationValidationAction extends ActionSupport { messageParams = {"one", "two", "three"}) @EmailValidator(message = "Foo isn't a valid e-mail!", fieldName = "foo", key = "email.key", messageParams = {"one", "two", "three"}, shortCircuit = true) + @ExpressionValidator(expression = "true", message = "Is not true!", key = "expression.key", + messageParams = {"one", "two", "three"}, shortCircuit = true) 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 167481b3d..050330445 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 @@ -19,6 +19,7 @@ import com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidato import com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator; import com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator; import com.opensymphony.xwork2.validator.validators.EmailValidator; +import com.opensymphony.xwork2.validator.validators.ExpressionValidator; import com.opensymphony.xwork2.validator.validators.RegexFieldValidator; import java.text.ParseException; @@ -41,7 +42,7 @@ public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase List validators = manager.getValidators(AnnotationValidationAction.class, null); // then - assertEquals(validators.size(), 7); + assertEquals(validators.size(), 8); for (Validator validator : validators) { validate(validator); } @@ -58,7 +59,7 @@ public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase ValueStack valueStack = container.getInstance(ValueStackFactory.class).createValueStack(); valueStack.push(new AnnotationValidationExpAction()); - assertEquals(validators.size(), 7); + assertEquals(validators.size(), 8); for (Validator validator : validators) { validator.setValueStack(valueStack); validate(validator); @@ -80,9 +81,19 @@ public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase validateDoubleRangeFieldValidator((DoubleRangeFieldValidator) validator); } else if (validator.getValidatorType().equals("email")) { validateEmailValidator((EmailValidator) validator); + } else if (validator.getValidatorType().equals("expression")) { + validateExpressionValidator((ExpressionValidator) validator); } } + private void validateExpressionValidator(ExpressionValidator validator) { + assertEquals("expression.key", validator.getMessageKey()); + assertEquals("Is not true!", validator.getDefaultMessage()); + assertEquals("true", validator.getExpression()); + assertEquals(true, validator.isShortCircuit()); + assertTrue(Arrays.equals(new String[]{"one", "two", "three"}, validator.getMessageParameters())); + } + private void validateEmailValidator(EmailValidator validator) { assertEquals("foo", validator.getFieldName()); assertEquals(EmailValidator.EMAIL_ADDRESS_PATTERN, validator.getRegex()); 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 15dd7821f..4fbc92051 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 @@ -7,6 +7,7 @@ import com.opensymphony.xwork2.validator.annotations.CustomValidator; import com.opensymphony.xwork2.validator.annotations.DateRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.DoubleRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.EmailValidator; +import com.opensymphony.xwork2.validator.annotations.ExpressionValidator; import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator; import com.opensymphony.xwork2.validator.annotations.ValidationParameter; @@ -41,6 +42,8 @@ public class AnnotationValidationExpAction extends ActionSupport { messageParams = {"one", "two", "three"}) @EmailValidator(message = "Foo isn't a valid e-mail!", fieldName = "foo", key = "email.key", messageParams = {"one", "two", "three"}, shortCircuit = true) + @ExpressionValidator(expression = "true", message = "Is not true!", key = "expression.key", + messageParams = {"one", "two", "three"}, shortCircuit = true) public String execute() { return SUCCESS; }