You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2008/08/31 20:18:54 UTC

svn commit: r690747 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src: main/java/org/apache/ibatis/reflection/MetaObject.java test/java/org/apache/ibatis/reflection/MetaObjectTest.java

Author: cbegin
Date: Sun Aug 31 11:18:53 2008
New Revision: 690747

URL: http://svn.apache.org/viewvc?rev=690747&view=rev
Log:
added support for map[key] syntax

Modified:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java?rev=690747&r1=690746&r2=690747&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java Sun Aug 31 11:18:53 2008
@@ -37,17 +37,20 @@
   }
 
   public String findProperty(String propName) {
-    if (object instanceof Map) return propName;
+    if (object instanceof Map)
+      return propName;
     return metaClass.findProperty(propName);
   }
 
   public String[] getGetterNames() {
-    if (object instanceof Map) return (String[]) ((Map) object).keySet().toArray(new String[((Map) object).size()]);
+    if (object instanceof Map)
+      return (String[]) ((Map) object).keySet().toArray(new String[((Map) object).size()]);
     return metaClass.getGetterNames();
   }
 
   public String[] getSetterNames() {
-    if (object instanceof Map) return (String[]) ((Map) object).keySet().toArray(new String[((Map) object).size()]);
+    if (object instanceof Map)
+      return (String[]) ((Map) object).keySet().toArray(new String[((Map) object).size()]);
     return metaClass.getSetterNames();
   }
 
@@ -84,7 +87,8 @@
   }
 
   public boolean hasSetter(String name) {
-    if (object instanceof Map) return true;
+    if (object instanceof Map)
+      return true;
     PropertyTokenizer prop = new PropertyTokenizer(name);
     if (prop.hasNext()) {
       MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
@@ -99,7 +103,8 @@
   }
 
   public boolean hasGetter(String name) {
-    if (object instanceof Map) return true;
+    if (object instanceof Map)
+      return true;
     PropertyTokenizer prop = new PropertyTokenizer(name);
     if (prop.hasNext()) {
       MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
@@ -123,7 +128,7 @@
         return metaValue.getValue(prop.getChildren());
       }
     } else {
-      return getProperty(object, prop);
+      return getProperty(prop, object);
     }
   }
 
@@ -139,7 +144,7 @@
           try {
             Object newObject = objectFactory.create(type);
             metaValue = MetaObject.forObject(newObject);
-            setProperty(object, prop, newObject);
+            setProperty(prop, object, newObject);
           } catch (Exception e) {
             throw new RuntimeException("Cannot set value of property '" + name + "' because '" + name + "' is null and cannot be instantiated on instance of " + type.getName() + ". Cause:" + e.toString(), e);
           }
@@ -147,38 +152,38 @@
       }
       metaValue.setValue(prop.getChildren(), value);
     } else {
-      setProperty(object, prop, value);
+      setProperty(prop, object, value);
     }
 
   }
 
