Tapestry
  1. Tapestry
  2. TAPESTRY-1020

AssetService cannot handle relative paths when asset is in jar

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 4.1
    • Fix Version/s: 4.1
    • Component/s: Framework, JavaScript
    • Labels:
      None
    • Environment:
      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")); }
      1. TapBug.zip
        15 kB
        Ben Sommerville

        Activity

          People

          • Assignee:
            Jesse Kuhnert
            Reporter:
            Ben Sommerville
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development