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 2022/06/14 12:56:24 UTC

[sling-org-apache-sling-resourceresolver] branch feature/resource-provider-mode updated: Evaluate new mode property

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

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


The following commit(s) were added to refs/heads/feature/resource-provider-mode by this push:
     new 45ff8f9  Evaluate new mode property
45ff8f9 is described below

commit 45ff8f9a879e35847b5f96da355778a0144ff587
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Tue Jun 14 14:56:19 2022 +0200

    Evaluate new mode property
---
 .../impl/helper/ResourceResolverControl.java       | 25 ++++++++++++------
 .../impl/providers/ResourceProviderInfo.java       | 30 ++++++++++++++++++++++
 .../impl/providers/ResourceProviderTracker.java    | 10 ++++----
 3 files changed, 52 insertions(+), 13 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 3a5b3d3..aeede94 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
@@ -47,6 +47,7 @@ import org.apache.sling.api.resource.path.PathBuilder;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderStorage;
 import org.apache.sling.resourceresolver.impl.providers.ResourceProviderStorageProvider;
+import org.apache.sling.resourceresolver.impl.providers.ResourceProviderInfo.Mode;
 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;
@@ -802,15 +803,23 @@ public class ResourceResolverControl {
     private @Nullable AuthenticatedResourceProvider getBestMatchingModifiableProvider(
             final ResourceResolverContext context,
             final String path)  {
-        final Node<ResourceProviderHandler> node = resourceProviderTracker.getResourceProviderStorage().getTree().getBestMatchingNode(path);
-        if ( node != null && node.getValue().getInfo().isModifiable() ) {
-            try {
-                return context.getProviderManager().getOrCreateProvider(node.getValue(), this);
-            } catch ( final LoginException le ) {
-                // ignore
-                return null;
+        String resourcePath = path;
+        do {
+            final Node<ResourceProviderHandler> node = resourceProviderTracker.getResourceProviderStorage().getTree().getBestMatchingNode(resourcePath);
+            if ( node.getValue().getInfo().isModifiable() ) {
+                try {
+                    return context.getProviderManager().getOrCreateProvider(node.getValue(), this);
+                } catch ( final LoginException le ) {
+                    // ignore
+                    return null;
+                }    
             }
-        }
+            if ( node.getValue().getInfo().getMode() == Mode.PASSTHROUGH ) {
+                resourcePath = ResourceUtil.getParent(resourcePath);
+            } else {
+                resourcePath = null;
+            }
+        } while ( resourcePath != null );
         return null;
     }
 
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderInfo.java b/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderInfo.java
index 0900e5e..18320c7 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderInfo.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderInfo.java
@@ -30,6 +30,18 @@ import org.slf4j.LoggerFactory;
  */
 public class ResourceProviderInfo implements Comparable<ResourceProviderInfo> {
 
+    /** mode for the resource resolver (should move to api) */
+    public static final String PROP_MODE = "provider.mode";
+    /** Default mode */
+    public static final String MODE_OVERLAY = "overlay";
+    /** Passthrough mode */
+    public static final String MODE_PASSTHROUGH = "passthrough";
+    
+    public enum Mode {
+        OVERLAY,
+        PASSTHROUGH
+    }
+
     private static final Logger logger = LoggerFactory.getLogger(ResourceProviderInfo.class);
 
     private final ServiceReference ref;
@@ -50,6 +62,8 @@ public class ResourceProviderInfo implements Comparable<ResourceProviderInfo> {
 
     private final boolean attributable;
 
+    private final Mode mode;
+
     public ResourceProviderInfo(final ServiceReference ref) {
         this.ref = ref;
         this.path = PropertiesUtil.toString(ref.getProperty(ResourceProvider.PROPERTY_ROOT), "");
@@ -67,6 +81,14 @@ public class ResourceProviderInfo implements Comparable<ResourceProviderInfo> {
         this.adaptable = PropertiesUtil.toBoolean(ref.getProperty(ResourceProvider.PROPERTY_ADAPTABLE), false);
         this.refreshable = PropertiesUtil.toBoolean(ref.getProperty(ResourceProvider.PROPERTY_REFRESHABLE), false);
         this.attributable = PropertiesUtil.toBoolean(ref.getProperty(ResourceProvider.PROPERTY_ATTRIBUTABLE), false);
+        final String modeValue = PropertiesUtil.toString(ref.getProperty(PROP_MODE), MODE_OVERLAY).toUpperCase();
+        Mode mode = null;
+        try {
+            mode = Mode.valueOf(modeValue);
+        } catch ( final IllegalArgumentException iae) {
+            logger.error("Illegal mode {} for resource provider {}", modeValue, name);
+        }
+        this.mode = mode;
     }
 
     public boolean isValid() {
@@ -79,6 +101,10 @@ public class ResourceProviderInfo implements Comparable<ResourceProviderInfo> {
             logger.debug("ResourceProvider has null authType, invalid");
             return false;
         }
+        if ( this.mode == null ) {
+            logger.debug("ResourceProvider has null mode, invalid");
+            return false;
+        }
         return true;
     }
 
@@ -90,6 +116,10 @@ public class ResourceProviderInfo implements Comparable<ResourceProviderInfo> {
         return this.path;
     }
 
+    public Mode getMode() {
+        return this.mode;
+    }
+
     @Override
     public int compareTo(final ResourceProviderInfo o) {
         int result = path.compareTo(o.path);
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java b/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
index 98d60ff..5a326d6 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
@@ -41,6 +41,7 @@ import org.apache.sling.api.resource.runtime.dto.ResourceProviderDTO;
 import org.apache.sling.api.resource.runtime.dto.ResourceProviderFailureDTO;
 import org.apache.sling.api.resource.runtime.dto.RuntimeDTO;
 import org.apache.sling.resourceresolver.impl.legacy.LegacyResourceProviderWhiteboard;
+import org.apache.sling.resourceresolver.impl.providers.ResourceProviderInfo.Mode;
 import org.apache.sling.spi.resource.provider.ObservationReporter;
 import org.apache.sling.spi.resource.provider.ResourceProvider;
 import org.osgi.framework.BundleContext;
@@ -176,11 +177,7 @@ public class ResourceProviderTracker implements ResourceProviderStorageProvider
 
            ResourceProviderHandler activate = null;
            synchronized ( this.handlers ) {
-               List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
-               if ( matchingHandlers == null ) {
-                   matchingHandlers = new ArrayList<>();
-                   this.handlers.put(info.getPath(), matchingHandlers);
-               }
+               final List<ResourceProviderHandler> matchingHandlers = this.handlers.computeIfAbsent(info.getPath(), key -> new ArrayList<>());
                final ResourceProviderHandler handler = new ResourceProviderHandler(bundleContext, info);
                matchingHandlers.add(handler);
                Collections.sort(matchingHandlers);
@@ -490,6 +487,9 @@ public class ResourceProviderTracker implements ResourceProviderStorageProvider
         final Path handlerPath = new Path(handler.getPath());
 
         for(final String otherPath : handlers.keySet()) {
+            if ( handler.getInfo().getMode() == Mode.PASSTHROUGH ) {
+                continue;
+            }
             if ( !handler.getPath().equals(otherPath) && handlerPath.matches(otherPath) ) {
                 excludedPaths.add(otherPath);
             }