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 2017/01/06 06:20:01 UTC
svn commit: r1777534 -
/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java
Author: cziegeler
Date: Fri Jan 6 06:20:00 2017
New Revision: 1777534
URL: http://svn.apache.org/viewvc?rev=1777534&view=rev
Log:
SLING-6439 : Filesystem Resource Provider does not support overlaying nodes from repository
Modified:
sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java
Modified: sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java?rev=1777534&r1=1777533&r2=1777534&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java (original)
+++ sling/trunk/bundles/extensions/fsresource/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java Fri Jan 6 06:20:00 2017
@@ -20,8 +20,10 @@ package org.apache.sling.fsprovider.inte
import java.io.File;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.NoSuchElementException;
+import java.util.Set;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
@@ -120,12 +122,23 @@ public class FsResourceProvider extends
* to access the file or folder. If no such file or folder exists, this
* method returns <code>null</code>.
*/
- @Override
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @Override
public Resource getResource(final ResolveContext<Object> ctx,
final String path,
final ResourceContext resourceContext,
final Resource parent) {
- return getResource(ctx.getResourceResolver(), path, getFile(path));
+ Resource rsrc = getResource(ctx.getResourceResolver(), path, getFile(path));
+ if ( rsrc == null ) {
+ // get resource from shadowed provider
+ final ResourceProvider rp = ctx.getParentResourceProvider();
+ if ( rp != null ) {
+ rsrc = rp.getResource((ResolveContext)ctx.getParentResolveContext(),
+ path,
+ resourceContext, parent);
+ }
+ }
+ return rsrc;
}
/**
@@ -165,55 +178,70 @@ public class FsResourceProvider extends
}
}
+ // get children from from shadowed provider
+ final ResourceProvider rp = ctx.getParentResourceProvider();
+ final Iterator<Resource> parentChildrenIterator;
+ if ( rp != null ) {
+ parentChildrenIterator = rp.listChildren(ctx.getParentResolveContext(), parent);
+ } else {
+ parentChildrenIterator = null;
+ }
final File[] children = parentFile.listFiles();
- if (children != null && children.length > 0) {
- final ResourceResolver resolver = parent.getResourceResolver();
- final String parentPath = parent.getPath();
- return new Iterator<Resource>() {
- int index = 0;
-
- Resource next = seek();
-
- @Override
- public boolean hasNext() {
- return next != null;
- }
+ final ResourceResolver resolver = ctx.getResourceResolver();
+ final String parentPath = parent.getPath();
+ return new Iterator<Resource>() {
- @Override
- public Resource next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
+ final Set<String> names = new HashSet<>();
- Resource result = next;
- next = seek();
- return result;
- }
+ int index = 0;
- @Override
- public void remove() {
- throw new UnsupportedOperationException("remove");
- }
+ Resource next = seek();
- private Resource seek() {
- while (index < children.length) {
- File file = children[index++];
- String path = parentPath + "/" + file.getName();
- Resource result = getResource(resolver, path, file);
- if (result != null) {
- return result;
- }
- }
+ @Override
+ public boolean hasNext() {
+ return next != null;
+ }
- // nothing found any more
- return null;
+ @Override
+ public Resource next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
}
- };
- }
- // no children
- return null;
+ Resource result = next;
+ next = seek();
+ return result;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("remove");
+ }
+
+ private Resource seek() {
+ while (children != null && index < children.length) {
+ File file = children[index++];
+ String path = parentPath + "/" + file.getName();
+ Resource result = getResource(resolver, path, file);
+ if (result != null) {
+ names.add(file.getName());
+ return result;
+ }
+ }
+ if ( parentChildrenIterator != null ) {
+ while ( parentChildrenIterator.hasNext() ) {
+ final Resource result = parentChildrenIterator.next();
+ if ( !names.contains(result.getName()) ) {
+ names.add(result.getName());
+ return result;
+ }
+ }
+ }
+ // nothing found any more
+ return null;
+ }
+ };
}
// ---------- SCR Integration
@@ -307,15 +335,16 @@ public class FsResourceProvider extends
return null;
}
- private Resource getResource(ResourceResolver resourceResolver,
- String resourcePath, File file) {
+ private Resource getResource(final ResourceResolver resolver,
+ final String resourcePath,
+ final File file) {
if (file != null) {
// if the file exists, but is not a directory or no repository entry
// exists, return it as a resource
if (file.exists()) {
- return new FsResource(resourceResolver, resourcePath, file);
+ return new FsResource(resolver, resourcePath, file);
}
}