Last modified by Pascal Robert on 2010/09/13 00:26

Show last authors
1 === Petite Abeille ===
2
3 Here is a little example on how to write your own WOResourceManager:
4
5 The main methods to implement are urlForResourceNamed() and bytesForResourceNamed().
6
7 * urlForResourceNamed simply build an URL for a resource from wherever you would like (eg a jar file). Unfortunately, urlForResourceNamed uses pathForResourceNamed so you will need to rewrite that also:
8
9 {{code}}
10
11 private URL urlForResourceNamed(String aResourceName)
12 {
13 return this.getClass().getResource( aResourceName );
14 }
15
16 public String pathForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
17 {
18 URL anURL = this.urlForResourceNamed( aResourceName );
19
20 if ( anURL != null )
21 {
22 return anURL.toExternalForm();
23 }
24
25 return null;
26 }
27
28 public String urlForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages, WORequest aRequest)
29 {
30 String anURL = super.urlForResourceNamed( aResourceName, aFrameworkName, someLanguages, aRequest );
31
32 this.bytesForResourceNamed( aResourceName, aFrameworkName, someLanguages );
33
34 return anURL;
35 }
36
37
38 {{/code}}
39
40 * bytesForResourceNamed simply retrieve a resource from wherever you would like (eg a jar file):
41
42 {{code}}
43
44 public InputStream inputStreamForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
45 {
46 return this.getClass().getResourceAsStream( aResourceName );
47 }
48
49 public byte[] bytesForResourceNamed(String aResourceName, String aFrameworkName, NSArray someLanguages)
50 {
51 if ( aResourceName != null )
52 {
53 URL anURL = this.urlForResourceNamed( aResourceName );
54
55 if ( anURL != null )
56 {
57 String aKey = anURL.toString();
58 WOURLValuedElementData anElement = (WOURLValuedElementData) _cache.get( aKey );
59
60 if ( anElement == null )
61 {
62 synchronized( this )
63 {
64 InputStream anInputStream = this.inputStreamForResourceNamed( aResourceName, null, null );
65
66 if ( anInputStream != null )
67 {
68 try
69 {
70 InputStream aBufferStream = new BufferedInputStream( anInputStream );
71 byte[] someBytes = new byte[ aBufferStream.available() ];
72
73 aBufferStream.read( someBytes );
74 aBufferStream.close();
75 anInputStream.close();
76
77 {
78 Data someData = new Data( someBytes );
79 String aType = this.contentTypeForResourceNamed( aKey );
80
81 anElement = new WOURLValuedElementData( someData, aType, aKey );
82
83 _cache.put( aKey, anElement );
84 }
85 }
86 catch(Exception anException)
87 {
88 SZLog.warning( anException );
89 }
90 }
91 }
92 }
93
94 return ( (Data) anElement.data() ).bytesNoCopy();
95 }
96
97 SZLog.debug( "Null url for resource named '" + aResourceName + "'." );
98
99 return null;
100 }
101
102 throw new IllegalArgumentException ( "ResourceManager.bytesForResourceNamed: null resource name." );
103 }
104
105
106 {{/code}}
107
108 * Last but not least, you need to take care of those funky WOURLValuedElementData so dataForResourceNamed will work:
109
110 {{code}}
111
112 public NSData dataForResourceNamed(String aResourceName)
113 {
114 this.bytesForResourceNamed( aResourceName, null, null );
115
116 String aKey = this.urlForResourceNamed( aResourceName ).toString();
117 WOURLValuedElementData anElement = (WOURLValuedElementData) _cache.get( aKey );
118
119 return anElement.data();
120 }
121
122 {{/code}}
123
124 * Finally, you need to register your resource manager with WOApplication:
125
126 {{code}}
127
128 anApplication.setResourceManager( new ResourceManager() );
129
130
131 {{/code}}
132
133 Handling of languages and frameworks are left as an exercise to the reader.