Coverage Report - org.apache.maven.archetype.common.DefaultArchetypeFilesResolver
 
Classes in this File Line Coverage Branch Coverage Complexity
DefaultArchetypeFilesResolver
65%
98/149
42%
17/40
2.111
 
 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  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  
 }