Wow, Nathan -- you are on a tear. Nice work. 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
