You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by "Jesse Kuhnert (JIRA)" <ta...@jakarta.apache.org> on 2006/07/21 15:48:14 UTC
[jira] Commented: (TAPESTRY-1020) AssetService cannot handle
relative paths when asset is in jar
[ http://issues.apache.org/jira/browse/TAPESTRY-1020?page=comments#action_12422644 ]
Jesse Kuhnert commented on TAPESTRY-1020:
-----------------------------------------
Can you give me an example of a resource dojo has been unable to resolve when packaged into the Tapestry jar? I've not had this issue so far and would definitely like to investigate further.
> 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: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org