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 private Hashtable<String, String> templatePaths = new Hashtable<String, String>();
55
56 public void init( ExtendedProperties configuration )
57 {
58 rsvc.getLog().info( "ProjectResourceLoader : initialization starting." );
59
60 String separator = System.getProperty( "file.separator" );
61
62 String path = System.getProperty( "user.dir" ) + separator + "src" + separator + "main" + separator
63 + "resources" + separator;
64
65 rsvc.getLog().info( "path :" + path );
66
67 paths = new ArrayList<String>();
68
69 paths.add( path );
70
71 for ( String path1 : paths )
72 {
73 rsvc.getLog().info( "ProjectResourceLoader : adding path '" + path1 + "'" );
74 }
75 rsvc.getLog().info( "ProjectResourceLoader : initialization complete." );
76 }
77
78
79
80
81
82
83
84
85 public synchronized InputStream getResourceStream( String templateName )
86 throws ResourceNotFoundException
87 {
88
89
90
91 if ( templateName == null || templateName.length() == 0 )
92 {
93
94
95
96
97 throw new ResourceNotFoundException( "Need to specify a file name or file path!" );
98 }
99
100 String template = StringUtils.normalizePath( templateName );
101 if ( template == null || template.length() == 0 )
102 {
103 String msg = "Project Resource loader error : argument " + template
104 + " contains .. and may be trying to access " + "content outside of template root. Rejected.";
105
106 rsvc.getLog().error( "ProjectResourceLoader : " + msg );
107
108 throw new ResourceNotFoundException( msg );
109 }
110
111
112
113
114 if ( template.startsWith( "/" ) )
115 {
116 template = template.substring( 1 );
117 }
118
119
120 paths.add( (String) rsvc.getApplicationAttribute( "baseDirectory" ) );
121
122 for ( String path : paths )
123 {
124 InputStream inputStream = findTemplate( path, template );
125
126 if ( inputStream != null )
127 {
128
129
130
131
132 templatePaths.put( templateName, path );
133 return inputStream;
134 }
135 }
136
137
138
139
140 String msg = "ProjectResourceLoader Error: cannot find resource " + template;
141
142 throw new ResourceNotFoundException( msg );
143 }
144
145
146
147
148
149
150
151 private InputStream findTemplate( String path, String template )
152 {
153 try
154 {
155 File file = new File( path, template );
156
157 if ( file.canRead() )
158 {
159 return new BufferedInputStream( new FileInputStream( file.getAbsolutePath() ) );
160 }
161 else
162 {
163 return null;
164 }
165 }
166 catch ( FileNotFoundException fnfe )
167 {
168
169
170
171 return null;
172 }
173 }
174
175
176
177
178
179
180 public boolean isSourceModified( Resource resource )
181 {
182
183
184
185
186 boolean modified = true;
187
188 String fileName = resource.getName();
189 String path = templatePaths.get( fileName );
190 File currentFile = null;
191
192 for ( int i = 0; currentFile == null && i < paths.size(); i++ )
193 {
194 String testPath = paths.get( i );
195 File testFile = new File( testPath, fileName );
196 if ( testFile.canRead() )
197 {
198 currentFile = testFile;
199 }
200 }
201 File file = new File( path, fileName );
202 if ( currentFile == null || !file.exists() )
203 {
204
205
206
207
208
209 }
210 else if ( currentFile.equals( file ) && file.canRead() )
211 {
212
213
214
215
216 modified = ( file.lastModified() != resource.getLastModified() );
217 }
218
219
220
221
222 return modified;
223 }
224
225 public long getLastModified( Resource resource )
226 {
227 String path = templatePaths.get( resource.getName() );
228 File file = new File( path, resource.getName() );
229
230 if ( file.canRead() )
231 {
232 return file.lastModified();
233 }
234 else
235 {
236 return 0;
237 }
238 }
239 }