Details

    • Type: Bug
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Affects Version/s: 4.1.2, 4.1.3, 4.1.5
    • Fix Version/s: 4.1.7
    • Component/s: Framework
    • Labels:
      None
    • Environment:
      WinXP SP2, Java 1.5.0_14, Tapestry 4.1.2 (also 4.1.5), IBM Websphere 6.1

      Description

      We are using Tapestry 4.0 for our project and all works fine.
      Now we want migrate to Tapestry 4.1.5 but in our Websphere environment css-assets are not loaded (The css is embedded via Asset in the html header of our page).
      In the source of the generated html page the css is not correct resolved and looks like this:

      <head>
      <title>XYZ</title>
      <link href="/xyz/app?digest=xxxxx&service=asset&path=%2Fpage_x%2Fpage_x.css" type="text/css" rel="stylesheet" id="Any_0"></link>
      </head>

      The correspondending java class creates the css link via "AbstractComponent.getAsset("pageCss").buildURL()".

      The Websphere log says:

      SRTServletRes W WARNING: Cannot set header. Response already committed.

      After debugging, we found the reason for this issue.

      If you deploy an war file in Websphere application server, Websphere creates an ear file with the war included. The classpath is:

      C:\Programme\IBM\WebSphere\AppServer\profiles\AppSrv01\installedApps\ws-product03Node01Cell\demoApp.ear\demoApp.war\WEB-INF\classes;
      C:\Programme\IBM\WebSphere\AppServer\profiles\AppSrv01\installedApps\ws-product03Node01Cell\demoApp.ear\demoApp.war\WEB-INF\lib\tapestry-annotations-4.1.5.jar;
      C:\Programme\IBM\WebSphere\AppServer\profiles\AppSrv01\installedApps\ws-product03Node01Cell\demoApp.ear\demoApp.war\WEB-INF\lib\tapestry-contrib-4.1.5.jar;
      C:\Programme\IBM\WebSphere\AppServer\profiles\AppSrv01\installedApps\ws-product03Node01Cell\demoApp.ear\demoApp.war\WEB-INF\lib\tapestry-framework-4.1.5.jar;
      C:\Programme\IBM\WebSphere\AppServer\profiles\AppSrv01\installedApps\ws-product03Node01Cell\demoApp.ear\demoApp.war

      And our directory structure looks like this:

      demoApp
      demoApp/styles
      demoApp/html
      demoApp/WEB-INF

      Tapestry tries to load an Asset with an AssetFactory.
      In the class org.apache.tapestry.assetAssetSourceImpl the method findAssetFactory(IComponentSpecification spec, Resource baseResource, String path, Locale locale) is used for this.

      It looks up the factory in this way:

      AssetFactory findAssetFactory(IComponentSpecification spec, Resource baseResource, String path, Locale locale) {
      // need to check these two core factories in order first

      if (_classpathAssetFactory.assetExists(spec, baseResource, path, locale))
      return _classpathAssetFactory;

      if (_contextAssetFactory.assetExists(spec, baseResource, path, locale))
      return _contextAssetFactory;

      ....

      }

      As you can see for the ear file, the styles directory is visble from classpath and _classpathAssetFactory.assetExists() will return true.
      And this is the problem.
      Like in Tapestry 4.0, you have to check first _contextAssetFactory.assetExists() and then _classpathAssetFactory.assetExists().

      After applying the patch (changing the order to return the assetFactory), the problem was solved for us.

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              cnutz Christian Nutz
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated: