diff --git a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/ChildrenCollectorFilter.java b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/ChildrenCollectorFilter.java index 3443b77..f2e0173 100644 --- a/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/ChildrenCollectorFilter.java +++ b/jackrabbit-jcr-commons/src/main/java/org/apache/jackrabbit/util/ChildrenCollectorFilter.java @@ -47,6 +47,8 @@ // namePattern and nameGlobs fields are used mutually exclusive private final String namePattern; private final String[] nameGlobs; + + private int currentLevel; /** * Constructs a ChildrenCollectorFilter @@ -67,6 +69,7 @@ nameGlobs = null; this.children = children; this.collectNodes = collectNodes; + currentLevel = 0; this.collectProperties = collectProperties; } @@ -179,4 +182,45 @@ public static boolean matches(String name, String[] nameGlobs) { return ItemNameMatcher.matches(name, nameGlobs); } + + /** + * {@inheritDoc} + */ + @Override + public void visit(Property property) throws RepositoryException { + entering(property, currentLevel); + leaving(property, currentLevel); + } + + /** + * {@inheritDoc} + */ + @Override + public void visit(Node node) + throws RepositoryException { + try { + // depth-first traversal + entering(node, currentLevel); + if (maxLevel == -1 || currentLevel < maxLevel) { + currentLevel++; + if (collectProperties) { + PropertyIterator propIter = node.getProperties(); + while (propIter.hasNext()) { + propIter.nextProperty().accept(this); + } + } + if (collectNodes) { + NodeIterator nodeIter = node.getNodes(); + while (nodeIter.hasNext()) { + nodeIter.nextNode().accept(this); + } + } + currentLevel--; + } + leaving(node, currentLevel); + } catch (RepositoryException re) { + currentLevel = 0; + throw re; + } + } }