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>.

Reply via email to