private <T> void walkTree( final JsonPointer pwd, final SchemaTree tree, final SchemaListener<T> listener, final ProcessingReport report) throws ProcessingException { listener.enteringPath(pwd, report); final SchemaTree resolvedTree = resolveTree(tree, report); listener.visiting(resolvedTree, report); /* * Grab pointer collectors */ final Map<String, PointerCollector> map = Maps.newTreeMap(); map.putAll(collectors); map.keySet().retainAll(Sets.newHashSet(resolvedTree.getNode().fieldNames())); /* * Collect pointers to visit next */ final List<JsonPointer> pointers = Lists.newArrayList(); for (final PointerCollector collector : map.values()) collector.collect(pointers, resolvedTree); /* * Now, visit the collected set of pointers */ for (final JsonPointer ptr : pointers) { walkTree(pwd.append(ptr), resolvedTree.append(ptr), listener, report); } listener.exitingPath(pwd, report); }