You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2013/03/16 16:14:04 UTC

svn commit: r1457262 - in /struts/struts2/trunk/xwork-core/src: main/java/com/opensymphony/xwork2/validator/ main/java/com/opensymphony/xwork2/validator/annotations/ test/java/com/opensymphony/xwork2/validator/

Author: lukaszlenart
Date: Sat Mar 16 15:14:04 2013
New Revision: 1457262

URL: http://svn.apache.org/r1457262
Log:
WW-4000 Improves ConditionalVisitorFieldValidator annotation to match validator class ConditionalVisitorFieldValidator

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/ConditionalVisitorFieldValidator.java
    struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/RegexFieldValidator.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=1457262&r1=1457261&r2=1457262&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 Sat Mar 16 15:14:04 2013
@@ -451,6 +451,7 @@ public class AnnotationValidationConfigu
             .shortCircuit(v.shortCircuit())
             .defaultMessage(v.message())
             .messageKey(v.key())
+            .messageParams(v.messageParams())
             .build();
     }
 
@@ -476,6 +477,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/ConditionalVisitorFieldValidator.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/ConditionalVisitorFieldValidator.java?rev=1457262&r1=1457261&r2=1457262&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/ConditionalVisitorFieldValidator.java (original)
+++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/ConditionalVisitorFieldValidator.java Sat Mar 16 15:14:04 2013
@@ -52,6 +52,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>
@@ -67,7 +73,7 @@ import java.lang.annotation.Target;
  * <td class='confluenceTd'> context </td>
  * <td class='confluenceTd'> no </td>
  * <td class='confluenceTd'> action alias </td>
- * <td class='confluenceTd'> Determines the context to use for validating the Object property. If not defined, the context of the Action validation is propogated to the Object property validation.  In the case of Action validation, this context is the Action alias.  </td>
+ * <td class='confluenceTd'> Determines the context to use for validating the Object property. If not defined, the context of the Action validation is propagated to the Object property validation.  In the case of Action validation, this context is the Action alias.  </td>
  * </tr>
  * <tr>
  * <td class='confluenceTd'> appendPrefix </td>
@@ -130,6 +136,11 @@ public @interface ConditionalVisitorFiel
     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/annotations/RegexFieldValidator.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/RegexFieldValidator.java?rev=1457262&r1=1457261&r2=1457262&view=diff
