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