what if it returns something you can't iterate over? Maybe check the return type first?

geir

On Sep 25, 2007, at 4:22 PM, Nathan Bubna wrote:

On 9/25/07, Will Glass-Husain <[EMAIL PROTECTED]> wrote:
Wow, Nathan -- you are on a tear.  Nice work.

well, i found a little time to work on some of these nagging little things. :)

WILL

On 9/25/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:

Author: nbubna
Date: Tue Sep 25 10:59:43 2007
New Revision: 579331

URL: http://svn.apache.org/viewvc?rev=579331&view=rev
Log:
support any object with an iterator() method in #foreach (VELOCITY-443)

Modified:

velocity/engine/trunk/src/java/org/apache/velocity/util/ introspection/UberspectImpl.java

velocity/engine/trunk/src/test/org/apache/velocity/test/ ForeachTestCase.java

Modified:
velocity/engine/trunk/src/java/org/apache/velocity/util/ introspection/UberspectImpl.java
URL:
http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/ apache/velocity/util/introspection/UberspectImpl.java? rev=579331&r1=579330&r2=579331&view=diff

==================================================================== ==========
---
velocity/engine/trunk/src/java/org/apache/velocity/util/ introspection/UberspectImpl.java
(original)
+++
velocity/engine/trunk/src/java/org/apache/velocity/util/ introspection/UberspectImpl.java
Tue Sep 25 10:59:43 2007
@@ -139,6 +139,22 @@
             }
             return new EnumerationIterator((Enumeration) obj);
         }
+        else
+        {
+ // look for an iterator() method to support the JDK5 Iterable + // interface or any user tools/DTOs that want to work in + // foreach without implementing the Collection interface
+            Class type = obj.getClass();
+            try
+            {
+                Method iter = type.getMethod("iterator", null);
+                return (Iterator)iter.invoke(obj, null);
+            }
+            catch (NoSuchMethodException nsme)
+            {
+                // eat this one, but let all other exceptions thru
+            }
+        }

         /*  we have no clue what this is  */
log.error("Could not determine type of iterator in #foreach loop
at " + i);

Modified:
velocity/engine/trunk/src/test/org/apache/velocity/test/ ForeachTestCase.java
URL:
http://svn.apache.org/viewvc/velocity/engine/trunk/src/test/org/ apache/velocity/test/ForeachTestCase.java? rev=579331&r1=579330&r2=579331&view=diff

==================================================================== ==========
---
velocity/engine/trunk/src/test/org/apache/velocity/test/ ForeachTestCase.java
(original)
+++
velocity/engine/trunk/src/test/org/apache/velocity/test/ ForeachTestCase.java
Tue Sep 25 10:59:43 2007
@@ -21,6 +21,7 @@

import java.io.StringWriter;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;
@@ -75,10 +76,10 @@
     }

     /**
- * Tests proper method execution during a Foreach loop with items
-     * of varying classes.
+     * Tests proper method execution during a Foreach loop over a
Collection
+     * with items of varying classes.
      */
-    public void testMethodCall()
+    public void testCollectionAndMethodCall()
         throws Exception
     {
         List col = new ArrayList();
@@ -94,4 +95,41 @@
assertEquals("Method calls while looping over varying classes
failed",
                      "int 100 str STRVALUE ", writer.toString());
     }
+
+    /**
+ * Tests that #foreach will be able to retrieve an iterator from + * an arbitrary object that happens to have an iterator() method.
+     * (With the side effect of supporting the new Java 5 Iterable
interface)
+     */
+    public void testObjectWithIteratorMethod()
+        throws Exception
+    {
+        context.put("iterable", new MyIterable());
+
+        StringWriter writer = new StringWriter();
+        String template = "#foreach ($i in $iterable)$i #end";
+        Velocity.evaluate(context, writer, "test", template);
+        assertEquals("Failed to call iterator() method",
+                     "1 2 3 ", writer.toString());
+    }
+
+
+    public static class MyIterable
+    {
+        private List foo;
+
+        public MyIterable()
+        {
+            foo = new ArrayList();
+            foo.add(new Integer(1));
+            foo.add(new Long(2));
+            foo.add("3");
+        }
+
+        public Iterator iterator()
+        {
+            return foo.iterator();
+        }
+    }
+
}





--
Forio Business Simulations

Will Glass-Husain
[EMAIL PROTECTED]
www.forio.com


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to