public Iterator listChildren()

in src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java [229:298]


    public Iterator<Resource> listChildren(final @NotNull ResolveContext<Object> ctx, final @NotNull Resource parent) {
        ResourceResolver resolver = ctx.getResourceResolver();

        List<Iterator<? extends Resource>> allChildren = new ArrayList<>();
        Iterator<Resource> children;
        boolean askParentResourceProvider;

        if (fsMode == FsMode.FILEVAULT_XML) {
            // filevault: always ask provider, it checks itself if children matches the filters
            askParentResourceProvider = true;
            children = fileVaultMapper.getChildren(resolver, parent);
            if (children != null) {
                allChildren.add(children);
            }
        }
        else {
            // Sling-Initial-Content: get all matching folders/files and content files
            askParentResourceProvider = this.overlayParentResourceProvider;
            children = contentFileMapper.getChildren(resolver, parent);
            if (children != null) {
                allChildren.add(children);
            }
            children = fileMapper.getChildren(resolver, parent);
            if (children != null) {
                allChildren.add(children);
            }
        }

    	// get children from from shadowed provider
        if (askParentResourceProvider) {
        	final ResourceProvider parentResourceProvider = ctx.getParentResourceProvider();
            final ResolveContext resolveContext = ctx.getParentResolveContext();
        	if (parentResourceProvider != null && resolveContext != null) {
        		children = parentResourceProvider.listChildren(resolveContext, parent);
                if (children != null) {
                    if (fsMode == FsMode.FILEVAULT_XML) {
                        // filevault: include all children from parent resource provider that do not match the filters
                        allChildren.add(IteratorUtils.filteredIterator(children, new Predicate() {
                            @Override
                            public boolean evaluate(Object object) {
                                Resource child = (Resource)object;
                                return !fileVaultMapper.pathMatches(child.getPath());
                            }
                        }));
                    }
                    else {
                        allChildren.add(children);
                    }
                }
        	}
        }

    	if (allChildren.isEmpty()) {
    	    return null;
    	}
    	else if (allChildren.size() == 1) {
    	    return (Iterator<Resource>)allChildren.get(0);
    	}
    	else {
    	    // merge all children from the different iterators, but filter out potential duplicates with same resource name
    	    return IteratorUtils.filteredIterator(IteratorUtils.chainedIterator(allChildren), new Predicate() {
    	        private Set<String> names = new HashSet<>();
                @Override
                public boolean evaluate(Object object) {
                    Resource resource = (Resource)object;
                    return names.add(resource.getName());
                }
            });
    	}
    }