[ http://issues.apache.org/jira/browse/TAPESTRY-1020?page=comments#action_12422892 ] Jesse Kuhnert commented on TAPESTRY-1020: -----------------------------------------
Ok, fixed and re-deployed. > 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 > Assigned To: Jesse Kuhnert > Priority: Minor > Fix For: 4.1 > > Attachments: TapBug.zip > > > 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]
