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