You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by bg...@apache.org on 2007/02/14 07:46:11 UTC

svn commit: r507416 - in /ibatis/trunk/java/mapper/mapper2: src/com/ibatis/common/beans/ComplexBeanProbe.java test/com/ibatis/sqlmap/NestedIterateTest.java test/com/ibatis/sqlmap/maps/NestedIterateStatements.xml

Author: bgoodin
Date: Tue Feb 13 22:46:10 2007
New Revision: 507416

URL: http://svn.apache.org/viewvc?view=rev&rev=507416
Log:
IBATIS-391 fixed and added additional unit tests for handling lists nested in beans and maps.

Modified:
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/ComplexBeanProbe.java
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/NestedIterateTest.java
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/NestedIterateStatements.xml

Modified: ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/ComplexBeanProbe.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/ComplexBeanProbe.java?view=diff&rev=507416&r1=507415&r2=507416
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/ComplexBeanProbe.java (original)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/ComplexBeanProbe.java Tue Feb 13 22:46:10 2007
@@ -29,7 +29,7 @@
  * Examples:
  * <p/>
  * StaticBeanProbe.setObject(object, propertyName, value);
- * <P>
+ * <p/>
  * Object value = StaticBeanProbe.getObject(object, propertyName);
  */
 public class ComplexBeanProbe extends BaseProbe {
@@ -292,24 +292,38 @@
   }
 
   protected Object getProperty(Object object, String name) {
-    ClassInfo classCache = ClassInfo.getInstance(object.getClass());
     try {
       Object value = null;
       if (name.indexOf('[') > -1) {
         value = getIndexedProperty(object, name);
       } else {
         if (object instanceof Map) {
-          value = ((Map) object).get(name);
-        } else {
-          Invoker method = classCache.getGetInvoker(name);
-          if (method == null) {
-            throw new NoSuchMethodException("No GET method for property " + name + " on instance of " + object.getClass().getName());
+          int index = name.indexOf('.');
+          if (index > -1) {
+            String mapId = name.substring(0, index);
+            value = getProperty(((Map) object).get(mapId), name.substring(index + 1));
+          } else {
+            value = ((Map) object).get(name);
           }
-          try {
-            value = method.invoke(object, NO_ARGUMENTS);
-          } catch (Throwable t) {
-            throw ClassInfo.unwrapThrowable(t);
+
+        } else {
+          int index = name.indexOf('.');
+          if (index > -1) {
+            String newName = name.substring(0, index);
+            value = getProperty(getObject(object, newName), name.substring(index + 1));
+          } else {
+            ClassInfo classCache = ClassInfo.getInstance(object.getClass());
+            Invoker method = classCache.getGetInvoker(name);
+            if (method == null) {
+              throw new NoSuchMethodException("No GET method for property " + name + " on instance of " + object.getClass().getName());
+            }
+            try {
+              value = method.invoke(object, NO_ARGUMENTS);
+            } catch (Throwable t) {
+              throw ClassInfo.unwrapThrowable(t);
+            }
           }
+
         }
       }
       return value;

Modified: ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/NestedIterateTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/NestedIterateTest.java?view=diff&rev=507416&r1=507415&r2=507416
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/NestedIterateTest.java (original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/NestedIterateTest.java Tue Feb 13 22:46:10 2007
@@ -2,8 +2,12 @@
 
 import testdomain.NestedIterateParameterObject;
 import testdomain.Person;
+import testdomain.SimpleNestedParameterObject;
 
 import java.util.List;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
 public class NestedIterateTest extends BaseSqlMapTest {
 
@@ -725,4 +729,153 @@
       fail(e.getMessage());
     }
   }
+
+  /**
+   * This tests nesting when objects are maps and not a list nested in a list
+   */
+  public void test26() {
+
+    NestedIterateParameterObject po = new NestedIterateParameterObject();
+    po.addId(new Integer(1));
+    po.addId(new Integer(2));
+    po.addId(new Integer(3));
+    po.addId(new Integer(4));
+    po.addId(new Integer(5));
+    po.addId(new Integer(6));
+    po.addId(new Integer(7));
+    po.addId(new Integer(8));
+    po.addId(new Integer(9));
+
+    Map params = new HashMap();
+    params.put("po",po);
+
+    try {
+      List results = sqlMap.queryForList("NestedIterateTest26", params);
+      assertEquals(3, results.size());
+      assertEquals(1, ((Person) results.get(0)).getId().intValue());
+      assertEquals(2, ((Person) results.get(1)).getId().intValue());
+      assertEquals(3, ((Person) results.get(2)).getId().intValue());
+    } catch (Exception e) {
+      fail(e.getMessage());
+    }
+
+  }
+
+  /**
+   * This tests nesting when objects are maps and not a list nested in a list
+   * same as test26 except deeper
+   */
+  public void test27() {
+
+    Map firstMap = new HashMap();
+
+    List firstList = new ArrayList();
+
+    Map params = new HashMap();
+
+    NestedIterateParameterObject po = new NestedIterateParameterObject();
+    po.addId(new Integer(1));
+    po.addId(new Integer(2));
+    po.addId(new Integer(3));
+    po.addId(new Integer(4));
+    po.addId(new Integer(5));
+    po.addId(new Integer(6));
+    po.addId(new Integer(7));
+    po.addId(new Integer(8));
+    po.addId(new Integer(9));
+
+    params.put("po",po);
+
+    firstList.add(params);
+
+    firstMap.put("firstList",firstList);
+
+    try {
+      List results = sqlMap.queryForList("NestedIterateTest27", firstMap);
+      assertEquals(3, results.size());
+      assertEquals(1, ((Person) results.get(0)).getId().intValue());
+      assertEquals(2, ((Person) results.get(1)).getId().intValue());
+      assertEquals(3, ((Person) results.get(2)).getId().intValue());
+    } catch (Exception e) {
+      fail(e.getMessage());
+    }
+
+  }
+
+
+  /**
+   * This tests nesting when objects are maps and not a list nested in a list
+   */
+  public void test28() {
+
+    NestedIterateParameterObject po = new NestedIterateParameterObject();
+    po.addId(new Integer(1));
+    po.addId(new Integer(2));
+    po.addId(new Integer(3));
+    po.addId(new Integer(4));
+    po.addId(new Integer(5));
+    po.addId(new Integer(6));
+    po.addId(new Integer(7));
+    po.addId(new Integer(8));
+    po.addId(new Integer(9));
+
+    SimpleNestedParameterObject simpleNestedParameterObject =
+        new SimpleNestedParameterObject();
+
+    simpleNestedParameterObject.setNestedIterateParameterObject(po);
+
+    try {
+      List results = sqlMap.queryForList("NestedIterateTest28", simpleNestedParameterObject);
+      assertEquals(3, results.size());
+      assertEquals(1, ((Person) results.get(0)).getId().intValue());
+      assertEquals(2, ((Person) results.get(1)).getId().intValue());
+      assertEquals(3, ((Person) results.get(2)).getId().intValue());
+    } catch (Exception e) {
+      fail(e.getMessage());
+    }
+
+  }
+
+  /**
+   * This tests nesting when objects are maps and not a list nested in a list
+   * same as test26 except deeper
+   */
+  public void test29() {
+
+    SimpleNestedParameterObject firstParameterObject =
+        new SimpleNestedParameterObject();
+
+    SimpleNestedParameterObject secondParameterObject =
+        new SimpleNestedParameterObject();
+
+    List parameterObjectList = new ArrayList();
+
+    NestedIterateParameterObject po = new NestedIterateParameterObject();
+    po.addId(new Integer(1));
+    po.addId(new Integer(2));
+    po.addId(new Integer(3));
+    po.addId(new Integer(4));
+    po.addId(new Integer(5));
+    po.addId(new Integer(6));
+    po.addId(new Integer(7));
+    po.addId(new Integer(8));
+    po.addId(new Integer(9));
+
+    secondParameterObject.setNestedIterateParameterObject(po);
+
+    parameterObjectList.add(secondParameterObject);
+
+    firstParameterObject.setNestedList(parameterObjectList);
+
+    try {
+      List results = sqlMap.queryForList("NestedIterateTest29", firstParameterObject);
+      assertEquals(3, results.size());
+      assertEquals(1, ((Person) results.get(0)).getId().intValue());
+      assertEquals(2, ((Person) results.get(1)).getId().intValue());
+      assertEquals(3, ((Person) results.get(2)).getId().intValue());
+    } catch (Exception e) {
+      fail(e.getMessage());
+    }
+  }
+
 }

Modified: ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/NestedIterateStatements.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/NestedIterateStatements.xml?view=diff&rev=507416&r1=507415&r2=507416
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/NestedIterateStatements.xml (original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/NestedIterateStatements.xml Tue Feb 13 22:46:10 2007
@@ -371,4 +371,57 @@
     </iterate>
     order by id
   </select>
+
+  <!-- test nested map -->
+  <select id="NestedIterateTest26" resultMap="personResult" parameterClass="map">
+    select id, first_name, last_name
+    from person
+    <iterate property="po.idList" conjunction="or" prepend="where" open="(" close=")">
+      <isLessThan property="po.idList[]" compareValue="4" >
+        id = #po.idList[]#
+      </isLessThan>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test deeper combo of list maps nesting -->
+  <select id="NestedIterateTest27" resultMap="personResult" parameterClass="map">
+    select id, first_name, last_name
+    from person
+    <iterate property="firstList">
+      <iterate property="firstList[].po.idList" conjunction="or" prepend="where" open="(" close=")">
+        <isLessThan property="firstList[].po.idList[]" compareValue="4">
+          id = #firstList[].po.idList[]#
+        </isLessThan>
+      </iterate>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test nested object -->
+  <select id="NestedIterateTest28" resultMap="personResult" parameterClass="testdomain.SimpleNestedParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="nestedIterateParameterObject.idList" conjunction="or" prepend="where" open="(" close=")">
+      <isLessThan property="nestedIterateParameterObject.idList[]" compareValue="4" >
+        id = #nestedIterateParameterObject.idList[]#
+      </isLessThan>
+    </iterate>
+    order by id
+  </select>
+
+  <!-- test deeper combo of list bean nesting -->
+  <select id="NestedIterateTest29" resultMap="personResult" parameterClass="testdomain.SimpleNestedParameterObject">
+    select id, first_name, last_name
+    from person
+    <iterate property="nestedList">
+      <iterate property="nestedList[].nestedIterateParameterObject.idList" conjunction="or" prepend="where" open="(" close=")">
+        <isLessThan property="nestedList[].nestedIterateParameterObject.idList[]" compareValue="4">
+          id = #nestedList[].nestedIterateParameterObject.idList[]#
+        </isLessThan>
+      </iterate>
+    </iterate>
+    order by id
+  </select>
+
 </sqlMap>