You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by th...@apache.org on 2014/06/05 23:58:43 UTC

git commit: Client validation was missing validations from annotations. TAP5-1718

Repository: tapestry-5
Updated Branches:
  refs/heads/master 0c1790d43 -> 7c9a72cfb


Client validation was missing validations from annotations. TAP5-1718


Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/7c9a72cf
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/7c9a72cf
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/7c9a72cf

Branch: refs/heads/master
Commit: 7c9a72cfb5e2e23eaf00a36f1a01ab9186928fef
Parents: 0c1790d
Author: Thiago H. de Paula Figueiredo <th...@apache.org>
Authored: Thu Jun 5 18:58:24 2014 -0300
Committer: Thiago H. de Paula Figueiredo <th...@apache.org>
Committed: Thu Jun 5 18:58:24 2014 -0300

----------------------------------------------------------------------
 .../beanvalidator/BeanFieldValidator.java       | 78 ++++++++++++++------
 .../TapestryBeanValidationIntegrationTests.java | 12 ++-
 .../example/testapp/pages/NestedObjectDemo.java | 14 +++-
 .../src/test/webapp/Index.tml                   |  5 +-
 .../src/test/webapp/NestedObjectDemo.tml        |  3 +-
 5 files changed, 87 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7c9a72cf/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java
----------------------------------------------------------------------
diff --git a/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java b/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java
index febe9e9..db3c2d2 100644
--- a/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java
+++ b/tapestry-beanvalidator/src/main/java/org/apache/tapestry5/internal/beanvalidator/BeanFieldValidator.java
@@ -84,13 +84,12 @@ public class BeanFieldValidator implements FieldValidator
 
         final Validator validator = validatorFactory.getValidator();
 
-        BeanDescriptor beanDescriptor = validator.getConstraintsForClass(beanValidationContext.getBeanType());
-
-        String currentProperty = beanValidationContext.getCurrentProperty();
+        final String currentProperty = beanValidationContext.getCurrentProperty();
 
         if (currentProperty == null) return;
-
-        PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty(currentProperty);
+        
+        final ValidationInfo validationInfo = getValidationInfo(beanValidationContext, currentProperty, validator);
+        final PropertyDescriptor propertyDescriptor = validationInfo.getPropertyDescriptor();
 
         if (propertyDescriptor == null) return;
 
@@ -144,26 +143,13 @@ public class BeanFieldValidator implements FieldValidator
 
         if (currentProperty == null) return;
         
-        Class<?> beanType = beanValidationContext.getBeanType();
-        String[] path = currentProperty.split("\\.");
-        BeanDescriptor beanDescriptor = validator.getConstraintsForClass(beanType);
-        
-        for (int i = 1; i < path.length - 1; i++) 
-        {
-            Class<?> constrainedPropertyClass = getConstrainedPropertyClass(beanDescriptor, path[i]);
-            if (constrainedPropertyClass != null) {
-                beanType = constrainedPropertyClass;
-                beanDescriptor = validator.getConstraintsForClass(beanType);
-            }
-        }
-
-        final String propertyName = path[path.length - 1];
-        PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty(propertyName);
+        final ValidationInfo validationInfo = getValidationInfo(beanValidationContext, currentProperty, validator);
+        final PropertyDescriptor propertyDescriptor = validationInfo.getPropertyDescriptor();
 
         if (propertyDescriptor == null) return;
 
         final Set<ConstraintViolation<Object>> violations = validator.validateValue(
-                (Class<Object>) beanType, propertyName,
+                (Class<Object>) validationInfo.getBeanType(), validationInfo.getPropertyName(),
                 value, beanValidationGroupSource.get());
 
         if (violations.isEmpty())
@@ -228,4 +214,54 @@ public class BeanFieldValidator implements FieldValidator
             }
         });
     }
+    
+    final private static ValidationInfo getValidationInfo(BeanValidationContext beanValidationContext, String currentProperty, Validator validator) {
+        Class<?> beanType = beanValidationContext.getBeanType();
+        String[] path = currentProperty.split("\\.");
+        BeanDescriptor beanDescriptor = validator.getConstraintsForClass(beanType);
+        
+        for (int i = 1; i < path.length - 1; i++) 
+        {
+            Class<?> constrainedPropertyClass = getConstrainedPropertyClass(beanDescriptor, path[i]);
+            if (constrainedPropertyClass != null) {
+                beanType = constrainedPropertyClass;
+                beanDescriptor = validator.getConstraintsForClass(beanType);
+            }
+        }
+
+        final String propertyName = path[path.length - 1];
+        PropertyDescriptor propertyDescriptor = beanDescriptor.getConstraintsForProperty(propertyName);
+        return new ValidationInfo(beanType, propertyName, propertyDescriptor);
+    }
+    
+    final private static class ValidationInfo {
+        final private Class<?> beanType;
+        final private String propertyName;
+        final private PropertyDescriptor propertyDescriptor;
+        public ValidationInfo(Class<?> beanType, String propertyName,
+                PropertyDescriptor propertyDescriptor) 
+        {
+            super();
+            this.beanType = beanType;
+            this.propertyName = propertyName;
+            this.propertyDescriptor = propertyDescriptor;
+        }
+        
+        public Class<?> getBeanType() 
+        {
+            return beanType;
+        }
+        
+        public String getPropertyName() 
+        {
+            return propertyName;
+        }
+
+        public PropertyDescriptor getPropertyDescriptor() 
+        {
+            return propertyDescriptor;
+        }
+
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7c9a72cf/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java
----------------------------------------------------------------------
diff --git a/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java b/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java
index 2b41abe..85d4d00 100644
--- a/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java
+++ b/tapestry-beanvalidator/src/test/java/org/apache/tapestry5/beanvalidator/integration/TapestryBeanValidationIntegrationTests.java
@@ -259,7 +259,7 @@ public class TapestryBeanValidationIntegrationTests extends SeleniumTestCase
         
         final String locatorTemplate = "//p[@data-error-block-for='%s']";
         
-        openLinks("NestedObject Demo");
+        openLinks("NestedObject Demo (client validation disabled)");
 
         clickAndWait(SUBMIT);
         
@@ -269,6 +269,16 @@ public class TapestryBeanValidationIntegrationTests extends SeleniumTestCase
                 getText(String.format(locatorTemplate, "simpleNotNullProperty")));
         assertEquals("Min Value must be greater than or equal to 6", 
                 getText(String.format(locatorTemplate, "minValue")));
