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