Author: jdcasey
Date: Thu Jan 31 17:53:21 2008
New Revision: 617325

URL: http://svn.apache.org/viewvc?rev=617325&view=rev
Log:
[MNG-2145] Correcting several merge issues between profiles and main build, and 
also of duplicate plugin declarations within a single build section.

Modified:
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/injection/DefaultProfileInjector.java
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
    
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java
    
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/injection/DefaultProfileInjectorTest.java
    
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/ModelUtilsTest.java

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/injection/DefaultProfileInjector.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/injection/DefaultProfileInjector.java?rev=617325&r1=617324&r2=617325&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/injection/DefaultProfileInjector.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/profiles/injection/DefaultProfileInjector.java
 Thu Jan 31 17:53:21 2008
@@ -66,7 +66,8 @@
 
     public void inject( Profile profile, Model model )
     {
-        injectDependencies( profile, model );
+
+        model.setDependencies( injectDependencies( profile.getDependencies(), 
model.getDependencies() ) );
 
         injectModules( profile, model );
 
@@ -213,6 +214,8 @@
             modelPlugin.setVersion( profilePlugin.getVersion() );
         }
 
+        modelPlugin.setDependencies( injectDependencies( 
profilePlugin.getDependencies(), modelPlugin.getDependencies() ) );
+
         // merge the lists of goals that are not attached to an <execution/>
         injectConfigurationContainer( profilePlugin, modelPlugin );
 
@@ -590,33 +593,29 @@
         recessive.flushReportSetMap();
     }
 
-    private void injectDependencies( Profile profile, Model model )
+    private List injectDependencies( List profileDeps, List modelDeps )
     {
         Map depsMap = new LinkedHashMap();
 
-        List deps = model.getDependencies();
-
-        if ( deps != null )
+        if ( modelDeps != null )
         {
-            for ( Iterator it = deps.iterator(); it.hasNext(); )
+            for ( Iterator it = modelDeps.iterator(); it.hasNext(); )
             {
                 Dependency dependency = (Dependency) it.next();
                 depsMap.put( dependency.getManagementKey(), dependency );
             }
         }
 
-        deps = profile.getDependencies();
-
-        if ( deps != null )
+        if ( profileDeps != null )
         {
-            for ( Iterator it = deps.iterator(); it.hasNext(); )
+            for ( Iterator it = profileDeps.iterator(); it.hasNext(); )
             {
                 Dependency dependency = (Dependency) it.next();
                 depsMap.put( dependency.getManagementKey(), dependency );
             }
         }
 
-        model.setDependencies( new ArrayList( depsMap.values() ) );
+        return new ArrayList( depsMap.values() );
     }
 
 }

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java?rev=617325&r1=617324&r2=617325&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/DefaultMavenProjectBuilder.java
 Thu Jan 31 17:53:21 2008
@@ -739,6 +739,9 @@
             }
         }
 
+        // merge any duplicated plugin definitions together, using the first 
appearance as the dominant one.
+        ModelUtils.mergeDuplicatePluginDefinitions( 
project.getModel().getBuild() );
+
         mergeManagedDependencies(project.getModel(), localRepository, 
parentSearchRepositories);
 
         try

Modified: 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java?rev=617325&r1=617324&r2=617325&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java
 (original)
+++ 
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java
 Thu Jan 31 17:53:21 2008
