Author: justin
Date: Mon Mar 2 15:35:44 2015
New Revision: 1663332
URL: http://svn.apache.org/r1663332
Log:
SLING-4468 - fixing case where parent is missing but grandparent is available
Modified:
sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
Modified:
sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java?rev=1663332&r1=1663331&r2=1663332&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
(original)
+++
sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/picker/OverridingResourcePicker.java
Mon Mar 2 15:35:44 2015
@@ -63,25 +63,25 @@ public class OverridingResourcePicker im
resources.add(currentTarget);
while (currentTarget != null) {
- final Resource inheritanceRootResource =
findInheritanceRoot(currentTarget);
- if (inheritanceRootResource == null) {
+ final InheritanceRootInfo info = new InheritanceRootInfo();
+ findInheritanceRoot(currentTarget, info);
+ if (info.resource == null) {
currentTarget = null;
} else {
- final String relPath = currentTarget.getPath()
- .substring(inheritanceRootResource.getPath().length());
+ final Resource inheritanceRootResource = info.resource;
+ final String pathRelativeToInheritanceRoot =
info.getPathRelativeToInheritanceRoot();
final String superType =
inheritanceRootResource.getResourceSuperType();
if (superType == null) {
currentTarget = null;
} else {
- final String superTypeChildPath = superType + relPath;
+ final String superTypeChildPath = superType +
pathRelativeToInheritanceRoot;
final Resource superTypeResource =
resolver.getResource(superTypeChildPath);
if (superTypeResource != null) {
- resources.add(superTypeResource);
currentTarget = superTypeResource;
} else {
- resources.add(new NonExistingResource(resolver,
superTypeChildPath));
- currentTarget = null;
+ currentTarget = new StubResource(resolver,
superTypeChildPath);
}
+ resources.add(currentTarget);
}
}
}
@@ -91,18 +91,33 @@ public class OverridingResourcePicker im
return resources;
}
- private Resource findInheritanceRoot(final Resource target) {
+ private void findInheritanceRoot(final Resource target, final
InheritanceRootInfo info) {
String superType = target.getResourceSuperType();
if (superType != null) {
- return target;
+ info.resource = target;
} else {
Resource parent = target.getParent();
- if (parent == null) {
- return null;
- } else {
- return findInheritanceRoot(parent);
+ if (parent != null) {
+ info.addLevel(target.getName());
+ findInheritanceRoot(parent, info);
}
}
}
+ // Using a value object here as a sort-of tuple because the original
+ // way of calculating the relative path of the current resource from the
+ // inheritance root did not deal with missing resources.
+ private class InheritanceRootInfo {
+ private Resource resource;
+ private final StringBuilder pathRelativeToInheritanceRoot = new
StringBuilder();
+
+ private String getPathRelativeToInheritanceRoot() {
+ return pathRelativeToInheritanceRoot.toString();
+ }
+
+ private void addLevel(String name) {
+ pathRelativeToInheritanceRoot.insert(0, name).insert(0, '/');
+ }
+ }
+
}
Modified:
sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java?rev=1663332&r1=1663331&r2=1663332&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
(original)
+++
sling/trunk/contrib/extensions/resourcemerger/src/test/java/org/apache/sling/resourcemerger/impl/OverridingResourceProviderTest.java
Mon Mar 2 15:35:44 2015
@@ -58,8 +58,10 @@ public class OverridingResourceProviderT
* /apps/a/1/d/1/b/1
* /apps/a/1/c
* /apps/a/2/c
+ * /apps/a/3
*
* /apps/a/2 has the super type of /apps/a/1
+ * /apps/a/3 has the super type of /apps/a/2
*/
@Before
public void setup() throws Exception {
@@ -82,6 +84,7 @@ public class OverridingResourceProviderT
.resource("/apps/a/1/c").p("1", "a").p("2", "b")
.resource("/apps/a/2").p(SUPER_TYPE, "a/1").p("b",
"2").p(MergedResourceConstants.PN_HIDE_CHILDREN, new String[] {"b"})
.resource("c").p("1", "c")
+ .resource("/apps/a/3").p(SUPER_TYPE, "a/2")
.commit();
this.provider = new MergingResourceProvider("/override", new
OverridingResourcePicker(), true);
@@ -108,6 +111,14 @@ public class OverridingResourceProviderT
}
@Test
+ public void testInheritingFromGrandParent() {
+ assertNotNull(this.provider.getResource(this.resolver,
"/override/apps/a/3/a"));
+ assertNull(this.provider.getResource(this.resolver,
"/override/apps/a/3/b"));
+ assertNotNull(this.provider.getResource(this.resolver,
"/override/apps/a/3/c"));
+ assertNotNull(this.provider.getResource(this.resolver,
"/override/apps/a/3/d"));
+ }
+
+ @Test
public void testHideChildrenFromList() {
final Resource rsrcA2 = this.provider.getResource(this.resolver,
"/override/apps/a/2");
final Iterator<Resource> children = this.provider.listChildren(rsrcA2);