You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ss...@apache.org on 2016/09/05 19:36:07 UTC
svn commit: r1759348 - in /sling/trunk/bundles/extensions/resourcebuilder:
./ src/main/java/org/apache/sling/resourcebuilder/api/
src/main/java/org/apache/sling/resourcebuilder/impl/
src/test/java/org/apache/sling/resourcebuilder/impl/
Author: sseifert
Date: Mon Sep 5 19:36:07 2016
New Revision: 1759348
URL: http://svn.apache.org/viewvc?rev=1759348&view=rev
Log:
SLING-6035 ResourceBuilder: Support absolute paths
This closes #165
Added:
sling/trunk/bundles/extensions/resourcebuilder/.gitignore
Modified:
sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java
sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java
sling/trunk/bundles/extensions/resourcebuilder/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java
Added: sling/trunk/bundles/extensions/resourcebuilder/.gitignore
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/resourcebuilder/.gitignore?rev=1759348&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/resourcebuilder/.gitignore (added)
+++ sling/trunk/bundles/extensions/resourcebuilder/.gitignore Mon Sep 5 19:36:07 2016
@@ -0,0 +1 @@
+sling
\ No newline at end of file
Modified: sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java?rev=1759348&r1=1759347&r2=1759348&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java (original)
+++ sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/api/ResourceBuilder.java Mon Sep 5 19:36:07 2016
@@ -45,12 +45,13 @@ public interface ResourceBuilder {
/** Create a Resource, which optionally becomes the current
* parent Resource.
- * @param relativePath The path of the Resource to create, relative to
- * this builder's current parent Resource.
+ * @param path The path of the Resource to create.
+ * If it's a relative path this builder's current resource is used as parent.
+ * Otherwise the resource is created ad the given absoulte path.
* @param properties optional name-value pairs
* @return this builder
*/
- ResourceBuilder resource(String relativePath, Object ... properties);
+ ResourceBuilder resource(String path, Object ... properties);
/** Create a file under the current parent resource
* @param filename The name of the created file
Modified: sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java?rev=1759348&r1=1759347&r2=1759348&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java (original)
+++ sling/trunk/bundles/extensions/resourcebuilder/src/main/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImpl.java Mon Sep 5 19:36:07 2016
@@ -85,12 +85,16 @@ public class ResourceBuilderImpl impleme
return this;
}
- private void checkRelativePath(String relativePath) {
- if(relativePath.startsWith("/")) {
- throw new IllegalArgumentException("Path is not relative:" + relativePath);
+ private boolean isAbsolutePath(String path) {
+ return path.startsWith("/") && !path.contains("..");
+ }
+
+ private void checkRelativePath(String path) {
+ if(path.startsWith("/")) {
+ throw new IllegalArgumentException("Path is not relative:" + path);
}
- if(relativePath.contains("..")) {
- throw new IllegalArgumentException("Path contains invalid pattern '..': " + relativePath);
+ if(path.contains("..")) {
+ throw new IllegalArgumentException("Path contains invalid pattern '..': " + path);
}
}
@@ -104,19 +108,28 @@ public class ResourceBuilderImpl impleme
}
@Override
- public ResourceBuilder resource(String relativePath, Object... properties) {
+ public ResourceBuilder resource(String path, Object... properties) {
Resource r = null;
- checkRelativePath(relativePath);
- final String parentPath = parentPath(relativePath);
+
+ final String parentPath;
+ final String fullPath;
+ if (isAbsolutePath(path)) {
+ parentPath = ResourceUtil.getParent(path);
+ fullPath = path;
+ }
+ else {
+ checkRelativePath(path);
+ parentPath = parentPath(path);
+ fullPath = currentParent.getPath() + "/" + path;
+ }
final Resource myParent = ensureResourceExists(parentPath);
- final String fullPath = currentParent.getPath() + "/" + relativePath;
try {
r = currentParent.getResourceResolver().getResource(fullPath);
final Map<String, Object> props = MapArgsConverter.toMap(properties);
if(r == null) {
r = currentParent.getResourceResolver().create(myParent,
- ResourceUtil.getName(relativePath), props);
+ ResourceUtil.getName(fullPath), props);
} else {
// Resource exists, set our properties
final ModifiableValueMap mvm = r.adaptTo(ModifiableValueMap.class);
@@ -129,13 +142,11 @@ public class ResourceBuilderImpl impleme
}
} catch(PersistenceException pex) {
throw new RuntimeException(
- "PersistenceException while creating Resource " + relativePath
- + " under " + currentParent.getPath(), pex);
+ "PersistenceException while creating Resource " + fullPath, pex);
}
if(r == null) {
- throw new RuntimeException("Failed to get or create resource " + relativePath
- + " under " + currentParent.getPath());
+ throw new RuntimeException("Failed to get or create resource " + fullPath);
} else if(hierarchyMode) {
currentParent = r;
}
Modified: sling/trunk/bundles/extensions/resourcebuilder/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/resourcebuilder/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java?rev=1759348&r1=1759347&r2=1759348&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/resourcebuilder/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java (original)
+++ sling/trunk/bundles/extensions/resourcebuilder/src/test/java/org/apache/sling/resourcebuilder/impl/ResourceBuilderImplTest.java Mon Sep 5 19:36:07 2016
@@ -200,11 +200,6 @@ public class ResourceBuilderImplTest {
}
@Test(expected=IllegalArgumentException.class)
- public void absolutePathFails() throws Exception {
- getBuilder(testRootPath).resource("/absolute");
- }
-
- @Test(expected=IllegalArgumentException.class)
public void aboveParentFails() throws Exception {
getBuilder(testRootPath).resource("../foo");
}
@@ -332,4 +327,23 @@ public class ResourceBuilderImplTest {
// Resource is created at root in this case
A.assertResource("/d/e/f");
}
+
+ @Test
+ public void absolutePath() throws Exception {
+ new ResourceBuilderService()
+ .forResolver(resourceResolver)
+ .resource("/a/b/c")
+ .resource("/a/b/f")
+ .resource("/g/h/i")
+ .resource("j/l/m")
+ .resource("/o/p/q");
+
+ // absolute paths are supported and can be mixed with relative paths
+ A.assertResource("/a/b/c");
+ A.assertResource("/a/b/f");
+ A.assertResource("/g/h/i");
+ A.assertResource("/g/h/i/j/l/m");
+ A.assertResource("/o/p/q");
+ }
+
}