1 package org.apache.maven.archetype.common;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.archetype.common.util.ListScanner;
23 import org.apache.maven.archetype.common.util.PathUtils;
24 import org.apache.maven.archetype.metadata.FileSet;
25 import org.codehaus.plexus.logging.AbstractLogEnabled;
26 import org.codehaus.plexus.util.FileUtils;
27 import org.codehaus.plexus.util.StringUtils;
28
29 import java.io.File;
30 import java.io.IOException;
31 import java.util.ArrayList;
32 import java.util.Arrays;
33 import java.util.HashSet;
34 import java.util.List;
35 import java.util.Set;
36
37
38 public class DefaultArchetypeFilesResolver
39 extends AbstractLogEnabled
40 implements ArchetypeFilesResolver
41 {
42 public List<String> getFilesWithExtension( List<String> files, String extension )
43 {
44 ListScanner scanner = new ListScanner();
45 scanner.setBasedir( "" );
46
47 scanner.setIncludes( "**/*." + extension );
48 scanner.setExcludes( "" );
49
50 return scanner.scan( files );
51 }
52
53 public List<String> getFilteredFiles( List<String> files, String filtered )
54 {
55 ListScanner scanner = new ListScanner();
56 scanner.setBasedir( "" );
57
58 scanner.setIncludes( filtered );
59 scanner.setExcludes( "" );
60
61 List<String> result = scanner.scan( files );
62 getLogger().debug( "Scanned " + result.size() + " filtered files in " + files.size() + " files" );
63 System.out.println( "Scanned " + result.size() + " filtered files in " + files.size() + " files: " + StringUtils.join( result.iterator(), ", " ) );
64
65 return result;
66 }
67
68 public List<String> filterFiles( String moduleOffset, FileSet fileSet, List<String> archetypeResources )
69 {
70 ListScanner scanner = new ListScanner();
71 scanner.setBasedir(
72 ( StringUtils.isEmpty( moduleOffset ) ? "" : ( moduleOffset + File.separatorChar ) )
73 + fileSet.getDirectory()
74 );
75 scanner.setIncludes( fileSet.getIncludes() );
76 scanner.setExcludes( fileSet.getExcludes() );
77 scanner.setCaseSensitive( true );
78
79 return scanner.scan( archetypeResources );
80 }
81
82 public List<String> findOtherResources( int level, List<String> files, String languages )
83 {
84 ListScanner scanner = new ListScanner();
85
86 scanner.setBasedir( "" );
87
88 StringBuilder includes = new StringBuilder( );
89 for ( int i = 0; i < level; i++ )
90 {
91 includes.append( "*/" );
92 }
93
94 includes.append( "**" );
95 scanner.setIncludes( includes.toString() );
96 scanner.setExcludes( languages );
97
98 List<String> result = scanner.scan( files );
99 getLogger().debug(
100 "Scanned " + result.size() + " other resources in " + files.size() + " files at level "
101 + level );
102
103 return result;
104 }
105
106 public List<String> findOtherResources( int level, List<String> files, List<String> sourcesFiles, String languages )
107 {
108 ListScanner scanner = new ListScanner();
109
110 scanner.setBasedir( "" );
111
112 Set<String> selectedDirectories = new HashSet<String>();
113
114 List<String> includes = new ArrayList<String>();
115
116 for ( String sourcesFile : sourcesFiles )
117 {
118 String directory = PathUtils.getDirectory( sourcesFile, level - 1 );
119 if ( !selectedDirectories.contains( directory ) )
120 {
121 includes.add( directory + "/**" );
122 }
123
124 selectedDirectories.add( directory );
125 }
126
127 scanner.setExcludes( languages );
128
129 List<String> result = scanner.scan( files );
130 getLogger().debug(
131 "Scanned " + result.size() + " other resources in " + files.size() + " files at level "
132 + level );
133
134 return result;
135 }
136
137 public List<String> findOtherSources( int level, List<String> files, String languages )
138 {
139 ListScanner scanner = new ListScanner();
140 scanner.setBasedir( "" );
141
142 String levelDirectory = "";
143 for ( int i = 0; i < ( level - 1 ); i++ )
144 {
145 levelDirectory += "*/";
146 }
147
148 String includes = "";
149 String[] languagesAsArray = StringUtils.split( languages );
150 for ( int i = 0; i < languagesAsArray.length; i++ )
151 {
152 includes += levelDirectory + languagesAsArray[i];
153 }
154
155 scanner.setIncludes( includes );
156
157 List<String> result = scanner.scan( files );
158 getLogger().debug(
159 "Scanned " + result.size() + " other sources in " + files.size() + " files at level "
160 + level );
161
162 return result;
163 }
164
165 public List<String> findResourcesMainFiles( List<String> files, String languages )
166 {
167 ListScanner scanner = new ListScanner();
168 scanner.setBasedir( "src/main" );
169
170 scanner.setIncludes( "**" );
171 scanner.setExcludes( languages );
172
173 List<String> result = scanner.scan( files );
174 getLogger().debug( "Scanned " + result.size() + " resources in " + files.size() + " files" );
175
176 return result;
177 }
178
179 public List<String> findResourcesTestFiles( List<String> files, String languages )
180 {
181 ListScanner scanner = new ListScanner();
182 scanner.setBasedir( "src/test" );
183
184 scanner.setIncludes( "**" );
185 scanner.setExcludes( languages );
186
187 List<String> result = scanner.scan( files );
188 getLogger().debug( "Scanned " + result.size() + " test resources in " + files.size() + " files" );
189
190 return result;
191 }
192
193 public List<String> findSiteFiles( List<String> files, String languages )
194 {
195 ListScanner scanner = new ListScanner();
196 scanner.setBasedir( "src/site" );
197
198 scanner.setIncludes( "**" );
199 scanner.setExcludes( languages );
200
201 List<String> result = scanner.scan( files );
202 getLogger().debug( "Scanned " + result.size() + " site resources in " + files.size() + " files" );
203
204 return result;
205 }
206
207 public List<String> findSourcesMainFiles( List<String> files, String languages )
208 {
209 ListScanner scanner = new ListScanner();
210 scanner.setBasedir( "src/main" );
211
212 scanner.setIncludes( languages );
213
214 List<String> result = scanner.scan( files );
215 getLogger().debug( "Scanned " + result.size() + " sources in " + files.size() + " files" );
216
217 return result;
218 }
219
220 public List<String> findSourcesTestFiles( List<String> files, String languages )
221 {
222 ListScanner scanner = new ListScanner();
223 scanner.setBasedir( "src/test" );
224
225 scanner.setIncludes( languages );
226
227 List<String> result = scanner.scan( files );
228 getLogger().debug( "Scanned " + result.size() + " test sources in " + files.size() + " files" );
229
230 return result;
231 }
232
233 public List<String> getPackagedFiles( List<String> files, String packageName )
234 {
235 List<String> packagedFiles = new ArrayList<String>();
236 for ( String file : files )
237 {
238 if ( file.startsWith( packageName ) )
239 {
240 packagedFiles.add( file.substring( packageName.length() + 1 ) );
241 }
242 }
243 getLogger().debug( "Scanned " + packagedFiles.size() + " packaged files in " + files.size() + " files" );
244 return packagedFiles;
245 }
246
247 public String resolvePackage( File basedir, List<String> languages )
248 throws IOException
249 {
250 getLogger().debug( "Resolving package in " + basedir + " using languages " + languages );
251
252 List<String> files = resolveFiles( basedir, languages );
253
254 return resolvePackage( files );
255 }
256
257 public List<String> getUnpackagedFiles( List<String> files, String packageName )
258 {
259 List<String> unpackagedFiles = new ArrayList<String>();
260 for ( String file : files )
261 {
262 if ( !file.startsWith( packageName ) )
263 {
264 unpackagedFiles.add( file );
265 }
266 }
267 getLogger().debug( "Scanned " + unpackagedFiles.size() + " unpackaged files in " + files.size() + " files" );
268 return unpackagedFiles;
269 }
270
271 private String getCommonPackage( String packageName, String templatePackage )
272 {
273 String common = "";
274
275 String difference = StringUtils.difference( packageName, templatePackage );
276 if ( StringUtils.isNotEmpty( difference ) )
277 {
278 String temporaryCommon =
279 StringUtils.substring( templatePackage, 0, templatePackage.lastIndexOf( difference ) );
280 if ( !difference.startsWith( "." ) )
281 {
282 common = StringUtils.substring( temporaryCommon, 0, temporaryCommon.lastIndexOf( "." ) );
283 }
284 else
285 {
286 common = temporaryCommon;
287 }
288 }
289 else
290 {
291 common = packageName;
292 }
293
294 return common;
295 }
296
297 private List<String> resolveFiles( File basedir, List<String> languages )
298 throws IOException
299 {
300 String[] languagesArray = languages.toArray( new String[languages.size()] );
301 String[] languagesPathesArray = new String[languagesArray.length];
302 for ( int i = 0; i < languagesArray.length; i++ )
303 {
304 languagesPathesArray[i] = "**/src/**/" + languagesArray[i] + "/**";
305 }
306
307 String excludes = "target";
308 for ( String defaultExclude : Arrays.asList( ListScanner.DEFAULTEXCLUDES ) )
309 {
310 excludes += "," + defaultExclude + "/**";
311 }
312
313 @SuppressWarnings( "unchecked" )
314 List<File> absoluteFiles = FileUtils.getFiles( basedir, StringUtils.join( languagesPathesArray, "," ), excludes );
315
316 getLogger().debug( "Found " + absoluteFiles.size() + " potential archetype files" );
317
318 List<String> files = new ArrayList<String>( absoluteFiles.size() );
319
320 for ( File file : absoluteFiles )
321 {
322 String filePath = StringUtils.prechomp( file.getAbsolutePath(), basedir.getAbsolutePath() + File.separator );
323
324 String minusSrc = StringUtils.prechomp( filePath, "src" + File.separator );
325
326 for ( int i = 0; i < languagesArray.length; i++ )
327 {
328 String language = languagesArray[i];
329
330 if ( StringUtils.countMatches( minusSrc, File.separator + language + File.separator ) > 0 )
331 {
332 String minusLanguage = StringUtils.prechomp( minusSrc, language + File.separator );
333
334 files.add( toUnixPath( minusLanguage ) );
335 }
336 }
337 }
338
339 getLogger().debug( "Found " + files.size() + " archetype files for package resolution " );
340
341 return files;
342 }
343
344 private String resolvePackage( List<String> files )
345 {
346 String packageName = null;
347 for ( String minusLanguage : files )
348 {
349 String filePackage;
350 if ( minusLanguage.indexOf( "/" ) >= 0 )
351 {
352 filePackage =
353 StringUtils.replace( minusLanguage.substring( 0, minusLanguage.lastIndexOf( "/" ) ), "/", "." );
354 }
355 else
356 {
357 filePackage = "";
358 }
359
360 if ( packageName == null )
361 {
362 packageName = filePackage;
363 }
364 else
365 {
366 packageName = getCommonPackage( packageName, filePackage );
367 }
368 }
369
370 getLogger().debug( "Package resolved to " + packageName );
371
372 return packageName;
373 }
374
375 private String toUnixPath( String path )
376 {
377 return path.replace( File.separatorChar, '/' );
378 }
379 }