in org.apache.sling.ddr/core/src/main/java/org/apache/sling/ddr/core/DeclarativeDynamicResourceProviderHandler.java [204:258]
public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent) {
Iterator<Resource> answer = null;
log.info("List Children, resolve-context: '{}', parent: '{}'", ctx, parent);
String resourcePath = parent.getPath();
ResourceResolver contextResourceResolver = ctx.getResourceResolver();
if(resourcePath.equals(providerRootPath)) {
// Handle the Source / Provider Path -> no DDRs here
answer = parent.listChildren();
} else if(resourcePath.startsWith(targetRootPath)) {
// Handle the dynamic path
ResourceProvider parentResourceProvider = ctx.getParentResourceProvider();
ResolveContext parentResolveContext = ctx.getParentResolveContext();
List<Resource> items = new ArrayList<>();
Iterator<Resource> i;
if (parentResourceProvider != null && parentResolveContext != null) {
// First obtain the Children from the Parent Resource Provider (JCR)
i = parentResourceProvider.listChildren(parentResolveContext, parent);
if (i != null) {
while (i.hasNext()) {
items.add(i.next());
}
}
}
synchronized (lock) {
// Obtain the matching resource from the provider
List<Reference> childrenList = childrenMappings.get(resourcePath);
log.info("Resource Path: '{}', Children List: '{}'", resourcePath, childrenList);
if (childrenList != null) {
for (Reference childPath : childrenList) {
Resource child = getResource(contextResourceResolver, childPath.getReference());
int index = childPath.getSource().lastIndexOf('/');
String childName = childPath.getSource().substring(index);
items.add(
createSyntheticFromResource(
child, resourcePath + childName,
resourcePath.equals(targetRootPath)
)
);
}
} else {
items = obtainChildren(contextResourceResolver, resourcePath, true);
}
}
answer = items.iterator();
} else {
ResourceProvider parentResourceProvider = ctx.getParentResourceProvider();
ResolveContext parentResolveContext = ctx.getParentResolveContext();
log.info("Parent Resource Provider: '{}'", parentResourceProvider);
log.info("Parent Resolve Context: '{}'", parentResolveContext);
if (parentResourceProvider != null && parentResolveContext != null) {
answer = parentResourceProvider.listChildren(parentResolveContext, parent);
}
}
return answer != null && answer.hasNext() ? answer : null;
}