You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2007/07/06 18:35:16 UTC

svn commit: r553946 [10/19] - in /maven/archetype/branches/maven-archetypeng: ./ maven-archetypeng-bundles/ maven-archetypeng-bundles/maven-archetypeng-archetype/ maven-archetypeng-bundles/maven-archetypeng-archetype/src/ maven-archetypeng-bundles/mave...

Added: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/DefaultArchetypeCreationQueryer.java
URL: http://svn.apache.org/viewvc/maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/DefaultArchetypeCreationQueryer.java?view=auto&rev=553946
==============================================================================
--- maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/DefaultArchetypeCreationQueryer.java (added)
+++ maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/DefaultArchetypeCreationQueryer.java Fri Jul  6 09:34:35 2007
@@ -0,0 +1,149 @@
+/*
+ * 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.codehaus.mojo.archetypeng.ArchetypeConfiguration;
+import org.codehaus.mojo.archetypeng.Constants;
+
+import org.codehaus.plexus.components.interactivity.Prompter;
+import org.codehaus.plexus.components.interactivity.PrompterException;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import java.util.Iterator;
+
+/**
+ * @plexus.component
+ */
+public class DefaultArchetypeCreationQueryer
+extends AbstractLogEnabled
+implements ArchetypeCreationQueryer
+{
+    /**
+     * @plexus.requirement
+     */
+    private Prompter prompter;
+
+    public String getArchetypeArtifactId ( String defaultValue )
+    throws PrompterException
+    {
+        return getValue ( Constants.ARCHETYPE_ARTIFACT_ID, defaultValue );
+    }
+
+    public String getArchetypeGroupId ( String defaultValue )
+    throws PrompterException
+    {
+        return getValue ( Constants.ARCHETYPE_GROUP_ID, defaultValue );
+    }
+
+    public String getArchetypeVersion ( String defaultValue )
+    throws PrompterException
+    {
+        return getValue ( Constants.ARCHETYPE_VERSION, defaultValue );
+    }
+
+    public String getArtifactId ( String defaultValue )
+    throws PrompterException
+    {
+        return getValue ( Constants.ARTIFACT_ID, defaultValue );
+    }
+
+    public boolean askAddAnotherProperty ()
+    throws PrompterException
+    {
+        String query = "Add a new custom property";
+
+        String answer = prompter.prompt ( query, "Y" );
+
+        return "Y".equalsIgnoreCase ( answer );
+    }
+
+    public String askNewPropertyKey ()
+    throws PrompterException
+    {
+        String query = "Define property key";
+
+        String answer = prompter.prompt ( query );
+
+        return answer;
+    }
+
+    public String askReplacementValue ( String propertyKey, String defaultValue )
+    throws PrompterException
+    {
+        return getValue ( propertyKey, defaultValue );
+    }
+
+    public boolean confirmConfiguration ( ArchetypeConfiguration archetypeConfiguration )
+    throws PrompterException
+    {
+        String query = "Confirm archetype configuration:\n";
+        query += Constants.ARCHETYPE_GROUP_ID + "=" + archetypeConfiguration.getGroupId () + "\n";
+        query +=
+            Constants.ARCHETYPE_ARTIFACT_ID + "=" + archetypeConfiguration.getArtifactId () + "\n";
+        query += Constants.ARCHETYPE_VERSION + "=" + archetypeConfiguration.getVersion () + "\n";
+
+        Iterator propertiesIter = archetypeConfiguration.getProperties ().keySet ().iterator ();
+
+        while ( propertiesIter.hasNext () )
+        {
+            String property = (String) propertiesIter.next ();
+            query += property + "=" + archetypeConfiguration.getProperty ( property ) + "\n";
+        }
+
+        String answer = prompter.prompt ( query, "Y" );
+
+        return "Y".equalsIgnoreCase ( answer );
+    }
+
+    public String getGroupId ( String defaultValue )
+    throws PrompterException
+    {
+        return getValue ( Constants.GROUP_ID, defaultValue );
+    }
+
+    public String getPackage ( String defaultValue )
+    throws PrompterException
+    {
+        return getValue ( Constants.PACKAGE, defaultValue );
+    }
+
+    public String getVersion ( String defaultValue )
+    throws PrompterException
+    {
+        return getValue ( Constants.VERSION, defaultValue );
+    }
+
+    private String getValue ( String requiredProperty, String defaultValue )
+    throws PrompterException
+    {
+        String query = "Define value for " + requiredProperty + ": ";
+        String answer;
+
+        if ( ( defaultValue != null ) && !defaultValue.equals ( "null" ) )
+        {
+            answer = prompter.prompt ( query, defaultValue );
+        }
+        else
+        {
+            answer = prompter.prompt ( query );
+        }
+        return answer;
+    }
+}

