Author: mgrigorov
Date: Fri Aug 12 15:19:05 2011
New Revision: 1157155

URL: http://svn.apache.org/viewvc?rev=1157155&view=rev
Log:
WICKET-3929 PropertyModel/PropertyResolver breaks when using a List as the root 
object


Added:
    
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java
Modified:
    
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java

Modified: 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java?rev=1157155&r1=1157154&r2=1157155&view=diff
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
 (original)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
 Fri Aug 12 15:19:05 2011
@@ -257,6 +257,13 @@ public final class PropertyResolver
        {
                String expressionBracketsSeperated = 
Strings.replaceAll(expression, "[", ".[").toString();
                int index = getNextDotIndex(expressionBracketsSeperated, 0);
+               while (index == 0 && 
expressionBracketsSeperated.startsWith("."))
+               {
+                       // eat dots at the beginning of the expression since 
they will confuse
+                       // later steps
+                       expressionBracketsSeperated = 
expressionBracketsSeperated.substring(1);
+                       index = getNextDotIndex(expressionBracketsSeperated, 0);
+               }
                int lastIndex = 0;
                Object value = object;
                String exp = expressionBracketsSeperated;

Added: 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java
URL: 
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java?rev=1157155&view=auto
==============================================================================
--- 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java
 (added)
+++ 
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/model/PropertyModelWithListTest.java
 Fri Aug 12 15:19:05 2011
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * https://issues.apache.org/jira/browse/WICKET-3929
+ * 
+ * @author Carl-Eric Menzel
+ */
+public class PropertyModelWithListTest extends Assert
+{
+       /** */
+       public static class BeansContainer
+       {
+               private List<Bean> beans = new ArrayList<Bean>();
+
+               /**
+                * @return the beans
+                * 
+                */
+               public List<Bean> getBeans()
+               {
+                       return beans;
+               }
+
+               /**
+                * @param beans
+                *            the bean
+                */
+               public void setBeans(List<Bean> beans)
+               {
+                       this.beans = beans;
+               }
+       }
+
+       /** */
+       public static class Bean
+       {
+               private String text;
+
+               /**
+                * @return the bean's text
+                */
+               public String getText()
+               {
+                       return text;
+               }
+
+               /**
+                * @param text
+                *            the bean's text
+                */
+               public void setText(String text)
+               {
+                       this.text = text;
+               }
+       }
+
+       /**
+        * 
+        * @throws Exception
+        */
+       @Test
+       public void listPropertyModel() throws Exception
+       {
+               List<Bean> beans = new 
ArrayList<PropertyModelWithListTest.Bean>();
+               Bean bean = new Bean();
+               bean.setText("Wrinkly and green I am.");
+               beans.add(bean);
+               PropertyModel<String> model = new PropertyModel<String>(beans, 
"0.text");
+               assertEquals("Wrinkly and green I am.", model.getObject());
+       }
+
+       /**
+        * @throws Exception
+        */
+       @Test
+       public void containerPropertyModel() throws Exception
+       {
+               BeansContainer container = new BeansContainer();
+               Bean bean = new Bean();
+               bean.setText("Wrinkly and green I am.");
+               container.getBeans().add(bean);
+               PropertyModel<String> model = new 
PropertyModel<String>(container, "beans[0].text");
+               assertEquals("Wrinkly and green I am.", model.getObject());
+       }
+
+       /**
+        * @throws Exception
+        */
+       @Test
+       public void nestedListPropertyModel() throws Exception
+       {
+               List<List<Bean>> outer = new ArrayList<List<Bean>>();
+               List<Bean> inner = new ArrayList<Bean>();
+               outer.add(inner);
+               Bean bean = new Bean();
+               bean.setText("Wrinkly and green I am.");
+               inner.add(bean);
+               PropertyModel<String> model = new PropertyModel<String>(outer, 
"0[0].text");
+               assertEquals("Wrinkly and green I am.", model.getObject());
+       }
+}
\ No newline at end of file


Reply via email to