On 9/25/07, Geir Magnusson Jr. <[EMAIL PROTECTED]> wrote: > what if it returns something you can't iterate over? Maybe check the > return type first?
yeah, that's a problem. thanks for catching this! > 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] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