Propchange: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/DefaultArchetypeCreationQueryer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/DefaultArchetypeCreationQueryer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/FilesetArchetypeCreator.java
URL: http://svn.apache.org/viewvc/maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/FilesetArchetypeCreator.java?view=auto&rev=553946
==============================================================================
--- maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/FilesetArchetypeCreator.java (added)
+++ maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/FilesetArchetypeCreator.java Fri Jul  6 09:34:35 2007
@@ -0,0 +1,1583 @@
+/*
+ * 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;
+    }
+}

Propchange: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/FilesetArchetypeCreator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/FilesetArchetypeCreator.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptor.java
URL: http://svn.apache.org/viewvc/maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptor.java?view=auto&rev=553946
==============================================================================
--- maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptor.java (added)
+++ maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptor.java Fri Jul  6 09:34:35 2007
@@ -0,0 +1,135 @@
+package org.codehaus.mojo.archetypeng.creator.olddescriptor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author rafale
+ */
+public class OldArchetypeDescriptor
+{
+    private String id;
+    private List sources;
+    private List testSources;
+    private List resources;
+    private List testResources;
+    private List siteResources;
+
+    public String getId ()
+    {
+        return id;
+    }
+
+    public void setId (String id)
+    {
+        this.id = id;
+    }
+
+    public List getSources ()
+    {
+        return sources;
+    }
+    public void addSource(String source)
+    {
+        if (sources == null)
+        {
+            sources = new ArrayList();
+        }
+        sources.add (source);
+    }
+
+    public List getTestSources ()
+    {
+        return testSources;
+    }
+    
+    public void addTestSources (String source)
+    {
+        if (testSources == null)
+        {
+            testSources = new ArrayList();
+        }
+        testSources.add (source);
+    }
+
+    public List getResources ()
+    {
+        return resources;
+    }
+    
+    public void addResources (String resource)
+    {
+        if (resources == null)
+        {
+            resources = new ArrayList();
+        }
+        resources.add (resource);
+    }
+
+    public List getTestResources ()
+    {
+        return testResources;
+    }
+    
+    public void addTestResources (String resource)
+    {
+        if (testResources == null)
+        {
+            testResources = new ArrayList();
+        }
+        testResources.add (resource);
+    }
+
+    public List getSiteResources ()
+    {
+        return siteResources;
+    }
+    
+    public void addSiteResources (String resource)
+    {
+        if (siteResources == null)
+        {
+            siteResources = new ArrayList();
+        }
+        siteResources.add (resource);
+    }
+
+    public void setSources (List sources)
+    {
+        this.sources = sources;
+    }
+
+    public void setTestSources (List testSources)
+    {
+        this.testSources = testSources;
+    }
+
+    public void setResources (List resources)
+    {
+        this.resources = resources;
+    }
+
+    public void setTestResources (List testResources)
+    {
+        this.testResources = testResources;
+    }
+
+    public void setSiteResources (List siteResources)
+    {
+        this.siteResources = siteResources;
+    }
+    
+    public String toString()
+    {
+        return "(OldArchetypeDescriptor" +
+            " id=" +id+
+            " sources=" +sources+
+            " testSources" +testSources+
+            " resources" +resources+
+            " testResources" +testResources+
+            " siteResources" +siteResources+
+            ")";
+    }
+    
+}

