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

AssetService cannot handle relative paths when asset is in jar

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Minor
    • Resolution: Fixed
    • 4.1
    • 4.1
    • Framework, JavaScript
    • None
    • Tapestry 4.1 head 21/7/06
      JBoss 4.0.4 GA

    Description

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

      Attachments

        1. TapBug.zip
          15 kB
          Ben Sommerville

        Activity

          People

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

            Dates

              Created:
              Updated:
              Resolved: