You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2007/12/07 14:56:05 UTC
svn commit: r602100 - in
/incubator/sling/trunk/microsling/microsling-core/src:
main/java/org/apache/sling/microsling/scripting/
main/java/org/apache/sling/microsling/scripting/helpers/
test/java/org/apache/sling/microsling/integration/ test/java/org/a...
Author: bdelacretaz
Date: Fri Dec 7 05:56:03 2007
New Revision: 602100
URL: http://svn.apache.org/viewvc?rev=602100&view=rev
Log:
SLING-125 - Allow multiple script search paths + search path based on the resource path
Modified:
incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java
incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilder.java
incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilder.java
incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java
incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java
incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilderTest.java
Modified: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java?rev=602100&r1=602099&r2=602100&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/MicroslingScriptResolver.java Fri Dec 7 05:56:03 2007
@@ -57,8 +57,9 @@
* <pre>
* /sling/scripts/some/type/get.html.js
* </pre>
- *
- * in the repository.
+ *
+ * in the repository. In the above example, "/sling/scripts" is a script search path,
+ * which is provided by {#ScriptSearchPathsBuilder}
*/
public class MicroslingScriptResolver implements SlingScriptResolver {
@@ -182,9 +183,19 @@
log.debug("Looking for script with filename=" + scriptFilename
+ " under " + currentPath);
}
+
+ // do not throw exceptions if path is invalid, that might happen
+ // depending on the resource type / search path values
+ boolean pathExists = false;
+ try {
+ pathExists = s.itemExists(currentPath);
+ } catch(Exception e) {
+ if(log.isDebugEnabled()) {
+ log.debug("itemExists(" + currentPath + ") call fails, exception ignored: " + e);
+ }
+ }
- if (s.itemExists(currentPath)) {
-
+ if (pathExists) {
// get the item and ensure it is a node
final Item i = s.getItem(currentPath);
if (i.isNode()) {
Modified: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilder.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilder.java?rev=602100&r1=602099&r2=602100&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilder.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilder.java Fri Dec 7 05:56:03 2007
@@ -36,8 +36,6 @@
*/
public class ScriptFilenameBuilder {
- public static final String SCRIPT_BASE_PATH = "/sling/scripts";
-
/** @return a name like "html.js" or "print/a4/html.vlt" or "POST.js" */
public String buildScriptFilename(String methodName,String requestExtension,String scriptExtension) {
final StringBuffer sb = new StringBuffer();
Modified: incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilder.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilder.java?rev=602100&r1=602099&r2=602100&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilder.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/main/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilder.java Fri Dec 7 05:56:03 2007
@@ -18,6 +18,7 @@
*/
package org.apache.sling.microsling.scripting.helpers;
+import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -30,7 +31,8 @@
*/
public class ScriptSearchPathsBuilder {
- public static final String SCRIPT_BASE_PATH = "/sling/scripts";
+ /** hardcoded for now, these could be configurable */
+ public static final String [] DEFAULT_SCRIPT_SEARCH_PATHS = { "/sling/scripts", "/apps" };
/** Returns the list of paths where scripts can be found, in order,
* for the given request.
@@ -46,26 +48,53 @@
throw new SlingException("resource.getResourceType()==null, cannot build script path");
}
- // base path
final String typePath = resource.getResourceType().replaceAll("\\:","/");
- final String basePath = SCRIPT_BASE_PATH + "/" + typePath.trim();
-
- // if there are selectors A and B, look for a script first under
- // basePath/A/B, then basePath/A, then basePath
final List<String> result = new LinkedList<String> ();
- if(selectors!=null) {
- for(int i=selectors.length - 1; i >= 0; i--) {
- final StringBuffer sb = new StringBuffer();
- sb.append(basePath);
- for(int j=0; j <= i; j++) {
- sb.append("/");
- sb.append(selectors[j]);
+
+ // use the default script search paths + the path provided by getDynamicDefaultScriptPath
+ final List<String> paths = new ArrayList<String>();
+ for(String defaultPath : DEFAULT_SCRIPT_SEARCH_PATHS) {
+ paths.add(defaultPath + "/" + typePath.trim());
+ }
+ // the last path in the list does not take the resource type into account (SLING-125)
+ paths.add(getDynamicDefaultScriptPath(resource));
+
+ // and add selector-based paths, which take precedence over the default ones
+ for(String basePath : paths) {
+
+ // if there are selectors A and B, look for a script first under
+ // basePath/A/B, then basePath/A, then basePath
+ if(selectors!=null) {
+ for(int i=selectors.length - 1; i >= 0; i--) {
+ final StringBuffer sb = new StringBuffer();
+ sb.append(basePath);
+ for(int j=0; j <= i; j++) {
+ sb.append("/");
+ sb.append(selectors[j]);
+ }
+ result.add(sb.toString());
}
- result.add(sb.toString());
}
+ result.add(basePath);
+
}
- result.add(basePath);
+ return result;
+ }
+
+ /** Transform the Resource URI into a search path for scripts.
+ * For example, a resource with URI=/content/blog/a/b/c returns
+ * /apps/blog - this allows for simple path-based mapping of
+ * resources to scripts
+ */
+ protected String getDynamicDefaultScriptPath(Resource r) {
+ String result = null;
+ if(r!=null && r.getURI() != null) {
+ final String [] pathFolders = r.getURI().split("/");
+ if(pathFolders.length >= 3) {
+ result ="/apps/" + pathFolders[2];
+ }
+ }
return result;
}
}
Modified: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java?rev=602100&r1=602099&r2=602100&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/NodetypeRenderingTest.java Fri Dec 7 05:56:03 2007
@@ -26,6 +26,8 @@
*/
public class NodetypeRenderingTest extends RenderingTestBase {
+ private String secondFolderOfContentPath;
+
@Override
protected void setUp() throws Exception {
super.setUp();
@@ -34,7 +36,8 @@
testText = "This is a test " + System.currentTimeMillis();
// create the test node, under a path that's specific to this class to allow collisions
- final String url = HTTP_BASE_URL + "/" + getClass().getSimpleName() + "." + System.currentTimeMillis();
+ secondFolderOfContentPath = "" + System.currentTimeMillis();
+ final String url = HTTP_BASE_URL + "/" + getClass().getSimpleName() + "/" + secondFolderOfContentPath + "/*";
final Map<String,String> props = new HashMap<String,String>();
props.put("text", testText);
displayUrl = testClient.createNode(url, props);
@@ -69,6 +72,27 @@
final String toDelete = uploadTestScript("rendering-test.esp","xml.esp");
try {
final String content = getContent(displayUrl + ".xml", CONTENT_TYPE_XML);
+ assertTrue("Content includes ESP marker",content.contains("ESP template"));
+ assertTrue("Content contains formatted test text",content.contains("<p>" + testText + "</p>"));
+ } finally {
+ testClient.delete(toDelete);
+ }
+ }
+
+ public void testEspHtmlWithContentBasedPath() throws IOException {
+
+ // make sure there's no leftover rendering script
+ {
+ final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
+ assertFalse("Content must not include ESP marker before test",content.contains("ESP template"));
+ }
+
+ // put our script in the /apps/<second folder level of content> (SLING-125)
+ final String path = "/apps/" + secondFolderOfContentPath;
+ testClient.mkdirs(WEBDAV_BASE_URL, path);
+ final String toDelete = uploadTestScript(path,"rendering-test.esp","html.esp");
+ try {
+ final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
assertTrue("Content includes ESP marker",content.contains("ESP template"));
assertTrue("Content contains formatted test text",content.contains("<p>" + testText + "</p>"));
} finally {
Modified: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java?rev=602100&r1=602099&r2=602100&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java Fri Dec 7 05:56:03 2007
@@ -27,6 +27,7 @@
public class SlingResourceTypeRenderingTest extends RenderingTestBase {
private String slingResourceType;
+ private String secondFolderOfContentPath;
@Override
protected void setUp() throws Exception {
@@ -37,7 +38,8 @@
testText = "This is a test " + System.currentTimeMillis();
// create the test node, under a path that's specific to this class to allow collisions
- final String url = HTTP_BASE_URL + "/" + getClass().getSimpleName() + "_" + System.currentTimeMillis() + "/*";
+ secondFolderOfContentPath = "" + System.currentTimeMillis();
+ final String url = HTTP_BASE_URL + "/" + getClass().getSimpleName() + "/" + secondFolderOfContentPath + "/*";
final Map<String,String> props = new HashMap<String,String>();
props.put("sling:resourceType", slingResourceType);
props.put("text", testText);
@@ -60,6 +62,47 @@
public void testEspHtml() throws IOException {
final String toDelete = uploadTestScript("rendering-test.esp","html.esp");
+ try {
+ final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
+ assertTrue("Content includes ESP marker",content.contains("ESP template"));
+ assertTrue("Content contains formatted test text",content.contains("<p>" + testText + "</p>"));
+ } finally {
+ testClient.delete(toDelete);
+ }
+ }
+
+ public void testEspHtmlInAppsFolder() throws IOException {
+ // make sure there's no leftover rendering script
+ {
+ final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
+ assertFalse("Content must not include ESP marker before test",content.contains("ESP template"));
+ }
+
+ // put our script under /apps/<resource type>
+ final String path = "/apps/" + slingResourceType;
+ testClient.mkdirs(WEBDAV_BASE_URL, path);
+ final String toDelete = uploadTestScript(path,"rendering-test.esp","html.esp");
+ try {
+ final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
+ assertTrue("Content includes ESP marker",content.contains("ESP template"));
+ assertTrue("Content contains formatted test text",content.contains("<p>" + testText + "</p>"));
+ } finally {
+ testClient.delete(toDelete);
+ }
+ }
+
+ public void testEspHtmlWithContentBasedPath() throws IOException {
+
+ // make sure there's no leftover rendering script
+ {
+ final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
+ assertFalse("Content must not include ESP marker before test",content.contains("ESP template"));
+ }
+
+ // put our script in the /apps/<second folder level of content> (SLING-125)
+ final String path = "/apps/" + secondFolderOfContentPath;
+ testClient.mkdirs(WEBDAV_BASE_URL, path);
+ final String toDelete = uploadTestScript(path,"rendering-test.esp","html.esp");
try {
final String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
assertTrue("Content includes ESP marker",content.contains("ESP template"));
Modified: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilderTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilderTest.java?rev=602100&r1=602099&r2=602100&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilderTest.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptSearchPathsBuilderTest.java Fri Dec 7 05:56:03 2007
@@ -32,8 +32,8 @@
private final ScriptSearchPathsBuilder builder = new ScriptSearchPathsBuilder();
- private void testBuilder(String resourceType,String [] selectors, String [] paths) throws SlingException {
- final Resource r = new MockResource(resourceType);
+ private void testBuilder(String resourceType,String resourcePath, String [] selectors, String [] paths) throws SlingException {
+ final Resource r = new MockResource(resourceType,resourcePath);
final List<String> actual = builder.getScriptSearchPaths(r, selectors);
@@ -48,34 +48,44 @@
public void testNoSelectorsA() throws SlingException {
final String [] selectors = null;
- final String [] expected = { "/sling/scripts/rt" };
- testBuilder("rt", selectors, expected);
+ final String [] expected = { "/sling/scripts/rt", "/apps/rt", "/apps/blog" };
+ testBuilder("rt", "/content/blog", selectors, expected);
}
public void testNoSelectorsB() throws SlingException {
final String [] selectors = null;
- final String [] expected = { "/sling/scripts/rt/something" };
- testBuilder("rt/something", selectors, expected);
+ final String [] expected = { "/sling/scripts/rt/something", "/apps/rt/something", "/apps/blog" };
+ testBuilder("rt/something", "/content/blog/a/b/c", selectors, expected);
}
public void testWithSelectorsA() throws SlingException {
final String [] selectors = { "a4" };
- final String [] expected = { "/sling/scripts/rt/a4", "/sling/scripts/rt" };
- testBuilder("rt", selectors, expected);
+ final String [] expected = {
+ "/sling/scripts/rt/a4", "/sling/scripts/rt",
+ "/apps/rt/a4", "/apps/rt",
+ "/apps/blog/a4", "/apps/blog",
+ };
+ testBuilder("rt", "/content/blog", selectors, expected);
}
public void testWithSelectorsB() throws SlingException {
final String [] selectors = { "a4", "print" };
- final String [] expected = { "/sling/scripts/rt/x/a4/print", "/sling/scripts/rt/x/a4", "/sling/scripts/rt/x" };
- testBuilder("rt/x", selectors, expected);
+ final String [] expected = {
+ "/sling/scripts/rt/x/a4/print", "/sling/scripts/rt/x/a4", "/sling/scripts/rt/x",
+ "/apps/rt/x/a4/print", "/apps/rt/x/a4", "/apps/rt/x",
+ "/apps/banking/a4/print", "/apps/banking/a4", "/apps/banking",
+ };
+ testBuilder("rt/x", "/somewhere/banking/blog", selectors, expected);
}
static class MockResource implements Resource {
private final String resourceType;
+ private final String path;
- MockResource(String resourceType) {
+ MockResource(String resourceType, String path) {
this.resourceType = resourceType;
+ this.path = path;
}
public String getResourceType() {
@@ -83,7 +93,7 @@
}
public String getURI() {
- throw new Error("MockResource does not implement this method");
+ return path;
}
public ResourceMetadata getResourceMetadata() {