Author: jcompagner
Date: Sat Nov  3 08:59:56 2007
New Revision: 591639

URL: http://svn.apache.org/viewvc?rev=591639&view=rev
Log:
fix for supporting . in side brackets for map lookup WICKET-988 

Modified:
    
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
    
wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java

Modified: 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java?rev=591639&r1=591638&r2=591639&view=diff
==============================================================================
--- 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
 (original)
+++ 
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/util/lang/PropertyResolver.java
 Sat Nov  3 08:59:56 2007
@@ -107,27 +107,27 @@
         *            The convertor to convert the value if needed to the right 
type.
         */
        public final static void setValue(final String expression, final Object 
object, Object value,
-                       PropertyResolverConverter converter)
+               PropertyResolverConverter converter)
        {
                if (expression == null || expression.equals(""))
                {
                        throw new WicketRuntimeException("Empty expression 
setting value: " + value +
-                                       " on object: " + object);
+                               " on object: " + object);
                }
                if (object == null)
                {
                        throw new WicketRuntimeException("Null object setting 
value: " + value +
-                                       " with expression: " + expression);
+                               " with expression: " + expression);
                }
 
                ObjectAndGetSetter setter = getObjectAndGetSetter(expression, 
object, CREATE_NEW_VALUE);
                if (setter == null)
                {
                        throw new WicketRuntimeException("Null object returned 
for expression: " + expression +
-                                       " for setting value: " + value + " on: 
" + object);
+                               " for setting value: " + value + " on: " + 
object);
                }
                setter.setValue(value, converter == null ? new 
PropertyResolverConverter(Application.get()
-                               .getConverterLocator(), 
Session.get().getLocale()) : converter);
+                       .getConverterLocator(), Session.get().getLocale()) : 
converter);
        }
 
        /**
@@ -141,7 +141,7 @@
                if (setter == null)
                {
                        throw new WicketRuntimeException("Null object returned 
for expression: " + expression +
-                                       " for getting the target classs of: " + 
object);
+                               " for getting the target classs of: " + object);
                }
                return setter.getTargetClass();
        }
@@ -158,7 +158,7 @@
                if (setter == null)
                {
                        throw new WicketRuntimeException("Null object returned 
for expression: " + expression +
-                                       " for getting the target classs of: " + 
object);
+                               " for getting the target classs of: " + object);
                }
                return setter.getField();
        }
@@ -175,7 +175,7 @@
                if (setter == null)
                {
                        throw new WicketRuntimeException("Null object returned 
for expression: " + expression +
-                                       " for getting the target classs of: " + 
object);
+                               " for getting the target classs of: " + object);
                }
                return setter.getGetter();
        }
@@ -192,17 +192,17 @@
                if (setter == null)
                {
                        throw new WicketRuntimeException("Null object returned 
for expression: " + expression +
-                                       " for getting the target classs of: " + 
object);
+                               " for getting the target classs of: " + object);
                }
                return setter.getSetter();
        }
 
        private static ObjectAndGetSetter getObjectAndGetSetter(final String 
expression,
-                       final Object object, int tryToCreateNull)
+               final Object object, int tryToCreateNull)
        {
                final String expressionBracketsSeperated = 
Strings.replaceAll(expression, "[", ".[")
-                               .toString();
-               int index = expressionBracketsSeperated.indexOf('.');
+                       .toString();
+               int index = getNextDotIndex(expressionBracketsSeperated, 0);
                int lastIndex = 0;
                Object value = object;
                Class clz = value.getClass();
@@ -220,11 +220,11 @@
 
                                // expression by it self can't be found. try to 
find a
                                // setPropertyByIndex(int,value) method
-                               index = 
expressionBracketsSeperated.indexOf('.', index + 1);
+                               index = 
getNextDotIndex(expressionBracketsSeperated, index + 1);
                                if (index != -1)
                                {
                                        String indexExpression = 
expressionBracketsSeperated
-                                                       .substring(lastIndex, 
index);
+                                               .substring(lastIndex, index);
                                        getAndSetter = 
getGetAndSetter(indexExpression, clz);
                                }
                                else
@@ -265,7 +265,7 @@
                        }
 
                        lastIndex = index + 1;
-                       index = expressionBracketsSeperated.indexOf('.', 
lastIndex);
+                       index = getNextDotIndex(expressionBracketsSeperated, 
lastIndex);
                        if (index == -1)
                        {
                                exp = 
expressionBracketsSeperated.substring(lastIndex);
@@ -277,6 +277,28 @@
        }
 
 
+       private static int getNextDotIndex(String expression, int start)
+       {
+               boolean insideBracket = false;
+               for (int i = start; i < expression.length(); i++)
+               {
+                       char ch = expression.charAt(i);
+                       if (ch == '.' && !insideBracket)
+                       {
+                               return i;
+                       }
+                       else if (ch == '[')
+                       {
+                               insideBracket = true;
+                       }
+                       else if (ch == ']')
+                       {
+                               insideBracket = false;
+                       }
+               }
+               return -1;
+       }
+
        private final static IGetAndSet getGetAndSetter(String exp, Class clz)
        {
                Map classesToGetAndSetters = getClassesToGetAndSetters();
@@ -325,7 +347,7 @@
                                                if (method != null)
                                                {
                                                        getAndSetter = new 
MethodGetAndSet(method, MethodGetAndSet.findSetter(
-                                                                       method, 
clz), null);
+                                                               method, clz), 
null);
                                                }
                                                else
                                                {
@@ -337,10 +359,10 @@
                                                        else
                                                        {
                                                                throw new 
WicketRuntimeException(
-                                                                               
"The expression '" +
-                                                                               
                exp +
-                                                                               
                "' is neither an index nor is it a method or field for the list 
" +
-                                                                               
                clz);
+                                                                       "The 
expression '" +
+                                                                               
exp +
+                                                                               
"' is neither an index nor is it a method or field for the list " +
+                                                                               
clz);
                                                        }
                                                }
                                        }
@@ -365,7 +387,7 @@
                                                else
                                                {
                                                        throw new 
WicketRuntimeException("can't parse the exp " + exp +
-                                                                       " as an 
index for an array lookup");
+                                                               " as an index 
for an array lookup");
                                                }
                                        }
                                }
@@ -390,7 +412,7 @@
                                                                        // 
getPropertyIndex(int)
                                                                        // and 
setPropertyIndex(int, object)
                                                                        String 
name = Character.toUpperCase(propertyName.charAt(0)) +
-                                                                               
        propertyName.substring(1);
+                                                                               
propertyName.substring(1);
                                                                        method 
= clz.getMethod("get" + name, new Class[] { int.class });
                                                                        
getAndSetter = new ArrayPropertyGetSet(method, parsedIndex);
 
@@ -398,8 +420,8 @@
                                                                catch 
(Exception e)
                                                                {
                                                                        throw 
new WicketRuntimeException(
-                                                                               
        "no get method defined for class: " + clz +
-                                                                               
                        " expression: " + propertyName);
+                                                                               
"no get method defined for class: " + clz +
+                                                                               
        " expression: " + propertyName);
                                                                }
                                                        }
                                                        else
@@ -409,14 +431,14 @@
                                                                // not good
                                                                // programming 
with beans patterns
                                                                throw new 
WicketRuntimeException(
-                                                                               
"No get method defined for class: " + clz +
-                                                                               
                " expression: " + exp);
+                                                                       "No get 
method defined for class: " + clz + " expression: " +
+                                                                               
exp);
                                                        }
                                                }
                                                else
                                                {
                                                        getAndSetter = new 
MethodGetAndSet(method, MethodGetAndSet.findSetter(
-                                                                       method, 
clz), field);
+                                                               method, clz), 
field);
                                                }
                                        }
                                        else
@@ -429,7 +451,7 @@
                        {
                                field = findField(clz, exp);
                                getAndSetter = new MethodGetAndSet(method, 
MethodGetAndSet.findSetter(method, clz),
-                                               field);
+                                       field);
                        }
                        getAndSetters.put(exp, getAndSetter);
                }
@@ -608,7 +630,7 @@
                public Object getValue(final Object object);
 
                /**
-                * @return
+                * @return The target class of the object that as to be set.
                 */
                public Class getTargetClass();
 
