[ http://issues.apache.org/jira/browse/TAPESTRY-1020?page=comments#action_12422873 ] Ben Sommerville commented on TAPESTRY-1020: -------------------------------------------
Thanks Jesse, that was quick! However I did find one small problem :( The commons-io normalization function converts the / chars to the system path separators. So on windows /dojo/dojo.js is converted to \\dojo\\dojo.js. Which is then not found by the class loader. You could run the output of FilenameUtils.normalize thru FilenameUtils.separatorsToUnix which should fix the problem (tho it starts to make the call a little ugly :() > 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]
