You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:58:32 UTC

[sling-org-apache-sling-resourcebuilder] 23/36: SLING-6036 ResourceBuilder: Reusing ResourceBuilder instances

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.resourcebuilder-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourcebuilder.git

commit a98c8621de39f9a5c42ecc267b9c95f26a584e59
Author: Stefan Seifert <ss...@apache.org>
AuthorDate: Mon Sep 5 20:06:48 2016 +0000

    SLING-6036 ResourceBuilder: Reusing ResourceBuilder instances
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/resourcebuilder@1759351 13f79535-47bb-0310-9956-ffa450edef68
---
 .../resourcebuilder/impl/ResourceBuilderImpl.java  | 35 ++++++++++++----------
 .../impl/ResourceBuilderImplTest.java              | 22 +++++++++++++-
 2 files changed, 41 insertions(+), 16 deletions(-)

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 @@ public class ResourceBuilderImpl implements ResourceBuilder {
         }
         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 @@ public class ResourceBuilderImpl implements ResourceBuilder {
 
     @Override
     public ResourceBuilder atParent() {
-        currentParent = originalParent;
-        hierarchyMode();
-        return this;
+        return cloneResourceBuilder(originalParent, this.intermediatePrimaryType, true);
     }
     
     private boolean isAbsolutePath(String path) {
@@ -145,10 +153,10 @@ public class ResourceBuilderImpl implements ResourceBuilder {
                     "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 @@ public class ResourceBuilderImpl implements ResourceBuilder {
             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 @@ public class ResourceBuilderImpl implements ResourceBuilder {
 
     @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.Resource;
 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 @@ public class ResourceBuilderImplTest {
         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");
+    }
+
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.