private int collectChildren()

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;
    }