Updated Branches:
  refs/heads/master d3e9f1d95 -> cb95e2236

FIXED - TAP5-2101: BeanEditor should always provide a new
BeanValidationContext (JSR-303) 
- apply Luca Menegus' patch with minor changes


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

Branch: refs/heads/master
Commit: cb95e2236873b497211427e89f96e54282919e19
Parents: d3e9f1d
Author: kaosko <[email protected]>
Authored: Sat Apr 13 22:11:33 2013 -0700
Committer: kaosko <[email protected]>
Committed: Sat Apr 13 22:11:33 2013 -0700

----------------------------------------------------------------------
 .../TapestryBeanValidationIntegrationTests.java    |   14 +++++
 .../org/example/testapp/entities/ComplexBean.java  |   44 +++++++++++++++
 .../testapp/entities/SomeOtherSimpleBean.java      |   21 +++++++
 .../example/testapp/entities/SomeSimpleBean.java   |   21 +++++++
 .../org/example/testapp/pages/ComplexBeanDemo.java |   14 +++++
 .../src/test/webapp/ComplexBeanDemo.tml            |   19 ++++++
 tapestry-beanvalidator/src/test/webapp/Index.tml   |    3 +
 .../tapestry5/corelib/components/BeanEditor.java   |   24 ++++----
 8 files changed, 148 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/cb95e223/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 29b50bf..248c24e 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
@@ -216,4 +216,18 @@ public class TapestryBeanValidationIntegrationTests 
extends SeleniumTestCase
         assertTextPresent("Login Name size must be between 7 and 10", "Login 
Name must match \"[0-9]+\"");
     }
 
