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>