package de.otto.wickettester; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.util.visit.IVisit; import org.apache.wicket.util.visit.IVisitor; import org.apache.wicket.util.visit.Visits; public class HavingChildComponentMatcher<T extends Component, CT extends Component> implements ComponentMatcher<T, T> { private final ComponentMatcher<CT, CT> matcher; public HavingChildComponentMatcher(final ComponentMatcher<CT, CT> matcher) { this.matcher = matcher; } @Override public T match(final T component) { if (!(component instanceof MarkupContainer)) { return null; } else { final Component res = Visits.visitChildren((MarkupContainer) component, new IVisitor<CT, CT>() { @Override public void component(final CT component, final IVisit<CT> visit) { final CT result = matcher.match(component); if (result != null) { visit.stop(result); } } }); return res != null ? component : null; } } @Override public String criterionAsString() { return String.format("having a child (%s)", matcher.criterionAsString()); } }