@@ -626,7 +648,7 @@
                 * @param converter
                 */
                public void setValue(final Object object, final Object value,
-                               PropertyResolverConverter converter);
+                       PropertyResolverConverter converter);
 
                /**
                 * @return Field or null if there is no field
@@ -813,7 +835,7 @@
                        catch (Exception e)
                        {
                                log.warn("Cannot set new value " + value + " at 
index " + index +
-                                               " for array holding elements of 
class " + clzComponentType, e);
+                                       " for array holding elements of class " 
+ clzComponentType, e);
                        }
                        return value;
                }
@@ -907,12 +929,12 @@
                        catch (InvocationTargetException ex)
                        {
                                throw new WicketRuntimeException("Error calling 
index property method: " +
-                                               getMethod + " on object: " + 
object, ex.getCause());
+                                       getMethod + " on object: " + object, 
ex.getCause());
                        }
                        catch (Exception ex)
                        {
                                throw new WicketRuntimeException("Error calling 
index property method: " +
-                                               getMethod + " on object: " + 
object, ex);
+                                       getMethod + " on object: " + object, 
ex);
                        }
                        return ret;
                }
@@ -933,7 +955,7 @@
                                if (converted == null && value != null)
                                {
                                        throw new ConversionException("Can't 
convert value: " + value + " to class: " +
-                                                       
getMethod.getReturnType() + " for setting it on " + object);
+                                               getMethod.getReturnType() + " 
for setting it on " + object);
                                }
                                try
                                {
@@ -942,18 +964,18 @@
                                catch (InvocationTargetException ex)
                                {
                                        throw new WicketRuntimeException("Error 
index property calling method: " +
-                                                       setMethod + " on 
object: " + object, ex.getCause());
+                                               setMethod + " on object: " + 
object, ex.getCause());
                                }
                                catch (Exception ex)
                                {
                                        throw new WicketRuntimeException("Error 
index property calling method: " +
-                                                       setMethod + " on 
object: " + object, ex);
+                                               setMethod + " on object: " + 
object, ex);
                                }
                        }
                        else
                        {
                                throw new WicketRuntimeException("no set method 
defined for value: " + value +
-                                               " on object: " + object);
+                                       " on object: " + object);
                        }
                }
 
@@ -1023,12 +1045,12 @@
                        catch (InvocationTargetException ex)
                        {
                                throw new WicketRuntimeException("Error calling 
method: " + getMethod +
-                                               " on object: " + object, 
ex.getCause());
+                                       " on object: " + object, ex.getCause());
                        }
                        catch (Exception ex)
                        {
                                throw new WicketRuntimeException("Error calling 
method: " + getMethod +
-                                               " on object: " + object, ex);
+                                       " on object: " + object, ex);
                        }
                        return ret;
                }
@@ -1039,7 +1061,7 @@
                 * @param converter
                 */
                public final void setValue(final Object object, final Object 
value,
-                               PropertyResolverConverter converter)
+                       PropertyResolverConverter converter)
                {
                        if (setMethod != null)
                        {
@@ -1049,14 +1071,14 @@
                                        if (value != null)
                                        {
                                                throw new 
ConversionException("Can't convert value: " + value +
-                                                               " to class: " + 
getMethod.getReturnType() + " for setting it on " +
-                                                               object);
+                                                       " to class: " + 
getMethod.getReturnType() + " for setting it on " +
+                                                       object);
                                        }
                                        else if 
(getMethod.getReturnType().isPrimitive())
                                        {
                                                throw new ConversionException(
-                                                               "Can't convert 
null value to a primitive class: " +
-                                                                               
getMethod.getReturnType() + " for setting it on " + object);
+                                                       "Can't convert null 
value to a primitive class: " +
+                                                               
getMethod.getReturnType() + " for setting it on " + object);
                                        }
                                }
                                try
