Hi,

(I was pretty sure I could find an answer to my question by searching
the list archives and the Wicket Jira, but didn't. But if there's an
answer somewhere already and I just missed it, I apologize and would
be very happy if I was pointed to it.)

Is the visitChildren method of MarkupContainer supposed to take into
account the return value of its IVisitor also if only specific,
non-container classes are to be visited?

The question naturally makes more sense with an example. Consider this
simple piece of code:

    MarkupContainer container1 = new WebMarkupContainer("container1");
    Label labelA1 = new Label("labelA1", "A1");
    Label labelA2 = new Label("labelA2", "A2");

    MarkupContainer container2 = new WebMarkupContainer("container2");
    Label labelB1 = new Label("labelB1", "B1");
    Label labelB2 = new Label("labelB2", "B2");

    add(container1);
    container1.add(labelA1, labelA2, container2);
    container2.add(labelB1, labelB2);

    container1.visitChildren(Label.class, new IVisitor<Component>() {
        @Override
        public Object component(Component component) {
            System.out.println(component.getDefaultModelObject());
            return CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER;
        }
    });

When I wrote the above code I thought the Visitor would only visit
labels A1 and A2, and it would skip B1 and B2, since they are deeper
in the object hierarchy and I use the return value
CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER. But the Visitor actually visits
all four labels anyway. If visitChildren is called without the first
parameter ("Label.class"), it only visits labels A1 and A2, but also
container2 (which is what I would expect it to do).

The reason for this is pretty obvious if you look at the source code
of visitChildren. The traversal depth check depends on the Visitor's
return value (e.g. CONTINUE_TRAVERSAL or
CONTINUE_TRAVERSAL_BUT_DONT_GO_DEEPER), and that is set only if no
specific class was defined (i.e. the first parameter wasn't given and
all kinds of components are visited) or the class of the component
matched the given parameter. In this case when visitChildren advances
to container2, the Visitor isn't called (because only Labels are to be
visited) and the return value remains null (the default value). And so
the visiting continues to container2's children, resulting in B1 and
B2 appearing in the results...

Is this how visitChildren was designed to work? Like I said, I
expected it to work differently, but the problem might only be in my
expectations. :)

BR,
Mika

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to