This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.resourceresolver-1.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
commit 54a4a2382c7473a93d3a08a7ac0144971bc9ef04 Author: Carsten Ziegeler <cziege...@apache.org> AuthorDate: Thu Oct 25 09:17:34 2012 +0000 SLING-2541 : General mechanism to chain resource providers git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/resourceresolver@1402037 13f79535-47bb-0310-9956-ffa450edef68 --- .../impl/helper/ResourceIterator.java | 27 +++++----- .../impl/tree/ResourceProviderEntry.java | 59 +++++++++++++++++----- 2 files changed, 58 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceIterator.java b/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceIterator.java index 0c84e0a..430259c 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceIterator.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceIterator.java @@ -120,8 +120,8 @@ public class ResourceIterator implements Iterator<Resource> { private final ResourceResolverContext resourceResolverContext; public ResourceIterator(final ResourceResolverContext ctx, - final Resource parentResource, - final RootResourceProviderEntry rootProviderEntry) { + final Resource parentResource, + final RootResourceProviderEntry rootProviderEntry) { this.resourceResolverContext = ctx; this.parentResource = parentResource; this.rootProviderEntry = rootProviderEntry; @@ -141,7 +141,7 @@ public class ResourceIterator implements Iterator<Resource> { if (log.isDebugEnabled()) { log.debug(" Provider Set for path {} {} ", path, Arrays - .toString(providersSet.toArray(new ProviderHandler[providersSet.size()]))); + .toString(providersSet.toArray(new ProviderHandler[providersSet.size()]))); } this.iteratorPath = path; providers = providersSet.iterator(); @@ -173,7 +173,7 @@ public class ResourceIterator implements Iterator<Resource> { private Resource seek() { while (delayedIter == null) { while ((resources == null || !resources.hasNext()) - && providers.hasNext()) { + && providers.hasNext()) { final ProviderHandler provider = providers.next(); resources = provider.listChildren(this.resourceResolverContext, parentResource); log.debug(" Checking Provider {} ", provider); @@ -214,18 +214,17 @@ public class ResourceIterator implements Iterator<Resource> { final ResourceProviderEntry rpw = baseEntryValues.next(); final String resPath = iteratorPath + rpw.getPath(); if (!visited.contains(resPath)) { - final ResourceResolver rr = parentResource - .getResourceResolver(); + final ResourceResolver rr = parentResource.getResourceResolver(); final Resource res = rpw.getResourceFromProviders(this.resourceResolverContext, rr, - resPath); + resPath); if (res == null) { if (!delayed.containsKey(resPath)) { delayed.put( + resPath, + new SyntheticResource( + rr, resPath, - new SyntheticResource( - rr, - resPath, - ResourceProvider.RESOURCE_TYPE_SYNTHETIC)); + ResourceProvider.RESOURCE_TYPE_SYNTHETIC)); } } else { // return the real resource immediately, add @@ -234,7 +233,7 @@ public class ResourceIterator implements Iterator<Resource> { delayed.remove(resPath); visited.add(resPath); log.debug(" B resource {} {}", resPath, - res.getClass()); + res.getClass()); return res; } } @@ -273,7 +272,7 @@ public class ResourceIterator implements Iterator<Resource> { * <code>null</code> if there is no entry at the given location */ private ResourceProviderEntry getResourceProviders(final String path, - final Set<ProviderHandler> providers) { + final Set<ProviderHandler> providers) { // collect providers along the ancestor path segements final String[] elements = ResourceProviderEntry.split(path); @@ -283,7 +282,7 @@ public class ResourceIterator implements Iterator<Resource> { base = base.get(element); if (log.isDebugEnabled()) { log.debug("Loading from {} {} ", element, - base.getResourceProviders().length); + base.getResourceProviders().length); } for (final ProviderHandler rp : base.getResourceProviders()) { log.debug("Adding {} for {} ", rp, path); diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java b/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java index b030cd6..1883e86 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java @@ -29,6 +29,7 @@ import java.util.Set; import org.apache.commons.collections.FastTreeMap; import org.apache.sling.api.resource.ModifyingResourceProvider; import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceMetadata; import org.apache.sling.api.resource.ResourceProvider; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.SyntheticResource; @@ -118,8 +119,8 @@ public class ResourceProviderEntry implements Comparable<ResourceProviderEntry> * if an error occurrs trying to access an existing resource. */ public Resource getResource(final ResourceResolverContext ctx, - final ResourceResolver resourceResolver, - final String path) { + final ResourceResolver resourceResolver, + final String path) { return getInternalResource(ctx, resourceResolver, path); } @@ -265,8 +266,8 @@ public class ResourceProviderEntry implements Comparable<ResourceProviderEntry> * @return null if no resource was found, a resource if one was found. */ private Resource getInternalResource(final ResourceResolverContext ctx, - final ResourceResolver resourceResolver, - final String fullPath) { + final ResourceResolver resourceResolver, + final String fullPath) { try { if (fullPath == null || fullPath.length() == 0 || fullPath.charAt(0) != '/') { @@ -277,19 +278,29 @@ public class ResourceProviderEntry implements Comparable<ResourceProviderEntry> final List<ResourceProviderEntry> entries = new ArrayList<ResourceProviderEntry>(); this.populateProviderPath(entries, elements); + Resource fallbackResource = null; + // the path is in reverse order end first for (int i = entries.size() - 1; i >= 0; i--) { final ProviderHandler[] rps = entries.get(i).getResourceProviders(); for (final ProviderHandler rp : rps) { + boolean foundFallback = false; final Resource resource = rp.getResource(ctx, resourceResolver, fullPath); if (resource != null) { - LOGGER.debug("Resolved Full {} using {} from {} ", new Object[] { fullPath, rp, Arrays.toString(rps) }); - return resource; + if ( resource.getResourceMetadata() != null && resource.getResourceMetadata().get(ResourceMetadata.INTERNAL_CONTINUE_RESOLVING) != null ) { + LOGGER.debug("Resolved Full {} using {} from {} - continue resolving flag is set!", new Object[] { fullPath, rp, Arrays.toString(rps) }); + fallbackResource = resource; + fallbackResource.getResourceMetadata().remove(ResourceMetadata.INTERNAL_CONTINUE_RESOLVING); + foundFallback = true; + } else { + LOGGER.debug("Resolved Full {} using {} from {} ", new Object[] { fullPath, rp, Arrays.toString(rps) }); + return resource; + } } - if ( rp.ownsRoots() ) { + if ( rp.ownsRoots() && !foundFallback ) { LOGGER.debug("Resource null {} ", fullPath); - return null; + return fallbackResource; } } } @@ -300,6 +311,11 @@ public class ResourceProviderEntry implements Comparable<ResourceProviderEntry> return resource; } + if ( fallbackResource != null ) { + LOGGER.debug("Using first found resource {} for {}", fallbackResource, fullPath); + return fallbackResource; + } + // query: /libs/sling/servlet/default // resource Provider: libs/sling/servlet/default/GET.servlet // list will match libs, sling, servlet, default @@ -320,21 +336,36 @@ public class ResourceProviderEntry implements Comparable<ResourceProviderEntry> } public Resource getResourceFromProviders(final ResourceResolverContext ctx, - final ResourceResolver resourceResolver, final String fullPath) { + final ResourceResolver resourceResolver, + final String fullPath) { + Resource fallbackResource = null; final ProviderHandler[] rps = getResourceProviders(); for (final ProviderHandler rp : rps) { + boolean foundFallback = false; + final Resource resource = rp.getResource(ctx, resourceResolver, fullPath); if (resource != null) { - LOGGER.debug("Resolved Base {} using {} ", fullPath, rp); - return resource; + if ( resource.getResourceMetadata() != null && resource.getResourceMetadata().get(ResourceMetadata.INTERNAL_CONTINUE_RESOLVING) != null ) { + LOGGER.debug("Resolved Base {} using {} - continue resolving flag is set!", fullPath, rp); + fallbackResource = resource; + fallbackResource.getResourceMetadata().remove(ResourceMetadata.INTERNAL_CONTINUE_RESOLVING); + foundFallback = true; + } else { + LOGGER.debug("Resolved Base {} using {} ", fullPath, rp); + return resource; + } + } + if ( rp.ownsRoots() && !foundFallback ) { + LOGGER.debug("Resource null {} ", fullPath); + return fallbackResource; } } - return null; + return fallbackResource; } public ModifyingResourceProvider getModifyingProvider(final ResourceResolverContext ctx, - final ResourceResolver resourceResolver, - final String fullPath) { + final ResourceResolver resourceResolver, + final String fullPath) { final String[] elements = split(fullPath); final List<ResourceProviderEntry> entries = new ArrayList<ResourceProviderEntry>(); this.populateProviderPath(entries, elements); -- To stop receiving notification emails like this one, please contact "commits@sling.apache.org" <commits@sling.apache.org>.