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