public Iterator listChildren()

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