blob: b78fd5ebcdd3cb6dc2caca0f535d9f2cba8e429c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.codehaus.mojo.archetypeng;
import java.util.Arrays;
import org.codehaus.mojo.archetypeng.archetype.filesets.FileSet;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* @plexus.component
*/
public class DefaultArchetypeFilesResolver
extends AbstractLogEnabled
implements ArchetypeFilesResolver
{
public List getFilesWithExtension ( List files, String extension )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "" );
scanner.setIncludes ( "**/*." + extension );
scanner.setExcludes ( "" );
return scanner.scan ( files );
}
public List getFilteredFiles ( List files, String filtered )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "" );
scanner.setIncludes ( filtered );
scanner.setExcludes ( "" );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " filtered files in " + files.size () + " files"
);
return result;
}
public List filterFiles ( FileSet fileSet, List archetypeResources )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( fileSet.getDirectory () );
scanner.setIncludes ( fileSet.getIncludes () );
scanner.setExcludes ( fileSet.getExcludes () );
scanner.setCaseSensitive ( true );
return scanner.scan ( archetypeResources );
}
public List filterFiles ( String moduleOffset, FileSet fileSet, List archetypeResources )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir (
( StringUtils.isEmpty ( moduleOffset ) ? "" : ( moduleOffset + "/" ) )
+ fileSet.getDirectory ()
);
scanner.setIncludes ( fileSet.getIncludes () );
scanner.setExcludes ( fileSet.getExcludes () );
scanner.setCaseSensitive ( true );
return scanner.scan ( archetypeResources );
}
public List findOtherResources ( int level, List files, String languages )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "" );
String includes = "";
for ( int i = 0; i < level; i++ )
{
includes += "*/";
}
scanner.setIncludes ( includes + "**" );
scanner.setExcludes ( languages );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " other resources in " + files.size ()
+ " files at level " + level
);
return result;
}
public List findOtherResources ( int level, List files, List sourcesFiles, String languages )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "" );
Set selectedDirectories = new HashSet ();
List includes = new ArrayList ();
Iterator sourcesFilesIterator = sourcesFiles.iterator ();
while ( sourcesFilesIterator.hasNext () )
{
String sourcesFile = (String) sourcesFilesIterator.next ();
String directory = PathUtils.getDirectory ( sourcesFile, level - 1 );
if ( !selectedDirectories.contains ( directory ) )
{
includes.add ( directory + "/**" );
}
selectedDirectories.add ( directory );
}
scanner.setExcludes ( languages );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " other resources in " + files.size ()
+ " files at level " + level
);
return result;
}
public List findOtherSources ( int level, List files, String languages )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "" );
String levelDirectory = "";
for ( int i = 0; i < ( level - 1 ); i++ )
{
levelDirectory += "*/";
}
String includes = "";
String[] languagesAsArray = StringUtils.split ( languages );
for ( int i = 0; i < languagesAsArray.length; i++ )
{
includes += levelDirectory + languagesAsArray[i];
}
scanner.setIncludes ( includes );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " other sources in " + files.size () + " files at level "
+ level
);
return result;
}
public List findResourcesMainFiles ( List files, String languages )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "src/main" );
scanner.setIncludes ( "**" );
scanner.setExcludes ( languages );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " resources in " + files.size () + " files"
);
return result;
}
public List findResourcesTestFiles ( List files, String languages )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "src/test" );
scanner.setIncludes ( "**" );
scanner.setExcludes ( languages );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " test resources in " + files.size () + " files"
);
return result;
}
public List findSiteFiles ( List files, String languages )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "src/site" );
scanner.setIncludes ( "**" );
scanner.setExcludes ( languages );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " site resources in " + files.size () + " files"
);
return result;
}
public List findSourcesMainFiles ( List files, String languages )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "src/main" );
scanner.setIncludes ( languages );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " sources in " + files.size () + " files"
);
return result;
}
public List findSourcesTestFiles ( List files, String languages )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "src/test" );
scanner.setIncludes ( languages );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " test sources in " + files.size () + " files"
);
return result;
}
public List getPackagedFiles ( List files, String packageName )
{
List packagedFiles = new ArrayList ();
Iterator filesIterator = files.iterator ();
while ( filesIterator.hasNext () )
{
String file = (String) filesIterator.next ();
if ( file.startsWith ( packageName ) )
{
packagedFiles.add ( file.substring ( packageName.length () + 1 ) );
}
}
getLogger ().debug (
"Scanned " + packagedFiles.size () + " pachaged files in " + files.size () + " files"
);
return packagedFiles;
}
public String resolvePackage ( File basedir, List languages )
throws IOException
{
getLogger ().debug ( "Resolving package in "+basedir+" using languages "+languages );
List files = resolveFiles ( basedir, languages );
return resolvePackage ( files );
}
public List getUnfilteredFiles ( List files, String filtered )
{
ListScanner scanner = new ListScanner ();
scanner.setBasedir ( "" );
scanner.setIncludes ( "**" );
scanner.setExcludes ( filtered );
List result = scanner.scan ( files );
getLogger ().debug (
"Scanned " + result.size () + " unfiltered files in " + files.size () + " files"
);
return result;
}
public List getUnpackagedFiles ( List files, String packageName )
{
List unpackagedFiles = new ArrayList ();
Iterator filesIterator = files.iterator ();
while ( filesIterator.hasNext () )
{
String file = (String) filesIterator.next ();
if ( !file.startsWith ( packageName ) )
{
unpackagedFiles.add ( file );
}
}
getLogger ().debug (
"Scanned " + unpackagedFiles.size () + " unpachaged files in " + files.size ()
+ " files"
);
return unpackagedFiles;
}
private String getCommonPackage ( String packageName, String templatePackage )
{
String common = "";
String difference = StringUtils.difference ( packageName, templatePackage );
if ( StringUtils.isNotEmpty ( difference ) )
{
String temporaryCommon =
StringUtils.substring (
templatePackage,
0,
templatePackage.lastIndexOf ( difference )
);
if ( !difference.startsWith ( "." ) )
{
common =
StringUtils.substring (
temporaryCommon,
0,
temporaryCommon.lastIndexOf ( "." )
);
}
else
{
common = temporaryCommon;
}
}
else
{
common = packageName;
}
return common;
}
private List resolveFiles ( File basedir, List languages )
throws IOException
{
String[] languagesArray = (String[]) languages.toArray ( new String[languages.size ()] );
String[] languagesPathesArray = new String[languagesArray.length];
for ( int i = 0; i < languagesArray.length; i++ )
{
languagesPathesArray[i] = "**/src/**/" + languagesArray[i] + "/**";
}
String excludes = "target";
Iterator defaultExcludes = Arrays.asList ( ListScanner.DEFAULTEXCLUDES ).iterator ();
while ( defaultExcludes.hasNext () )
{
excludes += "," + (String) defaultExcludes.next () + "/**";
}
List absoluteFiles =
FileUtils.getFiles (
basedir,
StringUtils.join ( languagesPathesArray, "," ),
excludes
);
getLogger ().debug ( "Found " + absoluteFiles.size () + " potential archetype files" );
List files = new ArrayList ( absoluteFiles.size () );
Iterator filesIterator = absoluteFiles.iterator ();
while ( filesIterator.hasNext () )
{
File file = (File) filesIterator.next ();
String filePath =
StringUtils.prechomp (
file.getAbsolutePath (),
basedir.getAbsolutePath () + File.separator
);
String minusSrc = StringUtils.prechomp ( filePath, "src" + File.separator );
for ( int i = 0; i < languagesArray.length; i++ )
{
String language = languagesArray[i];
if ( StringUtils.countMatches (
minusSrc,
File.separator + language + File.separator
)
> 0
)
{
String minusLanguage =
StringUtils.prechomp ( minusSrc, language + File.separator );
files.add ( toUnixPath ( minusLanguage ) );
}
}
}
getLogger ().debug (
"Found " + files.size () + " archetype files for package resolution "
);
return files;
}
private String resolvePackage ( List files )
{
String packageName = null;
Iterator minusLanguageIterator = files.iterator ();
while ( minusLanguageIterator.hasNext () )
{
String minusLanguage = (String) minusLanguageIterator.next ();
String filePackage;
if ( minusLanguage.indexOf( "/" ) >= 0 )
{
filePackage =
StringUtils.replace (
minusLanguage.substring ( 0, minusLanguage.lastIndexOf ( "/" ) ),
"/",
"."
);
}
else
{
filePackage = "";
}
if ( packageName == null )
{
packageName = filePackage;
}
else
{
packageName = getCommonPackage ( packageName, filePackage );
}
}
getLogger ().debug ( "Package resolved to " + packageName );
return packageName;
}
private String toUnixPath ( String path )
{
return path.replace ( File.separatorChar, '/' );
}
}