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.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 }