diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java b/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java index b587bf3d0..b2764cade 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java @@ -122,6 +122,14 @@ public class AnnotationValidationConfigurationBuilder { result.add(temp); } } + // Process CrediCardValidator + else if (a instanceof CreditCardValidator) { + CreditCardValidator v = (CreditCardValidator) a; + ValidatorConfig temp = processCreditCardValidatorAnnotation(v, fieldName, methodName); + if (temp != null) { + result.add(temp); + } + } // Process FieldExpressionValidator else if (a instanceof FieldExpressionValidator) { FieldExpressionValidator v = (FieldExpressionValidator) a; @@ -263,6 +271,15 @@ public class AnnotationValidationConfigurationBuilder { } } } + CreditCardValidator[] ccv = validations.creditCards(); + if (ccv != null) { + for (CreditCardValidator v : ccv) { + ValidatorConfig temp = processCreditCardValidatorAnnotation(v, fieldName, methodName); + if (temp != null) { + result.add(temp); + } + } + } FieldExpressionValidator[] fev = validations.fieldExpressions(); if (fev != null) { for (FieldExpressionValidator v : fev) { @@ -786,6 +803,28 @@ public class AnnotationValidationConfigurationBuilder { .build(); } + private ValidatorConfig processCreditCardValidatorAnnotation(CreditCardValidator v, String fieldName, String methodName) { + String validatorType = "creditcard"; + + Map params = new HashMap<>(); + + if (fieldName != null) { + params.put("fieldName", fieldName); + } else if (StringUtils.isNotEmpty(v.fieldName())) { + params.put("fieldName", v.fieldName()); + } + + validatorFactory.lookupRegisteredValidatorType(validatorType); + return new ValidatorConfig.Builder(validatorType) + .addParams(params) + .addParam("methodName", methodName) + .shortCircuit(v.shortCircuit()) + .defaultMessage(v.message()) + .messageKey(v.key()) + .messageParams(v.messageParams()) + .build(); + } + private ValidatorConfig processDateRangeFieldValidatorAnnotation(DateRangeFieldValidator v, String fieldName, String methodName) { String validatorType = "date"; diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/annotations/Validations.java b/core/src/main/java/com/opensymphony/xwork2/validator/annotations/Validations.java index b4b640b71..bdf5a75dc 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/annotations/Validations.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/annotations/Validations.java @@ -167,6 +167,8 @@ public @interface Validations { EmailValidator[] emails() default {}; + CreditCardValidator[] creditCards() default {}; + FieldExpressionValidator[] fieldExpressions() default {}; IntRangeFieldValidator[] intRangeFields() default {}; diff --git a/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java b/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java index eff835cf1..f6e9748f9 100644 --- a/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java +++ b/core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java @@ -148,9 +148,14 @@ public class RegexFieldValidator extends FieldValidatorSupport { compare = compare.trim(); } - Matcher matcher = pattern.matcher(compare); - if (!matcher.matches()) { - addFieldError(fieldName, object); + try { + setCurrentValue(compare); + Matcher matcher = pattern.matcher(compare); + if (!matcher.matches()) { + addFieldError(fieldName, object); + } + } finally { + setCurrentValue(null); } } diff --git a/core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java b/core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java index 6dbb429d9..9e95ddee0 100644 --- a/core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java +++ b/core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java @@ -3,6 +3,7 @@ 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.CreditCardValidator; import com.opensymphony.xwork2.validator.annotations.CustomValidator; import com.opensymphony.xwork2.validator.annotations.DateRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.DoubleRangeFieldValidator; @@ -45,6 +46,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) + @CreditCardValidator(message = "Foo isn't a valid credit card!", fieldName = "foo", key = "creditCard.key", + messageParams = {"one", "two", "three"}, shortCircuit = true) @ExpressionValidator(expression = "true", message = "Is not true!", key = "expression.key", messageParams = {"one", "two", "three"}, shortCircuit = true) @FieldExpressionValidator(expression = "true", fieldName = "foo", key = "fieldexpression.key", message = "It is not true!", diff --git a/core/src/test/resources/validators.xml b/core/src/test/resources/validators.xml index 48369fa5d..5eff925d9 100644 --- a/core/src/test/resources/validators.xml +++ b/core/src/test/resources/validators.xml @@ -11,6 +11,7 @@ +