Uploaded image for project: 'Tapestry'
  1. Tapestry
  2. TAPESTRY-1020

AssetService cannot handle relative paths when asset is in jar


    • Type: Bug
    • Status: Resolved
    • Priority: Minor
    • Resolution: Fixed
    • Affects Version/s: 4.1
    • Fix Version/s: 4.1
    • Component/s: Framework, JavaScript
    • Labels:
    • Environment:
      Tapestry 4.1 head 21/7/06
      JBoss 4.0.4 GA


      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")); }


        1. TapBug.zip
          15 kB
          Ben Sommerville



            • Assignee:
              jkuhnert Jesse Kuhnert
              bpsommerville Ben Sommerville
            • Votes:
              0 Vote for this issue
              0 Start watching this issue


              • Created: