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'>&nbsp;</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'>&nbsp;</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");
+    }
+
 }


Reply via email to