@@ -1066,18 +1088,18 @@
                                catch (InvocationTargetException ex)
                                {
                                        throw new WicketRuntimeException("Error 
calling method: " + setMethod +
-                                                       " on object: " + 
object, ex.getCause());
+                                               " on object: " + object, 
ex.getCause());
                                }
                                catch (Exception ex)
                                {
                                        throw new WicketRuntimeException("Error 
calling method: " + setMethod +
-                                                       " on object: " + 
object, ex);
+                                               " on object: " + object, ex);
                                }
                        }
                        else
                        {
                                throw new WicketRuntimeException("no set method 
defined for value: " + value +
-                                               " on object: " + object);
+                                       " on object: " + object);
                        }
                }
 
@@ -1198,7 +1220,7 @@
                        catch (Exception ex)
                        {
                                throw new WicketRuntimeException("Error getting 
field value of field " + field +
-                                               " from object " + object, ex);
+                                       " from object " + object, ex);
                        }
                }
 
@@ -1235,7 +1257,7 @@
                        catch (Exception ex)
                        {
                                throw new WicketRuntimeException("Error setting 
field value of field " + field +
-                                               " on object " + object + ", 
value " + value, ex);
+                                       " on object " + object + ", value " + 
value, ex);
                        }
                }
 

Modified: 
wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java?rev=591639&r1=591638&r2=591639&view=diff
==============================================================================
--- 
wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java
 (original)
