Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-3789

visitChildren and friends require inner classes. Replace with iterators

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Resolved
    • Major
    • Resolution: Won't Fix
    • None
    • None
    • None
    • None

    Description

      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

      Attachments

        1. wicket-3789.patch
          65 kB
          Juegen Donnerstag

        Issue Links

          Activity

            People

              jdonnerstag Juegen Donnerstag
              jdonnerstag Juegen Donnerstag
              Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: