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/04 13:57:41 UTC

svn commit: r600919 - 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: Tue Dec  4 04:57:40 2007
New Revision: 600919

URL: http://svn.apache.org/viewvc?rev=600919&view=rev
Log:
SLING-117 : MicroslingScriptResolver did not go up the path for selectors, fixed

Added:
    incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-2.esp
    incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-3.esp
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/test/java/org/apache/sling/microsling/integration/SlingResourceTypeRenderingTest.java
    incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilderTest.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=600919&r1=600918&r2=600919&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 Tue Dec  4 04:57:40 2007
@@ -22,6 +22,8 @@
 import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
 import javax.jcr.Item;
@@ -167,50 +169,65 @@
 
         String scriptFilename = scriptFilenameBuilder.buildScriptFilename(
             request.getMethod(),
-            request.getRequestPathInfo().getSelectorString(),
             request.getRequestPathInfo().getExtension(), 
             "*");
         String scriptPath = scriptFilenameBuilder.buildScriptPath(r);
-
-        // SLING-72: if the scriptfilename contains a relative path, move that
-        // to the scriptPath and make the scriptFilename a direct child pattern
-        int lastSlash = scriptFilename.lastIndexOf('/');
-        if (lastSlash >= 0) {
-            scriptPath += "/" + scriptFilename.substring(0, lastSlash);
-            scriptFilename = scriptFilename.substring(lastSlash + 1);
-        }
-
+        
         // this is the location of the trailing asterisk
         final int scriptExtensionOffset = scriptFilename.length() - 1;
 
