Repository: wicket Updated Branches: refs/heads/wicket-6.x 4e39ebdb3 -> 074f06a9e
WICKET-5811 Fix issue with infinite loop in PropertyValidator#createUnresolvablePropertyMessage(FormComponent<>) in case or trivial model (new Model<>(...)); Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/5fe26827 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/5fe26827 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/5fe26827 Branch: refs/heads/wicket-6.x Commit: 5fe26827a24f4e4eb1a64a96aa0df8f8558b84e7 Parents: 160c0f6 Author: Alexander Morozov <alexander.v.moro...@gmail.com> Authored: Mon Jan 19 17:00:12 2015 +0600 Committer: Alexander Morozov <alexander.v.moro...@gmail.com> Committed: Mon Jan 19 17:17:45 2015 +0600 ---------------------------------------------------------------------- .../validation/DefaultPropertyResolver.java | 30 ++---------- .../bean/validation/PropertyValidator.java | 20 +------- .../validation/ValidationModelResolver.java | 50 ++++++++++++++++++++ .../src/test/java/log4j.properties | 18 +++++++ .../bean/validation/TestValidatableBean.java | 25 ++++++++++ .../validation/ValidationModelResolverTest.java | 44 +++++++++++++++++ 6 files changed, 142 insertions(+), 45 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/5fe26827/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java ---------------------------------------------------------------------- diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java index 08311ac..ab8a11a 100644 --- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java +++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/DefaultPropertyResolver.java @@ -1,15 +1,13 @@ package org.apache.wicket.bean.validation; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.markup.html.form.FormComponent; -import org.apache.wicket.model.IModel; import org.apache.wicket.model.IPropertyReflectionAwareModel; -import org.apache.wicket.model.IWrapModel; import org.apache.wicket.model.PropertyModel; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + /** * Default property resolver. This resolver supports common Wicket models like the * {@link PropertyModel}, and other implementations of {@link IPropertyReflectionAwareModel} @@ -23,27 +21,7 @@ public class DefaultPropertyResolver implements IPropertyResolver @Override public Property resolveProperty(FormComponent<?> component) { - IModel<?> model = component.getModel(); - - while (true) - { - if (model == null) - { - return null; - } - if (model instanceof IPropertyReflectionAwareModel) - { - break; - } - if (model instanceof IWrapModel<?>) - { - model = ((IWrapModel<?>)model).getWrappedModel(); - continue; - } - return null; - } - - IPropertyReflectionAwareModel<?> delegate = (IPropertyReflectionAwareModel<?>)model; + IPropertyReflectionAwareModel<?> delegate = ValidationModelResolver.resolvePropertyModelFrom(component); String name; Method getter = delegate.getPropertyGetter(); http://git-wip-us.apache.org/repos/asf/wicket/blob/5fe26827/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java ---------------------------------------------------------------------- diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java index 17aa38f..5fcde2d 100644 --- a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java +++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/PropertyValidator.java @@ -103,25 +103,7 @@ public class PropertyValidator<T> extends Behavior implements IValidator<T> String baseMessage = "Could not resolve Bean Property from component: " + component + ". (Hints:) Possible causes are a typo in the PropertyExpression, a null reference or a model that does not work in combination with a " + IPropertyResolver.class.getSimpleName() + "."; - - IModel<?> model = component.getModel(); - // Code sadly copied over from DefaultPropertyResolver - while (true) - { - if (model == null) - { - break; - } - if (model instanceof IPropertyReflectionAwareModel) - { - break; - } - if (model instanceof IWrapModel<?>) - { - model = ((IWrapModel<?>)model).getWrappedModel(); - continue; - } - } + IModel<?> model = ValidationModelResolver.resolvePropertyModelFrom(component); if (model != null) { baseMessage += " Model : " + model; } http://git-wip-us.apache.org/repos/asf/wicket/blob/5fe26827/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java ---------------------------------------------------------------------- diff --git a/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java new file mode 100644 index 0000000..cb8cfcd --- /dev/null +++ b/wicket-bean-validation/src/main/java/org/apache/wicket/bean/validation/ValidationModelResolver.java @@ -0,0 +1,50 @@ +package org.apache.wicket.bean.validation; + +import org.apache.wicket.markup.html.form.FormComponent; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.IPropertyReflectionAwareModel; +import org.apache.wicket.model.IWrapModel; + +/** + * @author alexander.v.morozov + */ +final class ValidationModelResolver +{ + + /** + * Lookup for property-aware model, attached to certain form component. + * + * @param component + * form component + * + * @return property-aware model, extracted from supplied component or <code>null</code> + */ + public static IPropertyReflectionAwareModel<?> resolvePropertyModelFrom(FormComponent<?> component) + { + IModel<?> model = component.getModel(); + while (true) + { + if (model == null) + { + return null; + } + if (model instanceof IPropertyReflectionAwareModel) + { + return (IPropertyReflectionAwareModel<?>) model; + } + if (model instanceof IWrapModel<?>) + { + model = ((IWrapModel<?>)model).getWrappedModel(); + continue; + } + break; // not model found + } + return null; + } + + private ValidationModelResolver() + { + // nop + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/5fe26827/wicket-bean-validation/src/test/java/log4j.properties ---------------------------------------------------------------------- diff --git a/wicket-bean-validation/src/test/java/log4j.properties b/wicket-bean-validation/src/test/java/log4j.properties new file mode 100644 index 0000000..76a9aff --- /dev/null +++ b/wicket-bean-validation/src/test/java/log4j.properties @@ -0,0 +1,18 @@ +log4j.debug=false + +log4j.rootLogger=INFO,Stdout + +# please keep this setting FATAL to avoid questions from users +# why there are stacktraces in the test output. You can turn it +# down if you need to when testing, but don't check it in. (eelco) + +# changing back to ERROR. Looks like in some cases the log4j.properties +# in wicket gets picked which results in not printing the exceptions +# and that can be a bit dangerous (matej) +log4j.logger.org.apache.wicket=ERROR +#log4j.logger.org.apache.wicket.resource=FATAL +#log4j.logger.org.apache.wicket.Localizer=FATAL + +log4j.appender.Stdout=org.apache.log4j.ConsoleAppender +log4j.appender.Stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.Stdout.layout.conversionPattern=%-5p - %-26.26c{1} - %m\n http://git-wip-us.apache.org/repos/asf/wicket/blob/5fe26827/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/TestValidatableBean.java ---------------------------------------------------------------------- diff --git a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/TestValidatableBean.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/TestValidatableBean.java new file mode 100644 index 0000000..e33c7b9 --- /dev/null +++ b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/TestValidatableBean.java @@ -0,0 +1,25 @@ +package org.apache.wicket.bean.validation; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author alexander.v.morozov + */ +public class TestValidatableBean implements Serializable +{ + + @NotNull + private String text; + + public String getText() + { + return text; + } + + public void setText(String text) + { + this.text = text; + } + +} http://git-wip-us.apache.org/repos/asf/wicket/blob/5fe26827/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java ---------------------------------------------------------------------- diff --git a/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java new file mode 100644 index 0000000..cefb2e9 --- /dev/null +++ b/wicket-bean-validation/src/test/java/org/apache/wicket/bean/validation/ValidationModelResolverTest.java @@ -0,0 +1,44 @@ +package org.apache.wicket.bean.validation; + +import org.apache.wicket.markup.html.form.TextField; +import org.apache.wicket.model.IPropertyReflectionAwareModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.util.tester.WicketTesterScope; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; + +/** + * @author alexander.v.morozov + */ +public class ValidationModelResolverTest +{ + + @Rule + public WicketTesterScope scope = new WicketTesterScope(); + + @Test + public void noModelBoundToComponent() + { + TextField<String> textField = new TextField<String>("field"); + Assert.assertNull(ValidationModelResolver.resolvePropertyModelFrom(textField)); + } + + @Test + public void simpleModelBoundToComponent() + { + TextField<String> textField = new TextField<String>("text", new Model<String>()); + Assert.assertNull(ValidationModelResolver.resolvePropertyModelFrom(textField)); + } + + @Test + public void propertyModelBoundToComponent() + { + TextField<String> textField = new TextField<String>("text", new PropertyModel<String>(new TestValidatableBean(), "text")); + IPropertyReflectionAwareModel<?> model = ValidationModelResolver.resolvePropertyModelFrom(textField); + Assert.assertNotNull(model); + Assert.assertEquals("text", model.getPropertyField().getName()); + } + +} \ No newline at end of file