Author: bgoodin
Date: Wed Sep  7 07:37:49 2005
New Revision: 279330

URL: http://svn.apache.org/viewcvs?rev=279330&view=rev
Log:
IBATIS-131
 I Added additional code in BaseProbe, GenericProbe. ConditionalTagHandler, 
IterateTagHandler to handle the conditions expressed in bug report 131.

Unit tests sql was added to DynamicAccount.xml. Test code was added to 
IterateTest and DynamicPrependTest  to test various index property permutations.

I had to add type checking of Arrays and Lists. I also adde index value 
replacement parsing for attributes.

All unit tests have passed. However, i would strongly encourage users to test 
existing code and make sure there are no failures. Evertyhing should be fine. 
But, i'd rather be safe than sorry.

Modified:
    ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/BaseProbe.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/GenericProbe.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
    
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/IterateTagHandler.java
    
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/DynamicPrependTest.java
    ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/IterateTest.java
    
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DynamicAccount.xml
    ibatis/trunk/java/mapper/mapper2/test/compatibility/domain/MyBean.java

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/BaseProbe.java
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/BaseProbe.java?rev=279330&r1=279329&r2=279330&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/BaseProbe.java 
(original)
+++ ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/BaseProbe.java 
Wed Sep  7 07:37:49 2005
@@ -49,7 +49,13 @@
     try {
       String name = indexedName.substring(0, indexedName.indexOf("["));
       int i = Integer.parseInt(indexedName.substring(indexedName.indexOf("[") 
+ 1, indexedName.indexOf("]")));
-      Object list = getProperty(object, name);
+      Object list = null;
+      if(name.equals("")) {
+        list = object;        
+      } else {
+        list = getProperty(object, name);
+      }
+
       if (list instanceof List) {
         value = ((List) list).get(i);
       } else if (list instanceof Object[]) {
@@ -70,6 +76,53 @@
         value = new Long(((long[]) list)[i]);
       } else if (list instanceof short[]) {
         value = new Short(((short[]) list)[i]);
+      } else {
+        throw new ProbeException("The '" + name + "' property of the " + 
object.getClass().getName() + " class is not a List or Array.");
+      }
+
+    } catch (ProbeException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new ProbeException("Error getting ordinal list from JavaBean. 
Cause " + e, e);
+    }
+
+    return value;
+  }
+
+  protected Class getIndexedType(Object object, String indexedName) {
+
+    Class value = null;
+
+    try {
+      String name = indexedName.substring(0, indexedName.indexOf("["));
+      int i = Integer.parseInt(indexedName.substring(indexedName.indexOf("[") 
+ 1, indexedName.indexOf("]")));
+      Object list = null;
+      if(!name.equals("")) {
+        list = getProperty(object, name);
+      } else {
+        list = object;
+      }
+
+      if (list instanceof List) {
+        value = ((List) list).get(i).getClass();
+      } else if (list instanceof Object[]) {
+        value = ((Object[]) list)[i].getClass();
+      } else if (list instanceof char[]) {
+        value = Character.class;
+      } else if (list instanceof boolean[]) {
+        value = Boolean.class;
+      } else if (list instanceof byte[]) {
+        value = Byte.class;
+      } else if (list instanceof double[]) {
+        value = Double.class;
+      } else if (list instanceof float[]) {
+        value = Float.class;
+      } else if (list instanceof int[]) {
+        value = Integer.class;
+      } else if (list instanceof long[]) {
+        value = Long.class;
+      } else if (list instanceof short[]) {
+        value = Short.class;
       } else {
         throw new ProbeException("The '" + name + "' property of the " + 
object.getClass().getName() + " class is not a List or Array.");
       }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/GenericProbe.java
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/GenericProbe.java?rev=279330&r1=279329&r2=279330&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/GenericProbe.java 
(original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/common/beans/GenericProbe.java 
Wed Sep  7 07:37:49 2005
@@ -36,7 +36,7 @@
   private static final BaseProbe DOM_PROBE = new DomProbe();
   private static final String START_INDEX = "[";
   private static final String END_INDEX = "]";
-  
+
   protected GenericProbe() {
   }
 
@@ -49,10 +49,29 @@
    * @see com.ibatis.common.beans.BaseProbe#getObject(java.lang.Object, 
java.lang.String)
    */
   public Object getObject(Object object, String name) {
+    
     if (object instanceof org.w3c.dom.Document) {
       return DOM_PROBE.getObject(object, name);
     } else if (object instanceof List) {
-      return ((List)object).get(new 
Integer(name.substring(1,name.indexOf(END_INDEX))).intValue());
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof Object[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof char[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof boolean[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof byte[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof double[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof float[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof int[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof long[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
+    } else if (object instanceof short[]) {
+      return BEAN_PROBE.getIndexedProperty(object, name);
     } else {
       return BEAN_PROBE.getObject(object, name);
     }
@@ -136,6 +155,8 @@
       return getClassPropertyTypeForGetter((Class) object, name);
     } else if (object instanceof org.w3c.dom.Document) {
       return DOM_PROBE.getPropertyTypeForGetter(object, name);
+    } else if (name.indexOf("[") > -1) {
+      return BEAN_PROBE.getIndexedType(object,name);
     } else {
       return BEAN_PROBE.getPropertyTypeForGetter(object, name);
     }

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java?rev=279330&r1=279329&r2=279330&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/ConditionalTagHandler.java
 Wed Sep  7 07:37:49 2005
@@ -17,6 +17,7 @@
 
 import com.ibatis.common.beans.Probe;
 import com.ibatis.common.beans.ProbeFactory;
+import com.ibatis.common.beans.GenericProbe;
 import com.ibatis.common.exception.NestedRuntimeException;
 
 import java.math.BigDecimal;
@@ -34,6 +35,10 @@
   private static final String DATE_MASK = "yyyy/MM/dd hh:mm:ss";
   private static final DateFormat DATE_FORMAT = new 
SimpleDateFormat(DATE_MASK);
 
+  private static final String START_INDEX = "[";
+  private static final String END_INDEX = "]";
+  private static final String EMPTY_INDEX = "[]";
+
   public abstract boolean isCondition(SqlTagContext ctx, SqlTag tag, Object 
parameterObject);
 
   public int doStartFragment(SqlTagContext ctx, SqlTag tag, Object 
parameterObject) {
@@ -72,7 +77,23 @@
     String prop = tag.getPropertyAttr();
     Object value1;
     Class type;
+    IterateContext itCtx = ctx.peekIterateContext();
+
     if (prop != null) {
+
+      if(null != itCtx && itCtx.isAllowNext()){
+        itCtx.next();
+        itCtx.setAllowNext(false);
+        if(!itCtx.hasNext()) {
+          itCtx.setFinal(true);
+        }
+      }
+
+      if(prop.indexOf(START_INDEX) > -1) {
+        propertyName = new StringBuffer(propertyName).insert(
+                        
propertyName.indexOf(END_INDEX),itCtx.getIndex()).toString();
+      }
+
       value1 = PROBE.getObject(parameterObject, propertyName);
       type = PROBE.getPropertyTypeForGetter(parameterObject, propertyName);
     } else {

Modified: 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/IterateTagHandler.java
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/IterateTagHandler.java?rev=279330&r1=279329&r2=279330&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/IterateTagHandler.java
 (original)
+++ 
ibatis/trunk/java/mapper/mapper2/src/com/ibatis/sqlmap/engine/mapping/sql/dynamic/elements/IterateTagHandler.java
 Wed Sep  7 07:37:49 2005
@@ -66,10 +66,13 @@
           bodyContent.insert(0, open);
         }
       }
-      if (!iterate.isLast()) {
-        String conj = tag.getConjunctionAttr();
-        if (conj != null) {
-          bodyContent.append(conj);
+
+      if (!iterate.isFirst()) {
+        if(!bodyContent.toString().trim().equals("")) {
+          String conj = tag.getConjunctionAttr();
+          if (conj != null) {
+            bodyContent.insert(0,conj);
+          }
         }
       }
 

Modified: 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/DynamicPrependTest.java
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/DynamicPrependTest.java?rev=279330&r1=279329&r2=279330&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/DynamicPrependTest.java 
(original)
+++ 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/DynamicPrependTest.java 
Wed Sep  7 07:37:49 2005
@@ -72,6 +72,53 @@
     List list = sqlMap.queryForList("dynamicIterateWithPrepend2c", x);
     assertAccount1((Account) list.get(0));
     assertEquals(3, list.size());
+    assertEquals(1,((Account) list.get(0)).getId());
+    assertEquals(2,((Account) list.get(1)).getId());
+
+  }
+
+  public void testIterateWithPrepend2d() throws SQLException {
+
+    List params = Arrays.asList(new Integer[]{new Integer(1), new Integer(2), 
new Integer(3)});
+
+    MyBean x = new MyBean();
+    x.setMyList(params);
+
+    List list = sqlMap.queryForList("dynamicIterateWithPrepend2d", x);
+    assertAccount1((Account) list.get(0));
+    assertEquals(2, list.size());
+    assertEquals(1,((Account) list.get(0)).getId());
+    assertEquals(3,((Account) list.get(1)).getId());
+
+  }
+
+  public void testIterateWithPrepend2e() throws SQLException {
+
+    Object[] params = new Object[]{new Integer(1), new Integer(2), new 
Integer(3)};
+
+    MyBean x = new MyBean();
+    x.setMyArray(params);
+
+    List list = sqlMap.queryForList("dynamicIterateWithPrepend2e", x);
+    assertAccount1((Account) list.get(0));
+    assertEquals(2, list.size());
+    assertEquals(1,((Account) list.get(0)).getId());
+    assertEquals(3,((Account) list.get(1)).getId());
+
+  }
+
+  public void testIterateWithPrepend2f() throws SQLException {
+
+    int[] params = new int[]{1,2,3};
+
+    MyBean x = new MyBean();
+    x.setIntArray(params);
+
+    List list = sqlMap.queryForList("dynamicIterateWithPrepend2f", x);
+    assertAccount1((Account) list.get(0));
+    assertEquals(2, list.size());
+    assertEquals(1,((Account) list.get(0)).getId());
+    assertEquals(3,((Account) list.get(1)).getId());
 
   }
 

Modified: 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/IterateTest.java
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/IterateTest.java?rev=279330&r1=279329&r2=279330&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/IterateTest.java 
(original)
+++ ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/IterateTest.java 
Wed Sep  7 07:37:49 2005
@@ -25,7 +25,16 @@
   }
 
   // Iterate
-  
+
+  public void testIterateInConditional() throws SQLException {
+    List params = Arrays.asList(new Integer[]{new Integer(1), new Integer(2), 
new Integer(3)});
+    List list = sqlMap.queryForList("dynamicIterateInConditional", params);
+    assertEquals(2, list.size());
+    assertAccount1((Account) list.get(0));
+    assertEquals(1,((Account) list.get(0)).getId());
+    assertEquals(3,((Account) list.get(1)).getId());
+  }
+
   public void testIterateLiteral() throws SQLException {
     List params = Arrays.asList(new Integer[]{new Integer(1), new Integer(2), 
new Integer(3)});
     List list = sqlMap.queryForList("dynamicIterateLiteral", params);

Modified: 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DynamicAccount.xml
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DynamicAccount.xml?rev=279330&r1=279329&r2=279330&view=diff
==============================================================================
--- 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DynamicAccount.xml 
(original)
+++ 
ibatis/trunk/java/mapper/mapper2/test/com/ibatis/sqlmap/maps/DynamicAccount.xml 
Wed Sep  7 07:37:49 2005
@@ -170,6 +170,26 @@
     </iterate>
   </select>
 
+  <select id="dynamicIterateInConditional"
+    parameterClass="list"
+    resultClass="testdomain.Account">
+    select
+      ACC_ID as id,
+      ACC_FIRST_NAME as firstName,
+      ACC_LAST_NAME as lastName,
+      ACC_EMAIL as emailAddress
+    from ACCOUNT
+    WHERE ACC_ID IN
+    <iterate open="(" close=")" conjunction=",">
+        <isEqual property="[]" compareValue="1">
+            #[]#
+        </isEqual>
+        <isEqual property="[]" compareValue="3">
+            #[]#
+        </isEqual>
+    </iterate>
+  </select>
+
   <select id="multiDynamicIterate"
     parameterClass="list"
     resultClass="testdomain.Account">
@@ -480,6 +500,66 @@
     <dynamic prepend="where">
       <iterate property="myList" open="(" close=")" conjunction="OR">
           ACC_ID = #myList[].id#
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2d"
+    resultClass="testdomain.Account">
+    select
+      ACC_ID          as id,
+      ACC_FIRST_NAME  as firstName,
+      ACC_LAST_NAME   as lastName,
+      ACC_EMAIL       as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate property="myList" open="(" close=")" conjunction="OR">
+          <isEqual property="myList[]" compareValue="1">
+            ACC_ID = #myList[]#
+          </isEqual>
+          <isEqual property="myList[]" compareValue="3">
+            ACC_ID = #myList[]#
+          </isEqual>
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2e"
+    resultClass="testdomain.Account">
+    select
+      ACC_ID          as id,
+      ACC_FIRST_NAME  as firstName,
+      ACC_LAST_NAME   as lastName,
+      ACC_EMAIL       as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate property="myArray" open="(" close=")" conjunction="OR">
+          <isEqual property="myArray[]" compareValue="1">
+            ACC_ID = #myArray[]#
+          </isEqual>
+          <isEqual property="myArray[]" compareValue="3">
+            ACC_ID = #myArray[]#
+          </isEqual>
+      </iterate>
+    </dynamic>
+  </select>
+
+  <select id="dynamicIterateWithPrepend2f"
+    resultClass="testdomain.Account">
+    select
+      ACC_ID          as id,
+      ACC_FIRST_NAME  as firstName,
+      ACC_LAST_NAME   as lastName,
+      ACC_EMAIL       as emailAddress
+    from ACCOUNT
+    <dynamic prepend="where">
+      <iterate property="intArray" open="(" close=")" conjunction="OR">
+          <isEqual property="intArray[]" compareValue="1">
+            ACC_ID = #intArray[]#
+          </isEqual>
+          <isEqual property="intArray[]" compareValue="3">
+            ACC_ID = #intArray[]#
+          </isEqual>
       </iterate>
     </dynamic>
   </select>

Modified: ibatis/trunk/java/mapper/mapper2/test/compatibility/domain/MyBean.java
URL: 
http://svn.apache.org/viewcvs/ibatis/trunk/java/mapper/mapper2/test/compatibility/domain/MyBean.java?rev=279330&r1=279329&r2=279330&view=diff
==============================================================================
--- ibatis/trunk/java/mapper/mapper2/test/compatibility/domain/MyBean.java 
(original)
+++ ibatis/trunk/java/mapper/mapper2/test/compatibility/domain/MyBean.java Wed 
Sep  7 07:37:49 2005
@@ -11,14 +11,32 @@
  */
 public class MyBean {
 
-    public List getMyList() {
-      return myList;
-    }
-
-    public void setMyList(List myList) {
-      this.myList = myList;
-    }
+  public List getMyList() {
+    return myList;
+  }
 
-    private List myList;
+  public void setMyList(List myList) {
+    this.myList = myList;
+  }
+
+  public Object[] getMyArray() {
+    return myArray;
+  }
+
+  public void setMyArray(Object[] myArray) {
+    this.myArray = myArray;
+  }
+
+  public int[] getIntArray() {
+    return intArray;
+  }
+
+  public void setIntArray(int[] intArray) {
+    this.intArray = intArray;
+  }
+
+  private List myList;
+  private Object[] myArray;
+  private int[] intArray;
 
 }


Reply via email to