-  private Object getProperty(Object object, PropertyTokenizer prop) {
+  private Object getProperty(PropertyTokenizer prop, Object object) {
     if (prop.getIndex() != null) {
-      return getIndexedProperty(object, prop);
+      return getIndexedProperty(prop, object);
     } else {
-      return getBeanOrMapProperty(object, prop);
+      return getBeanOrMapProperty(prop, object);
     }
   }
 
-  private Object getBeanOrMapProperty(Object object, PropertyTokenizer prop) {
+  private Object getBeanOrMapProperty(PropertyTokenizer prop, Object object) {
     if (object instanceof Map) {
       return ((Map) object).get(prop.getName());
     } else {
-      return getBeanProperty(object, prop);
+      return getBeanProperty(prop, object);
     }
   }
 
-  private void setProperty(Object object, PropertyTokenizer prop, Object value) {
+  private void setProperty(PropertyTokenizer prop, Object object, Object value) {
     if (prop.getIndex() != null) {
-      setIndexedProperty(object, prop, value);
+      setIndexedProperty(prop, object, value);
     } else if (object instanceof Map) {
       ((Map) object).put(prop.getName(), value);
     } else {
-      setBeanProperty(object, prop, value);
+      setBeanProperty(prop, object, value);
     }
   }
 
-  private Object getBeanProperty(Object object, PropertyTokenizer prop) {
+  private Object getBeanProperty(PropertyTokenizer prop, Object object) {
     try {
       Invoker method = metaClass.getGetInvoker(prop.getName());
       try {
@@ -193,7 +198,7 @@
     }
   }
 
-  private void setBeanProperty(Object object, PropertyTokenizer prop, Object value) {
+  private void setBeanProperty(PropertyTokenizer prop, Object object, Object value) {
     try {
       Invoker method = metaClass.getSetInvoker(prop.getName());
       Object[] params = {value};
@@ -207,83 +212,82 @@
     }
   }
 
-  private Object getIndexedProperty(Object object, PropertyTokenizer prop) {
-    Object value;
-    try {
-      int i = Integer.parseInt(prop.getIndex());
-      Object list;
-      if ("".equals(prop.getName())) {
-        list = object;
-      } else {
-        list = getBeanOrMapProperty(object, prop);
-      }
-      if (list instanceof List) {
-        value = ((List) list).get(i);
-      } else if (list instanceof Object[]) {
-        value = ((Object[]) list)[i];
-      } else if (list instanceof char[]) {
-        value = ((char[]) list)[i];
-      } else if (list instanceof boolean[]) {
-        value = ((boolean[]) list)[i];
-      } else if (list instanceof byte[]) {
-        value = ((byte[]) list)[i];
-      } else if (list instanceof double[]) {
-        value = ((double[]) list)[i];
-      } else if (list instanceof float[]) {
-        value = ((float[]) list)[i];
-      } else if (list instanceof int[]) {
-        value = ((int[]) list)[i];
-      } else if (list instanceof long[]) {
-        value = ((long[]) list)[i];
-      } else if (list instanceof short[]) {
-        value = ((short[]) list)[i];
-      } else {
-        throw new RuntimeException("The '" + prop.getName() + "' property of " + object + " is not a List or Array.");
-      }
-    } catch (RuntimeException e) {
-      throw e;
-    } catch (Exception e) {
-      throw new RuntimeException("Error getting ordinal list from JavaBean. Cause " + e, e);
+  private Object resolveCollection(PropertyTokenizer prop, Object object) {
+    if ("".equals(prop.getName())) {
+      return object;
+    } else {
+      return getBeanOrMapProperty(prop, object);
     }
-    return value;
   }
 
-  private void setIndexedProperty(Object object, PropertyTokenizer prop, Object value) {
-    try {
-      int i = Integer.parseInt(prop.getIndex());
-      Object list;
-      if ("".equals(prop.getName())) {
-        list = object;
-      } else {
-        list = getBeanOrMapProperty(object, prop);
-      }
-      if (list instanceof List) {
-        ((List) list).set(i, value);
-      } else if (list instanceof Object[]) {
-        ((Object[]) list)[i] = value;
-      } else if (list instanceof char[]) {
-        ((char[]) list)[i] = (Character) value;
-      } else if (list instanceof boolean[]) {
-        ((boolean[]) list)[i] = (Boolean) value;
-      } else if (list instanceof byte[]) {
-        ((byte[]) list)[i] = (Byte) value;
-      } else if (list instanceof double[]) {
-        ((double[]) list)[i] = (Double) value;
-      } else if (list instanceof float[]) {
-        ((float[]) list)[i] = (Float) value;
-      } else if (list instanceof int[]) {
-        ((int[]) list)[i] = (Integer) value;
-      } else if (list instanceof long[]) {
-        ((long[]) list)[i] = (Long) value;
-      } else if (list instanceof short[]) {
-        ((short[]) list)[i] = (Short) value;
-      } else {
-        throw new RuntimeException("The '" + prop.getName() + "' property of " + object + " is not a List or Array.");
-      }
-    } catch (RuntimeException e) {
-      throw e;
-    } catch (Exception e) {
-      throw new RuntimeException("Error getting ordinal value from JavaBean. Cause " + e, e);
+  private Object getIndexedProperty(PropertyTokenizer prop, Object object) {
+    Object collection = resolveCollection(prop, object);
+    if (collection instanceof Map) {
+      return ((Map)collection).get(prop.getIndex());
+    }
+    return getListValue(prop, collection);
+  }
+
+  private Object getListValue(PropertyTokenizer prop, Object list) {
+    int i = Integer.parseInt(prop.getIndex());
+    if (list instanceof List) {
+      return ((List) list).get(i);
+    } else if (list instanceof Object[]) {
+      return ((Object[]) list)[i];
+    } else if (list instanceof char[]) {
+      return ((char[]) list)[i];
+    } else if (list instanceof boolean[]) {
+      return ((boolean[]) list)[i];
+    } else if (list instanceof byte[]) {
+      return ((byte[]) list)[i];
+    } else if (list instanceof double[]) {
+      return ((double[]) list)[i];
+    } else if (list instanceof float[]) {
+      return ((float[]) list)[i];
+    } else if (list instanceof int[]) {
+      return ((int[]) list)[i];
+    } else if (list instanceof long[]) {
+      return ((long[]) list)[i];
+    } else if (list instanceof short[]) {
+      return ((short[]) list)[i];
+    } else {
+      throw new RuntimeException("The '" + prop.getName() + "' property of " + list + " is not a List or Array.");
+    }
+  }
+
+  private void setIndexedProperty(PropertyTokenizer prop, Object object, Object value) {
+    Object collection = resolveCollection(prop, object);
+    if (collection instanceof Map) {
+      ((Map)collection).put(prop.getIndex(),value);
+    } else {
+      setListValue(prop, collection, value);
+    }    
+  }
+
+  private void setListValue(PropertyTokenizer prop, Object list, Object value) {
+    int i = Integer.parseInt(prop.getIndex());
+    if (list instanceof List) {
+      ((List) list).set(i, value);
+    } else if (list instanceof Object[]) {
+      ((Object[]) list)[i] = value;
+    } else if (list instanceof char[]) {
+      ((char[]) list)[i] = (Character) value;
+    } else if (list instanceof boolean[]) {
+      ((boolean[]) list)[i] = (Boolean) value;
+    } else if (list instanceof byte[]) {
+      ((byte[]) list)[i] = (Byte) value;
+    } else if (list instanceof double[]) {
+      ((double[]) list)[i] = (Double) value;
+    } else if (list instanceof float[]) {
+      ((float[]) list)[i] = (Float) value;
+    } else if (list instanceof int[]) {
+      ((int[]) list)[i] = (Integer) value;
+    } else if (list instanceof long[]) {
+      ((long[]) list)[i] = (Long) value;
+    } else if (list instanceof short[]) {
+      ((short[]) list)[i] = (Short) value;
+    } else {
+      throw new RuntimeException("The '" + prop.getName() + "' property of " + list + " is not a List or Array.");
     }
   }
 

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java?rev=690747&r1=690746&r2=690747&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java Sun Aug 31 11:18:53 2008
@@ -47,6 +47,14 @@
   }
 
   @Test
+  public void shouldGetAndSetMapPairUsingArraySyntax() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richMap[key]", "foo");
+    Assert.assertEquals("foo", meta.getValue("richMap[key]"));
+  }
+
+  @Test
   public void shouldGetAndSetNestedMapPair() {
     RichType rich = new RichType();
     MetaObject meta = MetaObject.forObject(rich);
@@ -55,6 +63,14 @@
   }
 
   @Test
+  public void shouldGetAndSetNestedMapPairUsingArraySyntax() {
+    RichType rich = new RichType();
+    MetaObject meta = MetaObject.forObject(rich);
+    meta.setValue("richType.richMap[key]", "foo");
+    Assert.assertEquals("foo", meta.getValue("richType.richMap[key]"));
+  }
+
+  @Test
   public void shouldGetAndSetListItem() {
     RichType rich = new RichType();
     MetaObject meta = MetaObject.forObject(rich);