1 package org.apache.maven.plugin.resource.loader;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.BufferedInputStream;
23 import java.io.File;
24 import java.io.FileInputStream;
25 import java.io.FileNotFoundException;
26 import java.io.InputStream;
27 import java.util.ArrayList;
28 import java.util.Hashtable;
29 import java.util.List;
30
31 import org.apache.commons.collections.ExtendedProperties;
32 import org.apache.velocity.exception.ResourceNotFoundException;
33 import org.apache.velocity.runtime.resource.Resource;
34 import org.apache.velocity.runtime.resource.loader.ResourceLoader;
35 import org.apache.velocity.util.StringUtils;
36
37
38
39
40
41
42 public class ProjectResourceLoader
43 extends ResourceLoader
44 {
45
46
47
48 private List<String> paths = null;
49
50
51
52
53
54
55 private Hashtable<String,String> templatePaths = new Hashtable<String,String>();
56
57 public void init( ExtendedProperties configuration )
58 {
59 rsvc.getLog().info( "ProjectResourceLoader : initialization starting." );
60
61 String separator = System.getProperty( "file.separator" );
62
63 String path = System.getProperty( "user.dir" ) + separator + "src" + separator + "main" + separator
64 + "resources" + separator;
65
66 rsvc.getLog().info( "path :" + path );
67
68 paths = new ArrayList<String>();
69
70 paths.add( path );
71
72 int sz = paths.size();
73
74 for ( int i = 0; i < sz; i++ )
75 {
76 rsvc.getLog().info( "ProjectResourceLoader : adding path '" + paths.get( i ) + "'" );
77 }
78 rsvc.getLog().info( "ProjectResourceLoader : initialization complete." );
79 }
80
81
82
83
84
85
86
87
88
89
90 public synchronized InputStream getResourceStream( String templateName )
91 throws ResourceNotFoundException
92 {
93
94
95
96 if ( templateName == null || templateName.length() == 0 )
97 {
98
99
100
101
102
103 throw new ResourceNotFoundException( "Need to specify a file name or file path!" );
104 }
105
106 String template = StringUtils.normalizePath( templateName );
107 if ( template == null || template.length() == 0 )
108 {
109 String msg = "Project Resource loader error : argument " + template
110 + " contains .. and may be trying to access " + "content outside of template root. Rejected.";
111
112 rsvc.getLog().error( "ProjectResourceLoader : " + msg );
113
114 throw new ResourceNotFoundException( msg );
115 }
116
117
118
119
120 if ( template.startsWith( "/" ) )
121 {
122 template = template.substring( 1 );
123 }
124
125
126 paths.add( (String) rsvc.getApplicationAttribute( "baseDirectory" ) );
127
128 for ( String path : paths )
129 {
130 InputStream inputStream = findTemplate( path, template );
131
132 if ( inputStream != null )
133 {
134
135
136
137
138
139
140 templatePaths.put( templateName, path );
141 return inputStream;
142 }
143 }
144
145
146
147
148
149
150 String msg = "ProjectResourceLoader Error: cannot find resource " + template;
151
152 throw new ResourceNotFoundException( msg );
153 }
154
155
156
157
158
159
160
161
162 private InputStream findTemplate( String path, String template )
163 {
164 try
165 {
166 File file = new File( path, template );
167
168 if ( file.canRead() )
169 {
170 return new BufferedInputStream( new FileInputStream( file.getAbsolutePath() ) );
171 }
172 else
173 {
174 return null;
175 }
176 }
177 catch ( FileNotFoundException fnfe )
178 {
179
180
181
182 return null;
183 }
184 }
185
186
187
188
189
190
191
192
193
194 public boolean isSourceModified( Resource resource )
195 {
196
197
198
199
200
201 boolean modified = true;
202
203 String fileName = resource.getName();
204 String path = templatePaths.get( fileName );
205 File currentFile = null;
206
207 for ( int i = 0; currentFile == null && i < paths.size(); i++ )
208 {
209 String testPath = paths.get( i );
210 File testFile = new File( testPath, fileName );
211 if ( testFile.canRead() )
212 {
213 currentFile = testFile;
214 }
215 }
216 File file = new File( path, fileName );
217 if ( currentFile == null || !file.exists() )
218 {
219
220
221
222
223
224
225
226
227 }
228 else if ( currentFile.equals( file ) && file.canRead() )
229 {
230
231
232
233
234
235
236 modified = ( file.lastModified() != resource.getLastModified() );
237 }
238
239
240
241
242 return modified;
243 }
244
245 public long getLastModified( Resource resource )
246 {
247 String path = templatePaths.get( resource.getName() );
248 File file = new File( path, resource.getName() );
249
250 if ( file.canRead() )
251 {
252 return file.lastModified();
253 }
254 else
255 {
256 return 0;
257 }
258 }
259 }