You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/11/07 19:28:41 UTC

svn commit: r833728 [2/5] - in /maven/archetype/trunk: ./ archetype-common/ archetype-common/src/main/java/org/apache/maven/archetype/common/ archetype-common/src/main/java/org/apache/maven/archetype/exception/ archetype-common/src/main/mdo/ archetype-...

Modified: maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java
URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java?rev=833728&r1=833727&r2=833728&view=diff
==============================================================================
--- maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java (original)
+++ maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java Sat Nov  7 18:28:39 2009
@@ -1,576 +1,576 @@
-/*
- * 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.apache.maven.archetype.common;
-
-import org.apache.maven.archetype.common.util.FileCharsetDetector;
-import org.apache.maven.archetype.common.util.Format;
-import org.apache.maven.archetype.exception.InvalidPackaging;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
-import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Parent;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Build;
-import org.apache.maven.model.Profile;
-import org.apache.maven.model.ModelBase;
-import org.apache.maven.model.Reporting;
-import org.apache.maven.model.ReportPlugin;
-import org.apache.maven.model.BuildBase;
-import org.apache.maven.model.Plugin;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.IOUtil;
-import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-import org.codehaus.plexus.util.xml.Xpp3DomUtils;
-import org.codehaus.plexus.util.xml.Xpp3Dom;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.Node;
-import org.dom4j.io.SAXReader;
-import org.dom4j.io.XMLWriter;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.*;
-
-/** @plexus.component */
-public class DefaultPomManager
-    extends AbstractLogEnabled
-    implements PomManager
-{
-    public void addModule( File pom,
-                           String artifactId )
-        throws
-        IOException,
-        XmlPullParserException,
-        DocumentException,
-        InvalidPackaging
-    {
-        boolean found = false;
-
-        StringWriter writer = new StringWriter();
-        Reader fileReader = new FileReader( pom );
-
-        try
-        {
-            fileReader = new FileReader( pom );
-
-            SAXReader reader = new SAXReader();
-            Document document = reader.read( fileReader );
-            Element project = document.getRootElement();
-
-            String packaging = null;
-            Element packagingElement = project.element( "packaging" );
-            if ( packagingElement != null )
-            {
-                packaging = packagingElement.getStringValue();
-            }
-            if ( !"pom".equals( packaging ) )
-            {
-                throw new InvalidPackaging(
-                    "Unable to add module to the current project as it is not of packaging type 'pom'"
-                );
-            }
-
-            Element modules = project.element( "modules" );
-            if ( modules == null )
-            {
-                modules = project.addText( "  " ).addElement( "modules" );
-                modules.setText( "\n  " );
-                project.addText( "\n" );
-            }
-            // TODO: change to while loop
-            for ( Iterator i = modules.elementIterator( "module" ); i.hasNext() && !found; )
-            {
-                Element module = (Element) i.next();
-                if ( module.getText().equals( artifactId ) )
-                {
-                    found = true;
-                }
-            }
-            if ( !found )
-            {
-                Node lastTextNode = null;
-                for ( Iterator i = modules.nodeIterator(); i.hasNext(); )
-                {
-                    Node node = (Node) i.next();
-                    if ( node.getNodeType() == Node.ELEMENT_NODE )
-                    {
-                        lastTextNode = null;
-                    }
-                    else if ( node.getNodeType() == Node.TEXT_NODE )
-                    {
-                        lastTextNode = node;
-                    }
-                }
-
-                if ( lastTextNode != null )
-                {
-                    modules.remove( lastTextNode );
-                }
-
-                modules.addText( "\n    " );
-                modules.addElement( "module" ).setText( artifactId );
-                modules.addText( "\n  " );
-
-                XMLWriter xmlWriter = new XMLWriter( writer );
-                xmlWriter.write( document );
-
-                FileUtils.fileWrite( pom.getAbsolutePath(), writer.toString() );
-            } // end if
-        }
-        finally
-        {
-            IOUtil.close( fileReader );
-        }
-    }
-
-    public void addParent( File pom,
-                           File parentPom )
-        throws
-        IOException,
-        XmlPullParserException
-    {
-        Model generatedModel = readPom( pom );
-        if( null != generatedModel.getParent() )
-        {
-            getLogger().info( "Parent element not overwrited in " + pom );
-            return;
-        }
-
-        Model parentModel = readPom( parentPom );
-
-        Parent parent = new Parent();
-        parent.setGroupId( parentModel.getGroupId() );
-        if ( parent.getGroupId() == null )
-        {
-            parent.setGroupId( parentModel.getParent().getGroupId() );
-        }
-        parent.setArtifactId( parentModel.getArtifactId() );
-        parent.setVersion( parentModel.getVersion() );
-        if ( parent.getVersion() == null )
-        {
-            parent.setVersion( parentModel.getParent().getVersion() );
-        }
-        generatedModel.setParent( parent );
-
-        writePom( generatedModel, pom, pom );
-    }
-
-    public void mergePoms( File pom,
-                           File temporaryPom )
-        throws
-        IOException,
-        XmlPullParserException
-    {
-        Model model = readPom( pom );
-        Model generatedModel = readPom( temporaryPom );
-
-        model.getProperties().putAll( generatedModel.getProperties() );
-
-        mergeModelBase( model, generatedModel );
-        mergeModelBuild( model, generatedModel );
-        mergeProfiles( model, generatedModel );
-        mergeReportPlugins( model, generatedModel );
-
-//
-//        // Potential merging
-//
-//        model.getModelEncoding ();
-//        model.getModelVersion ();
-//
-//        model.getGroupId ();
-//        model.getArtifactId ();
-//        model.getVersion ();
-//        model.getParent ();
-//
-//        model.getId ();
-//        model.getName ();
-//        model.getInceptionYear ();
-//        model.getDescription ();
-//        model.getUrl ();
-//        model.getLicenses ();
-//        model.getProperties ();
-//
-//        model.getOrganization ();
-//        model.getMailingLists ();
-//        model.getContributors ();
-//        model.getDevelopers ();
-//
-//        model.getScm ();
-//        model.getCiManagement ();
-//        model.getDistributionManagement ();
-//        model.getIssueManagement ();
-//
-//        model.getPackaging ();
-////        model.getDependencies (); // done
-//        model.getDependencyManagement ();
-//        model.getPrerequisites ().getMaven ();
-//        model.getPrerequisites ().getModelEncoding ();
-//
-//        model.getProfiles ();
-//        model.getModules ();
-//        model.getRepositories ();
-//        model.getPluginRepositories ();
-//
-//        model.getBuild ().getDefaultGoal ();
-//        model.getBuild ().getFinalName ();
-//        model.getBuild ().getModelEncoding ();
-//        model.getBuild ().getFilters ();
-//        model.getBuild ().getDirectory ();
-//        model.getBuild ().getOutputDirectory ();
-//        model.getBuild ().getSourceDirectory ();
-//        model.getBuild ().getResources ();
-//        model.getBuild ().getScriptSourceDirectory ();
-//        model.getBuild ().getTestOutputDirectory ();
-//        model.getBuild ().getTestResources ();
-//        model.getBuild ().getTestSourceDirectory ();
-//        model.getBuild ().getPluginManagement ();
-//        model.getBuild ().getExtensions ();
-////        model.getBuild ().getPluginsAsMap (); // done
-//
-//        model.getReporting ().getModelEncoding ();
-//        model.getReporting ().getOutputDirectory ();
-////        model.getReporting ().getReportPluginsAsMap (); // done
-//
-
-        writePom( model, pom, pom );
-    }
-
-    public Model readPom( final File pomFile )
-        throws
-        IOException,
-        XmlPullParserException
-    { // TODO ensure correct encoding by using default one from method argument !!!
-
-        Model model;
-        Reader pomReader = null;
-        try
-        {
-            FileCharsetDetector detector = new FileCharsetDetector( pomFile );
-
-            String fileEncoding = detector.isFound() ? detector.getCharset() : "UTF-8";
-
-            pomReader = new InputStreamReader( new FileInputStream( pomFile ), fileEncoding );
-
-            MavenXpp3Reader reader = new MavenXpp3Reader();
-
-            model = reader.read( pomReader );
-
-            if ( StringUtils.isEmpty( model.getModelEncoding() ) )
-            {
-                model.setModelEncoding( fileEncoding );
-            }
-        }
-        finally
-        {
-            IOUtil.close( pomReader );
-            pomReader = null;
-        }
-        return model;
-    }
-
-
-    public Model readPom( InputStream pomStream )
-        throws
-        IOException,
-        XmlPullParserException
-    { // TODO ensure correct encoding by using default one from method argument !!!
-
-        Model model;
-        Reader pomReader = null;
-        try
-        {
-//            FileCharsetDetector detector = new FileCharsetDetector( pomStream );
-
-            String fileEncoding = /*detector.isFound() ? detector.getCharset() :*/ "UTF-8";
-
-            pomReader = new InputStreamReader( pomStream, fileEncoding );
-
-            MavenXpp3Reader reader = new MavenXpp3Reader();
-
-            model = reader.read( pomReader );
-
-            if ( StringUtils.isEmpty( model.getModelEncoding() ) )
-            {
-                model.setModelEncoding( fileEncoding );
-            }
-        }
-        finally
-        {
-            IOUtil.close( pomReader );
-            pomReader = null;
-        }
-        return model;
-    }
-
-    public void writePom( final Model model,
-                          final File pomFile,
-                          final File initialPomFile )
-        throws
-        IOException
-    {
-        InputStream inputStream = null;
-        Writer outputStreamWriter = null;
-//        FileCharsetDetector detector = new FileCharsetDetector ( pomFile );
-
-        String fileEncoding =
-            StringUtils.isEmpty( model.getModelEncoding() ) ? model.getModelEncoding() : "UTF-8";
-
-        try
-        {
-            inputStream = new FileInputStream( initialPomFile );
-
-            SAXBuilder builder = new SAXBuilder();
-            org.jdom.Document doc = builder.build( inputStream );
-            inputStream.close();
-            inputStream = null;
-
-            // The cdata parts of the pom are not preserved from initial to target
-            MavenJDOMWriter writer = new MavenJDOMWriter();
-
-            outputStreamWriter =
-                new OutputStreamWriter( new FileOutputStream( pomFile ), fileEncoding );
-
-            Format form = Format.getRawFormat().setEncoding( fileEncoding );
-            writer.write( model, doc, outputStreamWriter, form );
-            outputStreamWriter.close();
-            outputStreamWriter = null;
-        }
-        catch ( JDOMException exc )
-        {
-            throw (IOException) new IOException( "Cannot parse the POM by JDOM." );
-        }
-        catch ( FileNotFoundException e )
-        {
-            getLogger().debug( "Creating pom file " + pomFile );
-
-            Writer pomWriter = null;
-
-            try
-            {
-//                pomWriter = new FileWriter ( pomFile );
-                pomWriter =
-                    new OutputStreamWriter( new FileOutputStream( pomFile ), fileEncoding );
-
-                MavenXpp3Writer writer = new MavenXpp3Writer();
-                writer.write( pomWriter, model );
-                pomWriter.close();
-                pomWriter = null;
-            }
-            finally
-            {
-                IOUtil.close( pomWriter );
-            }
-        }
-        finally
-        {
-            IOUtil.close( inputStream );
-            IOUtil.close( outputStreamWriter );
-        }
-    }
-
-    private Map createDependencyMap( List dependencies )
-    {
-        Map dependencyMap = new HashMap();
-        Iterator dependenciesIterator = dependencies.iterator();
-        while ( dependenciesIterator.hasNext() )
-        {
-            Dependency dependency = (Dependency) dependenciesIterator.next();
-
-            dependencyMap.put(
-                dependency.getManagementKey(),
-                dependency
-            );
-        }
-
-        return dependencyMap;
-    }
-
-    private void mergeModelBuild( Model model, Model generatedModel )
-    {
-        if ( generatedModel.getBuild() != null )
-        {
-            if ( model.getBuild() == null )
-            {
-                model.setBuild( new Build() );
-            }
-
-            mergeBuildPlugins( model.getBuild(), generatedModel.getBuild() );
-        }
-    }
-
-    private void mergeProfiles( Model model, Model generatedModel )
-    {
-        List generatedProfiles = generatedModel.getProfiles();
-        if ( generatedProfiles != null && generatedProfiles.size() > 0 )
-        {
-            List modelProfiles = model.getProfiles();
-            Map modelProfileIdMap = new HashMap();
-            if ( modelProfiles == null )
-            {
-                modelProfiles = new ArrayList();
-                model.setProfiles( modelProfiles );
-            }
-            else if ( modelProfiles.size() > 0 )
-            {
-                // add profile ids from the model for later lookups to the modelProfileIds set
-                Iterator modelProfilesIterator = modelProfiles.iterator();
-                while ( modelProfilesIterator.hasNext() )
-                {
-                    Profile modelProfile = (Profile) modelProfilesIterator.next();
-                    modelProfileIdMap.put( modelProfile.getId(), modelProfile );
-                }
-            }
-
-            Iterator generatedProfilesIterator = generatedProfiles.iterator();
-            while ( generatedProfilesIterator.hasNext() )
-            {
-                Profile generatedProfile = (Profile) generatedProfilesIterator.next();
-                String generatedProfileId = generatedProfile.getId();
-                if ( !modelProfileIdMap.containsKey( generatedProfileId ) )
-                {
-                    model.addProfile( generatedProfile );
-                }
-                else
-                {
-                    getLogger().warn( "Try to merge profiles with id " + generatedProfileId );
-                    mergeModelBase( (Profile) modelProfileIdMap.get( generatedProfileId ), generatedProfile );
-                    mergeProfileBuild( (Profile) modelProfileIdMap.get( generatedProfileId ), generatedProfile );
-                }
-            }
-        }
-    }
-
-    private void mergeProfileBuild( Profile modelProfile, Profile generatedProfile )
-    {
-        if ( generatedProfile.getBuild() != null )
-        {
-            if ( modelProfile.getBuild() == null )
-            {
-                modelProfile.setBuild( new Build() );
-            }
-            mergeBuildPlugins( modelProfile.getBuild(), generatedProfile.getBuild() );
-            // TODO: merge more than just plugins in the profile...
-        }
-    }
-
-    private void mergeModelBase( ModelBase model, ModelBase generatedModel )
-    {
-        // ModelBase can be a Model or a Profile...
-
-        Map dependenciesByIds = createDependencyMap( model.getDependencies() );
-        Map generatedDependenciesByIds = createDependencyMap( generatedModel.getDependencies() );
-
-        Iterator generatedDependencyIds = generatedDependenciesByIds.keySet().iterator();
-        while ( generatedDependencyIds.hasNext() )
-        {
-            String generatedDependencyId = (String) generatedDependencyIds.next();
-
-            if ( !dependenciesByIds.containsKey( generatedDependencyId ) )
-            {
-                model.addDependency(
-                    (Dependency) generatedDependenciesByIds.get( generatedDependencyId )
-                );
-            }
-            else
-            {
-                getLogger().warn( "Can not override property: " + generatedDependencyId );
-            }
-
-        // TODO: maybe warn, if a property key gets overriden?
-        model.getProperties().putAll( generatedModel.getProperties() );
-
-        // TODO: maybe merge more than just dependencies and properties...
-        }
-    }
-
-    private void mergeReportPlugins( Model model,
-                                     Model generatedModel )
-    {
-        if ( generatedModel.getReporting() != null )
-        {
-            if ( model.getReporting() == null )
-            {
-                model.setReporting( new Reporting() );
-            }
-
-            Map reportPluginsByIds = model.getReporting().getReportPluginsAsMap();
-            Map generatedReportPluginsByIds =
-                generatedModel.getReporting().getReportPluginsAsMap();
-
-            Iterator generatedReportPluginsIds = generatedReportPluginsByIds.keySet().iterator();
-            while ( generatedReportPluginsIds.hasNext() )
-            {
-                String generatedReportPluginsId = (String) generatedReportPluginsIds.next();
-
-                if ( !reportPluginsByIds.containsKey( generatedReportPluginsId ) )
-                {
-                    model.getReporting().addPlugin(
-                        (ReportPlugin) generatedReportPluginsByIds.get( generatedReportPluginsId )
-                    );
-                }
-                else
-                {
-                    getLogger().warn( "Can not override report: " + generatedReportPluginsId );
-                }
-            }
-        }
-    }
-    private void mergeBuildPlugins( BuildBase modelBuild, BuildBase generatedModelBuild )
-    {
-        Map pluginsByIds = modelBuild.getPluginsAsMap();
-        List generatedPlugins = generatedModelBuild.getPlugins();
-
-        Iterator generatedPluginsIterator = generatedPlugins.iterator();
-        while ( generatedPluginsIterator.hasNext() )
-        {
-            Plugin generatedPlugin = (Plugin) generatedPluginsIterator.next();
-            String generatedPluginsId = generatedPlugin.getKey();
-
-            if ( !pluginsByIds.containsKey( generatedPluginsId ) )
-            {
-                modelBuild.addPlugin( generatedPlugin );
-            }
-            else
-            {
-                getLogger().info( "Try to merge plugin configuration of plugins with id: " + generatedPluginsId );
-                Plugin modelPlugin = (Plugin) pluginsByIds.get( generatedPluginsId );
-
-                modelPlugin.setConfiguration( Xpp3DomUtils.mergeXpp3Dom( (Xpp3Dom) generatedPlugin.getConfiguration(),
-                                                                         (Xpp3Dom) modelPlugin.getConfiguration() ) );
-            }
-        }
-    }
-}
+/*
+ * 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.apache.maven.archetype.common;
+
+import org.apache.maven.archetype.common.util.FileCharsetDetector;
+import org.apache.maven.archetype.common.util.Format;
+import org.apache.maven.archetype.exception.InvalidPackaging;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Parent;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Build;
+import org.apache.maven.model.Profile;
+import org.apache.maven.model.ModelBase;
+import org.apache.maven.model.Reporting;
+import org.apache.maven.model.ReportPlugin;
+import org.apache.maven.model.BuildBase;
+import org.apache.maven.model.Plugin;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.codehaus.plexus.util.xml.Xpp3DomUtils;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.Node;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+import org.jdom.JDOMException;
+import org.jdom.input.SAXBuilder;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.*;
+
+/** @plexus.component */
+public class DefaultPomManager
+    extends AbstractLogEnabled
+    implements PomManager
+{
+    public void addModule( File pom,
+                           String artifactId )
+        throws
+        IOException,
+        XmlPullParserException,
+        DocumentException,
+        InvalidPackaging
+    {
+        boolean found = false;
+
+        StringWriter writer = new StringWriter();
+        Reader fileReader = new FileReader( pom );
+
+        try
+        {
+            fileReader = new FileReader( pom );
+
+            SAXReader reader = new SAXReader();
+            Document document = reader.read( fileReader );
+            Element project = document.getRootElement();
+
+            String packaging = null;
+            Element packagingElement = project.element( "packaging" );
+            if ( packagingElement != null )
+            {
+                packaging = packagingElement.getStringValue();
+            }
+            if ( !"pom".equals( packaging ) )
+            {
+                throw new InvalidPackaging(
+                    "Unable to add module to the current project as it is not of packaging type 'pom'"
+                );
+            }
+
+            Element modules = project.element( "modules" );
+            if ( modules == null )
+            {
+                modules = project.addText( "  " ).addElement( "modules" );
+                modules.setText( "\n  " );
+                project.addText( "\n" );
+            }
+            // TODO: change to while loop
+            for ( Iterator i = modules.elementIterator( "module" ); i.hasNext() && !found; )
+            {
+                Element module = (Element) i.next();
+                if ( module.getText().equals( artifactId ) )
+                {
+                    found = true;
+                }
+            }
+            if ( !found )
+            {
+                Node lastTextNode = null;
+                for ( Iterator i = modules.nodeIterator(); i.hasNext(); )
+                {
+                    Node node = (Node) i.next();
+                    if ( node.getNodeType() == Node.ELEMENT_NODE )
+                    {
+                        lastTextNode = null;
+                    }
+                    else if ( node.getNodeType() == Node.TEXT_NODE )
+                    {
+                        lastTextNode = node;
+                    }
+                }
+
+                if ( lastTextNode != null )
+                {
+                    modules.remove( lastTextNode );
+                }
+
+                modules.addText( "\n    " );
+                modules.addElement( "module" ).setText( artifactId );
+                modules.addText( "\n  " );
+
+                XMLWriter xmlWriter = new XMLWriter( writer );
+                xmlWriter.write( document );
+
+                FileUtils.fileWrite( pom.getAbsolutePath(), writer.toString() );
+            } // end if
+        }
+        finally
+        {
+            IOUtil.close( fileReader );
+        }
+    }
+
+    public void addParent( File pom,
+                           File parentPom )
+        throws
+        IOException,
+        XmlPullParserException
+    {
+        Model generatedModel = readPom( pom );
+        if( null != generatedModel.getParent() )
+        {
+            getLogger().info( "Parent element not overwrited in " + pom );
+            return;
+        }
+
+        Model parentModel = readPom( parentPom );
+
+        Parent parent = new Parent();
+        parent.setGroupId( parentModel.getGroupId() );
+        if ( parent.getGroupId() == null )
+        {
+            parent.setGroupId( parentModel.getParent().getGroupId() );
+        }
+        parent.setArtifactId( parentModel.getArtifactId() );
+        parent.setVersion( parentModel.getVersion() );
+        if ( parent.getVersion() == null )
+        {
+            parent.setVersion( parentModel.getParent().getVersion() );
+        }
+        generatedModel.setParent( parent );
+
+        writePom( generatedModel, pom, pom );
+    }
+
+    public void mergePoms( File pom,
+                           File temporaryPom )
+        throws
+        IOException,
+        XmlPullParserException
+    {
+        Model model = readPom( pom );
+        Model generatedModel = readPom( temporaryPom );
+
+        model.getProperties().putAll( generatedModel.getProperties() );
+
+        mergeModelBase( model, generatedModel );
+        mergeModelBuild( model, generatedModel );
+        mergeProfiles( model, generatedModel );
+        mergeReportPlugins( model, generatedModel );
+
+//
+//        // Potential merging
+//
+//        model.getModelEncoding ();
+//        model.getModelVersion ();
+//
+//        model.getGroupId ();
+//        model.getArtifactId ();
+//        model.getVersion ();
+//        model.getParent ();
+//
+//        model.getId ();
+//        model.getName ();
+//        model.getInceptionYear ();
+//        model.getDescription ();
+//        model.getUrl ();
+//        model.getLicenses ();
+//        model.getProperties ();
+//
+//        model.getOrganization ();
+//        model.getMailingLists ();
+//        model.getContributors ();
+//        model.getDevelopers ();
+//
+//        model.getScm ();
+//        model.getCiManagement ();
+//        model.getDistributionManagement ();
+//        model.getIssueManagement ();
+//
+//        model.getPackaging ();
+////        model.getDependencies (); // done
+//        model.getDependencyManagement ();
+//        model.getPrerequisites ().getMaven ();
+//        model.getPrerequisites ().getModelEncoding ();
+//
+//        model.getProfiles ();
+//        model.getModules ();
+//        model.getRepositories ();
+//        model.getPluginRepositories ();
+//
+//        model.getBuild ().getDefaultGoal ();
+//        model.getBuild ().getFinalName ();
+//        model.getBuild ().getModelEncoding ();
+//        model.getBuild ().getFilters ();
+//        model.getBuild ().getDirectory ();
+//        model.getBuild ().getOutputDirectory ();
+//        model.getBuild ().getSourceDirectory ();
+//        model.getBuild ().getResources ();
+//        model.getBuild ().getScriptSourceDirectory ();
+//        model.getBuild ().getTestOutputDirectory ();
+//        model.getBuild ().getTestResources ();
+//        model.getBuild ().getTestSourceDirectory ();
+//        model.getBuild ().getPluginManagement ();
+//        model.getBuild ().getExtensions ();
+////        model.getBuild ().getPluginsAsMap (); // done
+//
+//        model.getReporting ().getModelEncoding ();
+//        model.getReporting ().getOutputDirectory ();
+////        model.getReporting ().getReportPluginsAsMap (); // done
+//
+
+        writePom( model, pom, pom );
+    }
+
+    public Model readPom( final File pomFile )
+        throws
+        IOException,
+        XmlPullParserException
+    { // TODO ensure correct encoding by using default one from method argument !!!
+
+        Model model;
+        Reader pomReader = null;
+        try
+        {
+            FileCharsetDetector detector = new FileCharsetDetector( pomFile );
+
+            String fileEncoding = detector.isFound() ? detector.getCharset() : "UTF-8";
+
+            pomReader = new InputStreamReader( new FileInputStream( pomFile ), fileEncoding );
+
+            MavenXpp3Reader reader = new MavenXpp3Reader();
+
+            model = reader.read( pomReader );
+
+            if ( StringUtils.isEmpty( model.getModelEncoding() ) )
+            {
+                model.setModelEncoding( fileEncoding );
+            }
+        }
+        finally
+        {
+            IOUtil.close( pomReader );
+            pomReader = null;
+        }
+        return model;
+    }
+
+
+    public Model readPom( InputStream pomStream )
+        throws
+        IOException,
+        XmlPullParserException
+    { // TODO ensure correct encoding by using default one from method argument !!!
+
+        Model model;
+        Reader pomReader = null;
+        try
+        {
+//            FileCharsetDetector detector = new FileCharsetDetector( pomStream );
+
+            String fileEncoding = /*detector.isFound() ? detector.getCharset() :*/ "UTF-8";
+
+            pomReader = new InputStreamReader( pomStream, fileEncoding );
+
+            MavenXpp3Reader reader = new MavenXpp3Reader();
+
+            model = reader.read( pomReader );
+
+            if ( StringUtils.isEmpty( model.getModelEncoding() ) )
+            {
+                model.setModelEncoding( fileEncoding );
+            }
+        }
+        finally
+        {
+            IOUtil.close( pomReader );
+            pomReader = null;
+        }
+        return model;
+    }
+
+    public void writePom( final Model model,
+                          final File pomFile,
+                          final File initialPomFile )
+        throws
+        IOException
+    {
+        InputStream inputStream = null;
+        Writer outputStreamWriter = null;
+//        FileCharsetDetector detector = new FileCharsetDetector ( pomFile );
+
+        String fileEncoding =
+            StringUtils.isEmpty( model.getModelEncoding() ) ? model.getModelEncoding() : "UTF-8";
+
+        try
+        {
+            inputStream = new FileInputStream( initialPomFile );
+
+            SAXBuilder builder = new SAXBuilder();
+            org.jdom.Document doc = builder.build( inputStream );
+            inputStream.close();
+            inputStream = null;
+
+            // The cdata parts of the pom are not preserved from initial to target
+            MavenJDOMWriter writer = new MavenJDOMWriter();
+
+            outputStreamWriter =
+                new OutputStreamWriter( new FileOutputStream( pomFile ), fileEncoding );
+
+            Format form = Format.getRawFormat().setEncoding( fileEncoding );
+            writer.write( model, doc, outputStreamWriter, form );
+            outputStreamWriter.close();
+            outputStreamWriter = null;
+        }
+        catch ( JDOMException exc )
+        {
+            throw (IOException) new IOException( "Cannot parse the POM by JDOM." );
+        }
+        catch ( FileNotFoundException e )
+        {
+            getLogger().debug( "Creating pom file " + pomFile );
+
+            Writer pomWriter = null;
+
+            try
+            {
+//                pomWriter = new FileWriter ( pomFile );
+                pomWriter =
+                    new OutputStreamWriter( new FileOutputStream( pomFile ), fileEncoding );
+
+                MavenXpp3Writer writer = new MavenXpp3Writer();
+                writer.write( pomWriter, model );
+                pomWriter.close();
+                pomWriter = null;
+            }
+            finally
+            {
+                IOUtil.close( pomWriter );
+            }
+        }
+        finally
+        {
+            IOUtil.close( inputStream );
+            IOUtil.close( outputStreamWriter );
+        }
+    }
+
+    private Map createDependencyMap( List dependencies )
+    {
+        Map dependencyMap = new HashMap();
+        Iterator dependenciesIterator = dependencies.iterator();
+        while ( dependenciesIterator.hasNext() )
+        {
+            Dependency dependency = (Dependency) dependenciesIterator.next();
+
+            dependencyMap.put(
+                dependency.getManagementKey(),
+                dependency
+            );
+        }
+
+        return dependencyMap;
+    }
+
+    private void mergeModelBuild( Model model, Model generatedModel )
+    {
+        if ( generatedModel.getBuild() != null )
+        {
+            if ( model.getBuild() == null )
+            {
+                model.setBuild( new Build() );
+            }
+
+            mergeBuildPlugins( model.getBuild(), generatedModel.getBuild() );
+        }
+    }
+
+    private void mergeProfiles( Model model, Model generatedModel )
+    {
+        List generatedProfiles = generatedModel.getProfiles();
+        if ( generatedProfiles != null && generatedProfiles.size() > 0 )
+        {
+            List modelProfiles = model.getProfiles();
+            Map modelProfileIdMap = new HashMap();
+            if ( modelProfiles == null )
+            {
+                modelProfiles = new ArrayList();
+                model.setProfiles( modelProfiles );
+            }
+            else if ( modelProfiles.size() > 0 )
+            {
+                // add profile ids from the model for later lookups to the modelProfileIds set
+                Iterator modelProfilesIterator = modelProfiles.iterator();
+                while ( modelProfilesIterator.hasNext() )
+                {
+                    Profile modelProfile = (Profile) modelProfilesIterator.next();
+                    modelProfileIdMap.put( modelProfile.getId(), modelProfile );
+                }
+            }
+
+            Iterator generatedProfilesIterator = generatedProfiles.iterator();
+            while ( generatedProfilesIterator.hasNext() )
+            {
+                Profile generatedProfile = (Profile) generatedProfilesIterator.next();
+                String generatedProfileId = generatedProfile.getId();
+                if ( !modelProfileIdMap.containsKey( generatedProfileId ) )
+                {
+                    model.addProfile( generatedProfile );
+                }
+                else
+                {
+                    getLogger().warn( "Try to merge profiles with id " + generatedProfileId );
+                    mergeModelBase( (Profile) modelProfileIdMap.get( generatedProfileId ), generatedProfile );
+                    mergeProfileBuild( (Profile) modelProfileIdMap.get( generatedProfileId ), generatedProfile );
+                }
+            }
+        }
+    }
+
+    private void mergeProfileBuild( Profile modelProfile, Profile generatedProfile )
+    {
+        if ( generatedProfile.getBuild() != null )
+        {
+            if ( modelProfile.getBuild() == null )
+            {
+                modelProfile.setBuild( new Build() );
+            }
+            mergeBuildPlugins( modelProfile.getBuild(), generatedProfile.getBuild() );
+            // TODO: merge more than just plugins in the profile...
+        }
+    }
+
+    private void mergeModelBase( ModelBase model, ModelBase generatedModel )
+    {
+        // ModelBase can be a Model or a Profile...
+
+        Map dependenciesByIds = createDependencyMap( model.getDependencies() );
+        Map generatedDependenciesByIds = createDependencyMap( generatedModel.getDependencies() );
+
+        Iterator generatedDependencyIds = generatedDependenciesByIds.keySet().iterator();
+        while ( generatedDependencyIds.hasNext() )
+        {
+            String generatedDependencyId = (String) generatedDependencyIds.next();
+
+            if ( !dependenciesByIds.containsKey( generatedDependencyId ) )
+            {
+                model.addDependency(
+                    (Dependency) generatedDependenciesByIds.get( generatedDependencyId )
+                );
+            }
+            else
+            {
+                getLogger().warn( "Can not override property: " + generatedDependencyId );
+            }
+
+        // TODO: maybe warn, if a property key gets overriden?
+        model.getProperties().putAll( generatedModel.getProperties() );
+
+        // TODO: maybe merge more than just dependencies and properties...
+        }
+    }
+
+    private void mergeReportPlugins( Model model,
+                                     Model generatedModel )
+    {
+        if ( generatedModel.getReporting() != null )
+        {
+            if ( model.getReporting() == null )
+            {
+                model.setReporting( new Reporting() );
+            }
+
+            Map reportPluginsByIds = model.getReporting().getReportPluginsAsMap();
+            Map generatedReportPluginsByIds =
+                generatedModel.getReporting().getReportPluginsAsMap();
+
+            Iterator generatedReportPluginsIds = generatedReportPluginsByIds.keySet().iterator();
+            while ( generatedReportPluginsIds.hasNext() )
+            {
+                String generatedReportPluginsId = (String) generatedReportPluginsIds.next();
+
+                if ( !reportPluginsByIds.containsKey( generatedReportPluginsId ) )
+                {
+                    model.getReporting().addPlugin(
+                        (ReportPlugin) generatedReportPluginsByIds.get( generatedReportPluginsId )
+                    );
+                }
+                else
+                {
+                    getLogger().warn( "Can not override report: " + generatedReportPluginsId );
+                }
+            }
+        }
+    }
+    private void mergeBuildPlugins( BuildBase modelBuild, BuildBase generatedModelBuild )
+    {
+        Map pluginsByIds = modelBuild.getPluginsAsMap();
+        List generatedPlugins = generatedModelBuild.getPlugins();
+
+        Iterator generatedPluginsIterator = generatedPlugins.iterator();
+        while ( generatedPluginsIterator.hasNext() )
+        {
+            Plugin generatedPlugin = (Plugin) generatedPluginsIterator.next();
+            String generatedPluginsId = generatedPlugin.getKey();
+
+            if ( !pluginsByIds.containsKey( generatedPluginsId ) )
+            {
+                modelBuild.addPlugin( generatedPlugin );
+            }
+            else
+            {
+                getLogger().info( "Try to merge plugin configuration of plugins with id: " + generatedPluginsId );
+                Plugin modelPlugin = (Plugin) pluginsByIds.get( generatedPluginsId );
+
+                modelPlugin.setConfiguration( Xpp3DomUtils.mergeXpp3Dom( (Xpp3Dom) generatedPlugin.getConfiguration(),
+                                                                         (Xpp3Dom) modelPlugin.getConfiguration() ) );
+            }
+        }
+    }
+}

Propchange: maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java
------------------------------------------------------------------------------
    svn:eol-style = native