in src/main/java/org/apache/sling/servlets/get/impl/util/ResourceTraversor.java [86:126]
private int collectChildren(final Resource resource, int currentLevel) {
if (maxRecursionLevels == -1 || currentLevel < maxRecursionLevels) {
final Iterator<Resource> children = resource.listChildren();
List<Resource> childTree = tree.get(resource);
if (childTree == null) {
childTree = new ArrayList<>();
tree.put(resource, childTree);
}
while (children.hasNext()) {
count++;
final Resource child = children.next();
// SLING-2320: always allow enumeration of one's children;
// DOS-limitation is for deeper traversals.
if (count > maxResources && maxRecursionLevels != 1) {
return currentLevel;
}
nextQueue.addLast(child);
childTree.add(child);
}
}
// do processing only at first level to avoid unnecessary recursion
if (currentLevel > 0) {
return -1;
}
while (!currentQueue.isEmpty() || !nextQueue.isEmpty()) {
if (currentQueue.isEmpty()) {
currentLevel++;
currentQueue = nextQueue;
nextQueue = new LinkedList<>();
}
final int maxLevel = collectChildren(currentQueue.removeFirst(), currentLevel);
if (maxLevel != -1) {
return maxLevel;
}
}
return -1;
}