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; } }
