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 c571ac6  SLING-8848 : Wrong calculation for copy/move whether single 
provider can be used. Patch by Christian Keller
c571ac6 is described below

commit c571ac6a9feea403e65d1bb5f68ab6638d20009b
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Fri Nov 15 07:24:17 2019 +0100

    SLING-8848 : Wrong calculation for copy/move whether single provider can be 
used. Patch by Christian Keller
---
 .../impl/helper/ResourceResolverControl.java       | 89 +++++++++++-----------
 .../impl/helper/ResourceResolverControlTest.java   | 17 +++++
 2 files changed, 60 insertions(+), 46 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 a5d591b..2eefd39 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
@@ -45,10 +45,12 @@ import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.api.resource.path.PathBuilder;
 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.tree.Node;
+import org.apache.sling.resourceresolver.impl.providers.tree.PathTree;
 import org.apache.sling.spi.resource.provider.ResourceProvider;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -499,71 +501,66 @@ public class ResourceResolverControl {
         return null;
     }
 
-    private AuthenticatedResourceProvider checkSourceAndDest(final 
ResourceResolverContext context,
-            final String srcAbsPath, final String destAbsPath) throws 
PersistenceException {
-        // check source
-        final Node<ResourceProviderHandler> srcNode = 
getResourceProviderStorage().getTree().getBestMatchingNode(srcAbsPath);
-        if ( srcNode == null ) {
-            throw new PersistenceException("Source resource does not exist.", 
null, srcAbsPath, null);
+    private AuthenticatedResourceProvider checkExistence(final 
ResourceResolverContext context, final String path,
+            final String type) throws PersistenceException {
+        final Node<ResourceProviderHandler> node = 
getResourceProviderStorage().getTree().getBestMatchingNode(path);
+        if (node == null) {
+            throw new PersistenceException(type.concat(" resource does not 
exist."), null, path, null);
         }
-        AuthenticatedResourceProvider srcProvider = null;
+        AuthenticatedResourceProvider provider = null;
         try {
-            srcProvider = 
context.getProviderManager().getOrCreateProvider(srcNode.getValue(), this);
+            provider = 
context.getProviderManager().getOrCreateProvider(node.getValue(), this);
         } catch (LoginException e) {
             // ignore
         }
-        if ( srcProvider == null ) {
-            throw new PersistenceException("Source resource does not exist.", 
null, srcAbsPath, null);
+        if (provider == null) {
+            throw new PersistenceException(type.concat(" resource does not 
exist."), null, path, null);
         }
-        final Resource srcResource = srcProvider.getResource(srcAbsPath, null, 
null);
-        if ( srcResource == null ) {
-            throw new PersistenceException("Source resource does not exist.", 
null, srcAbsPath, null);
+        final Resource rsrc = provider.getResource(path, null, null);
+        if (rsrc == null) {
+            throw new PersistenceException(type.concat(" resource does not 
exist."), null, path, null);
         }
+        return provider;
+    }
 
+    public AuthenticatedResourceProvider checkSourceAndDest(final 
ResourceResolverContext context,
+            final String srcAbsPath, final String destAbsPath) throws 
PersistenceException {
+        // check source
+        final AuthenticatedResourceProvider srcProvider = 
checkExistence(context, srcAbsPath, "Source");
         // check destination
-        final Node<ResourceProviderHandler> destNode = 
getResourceProviderStorage().getTree().getBestMatchingNode(destAbsPath);
-        if ( destNode == null ) {
-            throw new PersistenceException("Destination resource does not 
exist.", null, destAbsPath, null);
-        }
-        AuthenticatedResourceProvider destProvider = null;
-        try {
-            destProvider = 
context.getProviderManager().getOrCreateProvider(destNode.getValue(), this);
-        } catch (LoginException e) {
-            // ignore
-        }
-        if ( destProvider == null ) {
-            throw new PersistenceException("Destination resource does not 
exist.", null, destAbsPath, null);
-        }
-        final Resource destResource = destProvider.getResource(destAbsPath, 
null, null);
-        if ( destResource == null ) {
-            throw new PersistenceException("Destination resource does not 
exist.", null, destAbsPath, null);
-        }
+        final AuthenticatedResourceProvider destProvider = 
checkExistence(context, destAbsPath, "Destination");
 
         // check for sub providers of src and dest
-        if ( srcProvider == destProvider && !collectProviders(context, 
srcNode) && !collectProviders(context, destNode) ) {
-            return srcProvider;
+        if (srcProvider == destProvider) {
+            final PathTree<ResourceProviderHandler> providerTree = 
getResourceProviderStorage().getTree();
+            final boolean sourceHasProvider = hasSubProvider(context, 
providerTree.getNode(srcAbsPath));
+            final boolean destHasProvider = hasSubProvider(context, 
providerTree.getNode(destAbsPath));
+            if (!(sourceHasProvider || destHasProvider)) {
+                return srcProvider;
+            }
         }
         return null;
     }
 
-    private boolean collectProviders(final ResourceResolverContext context,
-            final Node<ResourceProviderHandler> parent) {
-        boolean hasMoreProviders = false;
-        for (final Entry<String, Node<ResourceProviderHandler>> entry : 
parent.getChildren().entrySet()) {
-            if ( entry.getValue().getValue() != null ) {
-                try {
-                    
context.getProviderManager().getOrCreateProvider(entry.getValue().getValue(), 
this);
-                    hasMoreProviders = true;
-                } catch ( final LoginException ignore) {
-                    // ignore
+    private boolean hasSubProvider(ResourceResolverContext context, 
Node<ResourceProviderHandler> node) {
+        if (node != null) {
+            for (final Node<ResourceProviderHandler> childNode : 
node.getChildren().values()) {
+                final ResourceProviderHandler handler = childNode.getValue();
+                if (handler != null) {
+                    try {
+                        
context.getProviderManager().getOrCreateProvider(handler, this);
+                        return true;
+                    } catch (final LoginException ignore) {
+                        // ignore
+                    }
+                }
+                if (hasSubProvider(context, childNode)) {
+                    return true;
                 }
-            }
-            if ( collectProviders(context, entry.getValue())) {
-                hasMoreProviders = true;
             }
         }
 
-        return hasMoreProviders;
+        return false;
     }
 
     private void copy(final ResourceResolverContext context, final Resource 
src, final String dstPath, final List<Resource> newNodes) throws 
PersistenceException {
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 45c3940..93957a2 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
@@ -340,6 +340,23 @@ public class ResourceResolverControlTest {
     }
 
     /**
+     * Checks that its correctly calculated whether a copy/move can be done 
with the
+     * same provider
+     *
+     * @throws PersistenceException
+     */
+    @Test
+    public void checkProvidersForCopyMove() throws PersistenceException {
+        // first check same provider at root
+        configureResourceAt(rootProvider, "/a");
+        configureResourceAt(rootProvider, "/b");
+        assertNotNull(crp.checkSourceAndDest(context, "/a", "/b"));
+
+        // second check different providers
+        assertNull(crp.checkSourceAndDest(context, "/some/path/object", "/"));
+    }
+
+    /**
      * Verifies copying resources between the same ResourceProvider
      *
      * @throws PersistenceException persistence exception

Reply via email to