You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2021/06/25 11:08:40 UTC

[sling-org-apache-sling-resourceresolver] branch master updated: SLING-10553 : Add more tests for listing resource children

This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git


The following commit(s) were added to refs/heads/master by this push:
     new f612489  SLING-10553 : Add more tests for listing resource children
f612489 is described below

commit f612489b4840a554d71e16631e1d947081d0fbc4
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Fri Jun 25 13:08:26 2021 +0200

    SLING-10553 : Add more tests for listing resource children
---
 .../impl/helper/ResourceResolverControl.java       | 14 +++-
 .../impl/helper/ResourceResolverControlTest.java   | 97 ++++++++++++++++++++++
 2 files changed, 107 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java b/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java
index 356d492..c774a69 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControl.java
@@ -258,7 +258,6 @@ public class ResourceResolverControl {
      * transformations are done lazily, during the {@link Iterator#hasNext()}
      * invocation on the result.
      */
-    @SuppressWarnings("unchecked")
     public Iterator<Resource> listChildren(final ResourceResolverContext context, final Resource parent) {
         final String parentPath = parent.getPath();
 
@@ -272,13 +271,20 @@ public class ResourceResolverControl {
         if ( provider != null ) {
             realChildren = provider.listChildren(parent);
         }
- 
+        return listChildrenInternal(context, getResourceProviderStorage().getTree().getNode(parentPath), parent, realChildren);
+    }
+
+    @SuppressWarnings("unchecked")
+    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 chain = new IteratorChain();
+        IteratorChain<Resource> chain = new IteratorChain<>();
 
         // synthetic and providers are done in one loop
-        final Node<ResourceProviderHandler> node = getResourceProviderStorage().getTree().getNode(parent.getPath());
         if (node != null) {
             final List<Resource> syntheticList = new ArrayList<>();
             final List<Resource> providerList = new ArrayList<>();
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControlTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControlTest.java
index 898dc57..93cc638 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControlTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverControlTest.java
@@ -59,6 +59,9 @@ import org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderInfo;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderStorage;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderStorageProvider;
+import org.apache.sling.resourceresolver.impl.providers.stateful.AuthenticatedResourceProvider;
+import org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager;
+import org.apache.sling.resourceresolver.impl.providers.tree.PathTree;
 import org.apache.sling.spi.resource.provider.QueryLanguageProvider;
 import org.apache.sling.spi.resource.provider.ResolveContext;
 import org.apache.sling.spi.resource.provider.ResourceContext;
@@ -507,6 +510,100 @@ public class ResourceResolverControlTest {
         assertEquals("is " + TEST_ATTRIBUTE, crp.getAttribute(context, TEST_ATTRIBUTE));
     }
 
+    @Test
+    public void testListChildrenInternalNoRealChildren() throws LoginException {
+        final ResourceResolverControl control = new ResourceResolverControl(false, Collections.emptyMap(), null);
+        
+        final ResourceResolverContext context = Mockito.mock(ResourceResolverContext.class);
+        final ProviderManager providerManager = Mockito.mock(ProviderManager.class);
+        Mockito.when(context.getProviderManager()).thenReturn(providerManager);
+        
+        final ResourceProviderHandler root = Mockito.mock(ResourceProviderHandler.class);
+        Mockito.when(root.getPath()).thenReturn("/");
+        final AuthenticatedResourceProvider rootProvider = Mockito.mock(AuthenticatedResourceProvider.class);
+        Mockito.when(providerManager.getOrCreateProvider(root, control)).thenReturn(rootProvider);
+        
+        final ResourceProviderHandler sub1 = Mockito.mock(ResourceProviderHandler.class);
+        Mockito.when(sub1.getPath()).thenReturn("/libs/sub1");
+        final AuthenticatedResourceProvider sub1Provider = Mockito.mock(AuthenticatedResourceProvider.class);
+        Mockito.when(providerManager.getOrCreateProvider(sub1, control)).thenReturn(sub1Provider);
+
+        final ResourceProviderHandler sub2 = Mockito.mock(ResourceProviderHandler.class);
+        Mockito.when(sub2.getPath()).thenReturn("/libs/sub1/xy/sub2");
+        final AuthenticatedResourceProvider sub2Provider = Mockito.mock(AuthenticatedResourceProvider.class);
+        Mockito.when(providerManager.getOrCreateProvider(sub2, control)).thenReturn(sub2Provider);
+
+        final List<ResourceProviderHandler> handlers = new ArrayList<>();
+        handlers.add(root);
+        handlers.add(sub1);
+        handlers.add(sub2);
+
+        final PathTree<ResourceProviderHandler> tree = new PathTree<>(handlers);
+        
+//        assertChildren( control.listChildrenInternal(context, tree.getNode("/libs"), newMockResource("/libs"), null), "/libs/sub1" );
+        assertChildren( control.listChildrenInternal(context, tree.getNode("/libs/sub1"), newMockResource("/libs/sub1"), null), "/libs/sub1/xy" );
+        assertChildren( control.listChildrenInternal(context, tree.getNode("/libs/sub1/xy"), newMockResource("/libs/sub1/xy"), null), "/libs/sub1/xy/sub2" );
+        assertChildren( control.listChildrenInternal(context, tree.getNode("/libs/sub1/xy/sub2"), newMockResource("/libs/sub1/xy/sub2"), null) );
+    }
+
+    @Test
+    public void testListChildrenInternalRealChildren() throws LoginException {
+        final ResourceResolverControl control = new ResourceResolverControl(false, Collections.emptyMap(), null);
+        
+        final ResourceResolverContext context = Mockito.mock(ResourceResolverContext.class);
+        final ProviderManager providerManager = Mockito.mock(ProviderManager.class);
+        Mockito.when(context.getProviderManager()).thenReturn(providerManager);
+        
+        final ResourceProviderHandler root = Mockito.mock(ResourceProviderHandler.class);
+        Mockito.when(root.getPath()).thenReturn("/");
+        final AuthenticatedResourceProvider rootProvider = Mockito.mock(AuthenticatedResourceProvider.class);
+        Mockito.when(providerManager.getOrCreateProvider(root, control)).thenReturn(rootProvider);
+        
+        final ResourceProviderHandler sub1 = Mockito.mock(ResourceProviderHandler.class);
+        Mockito.when(sub1.getPath()).thenReturn("/libs/sub1");
+        final AuthenticatedResourceProvider sub1Provider = Mockito.mock(AuthenticatedResourceProvider.class);
+        Mockito.when(providerManager.getOrCreateProvider(sub1, control)).thenReturn(sub1Provider);
+
+        final ResourceProviderHandler sub2 = Mockito.mock(ResourceProviderHandler.class);
+        Mockito.when(sub2.getPath()).thenReturn("/libs/sub1/xy/sub2");
+        final AuthenticatedResourceProvider sub2Provider = Mockito.mock(AuthenticatedResourceProvider.class);
+        Mockito.when(providerManager.getOrCreateProvider(sub2, control)).thenReturn(sub2Provider);
+
+        final List<ResourceProviderHandler> handlers = new ArrayList<>();
+        handlers.add(root);
+        handlers.add(sub1);
+        handlers.add(sub2);
+
+        final PathTree<ResourceProviderHandler> tree = new PathTree<>(handlers);
+        
+        final Resource c1 = newMockResource("/libs/sub1/a");
+        final Resource c2 = newMockResource("/libs/sub1/b");
+
+        assertChildren( control.listChildrenInternal(context, tree.getNode("/libs/sub1"), newMockResource("/libs/sub1"), 
+            Arrays.asList(c1, c2).iterator()), "/libs/sub1/xy", "/libs/sub1/a", "/libs/sub1/b" );
+    }
+
+    private Map<String, Resource> mapChildren(final Iterator<Resource> children) {
+        final Map<String, Resource> all = new HashMap<String, Resource>();
+        while ( children.hasNext() ) {
+            final Resource child = children.next();
+            all.put(child.getPath(), child);
+        }
+        return all;
+    }
+    
+    private void assertChildren(final Iterator<Resource> children, final String... paths) {
+        final Map<String, Resource> all = mapChildren(children);
+        if ( paths == null ) {
+            assertTrue(all.isEmpty());
+        } else {
+            assertEquals("" + all.keySet(), paths.length, all.size());
+            for(final String path : paths) {
+                assertTrue(all.keySet() + " : " + path, all.containsKey(path));
+            }    
+        }
+    }
+
     /**
      * Simple test-only QueryLanguageProvider
      *