public Iterator listChildrenInternal()

in src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java [322:388]


    public Iterator<Resource> listChildrenInternal(
            final ResourceResolverContext context,
            final Node<ResourceProviderHandler> node,
            final Resource parent,
            final Iterator<Resource> realChildren) {

        final Set<String> visitedNames = new HashSet<>();

        IteratorChain<Resource> chain = new IteratorChain<>();

        // synthetic and providers are done in one loop
        if (node != null) {
            final List<Resource> syntheticList = new ArrayList<>();
            final List<Resource> providerList = new ArrayList<>();

            for (final Entry<String, Node<ResourceProviderHandler>> entry :
                    node.getChildren().entrySet()) {
                final String name = entry.getKey();
                final ResourceProviderHandler handler = entry.getValue().getValue();
                PathBuilder pathBuilder = new PathBuilder(parent.getPath());
                pathBuilder.append(name);
                final String childPath = pathBuilder.toString();
                if (handler == null) {
                    syntheticList.add(new SyntheticResource(
                            context.getResourceResolver(), childPath, ResourceProvider.RESOURCE_TYPE_SYNTHETIC));
                } else {
                    Resource rsrc = null;
                    try {
                        final AuthenticatedResourceProvider rp =
                                context.getProviderManager().getOrCreateProvider(handler, this);
                        rsrc = rp == null ? null : rp.getResource(childPath, parent, null);
                    } catch (final LoginException ignore) {
                        // ignore
                    }
                    if (rsrc != null) {
                        providerList.add(rsrc);
                    } else {
                        // if there is a child provider underneath, we need to create a synthetic resource
                        // otherwise we need to make sure that no one else is providing this child
                        if (!entry.getValue().getChildren().isEmpty()) {
                            syntheticList.add(new SyntheticResource(
                                    context.getResourceResolver(),
                                    childPath,
                                    ResourceProvider.RESOURCE_TYPE_SYNTHETIC));
                        } else {
                            visitedNames.add(name);
                        }
                    }
                }
            }
            if (!providerList.isEmpty()) {
                chain.addIterator(providerList.iterator());
            }
            if (realChildren != null) {
                chain.addIterator(realChildren);
            }
            if (!syntheticList.isEmpty()) {
                chain.addIterator(syntheticList.iterator());
            }
        } else if (realChildren != null) {
            chain.addIterator(realChildren);
        }
        if (chain.size() == 0) {
            return Collections.EMPTY_LIST.iterator();
        }
        return new UniqueResourceIterator(visitedNames, chain);
    }