Author: lukaszlenart
Date: Fri Mar 15 21:44:43 2013
New Revision: 1457137

URL: http://svn.apache.org/r1457137
Log:
WW-3996 Updates RegexFieldValidator annotation to match implementing class and 
adds test to verify that

Added:
    
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/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlReflectionProvider.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionProvider.java
    
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/DefaultValidatorFileParser.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/ValidatorConfig.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/annotations/RegexFieldValidator.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java
    
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java
    
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/SpringObjectFactoryTest.java
    
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java

Modified: 
struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
 (original)
+++ 
struts/struts2/trunk/plugins/convention/src/test/java/org/apache/struts2/convention/PackageBasedActionConfigBuilderTest.java
 Fri Mar 15 21:44:43 2013
@@ -757,7 +757,7 @@ public class PackageBasedActionConfigBui
                     ((ObjectFactory)obj).setReflectionProvider(new 
OgnlReflectionProvider() {
 
                         @Override
-                        public void setProperties(Map<String, String> 
properties, Object o) {
+                        public void setProperties(Map<String, ?> properties, 
Object o) {
                         }
 
                         public void setProperties(Map<String, String> 
properties, Object o, Map<String, Object> context, boolean 
throwPropertyExceptions) throws ReflectionException {

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ObjectFactory.java
 Fri Mar 15 21:44:43 2013
@@ -250,7 +250,7 @@ public class ObjectFactory implements Se
      * @param params    property name -> value Map to set onto the Validator 
instance
      * @param extraContext a Map of extra context which uses the same keys as 
the {@link com.opensymphony.xwork2.ActionContext}
      */
-    public Validator buildValidator(String className, Map<String, String> 
params, Map<String, Object> extraContext) throws Exception {
+    public Validator buildValidator(String className, Map<String, Object> 
params, Map<String, Object> extraContext) throws Exception {
         Validator validator = (Validator) buildBean(className, null);
         reflectionProvider.setProperties(params, validator);
 

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlReflectionProvider.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlReflectionProvider.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlReflectionProvider.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/OgnlReflectionProvider.java
 Fri Mar 15 21:44:43 2013
@@ -55,7 +55,7 @@ public class OgnlReflectionProvider impl
         
     }
 
-    public void setProperties(Map<String, String> properties, Object o) {
+    public void setProperties(Map<String, ?> properties, Object o) {
         ognlUtil.setProperties(properties, o);
     }
 

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionProvider.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionProvider.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionProvider.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/util/reflection/ReflectionProvider.java
 Fri Mar 15 21:44:43 2013
@@ -43,7 +43,7 @@ public interface ReflectionProvider {
      * @param properties
      * @param o
      */
-    void setProperties(Map<String, String> properties, Object o);
+    void setProperties(Map<String, ?> properties, Object o);
     
     /**
      *  This method returns a PropertyDescriptor for the given class and 
property name using

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=1457137&r1=1457136&r2=1457137&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
 Fri Mar 15 21:44:43 2013
@@ -367,7 +367,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processExpressionValidatorAnnotation(ExpressionValidator v, String fieldName, 
String methodName) {
         String validatorType = "expression";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -388,7 +388,7 @@ public class AnnotationValidationConfigu
 
     private ValidatorConfig processCustomValidatorAnnotation(CustomValidator 
v, String fieldName, String methodName) {
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -429,7 +429,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processRegexFieldValidatorAnnotation(RegexFieldValidator v, String fieldName, 
String methodName) {
         String validatorType = "regex";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -437,12 +437,17 @@ public class AnnotationValidationConfigu
             params.put("fieldName", v.fieldName());
         }
 
-        params.put("expression", v.expression());
+        params.put("regex", v.regex());
+        params.put("regexExpression", v.regexExpression());
 
         validatorFactory.lookupRegisteredValidatorType(validatorType);
         return new ValidatorConfig.Builder(validatorType)
             .addParams(params)
             .addParam("methodName", methodName)
+            .addParam("trim", v.trim())
+            .addParam("trimExpression", v.trimExpression())
+            .addParam("caseSensitive", v.caseSensitive())
+            .addParam("caseSensitiveExpression", v.caseSensitiveExpression())
             .shortCircuit(v.shortCircuit())
             .defaultMessage(v.message())
             .messageKey(v.key())
@@ -452,7 +457,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processConditionalVisitorFieldValidatorAnnotation(ConditionalVisitorFieldValidator
 v, String fieldName, String methodName) {
         String validatorType = "conditionalvisitor";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -480,7 +485,7 @@ public class AnnotationValidationConfigu
 
         String validatorType = "visitor";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -504,7 +509,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig processUrlValidatorAnnotation(UrlValidator v, 
String fieldName, String methodName) {
         String validatorType = "url";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -525,7 +530,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processStringLengthFieldValidatorAnnotation(StringLengthFieldValidator v, 
String fieldName, String methodName) {
         String validatorType = "stringlength";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -572,7 +577,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processRequiredStringValidatorAnnotation(RequiredStringValidator v, String 
fieldName, String methodName) {
         String validatorType = "requiredstring";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -595,7 +600,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processRequiredFieldValidatorAnnotation(RequiredFieldValidator v, String 
fieldName, String methodName) {
         String validatorType = "required";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -616,7 +621,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processIntRangeFieldValidatorAnnotation(IntRangeFieldValidator v, String 
fieldName, String methodName) {
         String validatorType = "int";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -644,7 +649,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processShortRangeFieldValidatorAnnotation(ShortRangeFieldValidator v, String 
fieldName, String methodName) {
         String validatorType = "short";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -672,7 +677,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processDoubleRangeFieldValidatorAnnotation(DoubleRangeFieldValidator v, String 
fieldName, String methodName) {
         String validatorType = "double";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -707,7 +712,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processFieldExpressionValidatorAnnotation(FieldExpressionValidator v, String 
fieldName, String methodName) {
         String validatorType = "fieldexpression";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -730,7 +735,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig processEmailValidatorAnnotation(EmailValidator v, 
String fieldName, String methodName) {
         String validatorType = "email";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -751,7 +756,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processDateRangeFieldValidatorAnnotation(DateRangeFieldValidator v, String 
fieldName, String methodName) {
         String validatorType = "date";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);
@@ -780,7 +785,7 @@ public class AnnotationValidationConfigu
     private ValidatorConfig 
processConversionErrorFieldValidatorAnnotation(ConversionErrorFieldValidator v, 
String fieldName, String methodName) {
         String validatorType = "conversion";
 
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, Object> params = new HashMap<String, Object>();
 
         if (fieldName != null) {
             params.put("fieldName", fieldName);

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/DefaultValidatorFileParser.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/DefaultValidatorFileParser.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/DefaultValidatorFileParser.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/DefaultValidatorFileParser.java
 Fri Mar 15 21:44:43 2013
@@ -88,13 +88,13 @@ public class DefaultValidatorFileParser 
             // it will not cause field-level validator to be kicked off.
             {
                 NodeList validatorNodes = 
doc.getElementsByTagName("validator");
-                addValidatorConfigs(validatorFactory, validatorNodes, new 
HashMap<String, String>(), validatorCfgs);
+                addValidatorConfigs(validatorFactory, validatorNodes, new 
HashMap<String, Object>(), validatorCfgs);
             }
 
             for (int i = 0; i < fieldNodes.getLength(); i++) {
                 Element fieldElement = (Element) fieldNodes.item(i);
                 String fieldName = fieldElement.getAttribute("name");
-                Map<String, String> extraParams = new HashMap<String, 
String>();
+                Map<String, Object> extraParams = new HashMap<String, 
Object>();
                 extraParams.put("fieldName", fieldName);
 
                 NodeList validatorNodes = 
fieldElement.getElementsByTagName("field-validator");
@@ -127,7 +127,7 @@ public class DefaultValidatorFileParser 
 
                 try {
                     // catch any problems here
-                    objectFactory.buildValidator(className, new 
HashMap<String, String>(), null);
+                    objectFactory.buildValidator(className, new 
HashMap<String, Object>(), null);
                     validators.put(name, className);
                 } catch (Exception e) {
                     throw new ConfigurationException("Unable to load validator 
class " + className, e, validatorElement);
@@ -166,11 +166,11 @@ public class DefaultValidatorFileParser 
         return value.toString().trim();
     }
 
-    private void addValidatorConfigs(ValidatorFactory factory, NodeList 
validatorNodes, Map<String, String> extraParams, List<ValidatorConfig> 
validatorCfgs) {
+    private void addValidatorConfigs(ValidatorFactory factory, NodeList 
validatorNodes, Map<String, Object> extraParams, List<ValidatorConfig> 
validatorCfgs) {
         for (int j = 0; j < validatorNodes.getLength(); j++) {
             Element validatorElement = (Element) validatorNodes.item(j);
             String validatorType = validatorElement.getAttribute("type");
-            Map<String, String> params = new HashMap<String, 
String>(extraParams);
+            Map<String, Object> params = new HashMap<String, 
Object>(extraParams);
 
             params.putAll(XmlHelper.getParams(validatorElement));
 

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/ValidatorConfig.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/ValidatorConfig.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/ValidatorConfig.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/ValidatorConfig.java
 Fri Mar 15 21:44:43 2013
@@ -34,7 +34,7 @@ import java.util.Map;
 public class ValidatorConfig extends Located {
 
     private String type;
-    private Map<String,String> params;
+    private Map<String, Object> params;
     private String defaultMessage;
     private String messageKey;
     private boolean shortCircuit;
@@ -45,12 +45,12 @@ public class ValidatorConfig extends Loc
      */
     protected ValidatorConfig(String validatorType) {
         this.type = validatorType;
-        params = new LinkedHashMap<String, String>();
+        params = new LinkedHashMap<String, Object>();
     }
 
     protected ValidatorConfig(ValidatorConfig orig) {
         this.type = orig.type;
-        this.params = new LinkedHashMap<String,String>(orig.params);
+        this.params = new LinkedHashMap<String,Object>(orig.params);
         this.defaultMessage = orig.defaultMessage;
         this.messageKey = orig.messageKey;
         this.shortCircuit = orig.shortCircuit;
@@ -82,7 +82,7 @@ public class ValidatorConfig extends Loc
     /**
      * @return Returns the configured params to set on the validator. 
      */
-    public Map<String, String> getParams() {
+    public Map<String, Object> getParams() {
         return params;
     }
     
@@ -138,14 +138,14 @@ public class ValidatorConfig extends Loc
             return this;
         }
 
-        public Builder addParam(String name, String value) {
+        public Builder addParam(String name, Object value) {
             if (value != null && name != null) {
                 target.params.put(name, value);
             }
             return this;
         }
 
-        public Builder addParams(Map<String,String> params) {
+        public Builder addParams(Map<String,Object> params) {
             target.params.putAll(params);
             return this;
         }

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=1457137&r1=1457136&r2=1457137&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
 Fri Mar 15 21:44:43 2013
@@ -113,7 +113,17 @@ public @interface RegexFieldValidator {
     String fieldName() default "";
 
 
-    String expression();
+    String regex() default "";
+
+    String regexExpression() default "";
+
+    boolean trim() default true;
+
+    String trimExpression() default "";
+
+    boolean caseSensitive() default true;
+
+    String caseSensitiveExpression() default "";
 
     /**
      * If this is activated, the validator will be used as short-circuit.

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/RegexFieldValidator.java
 Fri Mar 15 21:44:43 2013
@@ -16,7 +16,10 @@
 
 package com.opensymphony.xwork2.validator.validators;
 
+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;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -77,16 +80,25 @@ import java.util.regex.Pattern;
  */
 public class RegexFieldValidator extends FieldValidatorSupport {
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(RegexFieldValidator.class);
+
     private String regex;
-    private boolean caseSensitive = true;
-    private boolean trim = true;
+    private String regexExpression;
+    private Boolean caseSensitive = true;
+    private String caseSensitiveExpression = "";
+    private Boolean trim = true;
+    private String trimExpression = "";
 
     public void validate(Object object) throws ValidationException {
         String fieldName = getFieldName();
         Object value = this.getFieldValue(fieldName, object);
         // if there is no value - don't do comparison
         // if a value is required, a required validator should be added to the 
field
-        if (value == null || regex == null) {
+        String regexToUse = getRegex();
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Defined regexp as [#0]", regexToUse);
+        }
+        if (value == null || regexToUse == null) {
             return;
         }
 
@@ -104,13 +116,13 @@ public class RegexFieldValidator extends
         // match against expression
         Pattern pattern;
         if (isCaseSensitive()) {
-            pattern = Pattern.compile(regex);
+            pattern = Pattern.compile(regexToUse);
         } else {
-            pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
+            pattern = Pattern.compile(regexToUse, Pattern.CASE_INSENSITIVE);
         }
 
         String compare = (String) value;
-        if ( trim ) {
+        if ( isTrimed() ) {
             compare = compare.trim();
         }
         Matcher matcher = pattern.matcher( compare );
@@ -124,7 +136,13 @@ public class RegexFieldValidator extends
      * @return Returns the regular expression to be matched.
      */
     public String getRegex() {
-        return regex;
+        if (StringUtils.isNotEmpty(regex)) {
+            return regex;
+        } else if (StringUtils.isNotEmpty(regexExpression)) {
+            return (String) parse(regexExpression, String.class);
+        } else {
+            return null;
+        }
     }
 
     /**
@@ -138,7 +156,7 @@ public class RegexFieldValidator extends
      * Sets the regular expression as an OGNL expression to be matched
      */
     public void setRegexExpression(String regexExpression) {
-        this.regex = (String) parse(regexExpression, String.class);
+        this.regexExpression = regexExpression;
     }
 
     /**
@@ -146,6 +164,9 @@ public class RegexFieldValidator extends
      *         a case-sensitive way.  Default is <code>true</code>.
      */
     public boolean isCaseSensitive() {
+        if (StringUtils.isNotEmpty(caseSensitiveExpression)) {
+            return (Boolean) parse(caseSensitiveExpression, Boolean.class);
+        }
         return caseSensitive;
     }
 
@@ -161,7 +182,7 @@ public class RegexFieldValidator extends
      * Allows specify caseSensitive param as an OGNL expression
      */
     public void setCaseSensitiveExpression(String caseSensitiveExpression) {
-        this.caseSensitive = (Boolean) parse(caseSensitiveExpression, 
Boolean.class);
+        this.caseSensitiveExpression = caseSensitiveExpression;
     }
 
     /**
@@ -169,6 +190,9 @@ public class RegexFieldValidator extends
      * Default is <code>true</code>.
      */
     public boolean isTrimed() {
+        if (StringUtils.isNotEmpty(trimExpression)) {
+            return (Boolean) parse(trimExpression, Boolean.class);
+        }
         return trim;
     }
 
@@ -184,7 +208,7 @@ public class RegexFieldValidator extends
      * Allows specify trim param as an OGNL expression
      */
     public void setTrimExpression(String trimExpression) {
-        this.trim = (Boolean) parse(trimExpression, Boolean.class);
+        this.trimExpression = trimExpression;
     }
 
 }

Modified: 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/main/java/com/opensymphony/xwork2/validator/validators/ValidatorSupport.java
 Fri Mar 15 21:44:43 2013
@@ -40,6 +40,7 @@ import java.util.List;
 public abstract class ValidatorSupport implements Validator, 
ShortCircuitableValidator {
 
     protected final Logger log = LoggerFactory.getLogger(this.getClass());
+
     protected String defaultMessage = "";
     protected String messageKey;
     private ValidatorContext validatorContext;

Modified: 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/SpringObjectFactoryTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/SpringObjectFactoryTest.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/SpringObjectFactoryTest.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/spring/SpringObjectFactoryTest.java
 Fri Mar 15 21:44:43 2013
@@ -19,7 +19,15 @@ package com.opensymphony.xwork2.spring;
  * Created on Mar 8, 2004
  */
 
-import com.opensymphony.xwork2.*;
+import com.opensymphony.xwork2.Action;
+import com.opensymphony.xwork2.ActionChainResult;
+import com.opensymphony.xwork2.ActionContext;
+import com.opensymphony.xwork2.ModelDrivenAction;
+import com.opensymphony.xwork2.ObjectFactory;
+import com.opensymphony.xwork2.Result;
+import com.opensymphony.xwork2.SimpleAction;
+import com.opensymphony.xwork2.TestBean;
+import com.opensymphony.xwork2.XWorkTestCase;
 import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.config.entities.ActionConfig;
 import com.opensymphony.xwork2.config.entities.InterceptorConfig;
@@ -39,7 +47,6 @@ import org.springframework.aop.intercept
 import org.springframework.beans.BeansException;
 import org.springframework.beans.MutablePropertyValues;
 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.context.support.StaticApplicationContext;
@@ -107,7 +114,7 @@ public class SpringObjectFactoryTest ext
     }
 
     public void testFallsBackToDefaultObjectFactoryValidatorBuilding() throws 
Exception {
-        Validator validator = 
objectFactory.buildValidator(RequiredStringValidator.class.getName(), new 
HashMap<String, String>(), null);
+        Validator validator = 
objectFactory.buildValidator(RequiredStringValidator.class.getName(), new 
HashMap<String, Object>(), null);
 
         assertEquals(RequiredStringValidator.class, validator.getClass());
     }
@@ -143,7 +150,7 @@ public class SpringObjectFactoryTest ext
     public void testObtainValidatorBySpringName() throws Exception {
         sac.registerPrototype("expression-validator", 
ExpressionValidator.class, new MutablePropertyValues());
 
-        Validator validator = 
objectFactory.buildValidator("expression-validator", new HashMap<String, 
String>(), null);
+        Validator validator = 
objectFactory.buildValidator("expression-validator", new HashMap<String, 
Object>(), null);
 
         assertEquals(ExpressionValidator.class, validator.getClass());
     }

Added: 
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=1457137&view=auto
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java
 (added)
+++ 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationAction.java
 Fri Mar 15 21:44:43 2013
@@ -0,0 +1,22 @@
+package com.opensymphony.xwork2.validator;
+
+import com.opensymphony.xwork2.ActionSupport;
+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),
+            }
+    )
+    public String execute() {
+        return SUCCESS;
+    }
+
+}

Added: 
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=1457137&view=auto
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java
 (added)
+++ 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationConfigurationBuilderTest.java
 Fri Mar 15 21:44:43 2013
@@ -0,0 +1,110 @@
+package com.opensymphony.xwork2.validator;
+
+import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.ActionSupport;
+import com.opensymphony.xwork2.DefaultActionInvocation;
+import com.opensymphony.xwork2.XWorkConstants;
+import com.opensymphony.xwork2.XWorkTestCase;
+import com.opensymphony.xwork2.config.Configuration;
+import com.opensymphony.xwork2.config.ConfigurationException;
+import com.opensymphony.xwork2.config.ConfigurationProvider;
+import com.opensymphony.xwork2.config.entities.ActionConfig;
+import com.opensymphony.xwork2.config.entities.PackageConfig;
+import com.opensymphony.xwork2.inject.ContainerBuilder;
+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.RegexFieldValidator;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Simple test to check if validation Annotations match given validator class
+ */
+public class AnnotationValidationConfigurationBuilderTest extends 
XWorkTestCase{
+
+    public void testValidationAnnotation() throws Exception {
+        // given
+        AnnotationActionValidatorManager manager = 
createValidationManager(AnnotationValidationAction.class);
+
+        // when
+        List<Validator> validators = 
manager.getValidators(AnnotationValidationAction.class, null);
+
+        // then
+        assertEquals(validators.size(), 1);
+        for (Validator validator : validators) {
+            if (validator.getValidatorType().equals("regex")) {
+                validateRegexValidator((RegexFieldValidator) validator);
+            }
+        }
+    }
+
+    public void testValidationAnnotationExpParams() throws Exception {
+        // given
+        AnnotationActionValidatorManager manager = 
createValidationManager(AnnotationValidationExpAction.class);
+
+        // when
+        List<Validator> validators = 
manager.getValidators(AnnotationValidationExpAction.class, null);
+
+        // then
+        ValueStack valueStack = 
container.getInstance(ValueStackFactory.class).createValueStack();
+        valueStack.push(new AnnotationValidationExpAction());
+
+        assertEquals(validators.size(), 1);
+        for (Validator validator : validators) {
+            if (validator.getValidatorType().equals("regex")) {
+                validator.setValueStack(valueStack);
+                validateRegexValidator((RegexFieldValidator) validator);
+            }
+        }
+    }
+
+    private void validateRegexValidator(RegexFieldValidator validator) {
+        assertEquals("foo", validator.getRegex());
+        assertEquals("Foo doesn't match!", validator.getDefaultMessage());
+        assertEquals("regex.key", validator.getMessageKey());
+        assertEquals("bar", validator.getFieldName());
+        assertEquals(true, validator.isShortCircuit());
+        assertEquals(false, validator.isTrimed());
+        assertEquals(false, validator.isCaseSensitive());
+    }
+
+    private AnnotationActionValidatorManager createValidationManager(final 
Class<? extends ActionSupport> actionClass) throws Exception {
+        loadConfigurationProviders(new ConfigurationProvider() {
+            public void destroy() {
+
+            }
+
+            public void init(Configuration configuration) throws 
ConfigurationException {
+                configuration.addPackageConfig("default", new 
PackageConfig.Builder("default")
+                        .addActionConfig("annotation", new 
ActionConfig.Builder("", "annotation", actionClass.getName()).build())
+                        .build());
+            }
+
+            public boolean needsReload() {
+                return false;
+            }
+
+            public void loadPackages() throws ConfigurationException {
+
+            }
+
+            public void register(ContainerBuilder builder, LocatableProperties 
props) throws ConfigurationException {
+                builder.constant(XWorkConstants.DEV_MODE, true);
+            }
+        });
+
+        Map<String, Object> context = new HashMap<String, Object>();
+        ActionInvocation invocation = new DefaultActionInvocation(context, 
true);
+        container.inject(invocation);
+        invocation.init(actionProxyFactory.createActionProxy("", "annotation", 
null, context));
+
+        AnnotationActionValidatorManager manager = new 
AnnotationActionValidatorManager();
+        container.inject(manager);
+
+        return manager;
+    }
+
+}

Added: 
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=1457137&view=auto
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java
 (added)
+++ 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationValidationExpAction.java
 Fri Mar 15 21:44:43 2013
@@ -0,0 +1,34 @@
+package com.opensymphony.xwork2.validator;
+
+import com.opensymphony.xwork2.ActionSupport;
+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}"),
+            }
+    )
+    public String execute() {
+        return SUCCESS;
+    }
+
+    public String getFoo() {
+        return "foo";
+    }
+
+    public boolean getTrim() {
+        return false;
+    }
+
+    public boolean getCaseSensitive() {
+        return false;
+    }
+
+}

Modified: 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java?rev=1457137&r1=1457136&r2=1457137&view=diff
==============================================================================
--- 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java
 (original)
+++ 
struts/struts2/trunk/xwork-core/src/test/java/com/opensymphony/xwork2/validator/EmailValidatorTest.java
 Fri Mar 15 21:44:43 2013
@@ -55,7 +55,7 @@ public class EmailValidatorTest extends 
         assertFalse(verifyEmailValidity("aaa@aa.aaaaaaa"));
         assertFalse(verifyEmailValidity("+ferdamrave...@yahoo.com"));
 
-        assertFalse(verifyEmailValidityWithExpression("tm...@yahoo.co", 
"\\b^[a-z]+@[a-z]+(\\.[a-z]+)*\\.com$\\b"));
+        assertTrue(verifyEmailValidityWithExpression("tm...@yahoo.co", 
"\\b^[a-z]+@[a-z]+(\\.[a-z]+)*\\.com$\\b"));
     }
 
     protected boolean verifyEmailValidity(final String email) throws Exception 
{
@@ -97,7 +97,6 @@ public class EmailValidatorTest extends 
         validator.setRegexExpression("${emailExpression}");
 
         validator.validate(action);
-        valueStack.pop();
 
         return (action.getFieldErrors().size() == 0);
     }
@@ -124,8 +123,6 @@ public class EmailValidatorTest extends 
 
         validator.setCaseSensitiveExpression("${emailCaseSensitive}");
 
-        valueStack.pop();
-
         return validator;
     }
 
@@ -151,8 +148,6 @@ public class EmailValidatorTest extends 
 
         validator.setTrimExpression("${trimEmail}");
 
-        valueStack.pop();
-
         return validator;
     }
 


Reply via email to