You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by jd...@apache.org on 2005/05/27 23:47:13 UTC
svn commit: r178825 - /maven/components/trunk/maven-model
/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project
/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance
/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/injection
/maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance
Author: jdcasey
Date: Fri May 27 14:47:12 2005
New Revision: 178825
URL: http://svn.apache.org/viewcvs?rev=178825&view=rev
Log:
Added inheritance of Plugins according to the rules we decided upon. This consists of:
- inheritanceApplied flag on Plugin and Goal (NOT fields, just a code-only flag)
- flushGoalMap/flushPluginMap to clear caching of these calculated attributes
- ModelUtils.mergePluginLists() and ModelUtils.mergePluginDefinitions() for use in both
* DefaultModelInheritanceAssembler (Plugin/PluginManagement lists)
* DefaultModelDefaultsInjector (PluginManagement -> Plugin merges)
- Also added a few unit tests for basic Plugin inheritance stuff. This could be more thoroughly tested...
Modified:
maven/components/trunk/maven-model/maven.mdo
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java
maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/injection/DefaultModelDefaultsInjector.java
maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java
Modified: maven/components/trunk/maven-model/maven.mdo
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-model/maven.mdo?rev=178825&r1=178824&r2=178825&view=diff
==============================================================================
--- maven/components/trunk/maven-model/maven.mdo (original)
+++ maven/components/trunk/maven-model/maven.mdo Fri May 27 14:47:12 2005
@@ -680,6 +680,11 @@
<version>4.0.0</version>
<code><![CDATA[
Map pluginMap;
+
+ public void flushPluginMap()
+ {
+ this.pluginMap = null;
+ }
public Map getPluginsAsMap()
{
@@ -2045,6 +2050,22 @@
<version>4.0.0</version>
<code><![CDATA[
private Map goalMap = null;
+ private boolean inheritanceApplied = false;
+
+ public void setInheritanceApplied()
+ {
+ this.inheritanceApplied = true;
+ }
+
+ public boolean isInheritanceApplied()
+ {
+ return inheritanceApplied;
+ }
+
+ public void flushGoalMap()
+ {
+ this.goalMap = null;
+ }
public Map getGoalsAsMap()
{
@@ -2096,6 +2117,23 @@
<type>DOM</type>
</field>
</fields>
+ <codeSegments>
+ <codeSegment>
+ <code><![CDATA[
+ private boolean inheritanceApplied = false;
+
+ public void setInheritanceApplied()
+ {
+ this.inheritanceApplied = true;
+ }
+
+ public boolean isInheritanceApplied()
+ {
+ return inheritanceApplied;
+ }
+ ]]></code>
+ </codeSegment>
+ </codeSegments>
</class>
<class>
<name>DependencyManagement</name>
Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/ModelUtils.java?rev=178825&r1=178824&r2=178825&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 Fri May 27 14:47:12 2005
@@ -2,11 +2,14 @@
import org.apache.maven.model.Goal;
import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginContainer;
import org.codehaus.plexus.util.xml.Xpp3Dom;
+import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.TreeMap;
/*
* Copyright 2001-2005 The Apache Software Foundation.
@@ -26,44 +29,152 @@
public final class ModelUtils
{
-
- public static void mergeSupplementalPluginDefinition( Plugin main, Plugin supplemental )
+
+ public static void mergePluginLists( PluginContainer childContainer, PluginContainer parentContainer,
+ boolean handleAsInheritance )
{
- if ( main.getVersion() == null && supplemental.getVersion() != null )
+ if( childContainer == null || parentContainer == null )
{
- main.setVersion( supplemental.getVersion() );
+ // nothing to do.
+ return;
}
+
+ List parentPlugins = parentContainer.getPlugins();
+
+ if ( parentPlugins != null && !parentPlugins.isEmpty() )
+ {
+ Map assembledPlugins = new TreeMap();
+
+ Map childPlugins = childContainer.getPluginsAsMap();
+
+ for ( Iterator it = parentPlugins.iterator(); it.hasNext(); )
+ {
+ Plugin parentPlugin = (Plugin) it.next();
+
+ String parentInherited = parentPlugin.getInherited();
+
+ if ( !handleAsInheritance || parentInherited == null
+ || Boolean.valueOf( parentInherited ).booleanValue() )
+ {
+
+ Plugin assembledPlugin = parentPlugin;
+
+ Plugin childPlugin = (Plugin) childPlugins.get( parentPlugin.getKey() );
+
+ if ( childPlugin != null )
+ {
+ assembledPlugin = childPlugin;
+
+ ModelUtils.mergePluginDefinitions( childPlugin, parentPlugin, handleAsInheritance );
+ }
- Map supplementalGoals = supplemental.getGoalsAsMap();
+ if ( handleAsInheritance )
+ {
+ assembledPlugin.setInheritanceApplied();
+ }
- List pluginGoals = main.getGoals();
+ assembledPlugins.put( assembledPlugin.getKey(), assembledPlugin );
+ }
+ }
+
+ for ( Iterator it = childPlugins.values().iterator(); it.hasNext(); )
+ {
+ Plugin childPlugin = (Plugin) it.next();
+
+ if ( !assembledPlugins.containsKey( childPlugin.getKey() ) )
+ {
+ assembledPlugins.put( childPlugin.getKey(), childPlugin );
+ }
+ }
+
+ childContainer.setPlugins( new ArrayList( assembledPlugins.values() ) );
+
+ childContainer.flushPluginMap();
+ }
+ }
- if ( pluginGoals != null )
+ public static void mergePluginDefinitions( Plugin child, Plugin parent, boolean handleAsInheritance )
+ {
+ if( child == null || parent == null )
+ {
+ // nothing to do.
+ return;
+ }
+
+ if ( child.getVersion() == null && parent.getVersion() != null )
+ {
+ child.setVersion( parent.getVersion() );
+ }
+
+ List parentGoals = parent.getGoals();
+
+ // if the supplemental goals are non-existent, then nothing related to goals changes.
+ if ( parentGoals != null && !parentGoals.isEmpty() )
{
- for ( Iterator it = pluginGoals.iterator(); it.hasNext(); )
+ Map assembledGoals = new TreeMap();
+
+ Map childGoals = child.getGoalsAsMap();
+
+ if ( childGoals != null )
{
- Goal pluginGoal = (Goal) it.next();
+ for ( Iterator it = parentGoals.iterator(); it.hasNext(); )
+ {
+ Goal parentGoal = (Goal) it.next();
- Goal supplementalGoal = (Goal) supplementalGoals.get( pluginGoal.getId() );
+ String parentInherited = parentGoal.getInherited();
- if ( supplementalGoal != null )
+ if ( !handleAsInheritance || parentInherited == null
+ || Boolean.valueOf( parentInherited ).booleanValue() )
+ {
+ Goal assembledGoal = parentGoal;
+
+ Goal childGoal = (Goal) childGoals.get( parentGoal.getId() );
+
+ if ( childGoal != null )
+ {
+ Xpp3Dom childGoalConfig = (Xpp3Dom) childGoal.getConfiguration();
+ Xpp3Dom parentGoalConfig = (Xpp3Dom) parentGoal.getConfiguration();
+
+ childGoalConfig = Xpp3Dom.mergeXpp3Dom( childGoalConfig, parentGoalConfig );
+
+ childGoal.setConfiguration( childGoalConfig );
+
+ assembledGoal = childGoal;
+ }
+
+ if ( handleAsInheritance )
+ {
+ assembledGoal.setInheritanceApplied();
+ }
+
+ assembledGoals.put( assembledGoal.getId(), assembledGoal );
+ }
+ }
+
+ for ( Iterator it = childGoals.entrySet().iterator(); it.hasNext(); )
{
- Xpp3Dom pluginGoalConfig = (Xpp3Dom) pluginGoal.getConfiguration();
- Xpp3Dom supplementalGoalConfig = (Xpp3Dom) supplementalGoal.getConfiguration();
+ Map.Entry entry = (Map.Entry) it.next();
- pluginGoalConfig = Xpp3Dom.mergeXpp3Dom( pluginGoalConfig, supplementalGoalConfig );
+ String key = (String) entry.getKey();
+ Goal childGoal = (Goal) entry.getValue();
- pluginGoal.setConfiguration( pluginGoalConfig );
+ if ( !assembledGoals.containsKey( key ) )
+ {
+ assembledGoals.put( key, childGoal );
+ }
}
+
+ child.setGoals( new ArrayList( assembledGoals.values() ) );
+ child.flushGoalMap();
}
}
- Xpp3Dom pluginConfiguration = (Xpp3Dom) main.getConfiguration();
- Xpp3Dom supplementalConfiguration = (Xpp3Dom) supplemental.getConfiguration();
+ Xpp3Dom childConfiguration = (Xpp3Dom) child.getConfiguration();
+ Xpp3Dom parentConfiguration = (Xpp3Dom) parent.getConfiguration();
- pluginConfiguration = Xpp3Dom.mergeXpp3Dom( pluginConfiguration, supplementalConfiguration );
+ childConfiguration = Xpp3Dom.mergeXpp3Dom( childConfiguration, parentConfiguration );
- main.setConfiguration( pluginConfiguration );
+ child.setConfiguration( childConfiguration );
}
}
Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java?rev=178825&r1=178824&r2=178825&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssembler.java Fri May 27 14:47:12 2005
@@ -20,15 +20,13 @@
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.DistributionManagement;
-import org.apache.maven.model.Goal;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
-import org.apache.maven.model.PluginManagement;
import org.apache.maven.model.Repository;
import org.apache.maven.model.Scm;
import org.apache.maven.model.Site;
+import org.apache.maven.project.ModelUtils;
import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.xml.Xpp3Dom;
import java.util.Iterator;
import java.util.List;
@@ -202,70 +200,8 @@
}
assembleDependencyManagementInheritance( child, parent );
-
}
-
- private void assemblePluginManagementInheritance( Build childBuild, Build parentBuild )
- {
- PluginManagement parentPluginMgmt = parentBuild.getPluginManagement();
-
- PluginManagement childPluginMgmt = childBuild.getPluginManagement();
-
- if ( parentPluginMgmt != null )
- {
- if ( childPluginMgmt == null )
- {
- childBuild.setPluginManagement( parentPluginMgmt );
- }
- else
- {
- Map mappedChildPlugins = childPluginMgmt.getPluginsAsMap();
-
- for ( Iterator it = parentPluginMgmt.getPlugins().iterator(); it.hasNext(); )
- {
- Plugin plugin = (Plugin) it.next();
-
- if ( !mappedChildPlugins.containsKey( plugin.getKey() ) )
- {
- childPluginMgmt.addPlugin( plugin );
- }
- else
- {
- Plugin childPlugin = (Plugin) mappedChildPlugins.get( plugin.getKey() );
-
- if ( childPlugin.getVersion() == null )
- {
- childPlugin.setVersion( childPlugin.getVersion() );
- }
-
- Map mappedChildGoals = childPlugin.getGoalsAsMap();
-
- for ( Iterator itGoals = plugin.getGoals().iterator(); itGoals.hasNext(); )
- {
- Goal parentGoal = (Goal) itGoals.next();
- Goal childGoal = (Goal) mappedChildGoals.get( parentGoal.getId() );
-
- if ( childGoal == null )
- {
- childPlugin.addGoal( parentGoal );
- }
- else
- {
- Xpp3Dom childDom = (Xpp3Dom) childGoal.getConfiguration();
- Xpp3Dom parentDom = (Xpp3Dom) parentGoal.getConfiguration();
- childGoal.setConfiguration( Xpp3Dom.mergeXpp3Dom( childDom, parentDom ) );
- }
- }
-
- Xpp3Dom childConfig = (Xpp3Dom) childPlugin.getConfiguration();
- Xpp3Dom parentConfig = (Xpp3Dom) plugin.getConfiguration();
- childPlugin.setConfiguration( Xpp3Dom.mergeXpp3Dom( childConfig, parentConfig ) );
- }
- }
- }
- }
- }
-
+
private void assembleDependencyManagementInheritance( Model child, Model parent )
{
DependencyManagement parentDepMgmt = parent.getDependencyManagement();
@@ -369,9 +305,14 @@
childBuild.setTestResources( parentBuild.getTestResources() );
}
- // Plugins are not aggregated, but management is
-
- assemblePluginManagementInheritance( childBuild, parentBuild );
+ // Plugins are aggregated if Plugin.inherit != false
+ ModelUtils.mergePluginLists( childBuild, parentBuild, true );
+
+ // Plugin management :: aggregate
+ if( childBuild != null && parentBuild != null )
+ {
+ ModelUtils.mergePluginLists( childBuild.getPluginManagement(), parentBuild.getPluginManagement(), false );
+ }
}
}
Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/injection/DefaultModelDefaultsInjector.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/injection/DefaultModelDefaultsInjector.java?rev=178825&r1=178824&r2=178825&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/injection/DefaultModelDefaultsInjector.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/project/injection/DefaultModelDefaultsInjector.java Fri May 27 14:47:12 2005
@@ -18,12 +18,9 @@
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DependencyManagement;
-import org.apache.maven.model.Goal;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
-import org.apache.maven.model.PluginManagement;
import org.apache.maven.project.ModelUtils;
-import org.codehaus.plexus.util.xml.Xpp3Dom;
import java.util.Iterator;
import java.util.List;
@@ -42,38 +39,13 @@
injectDependencyDefaults( model.getDependencies(), model.getDependencyManagement() );
if ( model.getBuild() != null )
{
- injectPluginDefaults( model.getBuild().getPluginsAsMap(), model.getBuild().getPluginManagement() );
- }
- }
-
- private void injectPluginDefaults( Map pluginMap, PluginManagement pluginManagement )
- {
- if ( pluginManagement != null )
- {
- // a given project's plugins should be smaller than the
- // group-defined defaults set...
- // in other words, the project's plugins will probably be a subset
- // of
- // those specified in defaults.
-
- List managedPlugins = pluginManagement.getPlugins();
-
- for ( Iterator it = managedPlugins.iterator(); it.hasNext(); )
- {
- Plugin def = (Plugin) it.next();
-
- Plugin plugin = (Plugin) pluginMap.get( def.getKey() );
- if ( plugin != null )
- {
- mergePluginWithDefaults( plugin, def );
- }
- }
+ ModelUtils.mergePluginLists( model.getBuild(), model.getBuild().getPluginManagement(), false );
}
}
public void mergePluginWithDefaults( Plugin plugin, Plugin def )
{
- ModelUtils.mergeSupplementalPluginDefinition( plugin, def );
+ ModelUtils.mergePluginDefinitions( plugin, def, false );
}
private void injectDependencyDefaults( List dependencies, DependencyManagement dependencyManagement )
Modified: maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java?rev=178825&r1=178824&r2=178825&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java (original)
+++ maven/components/trunk/maven-project/src/test/java/org/apache/maven/project/inheritance/DefaultModelInheritanceAssemblerTest.java Fri May 27 14:47:12 2005
@@ -18,8 +18,10 @@
import junit.framework.TestCase;
import org.apache.maven.model.Build;
+import org.apache.maven.model.Goal;
import org.apache.maven.model.Model;
import org.apache.maven.model.Parent;
+import org.apache.maven.model.Plugin;
import org.apache.maven.model.Repository;
import org.apache.maven.model.Resource;
import org.apache.maven.model.Scm;
@@ -28,6 +30,7 @@
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
/**
* @author jdcasey
@@ -265,6 +268,140 @@
// TODO: a lot easier if modello generated equals() :)
assertRepositories( repos, child.getRepositories() );
+ }
+
+ public void testPluginInheritanceWhereParentPluginWithoutInheritFlagAndChildHasNoPlugins()
+ {
+ Model parent = makeBaseModel( "parent" );
+
+ Model child = makeBaseModel( "child" );
+
+ Plugin parentPlugin = new Plugin();
+ parentPlugin.setArtifactId( "maven-testInheritance-plugin" );
+ parentPlugin.setGroupId( "org.apache.maven.plugins" );
+ parentPlugin.setVersion( "1.0" );
+
+ List parentPlugins = Collections.singletonList( parentPlugin );
+
+ Build parentBuild = new Build();
+ parentBuild.setPlugins( parentPlugins );
+
+ parent.setBuild( parentBuild );
+
+ assembler.assembleModelInheritance( child, parent );
+
+ assertPlugins( parentPlugins, child );
+ }
+
+ public void testPluginInheritanceWhereParentPluginWithTrueInheritFlagAndChildHasNoPlugins()
+ {
+ Model parent = makeBaseModel( "parent" );
+
+ Model child = makeBaseModel( "child" );
+
+ Plugin parentPlugin = new Plugin();
+ parentPlugin.setArtifactId( "maven-testInheritance2-plugin" );
+ parentPlugin.setGroupId( "org.apache.maven.plugins" );
+ parentPlugin.setVersion( "1.0" );
+ parentPlugin.setInherited( "true" );
+
+ List parentPlugins = Collections.singletonList( parentPlugin );
+
+ Build parentBuild = new Build();
+ parentBuild.setPlugins( parentPlugins );
+
+ parent.setBuild( parentBuild );
+
+ assembler.assembleModelInheritance( child, parent );
+
+ assertPlugins( parentPlugins, child );
+ }
+
+ public void testPluginInheritanceWhereParentPluginWithFalseInheritFlagAndChildHasNoPlugins()
+ {
+ Model parent = makeBaseModel( "parent" );
+
+ Model child = makeBaseModel( "child" );
+
+ Plugin parentPlugin = new Plugin();
+ parentPlugin.setArtifactId("maven-testInheritance3-plugin");
+ parentPlugin.setGroupId("org.apache.maven.plugins");
+ parentPlugin.setVersion("1.0");
+ parentPlugin.setInherited("false");
+
+ List parentPlugins = Collections.singletonList(parentPlugin);
+
+ Build parentBuild = new Build();
+ parentBuild.setPlugins(parentPlugins);
+
+ parent.setBuild(parentBuild);
+
+ assembler.assembleModelInheritance( child, parent );
+
+ assertPlugins( new ArrayList(), child );
+ }
+
+ private void assertPlugins( List expectedPlugins, Model child )
+ {
+ Build childBuild = child.getBuild();
+
+ if( expectedPlugins != null && !expectedPlugins.isEmpty() )
+ {
+ assertNotNull( childBuild );
+
+ Map childPluginsMap = childBuild.getPluginsAsMap();
+
+ if( childPluginsMap != null )
+ {
+ assertEquals( expectedPlugins.size(), childPluginsMap.size() );
+
+ for ( Iterator it = expectedPlugins.iterator(); it.hasNext(); )
+ {
+ Plugin expectedPlugin = (Plugin) it.next();
+
+ Plugin childPlugin = (Plugin) childPluginsMap.get( expectedPlugin.getKey() );
+
+ assertPluginsEqual( expectedPlugin, childPlugin );
+ }
+ }
+ else
+ {
+ fail( "child plugins collection is null, but expectations map is not." );
+ }
+ }
+ else
+ {
+ assertTrue( childBuild == null || childBuild.getPlugins() == null || childBuild.getPlugins().isEmpty() );
+ }
+ }
+
+ private void assertPluginsEqual( Plugin reference, Plugin test )
+ {
+ assertEquals("Plugin keys don't match", reference.getKey(), test.getKey());
+ assertEquals("Plugin configurations don't match", reference.getConfiguration(), test.getConfiguration());
+
+ List referenceGoals = reference.getGoals();
+ Map testGoalsMap = test.getGoalsAsMap();
+
+ if( referenceGoals != null && !referenceGoals.isEmpty() )
+ {
+ assertTrue( "Missing goals specification", ( testGoalsMap != null && !testGoalsMap.isEmpty() ) );
+
+ for ( Iterator it = referenceGoals.iterator(); it.hasNext(); )
+ {
+ Goal referenceGoal = (Goal) it.next();
+ Goal testGoal = (Goal) testGoalsMap.get( referenceGoal.getId() );
+
+ assertNotNull( "Goal from reference not found in test", testGoal );
+
+ assertEquals( "Goal IDs don't match", referenceGoal.getId(), testGoal.getId() );
+ assertEquals( "Goal configurations don't match", referenceGoal.getConfiguration(), testGoal.getConfiguration() );
+ }
+ }
+ else
+ {
+ assertTrue( "Unexpected goals specification", ( testGoalsMap == null || testGoalsMap.isEmpty() ) );
+ }
}
// ----------------------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org