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

Reply via email to