visitChildren and friends require inner classes. Replace with iterators
-----------------------------------------------------------------------
Key: WICKET-3789
URL: https://issues.apache.org/jira/browse/WICKET-3789
Project: Wicket
Issue Type: Improvement
Reporter: Juergen Donnerstag
I never really liked that we need inner classes (implementations of IVisitor)
for traversing the component hierarchy. When needed, it comes easily to me that
I need MarkupContainer.visitChildren(), but I always need to look up how to use
it and friends. Debugging is also more complicated than it has to (breakpoint
inside the visit function: either another breakpoint behind visitChildren or
"press the continue-until-end-of-method" key several times until you are back).
For these reasons I gave Iterators another try. I've attached a patch for
others to review and provide feedback. I've also added test cases
(ComponentIteratorTest) and I changed quite some visitChildren occassions in
core. Maven compiles and successfully executes all tests.
I put the new classes in org.apache.wicket.util.iterator
ComponentIterator - An enhanced iterator with filters. Also supports chaining
iterators. Builder API for class filters, isvisible filters, isenabled filters
etc. Supports Java for each.
ComponentHierarchyIterator - enhances ComponentIterator to provide hierarchy
traversal. Adds traversal filters to separate traversal control from what
next() returns. Same Builder API. Supports Java for each.
IteratorFilter - Simple abstract class to implement the filter conditions. The
Builder API makes use of it to add filters to the iterator.
Some examples:
ComponentHierarchyIterator iter = new ComponentHierarchyIterator(page);
while (iter.hasNext())
{
Component component = iter.next();
}
for (Component component : new ComponentHierarchyIterator(page))
{
}
new ComponentHierarchyIterator(page)
.filterLeavesOnly()
.filterByVisibility()
.filterByClass(Form.class)
iter.skipRemainingSiblings(); // skip all remaining component of the same
parent
iter.dontGoDeeper() // provided the current component is a container and
potentially has children, they are ignored
onEndOfSiblings() is a callback function if you want to be informed about the
iterator leaving a level
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira