AssetService cannot handle relative paths when asset is in jar
--------------------------------------------------------------

                 Key: TAPESTRY-1020
                 URL: http://issues.apache.org/jira/browse/TAPESTRY-1020
             Project: Tapestry
          Issue Type: Bug
          Components: Framework, JavaScript
    Affects Versions: 4.1
         Environment: Tapestry 4.1 head 21/7/06
JBoss 4.0.4 GA
            Reporter: Ben Sommerville
            Priority: Minor


Dojo uses relative paths to load modules.  e.g. dojo/../tapestry/form.

When these resources are stored within a jar, the Asset service cannot resolve 
them.  I think it would work if they were part of the web resources (since that 
may use a file resolver) but the classpath resolver does not find them

The AssetService needs to convert the supplied path to a cannonical form (no 
back references) before it tries to load the resource.  

I made a quick modification to the AssertService.translateCssPath method which 
accomplishes this.  
String translateCssPath(String path)
   {
        if (path == null) return null;

        // Remove back references in path. 
        if( path.indexOf("/../") >= 0 ) {
            int start = path.indexOf("/../");
            while( start > 0 ) {
                int parentStart = path.lastIndexOf("/", start-1);
                path = path.substring(0,parentStart+1) + 
path.substring(start+4);
                start = path.indexOf("/../");
            }
        }
        
        // don't parse out actual css files
        if (path.endsWith(".css")) return path;
        
        int index = path.lastIndexOf(".css");
        if (index <= -1) return path;
        
        // now need to parse out whatever css file was referenced to get the 
real path
        int pathEnd = path.lastIndexOf("/", index);
        if (pathEnd <= -1) return path;
        
        return path.substring(0, pathEnd + 1) + path.substring(index + 4, 
path.length());
    }

That passes these tests
    public void testRelativePaths() {
        AssetService service = new AssetService();
        assertEquals("/src", service.translateCssPath("/dojo/../src"));
        assertEquals("src", service.translateCssPath("dojo/../src"));
        assertEquals("/src", service.translateCssPath("/dojo/blah/../../src"));
        assertEquals("src", service.translateCssPath("dojo/blah/../../src"));
        assertEquals("/src", service.translateCssPath("/dojo/../blah/../src"));
        assertEquals("src", service.translateCssPath("dojo/../blah/../src"));
        assertEquals("/src/", service.translateCssPath("/dojo/../src/"));
        assertEquals("src/", service.translateCssPath("dojo/../src/"));
        assertEquals("/", service.translateCssPath("/dojo/../"));
        assertEquals("", service.translateCssPath("dojo/../"));
        assertEquals("../dojo", service.translateCssPath("../dojo"));
        assertEquals("/../dojo", service.translateCssPath("/../dojo"));
    }


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to