org.apache.tapestry.asset
Class AssetExternalizerImpl

java.lang.Object
  extended byorg.apache.tapestry.asset.AssetExternalizerImpl
All Implemented Interfaces:
AssetExternalizer

public class AssetExternalizerImpl
extends java.lang.Object
implements AssetExternalizer

Implementation of the AssetExternalizerservice interface. Responsible for copying assets from the classpath to an external directory that is visible to the web server. The externalizer is stored inside the ServletContextas a named attribute.

The externalizer uses the name org.apache.tapestry.AssetExternalizer.application name . It configures itself using two additional properties (searching in IEngine.getPropertySource().

Parameter Description
org.apache.tapestry.asset.dir The directory to which assets will be copied.
org.apache.tapestry.asset.URL The corresponding URL for the asset directory.

If either of these parameters is null, then no externalization occurs. Private assets will still be available, just less efficiently, as the application will be invoked via its servlet and, ultimately, the AssetServicewill need to retrieve the asset.

Assets maintain thier directory structure when copied. For example, an asset with a resource path of /com/skunkworx/Banner.gif would be copied to the file system as dir/com/skunkworx/Banner.gif and would have a URL of URL/com/skunkworx/Banner.gif.

The externalizer will create any directories as needed.

The externalizer will not overwrite existing files. When a new version of the application is deployed with changed assets, there are two deployment stategies:

When using the second approach, it is best to use a directory that has a version number in it, for example, D:/inetpub/assets/0 mapped to the URL /assets/0. When a new version of the application is deployed, the trailing version number is incremented from 0 to 1.

Author:
Howard Lewis Ship

Constructor Summary
AssetExternalizerImpl()
           
 
Method Summary
protected  void externalize(java.lang.String resourcePath)
           
 java.lang.String getURL(java.lang.String resourcePath)
          Gets the URL to a private resource.
 void initializeService()
           
 void setClassResolver(org.apache.hivemind.ClassResolver resolver)
           
 void setLog(org.apache.commons.logging.Log log)
           
 void setPropertySource(IPropertySource propertySource)
          since 4.0
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

AssetExternalizerImpl

public AssetExternalizerImpl()
Method Detail

initializeService

public void initializeService()

externalize

protected void externalize(java.lang.String resourcePath)
                    throws java.io.IOException
Throws:
java.io.IOException

getURL

public java.lang.String getURL(java.lang.String resourcePath)
Gets the URL to a private resource. If the resource was previously copied out of the classpath, the previously generated URL is returned.

If the asset directory and URL are not configured, then returns null.

Otherwise, the asset is copied out to the asset directory, the URL is constructed (and recorded for later) and the URL is returned.

This method is not explicitly synchronized but should work multi-threaded. It synchronizes on the internal Map used to map resource paths to URLs.

Specified by:
getURL in interface AssetExternalizer
Parameters:
resourcePath - The full path of the resource within the classpath. This is expected to include a leading slash. For example: /com/skunkworx/Banner.gif.

setLog

public void setLog(org.apache.commons.logging.Log log)
Since:
4.0

setClassResolver

public void setClassResolver(org.apache.hivemind.ClassResolver resolver)
Since:
4.0

setPropertySource

public void setPropertySource(IPropertySource propertySource)
since 4.0