SLING-6036 ResourceBuilder: Reusing ResourceBuilder instances
git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1759351 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java b/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java
index 4905387..3440a27 100644
--- a/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java
+++ b/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java
@@ -59,8 +59,18 @@
}
originalParent = parent;
resourceResolver = originalParent.getResourceResolver();
- withIntermediatePrimaryType(null);
- atParent();
+ intermediatePrimaryType = DEFAULT_PRIMARY_TYPE;
+ currentParent = parent;
+ hierarchyMode = true;
+ }
+
+ private ResourceBuilderImpl cloneResourceBuilder(Resource newCurrentParent,
+ String newIntermediatePrimaryType, boolean newHierarchyMode) {
+ ResourceBuilderImpl clone = new ResourceBuilderImpl(originalParent, mimeTypeService);
+ clone.currentParent = newCurrentParent;
+ clone.intermediatePrimaryType = newIntermediatePrimaryType;
+ clone.hierarchyMode = newHierarchyMode;
+ return clone;
}
@Override
@@ -80,9 +90,7 @@
@Override
public ResourceBuilder atParent() {
- currentParent = originalParent;
- hierarchyMode();
- return this;
+ return cloneResourceBuilder(originalParent, this.intermediatePrimaryType, true);
}
private boolean isAbsolutePath(String path) {
@@ -145,10 +153,10 @@
"PersistenceException while creating Resource " + fullPath, pex);
}
- if(r == null) {
+ if (r == null) {
throw new RuntimeException("Failed to get or create resource " + fullPath);
} else if(hierarchyMode) {
- currentParent = r;
+ return cloneResourceBuilder(r, this.intermediatePrimaryType, this.hierarchyMode);
}
return this;
}
@@ -231,9 +239,8 @@
throw new RuntimeException("Unable to get or created file resource " + relativePath + " under " + currentParent.getPath());
}
if(hierarchyMode) {
- currentParent = file;
+ return cloneResourceBuilder(file, this.intermediatePrimaryType, this.hierarchyMode);
}
-
return this;
}
@@ -244,20 +251,18 @@
@Override
public ResourceBuilder withIntermediatePrimaryType(String primaryType) {
- intermediatePrimaryType = primaryType == null ? DEFAULT_PRIMARY_TYPE : primaryType;
- return this;
+ String intermediatePrimaryType = primaryType == null ? DEFAULT_PRIMARY_TYPE : primaryType;
+ return cloneResourceBuilder(currentParent, intermediatePrimaryType, hierarchyMode);
}
@Override
public ResourceBuilder siblingsMode() {
- hierarchyMode = false;
- return this;
+ return cloneResourceBuilder(currentParent, intermediatePrimaryType, false);
}
@Override
public ResourceBuilder hierarchyMode() {
- hierarchyMode = true;
- return this;
+ return cloneResourceBuilder(currentParent, intermediatePrimaryType, true);
}
@Override
diff --git a/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java b/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java
index 6d3cf52..def23ac 100644
--- a/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java
+++ b/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java
@@ -30,6 +30,7 @@
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.commons.mime.MimeTypeService;
+import org.apache.sling.resourcebuilder.api.ResourceBuilder;
import org.apache.sling.resourcebuilder.test.ResourceAssertions;
import org.apache.sling.testing.mock.sling.ResourceResolverType;
import org.apache.sling.testing.mock.sling.junit.SlingContext;
@@ -345,5 +346,24 @@
A.assertResource("/g/h/i/j/l/m");
A.assertResource("/o/p/q");
}
-
+
+ @Test
+ public void reuseInstance() throws Exception {
+ ResourceBuilder content = new ResourceBuilderService()
+ .forResolver(resourceResolver)
+ .resource("/content");
+ content.resource("a");
+ content.resource("b/c");
+ content.resource("/test")
+ .siblingsMode()
+ .resource("1")
+ .resource("2");
+
+ A.assertResource("/content/a");
+ A.assertResource("/content/b/c");
+ A.assertResource("/test");
+ A.assertResource("/test/1");
+ A.assertResource("/test/2");
+ }
+
}