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
*