Author: rafale Date: Sat Apr 11 22:37:50 2009 New Revision: 764258 URL: http://svn.apache.org/viewvc?rev=764258&view=rev Log: Fix for ARCHETYPE-235
Modified: maven/archetype/trunk/archetype-common/src/main/java/org/apache/maven/archetype/common/DefaultPomManager.java maven/archetype/trunk/archetype-plugin/pom.xml maven/archetype/trunk/pom.xml 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=764258&r1=764257&r2=764258&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 Apr 11 22:37:50 2009 @@ -22,20 +22,25 @@ 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.Build; -import org.apache.maven.model.Dependency; +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.Plugin; -import org.apache.maven.model.ReportPlugin; +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.io.xpp3.MavenXpp3Reader; -import org.apache.maven.model.io.xpp3.MavenXpp3Writer; +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; @@ -57,10 +62,7 @@ import java.io.Reader; import java.io.StringWriter; import java.io.Writer; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; /** @plexus.component */ public class DefaultPomManager @@ -194,8 +196,12 @@ { Model model = readPom( pom ); Model generatedModel = readPom( temporaryPom ); - mergeDependencies( model, generatedModel ); - mergeBuildPlugins( model, generatedModel ); + + model.getProperties().putAll( generatedModel.getProperties() ); + + mergeModelBase( model, generatedModel ); + mergeModelBuild( model, generatedModel ); + mergeProfiles( model, generatedModel ); mergeReportPlugins( model, generatedModel ); // @@ -404,7 +410,7 @@ Dependency dependency = (Dependency) dependenciesIterator.next(); dependencyMap.put( - dependency.getGroupId() + ":" + dependency.getArtifactId(), + dependency.getManagementKey(), dependency ); } @@ -412,8 +418,7 @@ return dependencyMap; } - private void mergeBuildPlugins( Model model, - Model generatedModel ) + private void mergeModelBuild( Model model, Model generatedModel ) { if ( generatedModel.getBuild() != null ) { @@ -422,31 +427,69 @@ model.setBuild( new Build() ); } - Map pluginsByIds = model.getBuild().getPluginsAsMap(); - Map generatedPluginsByIds = generatedModel.getBuild().getPluginsAsMap(); + mergeBuildPlugins( model.getBuild(), generatedModel.getBuild() ); + } + } - Iterator generatedPluginsIds = generatedPluginsByIds.keySet().iterator(); - while ( generatedPluginsIds.hasNext() ) + 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 ) { - String generatedPluginsId = (String) generatedPluginsIds.next(); + 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 ); + } + } - if ( !pluginsByIds.containsKey( generatedPluginsId ) ) + Iterator generatedProfilesIterator = generatedProfiles.iterator(); + while ( generatedProfilesIterator.hasNext() ) + { + Profile generatedProfile = (Profile) generatedProfilesIterator.next(); + String generatedProfileId = generatedProfile.getId(); + if ( !modelProfileIdMap.containsKey( generatedProfileId ) ) { - model.getBuild().addPlugin( - (Plugin) generatedPluginsByIds.get( generatedPluginsId ) - ); + model.addProfile( generatedProfile ); } else { - getLogger().warn( "Can not override plugin: " + generatedPluginsId ); + getLogger().warn( "Try to merge profiles with id " + generatedProfileId ); + mergeModelBase( (Profile) modelProfileIdMap.get( generatedProfileId ), generatedProfile ); + mergeProfileBuild( (Profile) modelProfileIdMap.get( generatedProfileId ), generatedProfile ); } } } } - private void mergeDependencies( Model model, - Model generatedModel ) + 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() ); @@ -465,6 +508,11 @@ { 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... } } @@ -500,4 +548,29 @@ } } } + 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() ) ); + } + } + } } Modified: maven/archetype/trunk/archetype-plugin/pom.xml URL: http://svn.apache.org/viewvc/maven/archetype/trunk/archetype-plugin/pom.xml?rev=764258&r1=764257&r2=764258&view=diff ============================================================================== --- maven/archetype/trunk/archetype-plugin/pom.xml (original) +++ maven/archetype/trunk/archetype-plugin/pom.xml Sat Apr 11 22:37:50 2009 @@ -66,6 +66,11 @@ <artifactId>commons-collections</artifactId> <version>3.2.1</version> </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-utils</artifactId> + <version>1.5.8</version> + </dependency> </dependencies> <properties> Modified: maven/archetype/trunk/pom.xml URL: http://svn.apache.org/viewvc/maven/archetype/trunk/pom.xml?rev=764258&r1=764257&r2=764258&view=diff ============================================================================== --- maven/archetype/trunk/pom.xml (original) +++ maven/archetype/trunk/pom.xml Sat Apr 11 22:37:50 2009 @@ -83,7 +83,7 @@ <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-utils</artifactId> - <version>1.5.6</version> + <version>1.5.8</version> </dependency> <dependency> <groupId>org.codehaus.plexus</groupId> @@ -364,4 +364,4 @@ </dependencyManagement> </profile> </profiles> -</project> \ No newline at end of file +</project>