==============================================================================
--- struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/RegexFieldValidator.java (original)
+++ struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/RegexFieldValidator.java Sat Mar 16 15:14:04 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>
@@ -103,6 +109,11 @@ public @interface RegexFieldValidator {
     String message() default "";
 
     /**
+     * Additional params to be used to customize message - will be evaluated against the Value Stack
+     */
+    String[] messageParams() default {};
+
+    /**
      * The message key to lookup for i18n.
      */
     String key() default "";
@@ -112,17 +123,47 @@ public @interface RegexFieldValidator {
      */
     String fieldName() default "";
 
-
+    /**
+     * Regex used to evaluate field against it
+     *
+     * @return String regular expression
+     */
     String regex() default "";
 
+    /**
+     * Defines regex as an expression which first will be evaluated against the Value Stack to get proper regex.
+     * Thus allow to dynamically change regex base on user actions.
+     *
+     * @return String an expression which starts with '$' or '%'
+     */
     String regexExpression() default "";
 
+    /**
+     * To trim or not the value, default true - trim
+     *
+     * @return boolean trim or not the value before validation
+     */
     boolean trim() default true;
 
+    /**
+     * Allows specify trim as an expression which will be evaluated during validation
+     *
+     * @return String an expression which starts with '$' or '%'
+     */
     String trimExpression() default "";
 
+    /**
+     * Match the value in case sensitive manner, default true
+     *
+     * @return boolean use case sensitive match or not
+     */
     boolean caseSensitive() default true;
 
+    /**
+     * Allows specify caseSensitive as an expression which will be evaluated during validation
+     *
+     * @return boolean use case sensitive match or not
+     */
     String caseSensitiveExpression() default "";
 
     /**
@@ -137,4 +178,5 @@ public @interface RegexFieldValidator {
      * The validation type for this field/method.
      */
     ValidatorType type() default ValidatorType.FIELD;
+
 }

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=1457262&r1=1457261&r2=1457262&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 Sat Mar 16 15:14:04 2013
@@ -1,20 +1,20 @@
 package com.opensymphony.xwork2.validator;
 
 import com.opensymphony.xwork2.ActionSupport;
+import com.opensymphony.xwork2.validator.annotations.ConditionalVisitorFieldValidator;
 import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;
-import com.opensymphony.xwork2.validator.annotations.Validations;
 
 /**
  * Sets up all available validation annotations
  */
 public class AnnotationValidationAction extends ActionSupport {
 
-    @Validations(
-            regexFields = {
-                    @RegexFieldValidator(regex = "foo", message = "Foo doesn't match!", key = "regex.key",
-                            fieldName = "bar", shortCircuit = true, trim = false, caseSensitive = false),
-            }
-    )
+    @RegexFieldValidator(regex = "foo", message = "Foo doesn't match!", key = "regex.key",
+            fieldName = "bar", shortCircuit = true, trim = false, caseSensitive = false,
+            messageParams = {"one", "two", "three"})
+    @ConditionalVisitorFieldValidator(expression = "foo+bar", context = "some", appendPrefix = false, fieldName = "bar",
+            key = "conditional.key", message = "Foo doesn't match!", 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=1457262&r1=1457261&r2=1457262&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 Sat Mar 16 15:14:04 2013
@@ -14,8 +14,10 @@ import com.opensymphony.xwork2.inject.Co
 import com.opensymphony.xwork2.util.ValueStack;
 import com.opensymphony.xwork2.util.ValueStackFactory;
 import com.opensymphony.xwork2.util.location.LocatableProperties;
+import com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator;
 import com.opensymphony.xwork2.validator.validators.RegexFieldValidator;
 
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -23,7 +25,7 @@ import java.util.Map;
 /**
  * Simple test to check if validation Annotations match given validator class
  */
-public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase{
+public class AnnotationValidationConfigurationBuilderTest extends XWorkTestCase {
 
     public void testValidationAnnotation() throws Exception {
         // given
@@ -33,11 +35,9 @@ public class AnnotationValidationConfigu
         List<Validator> validators = manager.getValidators(AnnotationValidationAction.class, null);
 
         // then
-        assertEquals(validators.size(), 1);
+        assertEquals(validators.size(), 2);
         for (Validator validator : validators) {
-            if (validator.getValidatorType().equals("regex")) {
-                validateRegexValidator((RegexFieldValidator) validator);
-            }
+            validate(validator);
         }
     }
 
@@ -52,15 +52,30 @@ public class AnnotationValidationConfigu
         ValueStack valueStack = container.getInstance(ValueStackFactory.class).createValueStack();
         valueStack.push(new AnnotationValidationExpAction());
 
-        assertEquals(validators.size(), 1);
+        assertEquals(validators.size(), 2);
         for (Validator validator : validators) {
-            if (validator.getValidatorType().equals("regex")) {
-                validator.setValueStack(valueStack);
-                validateRegexValidator((RegexFieldValidator) validator);
-            }
+            validator.setValueStack(valueStack);
+            validate(validator);
+        }
+    }
+
+    private void validate(Validator validator) {
+        if (validator.getValidatorType().equals("regex")) {
+            validateRegexValidator((RegexFieldValidator) validator);
+        } else if (validator.getValidatorType().equals("conditionalvisitor")) {
+            validateConditionalFieldVisitorValidator((ConditionalVisitorFieldValidator) validator);
         }
     }
 
+    private void validateConditionalFieldVisitorValidator(ConditionalVisitorFieldValidator validator) {
+        assertEquals("foo+bar", validator.getExpression());
+        assertEquals("some", validator.getContext());
+        assertEquals("Foo doesn't match!", validator.getDefaultMessage());
+        assertEquals("bar", validator.getFieldName());
+        assertEquals("conditional.key", validator.getMessageKey());
+        assertTrue(Arrays.equals(new String[]{"one", "two", "three"}, validator.getMessageParameters()));
+    }
+
     private void validateRegexValidator(RegexFieldValidator validator) {
         assertEquals("foo", validator.getRegex());
         assertEquals("Foo doesn't match!", validator.getDefaultMessage());
@@ -69,6 +84,7 @@ public class AnnotationValidationConfigu
         assertEquals(true, validator.isShortCircuit());
         assertEquals(false, validator.isTrimed());
         assertEquals(false, validator.isCaseSensitive());
+        assertTrue(Arrays.equals(new String[]{"one", "two", "three"}, validator.getMessageParameters()));
     }
 
     private AnnotationActionValidatorManager createValidationManager(final Class<? extends ActionSupport> actionClass) throws Exception {

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=1457262&r1=1457261&r2=1457262&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 Sat Mar 16 15:14:04 2013
@@ -1,20 +1,20 @@
 package com.opensymphony.xwork2.validator;
 
 import com.opensymphony.xwork2.ActionSupport;
+import com.opensymphony.xwork2.validator.annotations.ConditionalVisitorFieldValidator;
 import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;
-import com.opensymphony.xwork2.validator.annotations.Validations;
 
 /**
  * Sets up all available validation annotations with params as expressions
  */
 public class AnnotationValidationExpAction extends ActionSupport {
 
-    @Validations(
-            regexFields = {
-                    @RegexFieldValidator(regexExpression = "${foo}", message = "Foo doesn't match!", key = "regex.key",
-                            fieldName = "bar", shortCircuit = true, trimExpression = "${trim}", caseSensitiveExpression = "${caseSensitive}"),
-            }
-    )
+    @RegexFieldValidator(regexExpression = "${foo}", message = "Foo doesn't match!", key = "regex.key",
+            fieldName = "bar", shortCircuit = true, trimExpression = "${trim}", caseSensitiveExpression = "${caseSensitive}",
+            messageParams = {"one", "two", "three"})
+    @ConditionalVisitorFieldValidator(expression = "foo+bar", context = "some", appendPrefix = false, fieldName = "bar",
+            key = "conditional.key", message = "Foo doesn't match!", shortCircuit = true,
+            messageParams = {"one", "two", "three"})
     public String execute() {
         return SUCCESS;
     }