+++ 
wicket/trunk/jdk-1.4/wicket/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java
 Sat Nov  3 08:59:56 2007
@@ -42,7 +42,7 @@
 public class PropertyResolverTest extends TestCase
 {
        private static final PropertyResolverConverter CONVERTER = new 
PropertyResolverConverter(
-                       new ConverterLocator(), Locale.US);
+               new ConverterLocator(), Locale.US);
 
        private Person person;
        private MockWebApplication app;
@@ -151,7 +151,7 @@
                {
                        PropertyResolver.setValue("country.name", person, "US", 
CONVERTER);
                        throw new Exception(
-                                       "name can't be set on a country that 
doesn't have default constructor");
+                               "name can't be set on a country that doesn't 
have default constructor");
                }
                catch (WicketRuntimeException ex)
                {
@@ -212,6 +212,23 @@
        /**
         * @throws Exception
         */
+       public void testMapWithDotLookup() throws Exception
+       {
+               Address address = new Address();
+               HashMap hm = new HashMap();
+               PropertyResolver.setValue("addressMap", person, hm, CONVERTER);
+               PropertyResolver.setValue("addressMap[address.test]", person, 
address, CONVERTER);
+               assertNotNull(hm.get("address.test"));
+               PropertyResolver.setValue("addressMap[address.test].street", 
person, "wicket-street",
+                       CONVERTER);
+               String street = (String)PropertyResolver
+                       .getValue("addressMap[address.test].street", person);
+               assertEquals(street, "wicket-street");
+       }
+
+       /**
+        * @throws Exception
+        */
        public void testListLookup() throws Exception
        {
                PropertyResolver.setValue("addressList", person, new 
ArrayList(), CONVERTER);
@@ -232,7 +249,7 @@
        public void testArrayLookup() throws Exception
        {
                PropertyResolver.setValue("addressArray", person, new Address[] 
{ new Address(), null },
-                               CONVERTER);
+                       CONVERTER);
                PropertyResolver.setValue("addressArray.0.street", person, 
"wicket-street", CONVERTER);
                String street = 
(String)PropertyResolver.getValue("addressArray.0.street", person);
                assertEquals(street, "wicket-street");
@@ -248,7 +265,7 @@
        public void testArrayLookupByBrackets() throws Exception
        {
                PropertyResolver.setValue("addressArray", person, new Address[] 
{ new Address(), null },
-                               CONVERTER);
+                       CONVERTER);
                PropertyResolver.setValue("addressArray[0].street", person, 
"wicket-street", CONVERTER);
                String street = 
(String)PropertyResolver.getValue("addressArray[0].street", person);
                assertEquals(street, "wicket-street");


Reply via email to