Propchange: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptor.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptorXpp3Writer.java
URL: http://svn.apache.org/viewvc/maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptorXpp3Writer.java?view=auto&rev=553946
==============================================================================
--- maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptorXpp3Writer.java (added)
+++ maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptorXpp3Writer.java Fri Jul  6 09:34:35 2007
@@ -0,0 +1,91 @@
+package org.codehaus.mojo.archetypeng.creator.olddescriptor;
+
+import java.io.Writer;
+import java.util.Iterator;
+import org.codehaus.plexus.util.xml.pull.MXSerializer;
+import org.codehaus.plexus.util.xml.pull.XmlSerializer;
+
+/**
+ *
+ * @author rafale
+ */
+public class OldArchetypeDescriptorXpp3Writer
+{
+    
+    private String NAMESPACE;
+    
+    public void write(Writer writer, OldArchetypeDescriptor descriptor)
+        throws java.io.IOException
+    {
+        XmlSerializer serializer = new MXSerializer();
+        serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", "  " );
+        serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
+        serializer.setOutput( writer );
+        serializer.startDocument( "UTF-8", null );
+        writeArchetypeDescriptor( descriptor, "archetype", serializer );
+        serializer.endDocument();
+    }
+    private void writeArchetypeDescriptor(OldArchetypeDescriptor descriptor, String tagName, XmlSerializer serializer)
+        throws java.io.IOException
+    {
+        if ( descriptor != null )
+        {
+            serializer.startTag( NAMESPACE, tagName );
+            if ( descriptor.getId() != null )
+            {
+                serializer.startTag( NAMESPACE, "id" ).text( descriptor.getId() ).endTag( NAMESPACE, "id" );
+            }
+            if ( descriptor.getSources () != null && descriptor.getSources().size() > 0 )
+            {
+                serializer.startTag( NAMESPACE, "sources" );
+                for ( Iterator iter = descriptor.getSources().iterator(); iter.hasNext(); )
+                {
+                    String source = (String) iter.next();
+                    serializer.startTag( NAMESPACE, "source" ).text( source ).endTag( NAMESPACE, "source" );
+                }
+                serializer.endTag( NAMESPACE, "sources" );
+            }
+            if ( descriptor.getTestSources () != null && descriptor.getTestSources().size() > 0 )
+            {
+                serializer.startTag( NAMESPACE, "testSources" );
+                for ( Iterator iter = descriptor.getTestSources().iterator(); iter.hasNext(); )
+                {
+                    String source = (String) iter.next();
+                    serializer.startTag( NAMESPACE, "source" ).text( source ).endTag( NAMESPACE, "source" );
+                }
+                serializer.endTag( NAMESPACE, "testSources" );
+            }
+            if ( descriptor.getResources () != null && descriptor.getResources().size() > 0 )
+            {
+                serializer.startTag( NAMESPACE, "resources" );
+                for ( Iterator iter = descriptor.getResources ().iterator(); iter.hasNext(); )
+                {
+                    String source = (String) iter.next();
+                    serializer.startTag( NAMESPACE, "resource" ).text( source ).endTag( NAMESPACE, "resource" );
+                }
+                serializer.endTag( NAMESPACE, "resources" );
+            }
+            if ( descriptor.getTestResources () != null && descriptor.getTestResources().size() > 0 )
+            {
+                serializer.startTag( NAMESPACE, "testResources" );
+                for ( Iterator iter = descriptor.getTestResources().iterator(); iter.hasNext(); )
+                {
+                    String source = (String) iter.next();
+                    serializer.startTag( NAMESPACE, "resource" ).text( source ).endTag( NAMESPACE, "resource" );
+                }
+                serializer.endTag( NAMESPACE, "testResources" );
+            }
+            if ( descriptor.getSiteResources () != null && descriptor.getSiteResources().size() > 0 )
+            {
+                serializer.startTag( NAMESPACE, "siteResources" );
+                for ( Iterator iter = descriptor.getSiteResources().iterator(); iter.hasNext(); )
+                {
+                    String source = (String) iter.next();
+                    serializer.startTag( NAMESPACE, "resource" ).text( source ).endTag( NAMESPACE, "resource" );
+                }
+                serializer.endTag( NAMESPACE, "siteResources" );
+            }
+            serializer.endTag( NAMESPACE, tagName );
+        }
+    }
+}

Propchange: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptorXpp3Writer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archetype/branches/maven-archetypeng/maven-archetypeng-core/maven-archetypeng-creator/src/main/java/org/codehaus/mojo/archetypeng/creator/olddescriptor/OldArchetypeDescriptorXpp3Writer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"