in velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java [206:278]
public Iterator getIterator(Object obj, Info i)
{
if (obj.getClass().isArray())
{
return new ArrayIterator(obj);
}
else if (obj instanceof Iterable)
{
return ((Iterable) obj).iterator();
}
else if (obj instanceof Map)
{
return ((Map) obj).values().iterator();
}
else if (obj instanceof Iterator)
{
log.debug("The iterative object in the #foreach() loop at {}" +
" is of type java.util.Iterator. Because " +
"it is not resettable, if used in more than once it " +
"may lead to unexpected results.", i);
return ((Iterator) obj);
}
else if (obj instanceof Enumeration)
{
log.debug("The iterative object in the #foreach() loop at {}" +
" is of type java.util.Enumeration. Because " +
"it is not resettable, if used in more than once it " +
"may lead to unexpected results.", i);
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");
Class<?> returns = iter.getReturnType();
if (Iterator.class.isAssignableFrom(returns))
{
try
{
return (Iterator)iter.invoke(obj);
}
catch (IllegalAccessException e)
{
// Cannot invoke this method, just give up
}
catch (Exception e)
{
throw new VelocityException("Error invoking the method 'iterator' on class '"
+ obj.getClass().getName() +"'", e, rsvc.getLogContext().getStackTrace());
}
}
else
{
log.debug("iterator() method of reference in #foreach loop at " +
"{} does not return a true Iterator.", i);
}
}
catch (NoSuchMethodException nsme)
{
// eat this one, but let all other exceptions thru
}
}
/* we have no clue what this is */
log.debug("Could not determine type of iterator in #foreach loop at {}", i);
return null;
}