+        
+        openLinks("NestedObject Demo (client validation enabled)");
+        
+        click(SUBMIT);
+        assertEquals("You must provide a value for Not Null String.", 
+                getText(String.format(locatorTemplate, "notNullString")));
+        assertEquals("Simple Not Null Property may not be null", 
+                getText(String.format(locatorTemplate, "simpleNotNullProperty")));
+        assertEquals("Min Value must be greater than or equal to 6", 
+                getText(String.format(locatorTemplate, "minValue")));
 
     }
 

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7c9a72cf/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/NestedObjectDemo.java
----------------------------------------------------------------------
diff --git a/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/NestedObjectDemo.java b/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/NestedObjectDemo.java
index f6406bd..f365bdd 100644
--- a/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/NestedObjectDemo.java
+++ b/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/NestedObjectDemo.java
@@ -5,6 +5,7 @@ import org.apache.tapestry5.alerts.Duration;
 import org.apache.tapestry5.alerts.Severity;
 import org.apache.tapestry5.annotations.Persist;
 import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.corelib.ClientValidation;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.example.testapp.entities.ComplexBean;
 import org.example.testapp.entities.SomeSimpleBean;
@@ -23,7 +24,10 @@ public class NestedObjectDemo
     @Inject
     private AlertManager alertManager;
     
-    public void onActivate() {
+    private boolean enableClientValidation;
+    
+    public void onActivate(boolean enableClientValidation) {
+    	this.enableClientValidation = enableClientValidation;
         if (complexBean == null) { 
             complexBean = new ComplexBean();
             SomeSimpleBean otherSimpleBean = new SomeSimpleBean();
@@ -34,5 +38,13 @@ public class NestedObjectDemo
     void onSuccess() {
         alertManager.alert(Duration.TRANSIENT, Severity.SUCCESS, "Validation passed");
     }
+    
+    public ClientValidation getClientValidation() {
+    	return enableClientValidation ? ClientValidation.SUBMIT : ClientValidation.NONE;
+    }
+    
+    Boolean onPassivate() {
+    	return enableClientValidation;
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7c9a72cf/tapestry-beanvalidator/src/test/webapp/Index.tml
----------------------------------------------------------------------
diff --git a/tapestry-beanvalidator/src/test/webapp/Index.tml b/tapestry-beanvalidator/src/test/webapp/Index.tml
index 6734533..abc9dfa 100644
--- a/tapestry-beanvalidator/src/test/webapp/Index.tml
+++ b/tapestry-beanvalidator/src/test/webapp/Index.tml
@@ -28,7 +28,10 @@
                 <t:pagelink page="ComplexBeanDemo">ComplexBean Demo</t:pagelink>
             </li>            
             <li>
-                <t:pagelink page="NestedObjectDemo">NestedObject Demo</t:pagelink>
+                <t:pagelink page="NestedObjectDemo" t:context="false">NestedObject Demo (client validation disabled)</t:pagelink>
+            </li>            
+            <li>
+                <t:pagelink page="NestedObjectDemo" t:context="true">NestedObject Demo (client validation enabled)</t:pagelink>
             </li>            
         </ul>
     </body>

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/7c9a72cf/tapestry-beanvalidator/src/test/webapp/NestedObjectDemo.tml
----------------------------------------------------------------------
diff --git a/tapestry-beanvalidator/src/test/webapp/NestedObjectDemo.tml b/tapestry-beanvalidator/src/test/webapp/NestedObjectDemo.tml
index a42a1bc..b6fb17f 100644
--- a/tapestry-beanvalidator/src/test/webapp/NestedObjectDemo.tml
+++ b/tapestry-beanvalidator/src/test/webapp/NestedObjectDemo.tml
@@ -1,7 +1,8 @@
 <html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
     <body>
+    	<p>Client validation: ${clientValidation}</p>
     	<t:alerts/>
-        <t:form clientValidation="none" validate="complexBean">
+        <t:form clientValidation="prop:clientValidation" validate="complexBean">
 	    	<t:errors/>
 	    	<t:textfield t:id="notNullString" t:mixins="FormGroup" t:validate="required"/>
         	<t:textfield t:id="simpleNotNullProperty" t:value="complexBean.simpleNotNullProperty" t:mixins="FormGroup"/>