@@ -62,6 +62,54 @@
 {
 
     /**
+     * Given this plugin list:
+     *
+     * A1 -> B -> C -> A2 -> D
+     *
+     * Rearrange it to this:
+     *
+     * A(A1 + A2) -> B -> C -> D
+     *
+     * In cases of overlapping definitions, A1 is overridden by A2
+     *
+     */
+    public static void mergeDuplicatePluginDefinitions( PluginContainer 
pluginContainer )
+    {
+        if ( pluginContainer == null )
+        {
+            return;
+        }
+
+        List originalPlugins = pluginContainer.getPlugins();
+
+        if ( ( originalPlugins == null ) || originalPlugins.isEmpty() )
+        {
+            return;
+        }
+
+        List normalized = new ArrayList( originalPlugins.size() );
+
+        for ( Iterator it = originalPlugins.iterator(); it.hasNext(); )
+        {
+            Plugin currentPlugin = (Plugin) it.next();
+
+            if ( normalized.contains( currentPlugin ) )
+            {
+                int idx = normalized.indexOf( currentPlugin );
+                Plugin firstPlugin = (Plugin) normalized.get( idx );
+
+                mergePluginDefinitions( firstPlugin, currentPlugin, false );
+            }
+            else
+            {
+                normalized.add( currentPlugin );
+            }
+        }
+
+        pluginContainer.setPlugins( normalized );
+    }
+
+    /**
      * This should be the resulting ordering of plugins after merging:
      *
      * Given:

Modified: 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/injection/DefaultProfileInjectorTest.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/injection/DefaultProfileInjectorTest.java?rev=617325&r1=617324&r2=617325&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/injection/DefaultProfileInjectorTest.java
 (original)
+++ 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/profiles/injection/DefaultProfileInjectorTest.java
 Thu Jan 31 17:53:21 2008
@@ -19,16 +19,15 @@
  * under the License.
  */
 
-import junit.framework.TestCase;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.BuildBase;
+import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.PluginContainer;
 import org.apache.maven.model.PluginExecution;
 import org.apache.maven.model.Profile;
 import org.apache.maven.model.Repository;
-import org.apache.maven.profiles.injection.DefaultProfileInjector;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 import java.util.Collections;
@@ -36,9 +35,42 @@
 import java.util.List;
 import java.util.Map;
 
+import junit.framework.TestCase;
+
 public class DefaultProfileInjectorTest
     extends TestCase
 {
+
+    public void testShouldUseMainPluginDependencyVersionOverManagedDepVersion()
+    {
+        PluginContainer profile = new PluginContainer();
+        Plugin profilePlugin = createPlugin( "group", "artifact", "1", 
Collections.EMPTY_MAP );
+        Dependency profileDep = createDependency( "g", "a", "2" );
+        profilePlugin.addDependency( profileDep );
+        profile.addPlugin( profilePlugin );
+
+        PluginContainer model = new PluginContainer();
+        Plugin plugin = createPlugin( "group", "artifact", "1", 
Collections.EMPTY_MAP );
+        Dependency dep = createDependency( "g", "a", "1" );
+        plugin.addDependency( dep );
+        model.addPlugin( plugin );
+
+        new DefaultProfileInjector().injectPlugins( profile, model );
+
+        assertEquals( profileDep.getVersion(), ((Dependency) 
plugin.getDependencies().get( 0 ) ).getVersion() );
+    }
+
+    private Dependency createDependency( String gid,
+                                         String aid,
+                                         String ver )
+    {
+        Dependency dep = new Dependency();
+        dep.setGroupId( gid );
+        dep.setArtifactId( aid );
+        dep.setVersion( ver );
+
+        return dep;
+    }
 
     /**
      * Test that this is the resulting ordering of plugins after merging:

Modified: 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/ModelUtilsTest.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/ModelUtilsTest.java?rev=617325&r1=617324&r2=617325&view=diff
==============================================================================
--- 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/ModelUtilsTest.java
 (original)
+++ 
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/ModelUtilsTest.java
 Thu Jan 31 17:53:21 2008
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-import junit.framework.TestCase;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Plugin;
@@ -36,9 +35,38 @@
 import java.util.List;
 import java.util.Map;
 
+import junit.framework.TestCase;
+
 public class ModelUtilsTest
     extends TestCase
 {
+
+    public void testShouldUseMainPluginDependencyVersionOverManagedDepVersion()
+    {
+        Plugin mgtPlugin = createPlugin( "group", "artifact", "1", 
Collections.EMPTY_MAP );
+        Dependency mgtDep = createDependency( "g", "a", "2" );
+        mgtPlugin.addDependency( mgtDep );
+
+        Plugin plugin = createPlugin( "group", "artifact", "1", 
Collections.EMPTY_MAP );
+        Dependency dep = createDependency( "g", "a", "1" );
+        plugin.addDependency( dep );
+
+        ModelUtils.mergePluginDefinitions( plugin, mgtPlugin, false );
+
+        assertEquals( dep.getVersion(), ((Dependency) 
plugin.getDependencies().get( 0 ) ).getVersion() );
+    }
+
+    private Dependency createDependency( String gid,
+                                         String aid,
+                                         String ver )
+    {
+        Dependency dep = new Dependency();
+        dep.setGroupId( gid );
+        dep.setArtifactId( aid );
+        dep.setVersion( ver );
+
+        return dep;
+    }
 
     public void testShouldNotInheritPluginWithInheritanceSetToFalse()
     {


Reply via email to