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