-        if (log.isDebugEnabled()) {
-            log.debug("Looking for script with filename=" + scriptFilename
-                + " under " + scriptPath);
+        // if there are selectors A and B, look for a script first at
+        // A/B/scriptFilename, then A/scriptFilename, then scriptFilename
+        final List<String> possiblePaths = new LinkedList<String> ();
+        final String [] selectors = request.getRequestPathInfo().getSelectors();
+        if(selectors!=null) {
+            final StringBuffer sb = new StringBuffer();
+            sb.append(scriptPath);
+            for(int i=selectors.length - 1; i >= 0; i--) {
+                for(int j=0; j <= i; j++) {
+                    sb.append("/");
+                    sb.append(selectors[j]);
+                }
+                possiblePaths.add(sb.toString());
+            }
         }
-
-        if (s.itemExists(scriptPath)) {
-
-            // get the item and ensure it is a node
-            final Item i = s.getItem(scriptPath);
-            if (i.isNode()) {
-                Node parent = (Node) i;
-                NodeIterator scriptNodeIterator = parent.getNodes(scriptFilename);
-                while (scriptNodeIterator.hasNext()) {
-                    Node scriptNode = scriptNodeIterator.nextNode();
-
-                    // SLING-72: Require the node to be an nt:file
-                    if (scriptNode.isNodeType("nt:file")) {
-
-                        String scriptName = scriptNode.getName();
-                        String scriptExt = scriptName.substring(scriptExtensionOffset);
-                        SlingScriptEngine scriptEngine = scriptEngines.get(scriptExt);
-
-                        if (scriptEngine != null) {
-                            MicroslingScript script = new MicroslingScript();
-                            script.setScriptResource(new JcrNodeResource(scriptNode));
-                            script.setScriptEngine(scriptEngine);
-                            result = script;
-                            break;
+        possiblePaths.add(scriptPath);
+        
+        for(String currentPath : possiblePaths) {
+            
+            if(result != null) {
+                break;
+            }
+            
+            if (log.isDebugEnabled()) {
+                log.debug("Looking for script with filename=" + scriptFilename
+                    + " under " + scriptPath);
+            }
+            
+            if (s.itemExists(currentPath)) {
+    
+                // get the item and ensure it is a node
+                final Item i = s.getItem(currentPath);
+                if (i.isNode()) {
+                    Node parent = (Node) i;
+                    NodeIterator scriptNodeIterator = parent.getNodes(scriptFilename);
+                    while (scriptNodeIterator.hasNext()) {
+                        Node scriptNode = scriptNodeIterator.nextNode();
+    
+                        // SLING-72: Require the node to be an nt:file
+                        if (scriptNode.isNodeType("nt:file")) {
+    
+                            String scriptName = scriptNode.getName();
+                            String scriptExt = scriptName.substring(scriptExtensionOffset);
+                            SlingScriptEngine scriptEngine = scriptEngines.get(scriptExt);
+    
+                            if (scriptEngine != null) {
+                                MicroslingScript script = new MicroslingScript();
+                                script.setScriptResource(new JcrNodeResource(scriptNode));
+                                script.setScriptEngine(scriptEngine);
+                                result = script;
+                                break;
+                            }
                         }
                     }
                 }

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=600919&r1=600918&r2=600919&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 Tue Dec  4 04:57:40 2007
@@ -41,16 +41,8 @@
     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 selectors,String requestExtension,String scriptExtension) {
+    public String buildScriptFilename(String methodName,String requestExtension,String scriptExtension) {
         final StringBuffer sb = new StringBuffer();
-
-        // path before filename:
-        // add selectors in front of the filename if any, replacing dots in them by slashes
-        // so that print.a4 becomes print/a4/
-        if(selectors != null) {
-            sb.append(selectors.toLowerCase().replace('.','/'));
-            sb.append('/');
-        }
 
         // filename:
         if(methodName==null || methodName.length() == 0) {

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=600919&r1=600918&r2=600919&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 Tue Dec  4 04:57:40 2007
@@ -37,7 +37,7 @@
         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();
+        final String url = HTTP_BASE_URL + "/" + getClass().getSimpleName() + "_" + System.currentTimeMillis() + "/*";
         final Map<String,String> props = new HashMap<String,String>();
         props.put("sling:resourceType", slingResourceType);
         props.put("text", testText);
@@ -66,6 +66,35 @@
             assertTrue("Content contains formatted test text",content.contains("<p>" + testText + "</p>"));
         } finally {
             testClient.delete(toDelete);
+        }
+    }
+
+    public void testEspHtmlWithSelectors() throws IOException {
+        final String toDeleteA = uploadTestScript("rendering-test.esp","html.esp");
+        testClient.mkdirs(WEBDAV_BASE_URL, scriptPath + "/a4/print");
+        final String toDeleteB = uploadTestScript(scriptPath + "/a4","rendering-test-2.esp","html.esp");
+        final String toDeleteC = uploadTestScript(scriptPath + "/a4/print","rendering-test-3.esp","html.esp");
+        
+        try {
+            String content = getContent(displayUrl + ".html", CONTENT_TYPE_HTML);
+            assertTrue("Without selectors, content includes standard marker",content.contains("ESP template"));
+            assertTrue("Without selectors, content contains formatted test text",content.contains("<p>" + testText + "</p>"));
+            
+            content = getContent(displayUrl + ".a4.print.html", CONTENT_TYPE_HTML);
+            assertTrue("With a4.print selectors, content includes marker 3",content.contains("Template #3 for ESP tests"));
+            assertTrue("With a4.print selectors, content contains italic text",content.contains("<em>" + testText + "</em>"));
+            
+            content = getContent(displayUrl + ".a4.html", CONTENT_TYPE_HTML);
+            assertTrue("With a4 selector, content includes marker 2",content.contains("Template #2 for ESP tests"));
+            assertTrue("With a4 selector, content contains bold text",content.contains("<b>" + testText + "</b>"));
+            
+            content = getContent(displayUrl + ".different.html", CONTENT_TYPE_HTML);
+            assertTrue("With different selector only, content includes standard marker",content.contains("ESP template"));
+            assertTrue("With different selector only, content contains formatted test text",content.contains("<p>" + testText + "</p>"));
+        } finally {
+            testClient.delete(toDeleteA);
+            testClient.delete(toDeleteB);
+            testClient.delete(toDeleteC);
         }
     }
 

Modified: incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilderTest.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilderTest.java?rev=600919&r1=600918&r2=600919&view=diff
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilderTest.java (original)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/java/org/apache/sling/microsling/scripting/helpers/ScriptFilenameBuilderTest.java Tue Dec  4 04:57:40 2007
@@ -32,62 +32,50 @@
     }
 
     public void testNull() {
-        assertEquals("NO_METHOD.NO_EXT",builder.buildScriptFilename(null,null,null,null));
+        assertEquals("NO_METHOD.NO_EXT",builder.buildScriptFilename(null,null,null));
     }
     
     public void testSimpleGet() {
-        assertEquals("html.js",builder.buildScriptFilename("GET",null,"html","js"));
+        assertEquals("html.js",builder.buildScriptFilename("GET","html","js"));
     }
     
     public void testGetAndNulls() {
-        assertEquals("GET.NO_EXT",builder.buildScriptFilename("GET",null,null,null));
+        assertEquals("GET.NO_EXT",builder.buildScriptFilename("GET",null,null));
     }
     
     public void testSimpleHead() {
-        assertEquals("HEAD.js",builder.buildScriptFilename("HEAD",null,"text/html","js"));
-    }
-    
-    public void testGetOneSelector() {
-        assertEquals("print/html.js",builder.buildScriptFilename("GET","print","html","js"));
-    }
-    
-    public void testGetTwoSelectors() {
-        assertEquals("print/a4/xml.vlt",builder.buildScriptFilename("GET","print.a4","xml","vlt"));
+        assertEquals("HEAD.js",builder.buildScriptFilename("HEAD","text/html","js"));
     }
     
     public void testSimplePost() {
-        assertEquals("POST.js",builder.buildScriptFilename("POST",null,"html","js"));
+        assertEquals("POST.js",builder.buildScriptFilename("POST","html","js"));
     }
     
     public void testSimplePut() {
-        assertEquals("PUT.js",builder.buildScriptFilename("PUT",null,"html","js"));
+        assertEquals("PUT.js",builder.buildScriptFilename("PUT","html","js"));
     }
     
     public void testSimpleDelete() {
-        assertEquals("DELETE.js",builder.buildScriptFilename("DELETE",null,"html","js"));
+        assertEquals("DELETE.js",builder.buildScriptFilename("DELETE","html","js"));
     }
     
     public void testGetTextMimeType() {
-        assertEquals("txt.js",builder.buildScriptFilename("GET",null,"txt","js"));
+        assertEquals("txt.js",builder.buildScriptFilename("GET","txt","js"));
     }
     
     public void testGetWhateverMimeType() {
-        assertEquals("whatever.js",builder.buildScriptFilename("GET",null,"whatever","js"));
+        assertEquals("whatever.js",builder.buildScriptFilename("GET","whatever","js"));
     }
     
     public void testGetNoSlashMimeType() {
-        assertEquals("bar.js",builder.buildScriptFilename("GET",null,"bar","js"));
+        assertEquals("bar.js",builder.buildScriptFilename("GET","bar","js"));
     }
     
     public void testCaseCleanupOne() {
-        assertEquals("POST.js",builder.buildScriptFilename("posT",null,"html","jS"));
+        assertEquals("POST.js",builder.buildScriptFilename("posT","html","jS"));
     }
     
     public void testCaseCleanupTwo() {
-        assertEquals("html.js",builder.buildScriptFilename("get",null,"HTML","JS"));
-    }
-    
-    public void testCaseCleanupThree() {
-        assertEquals("print/a4/html.js",builder.buildScriptFilename("get","PRInT.A4","HTML","JS"));
+        assertEquals("html.js",builder.buildScriptFilename("get","HTML","JS"));
     }
 }

Added: incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-2.esp
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-2.esp?rev=600919&view=auto
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-2.esp (added)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-2.esp Tue Dec  4 04:57:40 2007
@@ -0,0 +1,7 @@
+<%-- used by ScriptedRenderingTest --%>
+<html>
+	<body>
+		Template #2 for ESP tests 
+		<p><b><%= resource.node.text %></b></p>
+	</body>
+</html>

Added: incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-3.esp
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-3.esp?rev=600919&view=auto
==============================================================================
--- incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-3.esp (added)
+++ incubator/sling/trunk/microsling/microsling-core/src/test/resources/integration-test/rendering-test-3.esp Tue Dec  4 04:57:40 2007
@@ -0,0 +1,7 @@
+<%-- used by ScriptedRenderingTest --%>
+<html>
+	<body>
+		Template #3 for ESP tests 
+		<p><em><%= resource.node.text %></em></p>
+	</body>
+</html>