Author: lukaszlenart Date: Sun Mar 17 20:22:18 2013 New Revision: 1457552 URL: http://svn.apache.org/r1457552 Log: WW-4003 Improves DateRangeFieldValidator annotation to match DateRangeFieldValidator class
Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/DateRangeFieldValidator.java struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/AbstractRangeValidator.java struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java?rev=1457552&r1=1457551&r2=1457552&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilder.java Sun Mar 17 20:22:18 2013 @@ -16,6 +16,7 @@ package com.opensymphony.xwork2.validator; import com.opensymphony.xwork2.validator.annotations.*; +import org.apache.commons.lang3.StringUtils; import java.lang.annotation.Annotation; import java.lang.reflect.Method; @@ -559,12 +560,16 @@ public class AnnotationValidationConfigu .build(); } - private Date parseDateString(String value) { + private Date parseDateString(String value, String format) { + SimpleDateFormat d0 = null; + if (StringUtils.isNotEmpty(format)) { + d0 = new SimpleDateFormat(format); + } SimpleDateFormat d1 = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG, Locale.getDefault()); SimpleDateFormat d2 = (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM, Locale.getDefault()); SimpleDateFormat d3 = (SimpleDateFormat)DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault()); - SimpleDateFormat[] dfs = {d1, d2, d3}; + SimpleDateFormat[] dfs = (d0 != null ? new SimpleDateFormat[]{d0, d1, d2, d3} : new SimpleDateFormat[]{d1, d2, d3}); for (SimpleDateFormat df : dfs) try { Date check = df.parse(value); @@ -574,7 +579,6 @@ public class AnnotationValidationConfigu } catch (ParseException ignore) { } return null; - } private ValidatorConfig processRequiredStringValidatorAnnotation(RequiredStringValidator v, String fieldName, String methodName) { @@ -767,12 +771,19 @@ public class AnnotationValidationConfigu params.put("fieldName", v.fieldName()); } if ( v.min() != null && v.min().length() > 0) { - final Date minDate = parseDateString(v.min()); - params.put("min", String.valueOf(minDate == null ? v.min() : minDate)); + final Date minDate = parseDateString(v.min(), v.dateFormat()); + params.put("min", minDate == null ? v.min() : minDate); } if ( v.max() != null && v.max().length() > 0) { - final Date maxDate = parseDateString(v.max()); - params.put("max", String.valueOf(maxDate == null ? v.max() : maxDate)); + final Date maxDate = parseDateString(v.max(), v.dateFormat()); + params.put("max", maxDate == null ? v.max() : maxDate); + } + + if (StringUtils.isNotEmpty(v.minExpression())) { + params.put("minExpression", v.minExpression()); + } + if (StringUtils.isNotEmpty(v.maxExpression())) { + params.put("maxExpression", v.maxExpression()); } validatorFactory.lookupRegisteredValidatorType(validatorType); @@ -782,6 +793,7 @@ public class AnnotationValidationConfigu .shortCircuit(v.shortCircuit()) .defaultMessage(v.message()) .messageKey(v.key()) + .messageParams(v.messageParams()) .build(); } Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/DateRangeFieldValidator.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/DateRangeFieldValidator.java?rev=1457552&r1=1457551&r2=1457552&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/DateRangeFieldValidator.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/DateRangeFieldValidator.java Sun Mar 17 20:22:18 2013 @@ -55,6 +55,12 @@ import java.lang.annotation.Target; * <td class='confluenceTd'>i18n key from language specific properties file.</td> * </tr> * <tr> + * <td class='confluenceTd'>messageParams</td> + * <td class='confluenceTd'>no</td> + * <td class='confluenceTd'> </td> + * <td class='confluenceTd'>Additional params to be used to customize message - will be evaluated against the Value Stack</td> + * </tr> + * <tr> * <td class='confluenceTd'>fieldName</td> * <td class='confluenceTd'>no</td> * <td class='confluenceTd'> </td> @@ -110,11 +116,26 @@ public @interface DateRangeFieldValidato String min() default ""; /** + * An expression which will be evaluated against the Value Stack to get the min value + */ + String minExpression() default ""; + + /** * Date property. The maximum date can be. */ String max() default ""; /** + * An expression which will be evaluated against the Value Stack to get the max value + */ + String maxExpression() default ""; + + /** + * Date format used to parse min and mac value + */ + String dateFormat() default ""; + + /** * The default error message for this validator. * NOTE: It is required to set a message, if you are not using the message key for 18n lookup! */ @@ -126,6 +147,11 @@ public @interface DateRangeFieldValidato String key() default ""; /** + * Additional params to be used to customize message - will be evaluated against the Value Stack + */ + String[] messageParams() default {}; + + /** * The optional fieldName for SIMPLE validator types. */ String fieldName() default ""; Modified: struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/AbstractRangeValidator.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/AbstractRangeValidator.java?rev=1457552&r1=1457551&r2=1457552&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/AbstractRangeValidator.java (original) +++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/AbstractRangeValidator.java Sun Mar 17 20:22:18 2013 @@ -18,6 +18,7 @@ package com.opensymphony.xwork2.validato import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; import com.opensymphony.xwork2.validator.ValidationException; +import org.apache.commons.lang3.StringUtils; /** @@ -33,7 +34,9 @@ public abstract class AbstractRangeValid private final Class<T> type; private T min; + private String minExpression; private T max; + private String maxExpression; protected AbstractRangeValidator(Class<T> type) { this.type = type; @@ -67,14 +70,20 @@ public abstract class AbstractRangeValid } public T getMin() { - return min; + if (min != null) { + return min; + } else if (StringUtils.isNotEmpty(minExpression)) { + return (T) parse(minExpression, type); + } else { + return null; + } } public void setMinExpression(String minExpression) { if (LOG.isDebugEnabled()) { LOG.debug("${minExpression} was defined as [#0]", minExpression); } - this.min = (T) parse(minExpression, type); + this.minExpression = minExpression; } public void setMax(T max) { @@ -82,14 +91,20 @@ public abstract class AbstractRangeValid } public T getMax() { - return max; + if (max != null) { + return max; + } else if (StringUtils.isNotEmpty(maxExpression)) { + return (T) parse(maxExpression, type); + } else { + return null; + } } public void setMaxExpression(String maxExpression) { if (LOG.isDebugEnabled()) { LOG.debug("${maxExpression} was defined as [#0]", maxExpression); } - this.max = (T) parse(maxExpression, type); + this.maxExpression = maxExpression; } } Modified: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java?rev=1457552&r1=1457551&r2=1457552&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java (original) +++ struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java Sun Mar 17 20:22:18 2013 @@ -4,6 +4,7 @@ import com.opensymphony.xwork2.ActionSup 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.DateRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator; import com.opensymphony.xwork2.validator.annotations.ValidationParameter; @@ -26,6 +27,8 @@ public class AnnotationValidationAction @ValidationParameter(name = "value", value = "1") } ) + @DateRangeFieldValidator(fieldName = "foo", key = "date.foo", max = "2012", min = "2011", dateFormat = "yyyy", + message = "Foo isn't in range!", shortCircuit = true, messageParams = {"one", "two", "three"}) public String execute() { return SUCCESS; } Modified: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java?rev=1457552&r1=1457551&r2=1457552&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java (original) +++ struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java Sun Mar 17 20:22:18 2013 @@ -16,8 +16,11 @@ import com.opensymphony.xwork2.util.Valu import com.opensymphony.xwork2.util.location.LocatableProperties; import com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator; import com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator; +import com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator; import com.opensymphony.xwork2.validator.validators.RegexFieldValidator; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -36,7 +39,7 @@ public class AnnotationValidationConfigu List<Validator> validators = manager.getValidators(AnnotationValidationAction.class, null); // then - assertEquals(validators.size(), 4); + assertEquals(validators.size(), 5); for (Validator validator : validators) { validate(validator); } @@ -53,14 +56,14 @@ public class AnnotationValidationConfigu ValueStack valueStack = container.getInstance(ValueStackFactory.class).createValueStack(); valueStack.push(new AnnotationValidationExpAction()); - assertEquals(validators.size(), 4); + assertEquals(validators.size(), 5); for (Validator validator : validators) { validator.setValueStack(valueStack); validate(validator); } } - private void validate(Validator validator) { + private void validate(Validator validator) throws Exception { if (validator.getValidatorType().equals("regex")) { validateRegexValidator((RegexFieldValidator) validator); } else if (validator.getValidatorType().equals("conditionalvisitor")) { @@ -69,9 +72,21 @@ public class AnnotationValidationConfigu validateConversionFieldErrorVisitorValidator((ConversionErrorFieldValidator) validator); } else if (validator.getValidatorType().equals("myValidator")) { validateMyValidator((MyValidator) validator); + } else if (validator.getValidatorType().equals("date")) { + validateDateRangeFieldValidator((DateRangeFieldValidator) validator); } } + private void validateDateRangeFieldValidator(DateRangeFieldValidator validator) throws ParseException { + assertEquals("foo", validator.getFieldName()); + assertEquals("Foo isn't in range!", validator.getDefaultMessage()); + assertEquals("date.foo", validator.getMessageKey()); + assertEquals(true, validator.isShortCircuit()); + assertTrue(Arrays.equals(new String[]{"one", "two", "three"}, validator.getMessageParameters())); + assertEquals(new SimpleDateFormat("yyyy").parse("2011"), validator.getMin()); + assertEquals(new SimpleDateFormat("yyyy").parse("2012"), validator.getMax()); + } + private void validateMyValidator(MyValidator validator) { assertEquals("Foo is invalid!", validator.getDefaultMessage()); assertEquals("foo", validator.getFieldName()); Modified: struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java?rev=1457552&r1=1457551&r2=1457552&view=diff ============================================================================== --- struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java (original) +++ struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java Sun Mar 17 20:22:18 2013 @@ -4,9 +4,14 @@ import com.opensymphony.xwork2.ActionSup 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.DateRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator; import com.opensymphony.xwork2.validator.annotations.ValidationParameter; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + /** * Sets up all available validation annotations with params as expressions */ @@ -26,6 +31,8 @@ public class AnnotationValidationExpActi @ValidationParameter(name = "value", value = "1") } ) + @DateRangeFieldValidator(fieldName = "foo", key = "date.foo", maxExpression = "${dateMax}", minExpression = "${dateMin}", dateFormat = "yyyy", + message = "Foo isn't in range!", shortCircuit = true, messageParams = {"one", "two", "three"}) public String execute() { return SUCCESS; } @@ -42,4 +49,12 @@ public class AnnotationValidationExpActi return false; } + public Date getDateMin() throws ParseException { + return new SimpleDateFormat("yyyy").parse("2011"); + } + + public Date getDateMax() throws ParseException { + return new SimpleDateFormat("yyyy").parse("2012"); + } + }