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();
+ }
+ }
+
}