View Javadoc

1   package org.apache.maven.archetype.common;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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  /** @plexus.component */
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 }