blob: 9ad3d141ad1d26ae60d80106a5f158eda2cf7c69 [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.creator;
import org.apache.maven.model.Build;
import org.apache.maven.model.Extension;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.codehaus.mojo.archetypeng.ArchetypeConfiguration;
import org.codehaus.mojo.archetypeng.ArchetypeDefinition;
import org.codehaus.mojo.archetypeng.ArchetypeFactory;
import org.codehaus.mojo.archetypeng.ArchetypeFilesResolver;
import org.codehaus.mojo.archetypeng.ArchetypePropertiesManager;
import org.codehaus.mojo.archetypeng.Constants;
import org.codehaus.mojo.archetypeng.FileCharsetDetector;
import org.codehaus.mojo.archetypeng.ListScanner;
import org.codehaus.mojo.archetypeng.PathUtils;
import org.codehaus.mojo.archetypeng.PomManager;
import org.codehaus.mojo.archetypeng.archetype.filesets.ArchetypeDescriptor;
import org.codehaus.mojo.archetypeng.archetype.filesets.FileSet;
import org.codehaus.mojo.archetypeng.archetype.filesets.ModuleDescriptor;
import org.codehaus.mojo.archetypeng.archetype.filesets.RequiredProperty;
import org.codehaus.mojo.archetypeng.archetype.filesets.io.xpp3.ArchetypeDescriptorXpp3Writer;
import org.codehaus.mojo.archetypeng.creator.olddescriptor.OldArchetypeDescriptor;
import org.codehaus.mojo.archetypeng.creator.olddescriptor.OldArchetypeDescriptorXpp3Writer;
import org.codehaus.mojo.archetypeng.exception.ArchetypeNotConfigured;
import org.codehaus.mojo.archetypeng.exception.ArchetypeNotDefined;
import org.codehaus.mojo.archetypeng.exception.TemplateCreationException;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
* @plexus.component role-hint="fileset"
*/
public class FilesetArchetypeCreator
extends AbstractLogEnabled
implements ArchetypeCreator
{
/**
* @plexus.requirement
*/
private ArchetypeFactory archetypeFactory;
/**
* @plexus.requirement
*/
private ArchetypeFilesResolver archetypeFilesResolver;
/**
* @plexus.requirement
*/
private ArchetypePropertiesManager archetypePropertiesManager;
/**
* @plexus.requirement
*/
private PomManager pomManager;
public void createArchetype (
MavenProject project,
File propertyFile,
List languages,
List filtereds,
String defaultEncoding
)
throws IOException,
ArchetypeNotDefined,
ArchetypeNotConfigured,
TemplateCreationException,
XmlPullParserException
{
Properties properties = initialiseArchetypeProperties ( propertyFile );
ArchetypeDefinition archetypeDefinition =
archetypeFactory.createArchetypeDefinition ( properties );
if ( !archetypeDefinition.isDefined () )
{
throw new ArchetypeNotDefined ( "The archetype is not defined" );
}
ArchetypeConfiguration archetypeConfiguration =
archetypeFactory.createArchetypeConfiguration ( archetypeDefinition, properties );
if ( !archetypeConfiguration.isConfigured () )
{
throw new ArchetypeNotConfigured ( "The archetype is not configured" );
}
File basedir = project.getBasedir ();
File generatedSourcesDirectory =
FileUtils.resolveFile ( basedir, getGeneratedSourcesDirectory () );
generatedSourcesDirectory.mkdirs ();
getLogger ().debug ( "Creating archetype in " + generatedSourcesDirectory );
Model model = new Model ();
model.setModelVersion ( "4.0.0" );
model.setGroupId ( archetypeDefinition.getGroupId () );
model.setArtifactId ( archetypeDefinition.getArtifactId () );
model.setVersion ( archetypeDefinition.getVersion () );
model.setPackaging ( "maven-archetype" );
Build build = new Build ();
model.setBuild ( build );
Extension extension = new Extension ();
extension.setGroupId ( "org.codehaus.mojo" );
extension.setArtifactId ( "maven-archetypeng-plugin" );
extension.setVersion ( "1.0-SNAPSHOT" );
model.getBuild ().addExtension ( extension );
Plugin plugin = new Plugin ();
plugin.setGroupId ( "org.codehaus.mojo" );
plugin.setArtifactId ( "maven-archetypeng-plugin" );
plugin.setVersion ( "1.0-SNAPSHOT" );
plugin.setExtensions ( true );
model.getBuild ().addPlugin ( plugin );
getLogger ().debug ( "Creating archetype's pom" );
File archetypePomFile = FileUtils.resolveFile ( basedir, getArchetypePom () );
archetypePomFile.getParentFile ().mkdirs ();
pomManager.writePom ( model, archetypePomFile );
File archetypeResourcesDirectory =
FileUtils.resolveFile ( generatedSourcesDirectory, getTemplateOutputDirectory () );
archetypeResourcesDirectory.mkdirs ();
File archetypeFilesDirectory =
FileUtils.resolveFile ( archetypeResourcesDirectory, Constants.ARCHETYPE_RESOURCES );
archetypeFilesDirectory.mkdirs ();
getLogger ().debug ( "Archetype's files output directory " + archetypeFilesDirectory );
File replicaMainDirectory =
FileUtils.resolveFile (
generatedSourcesDirectory,
getReplicaOutputDirectory () + File.separator
+ archetypeDefinition.getArtifactId ()
);
replicaMainDirectory.mkdirs ();
File replicaFilesDirectory = FileUtils.resolveFile ( replicaMainDirectory, "reference" );
replicaFilesDirectory.mkdirs ();
File archetypeDescriptorFile =
FileUtils.resolveFile ( archetypeResourcesDirectory, Constants.ARCHETYPE_DESCRIPTOR );
archetypeDescriptorFile.getParentFile ().mkdirs ();
ArchetypeDescriptor archetypeDescriptor = new ArchetypeDescriptor ();
archetypeDescriptor.setId ( archetypeDefinition.getArtifactId () );
getLogger ().debug (
"Starting archetype's descriptor " + archetypeDefinition.getArtifactId ()
);
archetypeDescriptor.setPartial ( false );
addRequiredProperties ( archetypeDescriptor, properties );
// TODO ensure reversedproperties contains NO dotted properties
Properties reverseProperties = getRequiredProperties ( archetypeDescriptor, properties );
reverseProperties.remove ( Constants.GROUP_ID );
// TODO ensure pomReversedProperties contains NO dotted properties
Properties pomReversedProperties =
getRequiredProperties ( archetypeDescriptor, properties );
pomReversedProperties.remove ( Constants.PACKAGE );
String packageName = archetypeConfiguration.getProperty ( Constants.PACKAGE );
Model pom =
pomManager.readPom ( FileUtils.resolveFile ( basedir, Constants.ARCHETYPE_POM ) );
List fileNames = resolveFileNames ( pom, basedir );
List filesets =
resolveFileSets ( packageName, fileNames, languages, filtereds, defaultEncoding );
getLogger ().debug ( "Resolved filesets for " + archetypeDescriptor.getId () );
archetypeDescriptor.setFileSets ( filesets );
createArchetypeFiles (
reverseProperties,
filesets,
packageName,
basedir,
archetypeFilesDirectory,
defaultEncoding
);
getLogger ().debug ( "Created files for " + archetypeDescriptor.getId () );
createReplicaFiles ( filesets, basedir, replicaFilesDirectory );
getLogger ().debug ( "Created replica files for " + archetypeDescriptor.getId () );
FileUtils.copyFile (
propertyFile,
new File ( replicaMainDirectory, "archetype.properties" )
);
new File ( replicaMainDirectory, "goal.txt" ).createNewFile ();
setParentArtifactId (
reverseProperties,
pomReversedProperties,
archetypeConfiguration.getProperty ( Constants.ARTIFACT_ID )
);
Iterator modules = pom.getModules ().iterator ();
while ( modules.hasNext () )
{
String moduleId = (String) modules.next ();
setArtifactId ( reverseProperties, pomReversedProperties, moduleId );
getLogger ().debug ( "Creating module " + moduleId );
ModuleDescriptor moduleDescriptor =
createModule (
reverseProperties,
pomReversedProperties,
moduleId,
packageName,
FileUtils.resolveFile ( basedir, moduleId ),
FileUtils.resolveFile ( archetypeFilesDirectory, moduleId ),
FileUtils.resolveFile ( replicaFilesDirectory, moduleId ),
languages,
filtereds,
defaultEncoding
);
archetypeDescriptor.addModule ( moduleDescriptor );
getLogger ().debug (
"Added module " + moduleDescriptor.getId () + " in "
+ archetypeDescriptor.getId ()
);
}
restoreParentArtifactId ( reverseProperties, pomReversedProperties, null );
restoreArtifactId (
reverseProperties,
pomReversedProperties,
archetypeConfiguration.getProperty ( Constants.ARTIFACT_ID )
);
createArchetypePom (
pom,
archetypeFilesDirectory,
pomReversedProperties,
FileUtils.resolveFile ( basedir, Constants.ARCHETYPE_POM )
);
getLogger ().debug ( "Created Archetype " + archetypeDescriptor.getId () + " pom" );
ArchetypeDescriptorXpp3Writer writer = new ArchetypeDescriptorXpp3Writer ();
writer.write ( new FileWriter ( archetypeDescriptorFile ), archetypeDescriptor );
getLogger ().debug ( "Archetype " + archetypeDescriptor.getId () + " descriptor written" );
OldArchetypeDescriptor oldDescriptor = convertToOldDescriptor (archetypeDescriptor.getId (), packageName, basedir);
File oldDescriptorFile =
FileUtils.resolveFile ( archetypeResourcesDirectory, Constants.OLD_ARCHETYPE_DESCRIPTOR );
archetypeDescriptorFile.getParentFile ().mkdirs ();
writeOldDescriptor(oldDescriptor, oldDescriptorFile);
getLogger ().debug ( "Archetype " + archetypeDescriptor.getId () + " old descriptor written" );
}
private void addRequiredProperties (
ArchetypeDescriptor archetypeDescriptor,
Properties properties
)
{
Properties requiredProperties = new Properties ();
requiredProperties.putAll ( properties );
requiredProperties.remove ( Constants.ARCHETYPE_GROUP_ID );
requiredProperties.remove ( Constants.ARCHETYPE_ARTIFACT_ID );
requiredProperties.remove ( Constants.ARCHETYPE_VERSION );
requiredProperties.remove ( Constants.GROUP_ID );
requiredProperties.remove ( Constants.ARTIFACT_ID );
requiredProperties.remove ( Constants.VERSION );
requiredProperties.remove ( Constants.PACKAGE );
Iterator propertiesIterator = requiredProperties.keySet ().iterator ();
while ( propertiesIterator.hasNext () )
{
String propertyKey = (String) propertiesIterator.next ();
RequiredProperty requiredProperty = new RequiredProperty ();
requiredProperty.setKey ( propertyKey );
requiredProperty.setDefaultValue ( requiredProperties.getProperty ( propertyKey ) );
archetypeDescriptor.addRequiredProperty ( requiredProperty );
getLogger ().debug (
"Adding requiredProperty " + propertyKey + "="
+ requiredProperties.getProperty ( propertyKey ) + "to archetype's descriptor"
);
}
}
private String getArchetypePom ()
{
return getGeneratedSourcesDirectory () + File.separator + Constants.ARCHETYPE_POM;
}
private void setArtifactId (
Properties reverseProperties,
Properties pomReversedProperties,
String artifactId
)
{
reverseProperties.setProperty ( Constants.ARTIFACT_ID, artifactId );
pomReversedProperties.setProperty ( Constants.ARTIFACT_ID, artifactId );
}
private List concatenateToList ( List toConcatenate, String with )
{
List result = new ArrayList ( toConcatenate.size () );
Iterator iterator = toConcatenate.iterator ();
while ( iterator.hasNext () )
{
String concatenate = (String) iterator.next ();
result.add ( ( ( with.length () > 0 ) ? ( with + "/" + concatenate ) : concatenate ) );
}
return result;
}
private void copyFiles (
File basedir,
File archetypeFilesDirectory,
String directory,
List fileSetResources,
boolean packaged,
String packageName
)
throws IOException
{
Iterator iterator = fileSetResources.iterator ();
while ( iterator.hasNext () )
{
String inputFileName = (String) iterator.next ();
String packageAsDirectory = StringUtils.replace ( packageName, ".", "/" );
String outputFileName =
packaged ? StringUtils.replace ( inputFileName, packageAsDirectory + "/", "" )
: inputFileName;
File outputFile = new File ( archetypeFilesDirectory, outputFileName );
File inputFile = new File ( basedir, inputFileName );
outputFile.getParentFile ().mkdirs ();
FileUtils.copyFile ( inputFile, outputFile );
} // end while
}
private void copyPom ( File basedir, File replicaFilesDirectory )
throws IOException
{
FileUtils.copyFileToDirectory (
new File ( basedir, Constants.ARCHETYPE_POM ),
replicaFilesDirectory
);
}
private void createArchetypeFiles (
Properties reverseProperties,
List fileSets,
String packageName,
File basedir,
File archetypeFilesDirectory,
String defaultEncoding
)
throws IOException
{
getLogger ().debug (
"Creating Archetype/Module files from " + basedir + " to " + archetypeFilesDirectory
);
Iterator iterator = fileSets.iterator ();
while ( iterator.hasNext () )
{
FileSet fileSet = (FileSet) iterator.next ();
DirectoryScanner scanner = new DirectoryScanner ();
scanner.setBasedir ( basedir );
scanner.setIncludes (
(String[]) concatenateToList ( fileSet.getIncludes (), fileSet.getDirectory () )
.toArray ( new String[fileSet.getIncludes ().size ()] )
);
scanner.setExcludes (
(String[]) fileSet.getExcludes ().toArray (
new String[fileSet.getExcludes ().size ()]
)
);
scanner.addDefaultExcludes ();
getLogger ().debug ( "Using fileset " + fileSet );
scanner.scan ();
List fileSetResources = Arrays.asList ( scanner.getIncludedFiles () );
if ( fileSet.isFiltered () )
{
processFileSet (
basedir,
archetypeFilesDirectory,
fileSet.getDirectory (),
fileSetResources,
fileSet.isPackaged (),
packageName,
reverseProperties,
defaultEncoding
);
getLogger ().debug ( "Processed " + fileSet.getDirectory () + " files" );
}
else
{
copyFiles (
basedir,
archetypeFilesDirectory,
fileSet.getDirectory (),
fileSetResources,
fileSet.isPackaged (),
packageName
);
getLogger ().debug ( "Copied " + fileSet.getDirectory () + " files" );
}
} // end while
}
private void createArchetypePom (
Model pom,
File archetypeFilesDirectory,
Properties pomReversedProperties,
File initialPomFile
)
throws IOException
{
// pom.setParent ( null );
// pom.setModules ( null );
// pom.setGroupId ( "${" + Constants.GROUP_ID + "}" );
// pom.setArtifactId ( "${" + Constants.ARTIFACT_ID + "}" );
// pom.setVersion ( "${" + Constants.VERSION + "}" );
File outputFile =
FileUtils.resolveFile ( archetypeFilesDirectory, Constants.ARCHETYPE_POM );
File inputFile =
FileUtils.resolveFile ( archetypeFilesDirectory, Constants.ARCHETYPE_POM + ".tmp" );
FileUtils.copyFile ( initialPomFile, inputFile );
// pomManager.writePom ( pom, inputFile );
String initialcontent = FileUtils.fileRead ( inputFile );
String content = getReversedContent ( initialcontent, pomReversedProperties );
outputFile.getParentFile ().mkdirs ();
FileUtils.fileWrite ( outputFile.getAbsolutePath (), content );
inputFile.delete ();
}
private FileSet createFileSet (
final List excludes,
final boolean packaged,
final boolean filtered,
final String group,
final List includes,
String defaultEncoding
)
{
FileSet fileSet = new FileSet ();
fileSet.setDirectory ( group );
fileSet.setPackaged ( packaged );
fileSet.setFiltered ( filtered );
fileSet.setIncludes ( includes );
fileSet.setExcludes ( excludes );
fileSet.setEncoding ( defaultEncoding );
getLogger ().debug ( "Created Fileset " + fileSet );
return fileSet;
}
private List createFileSets (
List files,
int level,
boolean packaged,
String packageName,
boolean filtered,
String defaultEncoding
)
{
List fileSets = new ArrayList ();
if ( !files.isEmpty () )
{
getLogger ().debug (
"Creating filesets" + ( packaged ? ( " packaged (" + packageName + ")" ) : "" )
+ ( filtered ? " filtered" : "" ) + " at level " + level
);
if ( level == 0 )
{
List includes = new ArrayList ();
List excludes = new ArrayList ();
Iterator filesIterator = files.iterator ();
while ( filesIterator.hasNext () )
{
String file = (String) filesIterator.next ();
includes.add ( file );
}
if ( !includes.isEmpty () )
{
fileSets.add (
createFileSet (
excludes,
packaged,
filtered,
"",
includes,
defaultEncoding
)
);
}
}
else
{
Map groups = getGroupsMap ( files, level );
Iterator groupIterator = groups.keySet ().iterator ();
while ( groupIterator.hasNext () )
{
String group = (String) groupIterator.next ();
getLogger ().debug ( "Creating filesets for group " + group );
if ( !packaged )
{
fileSets.add (
getUnpackagedFileSet (
filtered,
group,
(List) groups.get ( group ),
defaultEncoding
)
);
}
else
{
fileSets.addAll (
getPackagedFileSets (
filtered,
group,
(List) groups.get ( group ),
packageName,
defaultEncoding
)
);
}
}
} // end if
getLogger ().debug ( "Resolved " + fileSets.size () + " filesets" );
} // end if
return fileSets;
}
private ModuleDescriptor createModule (
Properties reverseProperties,
Properties pomReversedProperties,
String moduleId,
String packageName,
File basedir,
File archetypeFilesDirectory,
File replicaFilesDirectory,
List languages,
List filtereds,
String defaultEncoding
)
throws IOException, XmlPullParserException
{
ModuleDescriptor archetypeDescriptor = new ModuleDescriptor ();
archetypeDescriptor.setId ( moduleId );
getLogger ().debug ( "Starting module's descriptor " + moduleId );
archetypeFilesDirectory.mkdirs ();
getLogger ().debug ( "Module's files output directory " + archetypeFilesDirectory );
Model pom =
pomManager.readPom ( FileUtils.resolveFile ( basedir, Constants.ARCHETYPE_POM ) );
List fileNames = resolveFileNames ( pom, basedir );
List filesets =
resolveFileSets ( packageName, fileNames, languages, filtereds, defaultEncoding );
getLogger ().debug ( "Resolved filesets for module " + archetypeDescriptor.getId () );
archetypeDescriptor.setFileSets ( filesets );
createArchetypeFiles (
reverseProperties,
filesets,
packageName,
basedir,
archetypeFilesDirectory,
defaultEncoding
);
getLogger ().debug ( "Created files for module " + archetypeDescriptor.getId () );
createReplicaFiles ( filesets, basedir, replicaFilesDirectory );
getLogger ().debug ( "Created replica files for " + archetypeDescriptor.getId () );
String parentArtifactId = reverseProperties.getProperty ( Constants.PARENT_ARTIFACT_ID );
setParentArtifactId ( reverseProperties, pomReversedProperties, moduleId );
Iterator modules = pom.getModules ().iterator ();
while ( modules.hasNext () )
{
String subModuleId = (String) modules.next ();
setArtifactId ( reverseProperties, pomReversedProperties, subModuleId );
getLogger ().debug ( "Creating module " + subModuleId );
ModuleDescriptor moduleDescriptor =
createModule (
reverseProperties,
pomReversedProperties,
subModuleId,
packageName,
FileUtils.resolveFile ( basedir, subModuleId ),
FileUtils.resolveFile ( archetypeFilesDirectory, subModuleId ),
FileUtils.resolveFile ( replicaFilesDirectory, subModuleId ),
languages,
filtereds,
defaultEncoding
);
archetypeDescriptor.addModule ( moduleDescriptor );
getLogger ().debug (
"Added module " + moduleDescriptor.getId () + " in "
+ archetypeDescriptor.getId ()
);
}
restoreParentArtifactId ( reverseProperties, pomReversedProperties, parentArtifactId );
restoreArtifactId ( reverseProperties, pomReversedProperties, moduleId );
createModulePom (
pom,
archetypeFilesDirectory,
pomReversedProperties,
FileUtils.resolveFile ( basedir, Constants.ARCHETYPE_POM )
);
getLogger ().debug ( "Created Module " + archetypeDescriptor.getId () + " pom" );
return archetypeDescriptor;
}
private void createModulePom (
Model pom,
File archetypeFilesDirectory,
Properties pomReversedProperties,
File initialPomFile
)
throws IOException
{
// pom.setParent ( null );
// pom.setModules ( null );
// pom.setGroupId ( "${" + Constants.GROUP_ID + "}" );
// pom.setArtifactId ( "${" + Constants.ARTIFACT_ID + "}" );
// pom.setVersion ( "${" + Constants.VERSION + "}" );
File outputFile =
FileUtils.resolveFile ( archetypeFilesDirectory, Constants.ARCHETYPE_POM );
File inputFile =
FileUtils.resolveFile ( archetypeFilesDirectory, Constants.ARCHETYPE_POM + ".tmp" );
FileUtils.copyFile ( initialPomFile, inputFile );
// pomManager.writePom ( pom, inputFile );
String initialcontent = FileUtils.fileRead ( inputFile );
String content = getReversedContent ( initialcontent, pomReversedProperties );
outputFile.getParentFile ().mkdirs ();
FileUtils.fileWrite ( outputFile.getAbsolutePath (), content );
inputFile.delete ();
}
private void createReplicaFiles ( List filesets, File basedir, File replicaFilesDirectory )
throws IOException
{
getLogger ().debug (
"Creating Archetype/Module replica files from " + basedir + " to "
+ replicaFilesDirectory
);
copyPom ( basedir, replicaFilesDirectory );
Iterator iterator = filesets.iterator ();
while ( iterator.hasNext () )
{
FileSet fileset = (FileSet) iterator.next ();
DirectoryScanner scanner = new DirectoryScanner ();
scanner.setBasedir ( basedir );
scanner.setIncludes (
(String[]) concatenateToList ( fileset.getIncludes (), fileset.getDirectory () )
.toArray ( new String[fileset.getIncludes ().size ()] )
);
scanner.setExcludes (
(String[]) fileset.getExcludes ().toArray (
new String[fileset.getExcludes ().size ()]
)
);
scanner.addDefaultExcludes ();
getLogger ().debug ( "Using fileset " + fileset );
scanner.scan ();
List fileSetResources = Arrays.asList ( scanner.getIncludedFiles () );
copyFiles (
basedir,
replicaFilesDirectory,
fileset.getDirectory (),
fileSetResources,
false,
null
);
getLogger ().debug ( "Copied " + fileset.getDirectory () + " files" );
}
}
private Set getExtensions ( List files )
{
Set extensions = new HashSet ();
Iterator filesIterator = files.iterator ();
while ( filesIterator.hasNext () )
{
String file = (String) filesIterator.next ();
extensions.add ( FileUtils.extension ( file ) );
}
return extensions;
}
private String getGeneratedSourcesDirectory ()
{
return "target" + File.separator + "generated-sources" + File.separator + "archetypeng";
}
private Map getGroupsMap ( final List files, final int level )
{
Map groups = new HashMap ();
Iterator fileIterator = files.iterator ();
while ( fileIterator.hasNext () )
{
String file = (String) fileIterator.next ();
String directory = PathUtils.getDirectory ( file, level );
if ( !groups.containsKey ( directory ) )
{
groups.put ( directory, new ArrayList () );
}
List group = (List) groups.get ( directory );
String innerPath = file.substring ( directory.length () + 1 );
group.add ( innerPath );
}
getLogger ().debug (
"Sorted " + groups.size () + " groups in " + files.size () + " files"
);
return groups;
}
private Properties initialiseArchetypeProperties ( File propertyFile )
throws IOException
{
Properties properties = new Properties ();
archetypePropertiesManager.readProperties ( properties, propertyFile );
return properties;
}
private FileSet getPackagedFileSet (
final boolean filtered,
final Set packagedExtensions,
final String group,
final Set unpackagedExtensions,
final List unpackagedFiles,
String defaultEncoding
)
{
List includes = new ArrayList ();
List excludes = new ArrayList ();
Iterator extensionsIterator = packagedExtensions.iterator ();
while ( extensionsIterator.hasNext () )
{
String extension = (String) extensionsIterator.next ();
includes.add ( "**/*." + extension );
if ( unpackagedExtensions.contains ( extension ) )
{
excludes.addAll (
archetypeFilesResolver.getFilesWithExtension ( unpackagedFiles, extension )
);
}
}
FileSet fileset =
createFileSet ( excludes, true, filtered, group, includes, defaultEncoding );
return fileset;
}
private List getPackagedFileSets (
final boolean filtered,
final String group,
final List groupFiles,
final String packageName,
String defaultEncoding
)
{
String packageAsDir = StringUtils.replace ( packageName, ".", "/" );
List packagedFileSets = new ArrayList ();
List packagedFiles = archetypeFilesResolver.getPackagedFiles ( groupFiles, packageAsDir );
List unpackagedFiles =
archetypeFilesResolver.getUnpackagedFiles ( groupFiles, packageAsDir );
Set packagedExtensions = getExtensions ( packagedFiles );
getLogger ().debug ( "Found packaged extensions " + packagedExtensions );
Set unpackagedExtensions = getExtensions ( unpackagedFiles );
packagedFileSets.add (
getPackagedFileSet (
filtered,
packagedExtensions,
group,
unpackagedExtensions,
unpackagedFiles,
defaultEncoding
)
);
if ( !unpackagedExtensions.isEmpty () )
{
getLogger ().debug ( "Found unpackaged extensions " + unpackagedExtensions );
packagedFileSets.add (
getUnpackagedFileSet (
filtered,
unpackagedExtensions,
unpackagedFiles,
group,
packagedExtensions,
defaultEncoding
)
);
}
return packagedFileSets;
}
private void setParentArtifactId (
Properties reverseProperties,
Properties pomReversedProperties,
String parentArtifactId
)
{
reverseProperties.setProperty ( Constants.PARENT_ARTIFACT_ID, parentArtifactId );
pomReversedProperties.setProperty ( Constants.PARENT_ARTIFACT_ID, parentArtifactId );
}
private void processFileSet (
File basedir,
File archetypeFilesDirectory,
String directory,
List fileSetResources,
boolean packaged,
String packageName,
Properties reverseProperties,
String defaultEncoding
)
throws IOException
{
Iterator iterator = fileSetResources.iterator ();
while ( iterator.hasNext () )
{
String inputFileName = (String) iterator.next ();
String packageAsDirectory = StringUtils.replace ( packageName, ".", "/" );
String outputFileName =
packaged ? StringUtils.replace ( inputFileName, packageAsDirectory + "/", "" )
: inputFileName;
File outputFile = new File ( archetypeFilesDirectory, outputFileName );
File inputFile = new File ( basedir, inputFileName );
FileCharsetDetector detector = new FileCharsetDetector ( inputFile );
String fileEncoding = detector.isFound () ? detector.getCharset () : defaultEncoding;
String initialcontent =
org.apache.commons.io.IOUtils.toString (
new FileInputStream ( inputFile ),
fileEncoding
);
// String initialcontent = FileUtils.fileRead ( inputFile );
String content = getReversedContent ( initialcontent, reverseProperties );
outputFile.getParentFile ().mkdirs ();
org.apache.commons.io.IOUtils.write (
content,
new FileOutputStream ( outputFile ),
fileEncoding
);
// FileUtils.fileWrite ( outputFile.getAbsolutePath (), content );
} // end while
}
private String getReplicaOutputDirectory ()
{
return
Constants.SRC + File.separator + Constants.TEST + File.separator + Constants.RESOURCES
+ File.separator + "projects";
}
private Properties getRequiredProperties (
ArchetypeDescriptor archetypeDescriptor,
Properties properties
)
{
Properties reversedProperties = new Properties ();
reversedProperties.putAll ( properties );
reversedProperties.remove ( Constants.ARCHETYPE_GROUP_ID );
reversedProperties.remove ( Constants.ARCHETYPE_ARTIFACT_ID );
reversedProperties.remove ( Constants.ARCHETYPE_VERSION );
// reversedProperties.remove ( Constants.GROUP_ID );
// reversedProperties.remove ( Constants.ARTIFACT_ID );
// reversedProperties.remove ( Constants.VERSION );
return reversedProperties;
}
private List resolveFileNames ( final Model pom, final File basedir )
throws IOException
{
getLogger ().debug ( "Resolving files for " + pom.getId () + " in " + basedir );
Iterator modules = pom.getModules ().iterator ();
String excludes = "pom.xml*,archetype.properties*,target/**,";
while ( modules.hasNext () )
{
excludes += "," + (String) modules.next () + "/**";
}
Iterator defaultExcludes = Arrays.asList ( ListScanner.DEFAULTEXCLUDES ).iterator ();
while ( defaultExcludes.hasNext () )
{
excludes += "," + (String) defaultExcludes.next () + "/**";
}
List fileNames = FileUtils.getFileNames ( basedir, "**", excludes, false );
getLogger ().debug ( "Resolved " + fileNames.size () + " files" );
return fileNames;
}
private List resolveFileSets (
String packageName,
List fileNames,
List languages,
List filtereds,
String defaultEncoding
)
{
List resolvedFileSets = new ArrayList ();
getLogger ().debug (
"Resolving filesets with package=" + packageName + ", languages=" + languages
+ " and extentions=" + filtereds
);
List files = new ArrayList ( fileNames );
String languageIncludes = "";
Iterator languagesIterator = languages.iterator ();
while ( languagesIterator.hasNext () )
{
String language = (String) languagesIterator.next ();
languageIncludes +=
( ( languageIncludes.length () == 0 ) ? "" : "," ) + language + "/**";
}
String filteredIncludes = "";
Iterator filteredsIterator = filtereds.iterator ();
while ( filteredsIterator.hasNext () )
{
String filtered = (String) filteredsIterator.next ();
filteredIncludes +=
( ( filteredIncludes.length () == 0 ) ? "" : "," ) + "**/"
+ ( filtered.startsWith ( "." ) ? "" : "*." ) + filtered;
}
/*sourcesMainFiles*/
List sourcesMainFiles =
archetypeFilesResolver.findSourcesMainFiles ( files, languageIncludes );
if ( !sourcesMainFiles.isEmpty () )
{
files.removeAll ( sourcesMainFiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles ( sourcesMainFiles, filteredIncludes ),
3,
true,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
sourcesMainFiles,
filteredIncludes
),
3,
true,
packageName,
false,
defaultEncoding
)
);
}
/*resourcesMainFiles*/
List resourcesMainFiles =
archetypeFilesResolver.findResourcesMainFiles ( files, languageIncludes );
if ( !resourcesMainFiles.isEmpty () )
{
files.removeAll ( resourcesMainFiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles (
resourcesMainFiles,
filteredIncludes
),
3,
false,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
resourcesMainFiles,
filteredIncludes
),
3,
false,
packageName,
false,
defaultEncoding
)
);
}
/*sourcesTestFiles*/
List sourcesTestFiles =
archetypeFilesResolver.findSourcesTestFiles ( files, languageIncludes );
if ( !sourcesTestFiles.isEmpty () )
{
files.removeAll ( sourcesTestFiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles ( sourcesTestFiles, filteredIncludes ),
3,
true,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
sourcesTestFiles,
filteredIncludes
),
3,
true,
packageName,
false,
defaultEncoding
)
);
}
/*ressourcesTestFiles*/
List resourcesTestFiles =
archetypeFilesResolver.findResourcesTestFiles ( files, languageIncludes );
if ( !resourcesTestFiles.isEmpty () )
{
files.removeAll ( resourcesTestFiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles (
resourcesTestFiles,
filteredIncludes
),
3,
false,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
resourcesTestFiles,
filteredIncludes
),
3,
false,
packageName,
false,
defaultEncoding
)
);
}
/*siteFiles*/
List siteFiles = archetypeFilesResolver.findSiteFiles ( files, languageIncludes );
if ( !siteFiles.isEmpty () )
{
files.removeAll ( siteFiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles ( siteFiles, filteredIncludes ),
2,
false,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles ( siteFiles, filteredIncludes ),
2,
false,
packageName,
false,
defaultEncoding
)
);
}
/*thirdLevelSourcesfiles*/
List thirdLevelSourcesfiles =
archetypeFilesResolver.findOtherSources ( 3, files, languageIncludes );
if ( !thirdLevelSourcesfiles.isEmpty () )
{
files.removeAll ( thirdLevelSourcesfiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles (
thirdLevelSourcesfiles,
filteredIncludes
),
3,
true,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
thirdLevelSourcesfiles,
filteredIncludes
),
3,
true,
packageName,
false,
defaultEncoding
)
);
/*thirdLevelResourcesfiles*/
List thirdLevelResourcesfiles =
archetypeFilesResolver.findOtherResources (
3,
files,
thirdLevelSourcesfiles,
languageIncludes
);
if ( !thirdLevelResourcesfiles.isEmpty () )
{
files.removeAll ( thirdLevelResourcesfiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles (
thirdLevelResourcesfiles,
filteredIncludes
),
3,
false,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
thirdLevelResourcesfiles,
filteredIncludes
),
3,
false,
packageName,
false,
defaultEncoding
)
);
}
} // end if
/*secondLevelSourcesfiles*/
List secondLevelSourcesfiles =
archetypeFilesResolver.findOtherSources ( 2, files, languageIncludes );
if ( !secondLevelSourcesfiles.isEmpty () )
{
files.removeAll ( secondLevelSourcesfiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles (
secondLevelSourcesfiles,
filteredIncludes
),
2,
true,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
secondLevelSourcesfiles,
filteredIncludes
),
2,
true,
packageName,
false,
defaultEncoding
)
);
}
/*secondLevelResourcesfiles*/
List secondLevelResourcesfiles =
archetypeFilesResolver.findOtherResources ( 2, files, languageIncludes );
if ( !secondLevelResourcesfiles.isEmpty () )
{
files.removeAll ( secondLevelResourcesfiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles (
secondLevelResourcesfiles,
filteredIncludes
),
2,
false,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
secondLevelResourcesfiles,
filteredIncludes
),
2,
false,
packageName,
false,
defaultEncoding
)
);
}
/*rootResourcesfiles*/
List rootResourcesfiles =
archetypeFilesResolver.findOtherResources ( 0, files, languageIncludes );
if ( !rootResourcesfiles.isEmpty () )
{
files.removeAll ( rootResourcesfiles );
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getFilteredFiles (
rootResourcesfiles,
filteredIncludes
),
0,
false,
packageName,
true,
defaultEncoding
)
);
resolvedFileSets.addAll (
createFileSets (
archetypeFilesResolver.getUnfilteredFiles (
rootResourcesfiles,
filteredIncludes
),
0,
false,
packageName,
false,
defaultEncoding
)
);
}
/**/
if ( !files.isEmpty () )
{
getLogger ().info ( "Ignored files: " + files );
}
return resolvedFileSets;
}
private void restoreArtifactId (
Properties reverseProperties,
Properties pomReversedProperties,
String artifactId
)
{
if ( StringUtils.isEmpty ( artifactId ) )
{
reverseProperties.remove ( Constants.ARTIFACT_ID );
pomReversedProperties.remove ( Constants.ARTIFACT_ID );
}
else
{
reverseProperties.setProperty ( Constants.ARTIFACT_ID, artifactId );
pomReversedProperties.setProperty ( Constants.ARTIFACT_ID, artifactId );
}
}
private void restoreParentArtifactId (
Properties reverseProperties,
Properties pomReversedProperties,
String parentArtifactId
)
{
if ( StringUtils.isEmpty ( parentArtifactId ) )
{
reverseProperties.remove ( Constants.PARENT_ARTIFACT_ID );
pomReversedProperties.remove ( Constants.PARENT_ARTIFACT_ID );
}
else
{
reverseProperties.setProperty ( Constants.PARENT_ARTIFACT_ID, parentArtifactId );
pomReversedProperties.setProperty ( Constants.PARENT_ARTIFACT_ID, parentArtifactId );
}
}
private String getReversedContent ( String content, final Properties properties )
{
String result = content;
Iterator propertyIterator = properties.keySet ().iterator ();
while ( propertyIterator.hasNext () )
{
String propertyKey = (String) propertyIterator.next ();
result =
StringUtils.replace (
result,
properties.getProperty ( propertyKey ),
"${" + propertyKey + "}"
);
}
return result;
}
private String getTemplateOutputDirectory ()
{
return
Constants.SRC + File.separator + Constants.MAIN + File.separator + Constants.RESOURCES;
}
private FileSet getUnpackagedFileSet (
final boolean filtered,
final String group,
final List groupFiles,
String defaultEncoding
)
{
Set extensions = getExtensions ( groupFiles );
List includes = new ArrayList ();
List excludes = new ArrayList ();
Iterator extensionsIterator = extensions.iterator ();
while ( extensionsIterator.hasNext () )
{
String extension = (String) extensionsIterator.next ();
includes.add ( "**/*." + extension );
}
return createFileSet ( excludes, false, filtered, group, includes, defaultEncoding );
}
private FileSet getUnpackagedFileSet (
final boolean filtered,
final Set unpackagedExtensions,
final List unpackagedFiles,
final String group,
final Set packagedExtensions,
String defaultEncoding
)
{
List includes = new ArrayList ();
List excludes = new ArrayList ();
Iterator extensionsIterator = unpackagedExtensions.iterator ();
while ( extensionsIterator.hasNext () )
{
String extension = (String) extensionsIterator.next ();
if ( packagedExtensions.contains ( extension ) )
{
includes.addAll (
archetypeFilesResolver.getFilesWithExtension ( unpackagedFiles, extension )
);
}
else
{
includes.add ( "**/*." + extension );
}
}
return createFileSet ( excludes, false, filtered, group, includes, defaultEncoding );
}
private OldArchetypeDescriptor convertToOldDescriptor (String id, String packageName, File basedir) throws IOException
{
getLogger ().debug ( "Resolving OldArchetypeDescriptor files in " + basedir );
String excludes = "pom.xml,archetype.properties*,**/target/**";
Iterator defaultExcludes = Arrays.asList ( ListScanner.DEFAULTEXCLUDES ).iterator ();
while ( defaultExcludes.hasNext () )
{
excludes += "," + (String) defaultExcludes.next () + "/**";
}
List fileNames = FileUtils.getFileNames ( basedir, "**", excludes, false );
getLogger ().debug ( "Resolved " + fileNames.size () + " files" );
String packageAsDirectory = StringUtils.replace (packageName, '.', '/') +"/";
List sources = archetypeFilesResolver.findSourcesMainFiles (fileNames, "java/**");
fileNames.removeAll (sources);
sources = removePackage(sources, packageAsDirectory);
List testSources = archetypeFilesResolver.findSourcesTestFiles (fileNames, "java/**");
fileNames.removeAll (testSources);
testSources = removePackage(testSources, packageAsDirectory);
List resources = archetypeFilesResolver.findResourcesMainFiles (fileNames, "java/**");
fileNames.removeAll (resources);
List testResources = archetypeFilesResolver.findResourcesTestFiles (fileNames, "java/**");
fileNames.removeAll (testResources);
List siteResources = archetypeFilesResolver.findSiteFiles (fileNames, null);
fileNames.removeAll (siteResources);
resources.addAll (fileNames);
OldArchetypeDescriptor descriptor = new OldArchetypeDescriptor();
descriptor.setId (id);
descriptor.setSources (sources);
descriptor.setTestSources (testSources);
descriptor.setResources (resources);
descriptor.setTestResources (testResources);
descriptor.setSiteResources (siteResources);
return descriptor;
}
private void writeOldDescriptor (OldArchetypeDescriptor oldDescriptor, File oldDescriptorFile) throws IOException
{
OldArchetypeDescriptorXpp3Writer writer = new OldArchetypeDescriptorXpp3Writer ();
writer.write ( new FileWriter ( oldDescriptorFile ), oldDescriptor );
}
private List removePackage (List sources, String packageAsDirectory)
{
if (sources == null)
{
return null;
}
List unpackagedSources = new ArrayList (sources.size ());
Iterator sourcesIterator = sources.iterator ();
while (sourcesIterator.hasNext ())
{
String source = (String) sourcesIterator.next ();
String unpackagedSource = StringUtils.replace (source, packageAsDirectory,"");
unpackagedSources.add (unpackagedSource);
}
return unpackagedSources;
}
}