+    @Test
+    public void beaneditor_validation() throws Exception
+    {
+        openLinks("ComplexBean Demo");
+
+        // Test JSR-303 validator
+
+        clickAndWait(SUBMIT);
+
+        assertTextPresent("Simple Not Null Property may not be null",
+                "Min Value must be greater than or equal to 6", "Not Null 
String may not be null");
+    }
+
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/cb95e223/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/ComplexBean.java
----------------------------------------------------------------------
diff --git 
a/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/ComplexBean.java
 
b/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/ComplexBean.java
new file mode 100644
index 0000000..beaa840
--- /dev/null
+++ 
b/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/ComplexBean.java
@@ -0,0 +1,44 @@
+package org.example.testapp.entities;
+
+import javax.validation.constraints.NotNull;
+
+public class ComplexBean
+{
+
+    private SomeSimpleBean someSimpleBean;
+    private SomeOtherSimpleBean someOtherSimpleBean;
+
+    @NotNull
+    private String simpleNotNullProperty;
+
+    public SomeSimpleBean getSomeSimpleBean()
+    {
+        return someSimpleBean;
+    }
+
+    public void setSomeSimpleBean(SomeSimpleBean someSimpleBean)
+    {
+        this.someSimpleBean = someSimpleBean;
+    }
+
+    public SomeOtherSimpleBean getSomeOtherSimpleBean()
+    {
+        return someOtherSimpleBean;
+    }
+
+    public void setSomeOtherSimpleBean(SomeOtherSimpleBean someOtherSimpleBean)
+    {
+        this.someOtherSimpleBean = someOtherSimpleBean;
+    }
+
+    public String getSimpleNotNullProperty()
+    {
+        return simpleNotNullProperty;
+    }
+
+    public void setSimpleNotNullProperty(String simpleNotNullProperty)
+    {
+        this.simpleNotNullProperty = simpleNotNullProperty;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/cb95e223/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/SomeOtherSimpleBean.java
----------------------------------------------------------------------
diff --git 
a/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/SomeOtherSimpleBean.java
 
b/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/SomeOtherSimpleBean.java
new file mode 100644
index 0000000..9a262f3
--- /dev/null
+++ 
b/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/SomeOtherSimpleBean.java
@@ -0,0 +1,21 @@
+package org.example.testapp.entities;
+
+import javax.validation.constraints.NotNull;
+
+public class SomeOtherSimpleBean
+{
+
+    @NotNull
+    private String notNullString;
+
+    public String getNotNullString()
+    {
+        return notNullString;
+    }
+
+    public void setNotNullString(String notNullString)
+    {
+        this.notNullString = notNullString;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/cb95e223/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/SomeSimpleBean.java
----------------------------------------------------------------------
diff --git 
a/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/SomeSimpleBean.java
 
b/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/SomeSimpleBean.java
new file mode 100644
index 0000000..1564112
--- /dev/null
+++ 
b/tapestry-beanvalidator/src/test/java/org/example/testapp/entities/SomeSimpleBean.java
@@ -0,0 +1,21 @@
+package org.example.testapp.entities;
+
+import javax.validation.constraints.Min;
+
+public class SomeSimpleBean
+{
+
+    @Min(6)
+    private int minValue;
+
+    public int getMinValue()
+    {
+        return minValue;
+    }
+
+    public void setMinValue(int minValue)
+    {
+        this.minValue = minValue;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/cb95e223/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ComplexBeanDemo.java
----------------------------------------------------------------------
diff --git 
a/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ComplexBeanDemo.java
 
b/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ComplexBeanDemo.java
new file mode 100644
index 0000000..f7b2623
--- /dev/null
+++ 
b/tapestry-beanvalidator/src/test/java/org/example/testapp/pages/ComplexBeanDemo.java
@@ -0,0 +1,14 @@
+package org.example.testapp.pages;
+
+import org.apache.tapestry5.annotations.Persist;
+import org.apache.tapestry5.annotations.Property;
+import org.example.testapp.entities.ComplexBean;
+
+public class ComplexBeanDemo
+{
+
+    @Property
+    @Persist
+    private ComplexBean complexBean;
+
+}

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/cb95e223/tapestry-beanvalidator/src/test/webapp/ComplexBeanDemo.tml
----------------------------------------------------------------------
diff --git a/tapestry-beanvalidator/src/test/webapp/ComplexBeanDemo.tml 
b/tapestry-beanvalidator/src/test/webapp/ComplexBeanDemo.tml
new file mode 100644
index 0000000..fd20eab
--- /dev/null
+++ b/tapestry-beanvalidator/src/test/webapp/ComplexBeanDemo.tml
@@ -0,0 +1,19 @@
+<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd";>
+    <body>
+        <t:form clientValidation="none" validate="complexBean">
+               <t:errors/>
+
+               <br/>
+               <t:BeanEditor object="complexBean" />
+
+               <br/>
+               <t:BeanEditor object="complexBean.someSimpleBean" />
+
+               <br/>
+               <t:BeanEditor object="complexBean.someOtherSimpleBean" />
+
+               <br/>
+               <input type="submit" value="Go"/>
+        </t:form>
+     </body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/cb95e223/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 da8978e..0970c96 100644
--- a/tapestry-beanvalidator/src/test/webapp/Index.tml
+++ b/tapestry-beanvalidator/src/test/webapp/Index.tml
@@ -24,6 +24,9 @@
             <li>
                 <t:pagelink page="OnPrepareDemo">OnPrepare Demo</t:pagelink>
             </li>
+            <li>
+                <t:pagelink page="ComplexBeanDemo">ComplexBean 
Demo</t:pagelink>
+            </li>            
         </ul>
     </body>
 </html>

http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/cb95e223/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java
----------------------------------------------------------------------
diff --git 
a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java
 
b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java
index 1d7ed6c..94c37b9 100644
--- 
a/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java
+++ 
b/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/BeanEditor.java
@@ -166,6 +166,8 @@ public class BeanEditor
      */
     private Object cachedObject;
 
+    private BeanValidationContext originalBeanValidationContext;
+    
     // Needed for testing as well
 
     public Object getObject()
@@ -213,10 +215,6 @@ public class BeanEditor
                         PlasticUtils.toTypeName(model.getBeanType()), 
resources.getCompleteId(), ex);
                 throw new TapestryException(message, resources.getLocation(), 
ex);
             }
-
-            // If 'object' parameter is bound to a null-value 
BeanValidationContext is empty.
-            // This prevents JSR-303 javascript validators to be rendered 
properly .
-            refreshBeanValidationContext();
         }
 
         BeanEditContext context = new BeanEditContext()
@@ -235,20 +233,22 @@ public class BeanEditor
         cachedObject = object;
 
         environment.push(BeanEditContext.class, context);
+        // Always provide a new BeanValidationContext
+        originalBeanValidationContext = 
environment.push(BeanValidationContext.class,
+                new BeanValidationContextImpl(object));
+        
     }
 
     void cleanupEnvironment()
     {
         environment.pop(BeanEditContext.class);
-    }
-
-    private void refreshBeanValidationContext()
-    {
-        if (environment.peek(BeanValidationContext.class) != null)
+        environment.pop(BeanValidationContext.class);
+        // Restore the original BeanValidationContext as it might still be 
useful to the enclosing
+        // form
+        if (originalBeanValidationContext != null)
         {
-            environment.pop(BeanValidationContext.class);
-
-            environment.push(BeanValidationContext.class, new 
BeanValidationContextImpl(object));
+            environment.push(BeanValidationContext.class, 
originalBeanValidationContext);
+            originalBeanValidationContext = null;
         }
     }
 

Reply via email to