< WebObjects < Web Applications < Development
Petite Abeille
Here is a little example on how to write your own WOResourceManager:
The main methods to implement are urlForResourceNamed() and bytesForResourceNamed().
- urlForResourceNamed simply build an URL for a resource from wherever you would like (e.g. a jar file). Unfortunately, urlForResourceNamed uses pathForResourceNamed so you will need to rewrite that also:
private URL urlForResourceNamed(String aResourceName)
{
return this.getClass().getResource( aResourceName );
}
public String pathForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
{
URL anURL = this.urlForResourceNamed( aResourceName );
if ( anURL != null )
{
return anURL.toExternalForm();
}
return null;
}
public String urlForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages, WORequest aRequest)
{
String anURL = super.urlForResourceNamed( aResourceName, aFrameworkName, someLanguages, aRequest );
this.bytesForResourceNamed( aResourceName, aFrameworkName, someLanguages );
return anURL;
}
- bytesForResourceNamed simply retrieve a resource from wherever you would like (e.g. a jar file):
public InputStream inputStreamForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages) { return this.getClass().getResourceAsStream( aResourceName ); } public byte[] bytesForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages) { if ( aResourceName != null ) { URL anURL = this.urlForResourceNamed( aResourceName ); if ( anURL != null ) { String aKey = anURL.toString(); WOURLValuedElementData anElement = (WOURLValuedElementData) _cache.get( aKey ); if ( anElement == null ) { synchronized( this ) { InputStream anInputStream = this.inputStreamForResourceNamed( aResourceName, null, null ); if ( anInputStream != null ) { try { InputStream aBufferStream = new BufferedInputStream( anInputStream ); byte[] someBytes = new byte[ aBufferStream.available() ]; aBufferStream.read( someBytes ); aBufferStream.close(); anInputStream.close(); { Data someData = new Data( someBytes ); String aType = this.contentTypeForResourceNamed( aKey ); anElement = new WOURLValuedElementData( someData, aType, aKey ); _cache.put( aKey, anElement ); } } catch(Exception anException) { SZLog.warning( anException ); } } } } return ( (Data) anElement.data() ).bytesNoCopy(); } SZLog.debug( "Null url for resource named '" + aResourceName + "'." ); return null; } throw new IllegalArgumentException ( "ResourceManager.bytesForResourceNamed: null resource name." ); }
- Last but not least, you need to take care of those funky WOURLValuedElementData so dataForResourceNamed will work:
public NSData dataForResourceNamed(String aResourceName) { this.bytesForResourceNamed( aResourceName, null, null ); String aKey = this.urlForResourceNamed( aResourceName ).toString(); WOURLValuedElementData anElement = (WOURLValuedElementData) _cache.get( aKey ); return anElement.data(); }
- Finally, you need to register your resource manager with WOApplication:
anApplication.setResourceManager( new ResourceManager() );
Handling of languages and frameworks are left as an exercise to the reader.
This article is issued from Wikibooks. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.