Author: jdcasey
Date: Thu Jun 28 13:53:55 2007
New Revision: 551696

URL: http://svn.apache.org/viewvc?view=rev&rev=551696
Log:
Fixing infinite recursion when a mojo bound to the lifecycle forks a new phase 
that contains implies another phase that contains the bound mojo. This was 
triggered by the assembly:assembly mojo, and should look familiar.

Added:
    
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java
   (with props)
    
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/testutils/
    
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/testutils/TestPluginLoader.java
   (with props)
    
maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/
    
maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/plan/
    
maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.xml
   (with props)
Modified:
    maven/components/trunk/maven-core/pom.xml
    
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java
    
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java
    
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java

Modified: maven/components/trunk/maven-core/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-core/pom.xml?view=diff&rev=551696&r1=551695&r2=551696
==============================================================================
--- maven/components/trunk/maven-core/pom.xml (original)
+++ maven/components/trunk/maven-core/pom.xml Thu Jun 28 13:53:55 2007
@@ -150,4 +150,18 @@
       <scope>test</scope>
     </dependency>      
   </dependencies>
+  
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        
+        <configuration>
+          <excludes>
+            <exclude>**/testutils/**</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
 </project>

Modified: 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java?view=diff&rev=551696&r1=551695&r2=551696
==============================================================================
--- 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java
 (original)
+++ 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/BuildPlan.java
 Thu Jun 28 13:53:55 2007
@@ -11,6 +11,7 @@
 import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -127,6 +128,11 @@
         invoke.addAll( forkedInvocations );
     }
 
+    public BuildPlan copy( String task )
+    {
+        return copy( Collections.singletonList( task ) );
+    }
+
     public BuildPlan copy( final List newTasks )
     {
         return new BuildPlan( bindings, forkedDirectInvocations, forkedPhases, 
directInvocationBindings, newTasks );
@@ -270,6 +276,12 @@
         }
 
         return bindings;
+    }
+
+    public void removeAll( List mojoBindings )
+        throws NoSuchPhaseException
+    {
+        LifecycleUtils.removeMojoBindings( mojoBindings, bindings, false );
     }
 
 }

Modified: 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java?view=diff&rev=551696&r1=551695&r2=551696
==============================================================================
--- 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java
 (original)
+++ 
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/plan/DefaultBuildPlanner.java
 Thu Jun 28 13:53:55 2007
@@ -59,8 +59,8 @@
         initializeDirectInvocations( plan, project );
 
         // Inject forked lifecycles as plan modifiers for each mojo that has 
@execute in it.
-        addForkedLifecycleModifiers( plan, project );
-        addReportingLifecycleModifiers( plan, project );
+        addForkedLifecycleModifiers( plan, project, new LinkedList() );
+        addReportingLifecycleModifiers( plan, project, new LinkedList() );
 
         // TODO: Inject relative-ordered project/plugin executions as plan 
modifiers.
 
@@ -94,8 +94,9 @@
     /**
      * Traverses all MojoBinding instances discovered from the POM and its 
packaging-mappings, and orchestrates the
      * process of injecting any modifiers that are necessary to accommodate 
forked execution.
+     * @param callStack
      */
-    private void addForkedLifecycleModifiers( final BuildPlan plan, final 
MavenProject project )
+    private void addForkedLifecycleModifiers( final BuildPlan plan, final 
MavenProject project, LinkedList callStack )
         throws LifecyclePlannerException, LifecycleSpecificationException, 
LifecycleLoaderException
     {
         List planBindings = plan.renderExecutionPlan( new Stack() );
@@ -105,11 +106,11 @@
         {
             MojoBinding mojoBinding = (MojoBinding) it.next();
 
-            findForkModifiers( mojoBinding, plan, project );
+            findForkModifiers( mojoBinding, plan, project, callStack );
         }
     }
 
-    private void findForkModifiers( final MojoBinding mojoBinding, final 
BuildPlan plan, final MavenProject project )
+    private void findForkModifiers( final MojoBinding mojoBinding, final 
BuildPlan plan, final MavenProject project, LinkedList callStack )
         throws LifecyclePlannerException, LifecycleSpecificationException, 
LifecycleLoaderException
     {
         PluginDescriptor pluginDescriptor = loadPluginDescriptor( mojoBinding, 
plan, project );
@@ -126,15 +127,16 @@
                                                  + pluginDescriptor.getId() + 
"." );
         }
 
-        findForkModifiers( mojoBinding, pluginDescriptor, plan, project, false 
);
+        findForkModifiers( mojoBinding, pluginDescriptor, plan, project, 
false, callStack );
     }
 
     /**
      * Traverses all MojoBinding instances discovered from the POM and its 
packaging-mappings, and orchestrates the
      * process of injecting any modifiers that are necessary to accommodate 
mojos that require access to the project's
      * configured reports.
+     * @param callStack
      */
-    private void addReportingLifecycleModifiers( final BuildPlan plan, final 
MavenProject project )
+    private void addReportingLifecycleModifiers( final BuildPlan plan, final 
MavenProject project, LinkedList callStack )
         throws LifecyclePlannerException, LifecycleSpecificationException, 
LifecycleLoaderException
     {
         List planBindings = plan.renderExecutionPlan( new Stack() );
@@ -174,7 +176,7 @@
 
                         if ( pd != null )
                         {
-                            findForkModifiers( reportBinding, pd, plan, 
project, true );
+                            findForkModifiers( reportBinding, pd, plan, 
project, true, callStack );
                         }
                     }
                 }
@@ -218,9 +220,10 @@
     /**
      * Explores a single MojoBinding, and injects any necessary plan modifiers 
to accommodate any of the three types of
      * forked execution, along with any new mojos/lifecycles that entails.
+     * @param callStack
      */
     private void findForkModifiers( final MojoBinding mojoBinding, final 
PluginDescriptor pluginDescriptor,
-                                    final BuildPlan plan, final MavenProject 
project, final boolean includeReportConfig )
+                                    final BuildPlan plan, final MavenProject 
project, final boolean includeReportConfig, LinkedList callStack )
         throws LifecyclePlannerException, LifecycleSpecificationException, 
LifecycleLoaderException
     {
         String referencingGoal = mojoBinding.getGoal();
@@ -239,7 +242,7 @@
         }
         else if ( mojoDescriptor.getExecutePhase() != null )
         {
-            recursePhaseMojoFork( mojoBinding, pluginDescriptor, plan, 
project, includeReportConfig );
+            recursePhaseMojoFork( mojoBinding, pluginDescriptor, plan, 
project, includeReportConfig, callStack );
         }
     }
 
@@ -254,48 +257,59 @@
      */
     private void recursePhaseMojoFork( final MojoBinding mojoBinding, final 
PluginDescriptor pluginDescriptor,
                                        final BuildPlan plan, final 
MavenProject project,
-                                       final boolean includeReportConfig )
+                                       final boolean includeReportConfig, 
LinkedList callStack )
         throws LifecyclePlannerException, LifecycleSpecificationException, 
LifecycleLoaderException
     {
-        String referencingGoal = mojoBinding.getGoal();
-
-        MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( 
referencingGoal );
+        callStack.addFirst( mojoBinding );
 
-        String phase = mojoDescriptor.getExecutePhase();
-
-        if ( phase == null )
+        try
         {
-            return;
-        }
+            String referencingGoal = mojoBinding.getGoal();
 
-        if ( !LifecycleUtils.isValidPhaseName( phase ) )
-        {
-            throw new LifecyclePlannerException( "Cannot find lifecycle for 
phase: " + phase );
-        }
+            MojoDescriptor mojoDescriptor = pluginDescriptor.getMojo( 
referencingGoal );
 
-        BuildPlan clonedPlan = plan.copy( Collections.singletonList( phase ) );
+            String phase = mojoDescriptor.getExecutePhase();
 
-        String executeLifecycle = mojoDescriptor.getExecuteLifecycle();
-        if ( executeLifecycle != null )
-        {
-            LifecycleBindings overlayBindings;
-            try
+            if ( phase == null )
             {
-                overlayBindings =
-                    lifecycleBindingManager.getPluginLifecycleOverlay( 
pluginDescriptor, executeLifecycle, project, includeReportConfig );
+                return;
             }
-            catch ( LifecycleLoaderException e )
+
+            if ( !LifecycleUtils.isValidPhaseName( phase ) )
             {
-                throw new LifecyclePlannerException( "Failed to load overlay 
lifecycle: " + executeLifecycle
-                                                     + ". Reason: " + 
e.getMessage(), e );
+                throw new LifecyclePlannerException( "Cannot find lifecycle 
for phase: " + phase );
             }
 
-            clonedPlan.addLifecycleOverlay( overlayBindings );
-        }
+            BuildPlan clonedPlan = plan.copy( phase );
+            clonedPlan.removeAll( callStack );
 
-        plan.addForkedExecution( mojoBinding, clonedPlan );
+            String executeLifecycle = mojoDescriptor.getExecuteLifecycle();
+            if ( executeLifecycle != null )
+            {
+                LifecycleBindings overlayBindings;
+                try
+                {
+                    overlayBindings =
+                        lifecycleBindingManager.getPluginLifecycleOverlay( 
pluginDescriptor, executeLifecycle, project, includeReportConfig );
+                }
+                catch ( LifecycleLoaderException e )
+                {
+                    throw new LifecyclePlannerException( "Failed to load 
overlay lifecycle: " + executeLifecycle
+                                                         + ". Reason: " + 
e.getMessage(), e );
+                }
+
+                clonedPlan.addLifecycleOverlay( overlayBindings );
+            }
+
+            plan.addForkedExecution( mojoBinding, clonedPlan );
+
+            addForkedLifecycleModifiers( clonedPlan, project, callStack );
+        }
+        finally
+        {
+            callStack.removeFirst();
+        }
 
-        addForkedLifecycleModifiers( clonedPlan, project );
     }
 
     /**
@@ -303,6 +317,7 @@
      * off to the
      * [EMAIL PROTECTED] 
DefaultBuildPlanner#modifyBuildPlanForForkedDirectInvocation(MojoBinding, 
MojoBinding, PluginDescriptor, ModifiablePlanElement, LifecycleBindings, 
MavenProject, LinkedList, List)}
      * method to actually inject the modification.
+     * @param callStack
      */
     private void recurseSingleMojoFork( final MojoBinding mojoBinding, final 
PluginDescriptor pluginDescriptor,
                                         final BuildPlan plan, final 
MavenProject project, final boolean includeReportConfig )

Modified: 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java?view=diff&rev=551696&r1=551695&r2=551696
==============================================================================
--- 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java
 (original)
+++ 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/BuildPlanTest.java
 Thu Jun 28 13:53:55 2007
@@ -76,11 +76,64 @@
         assertBindings( check, executionPlan );
     }
 
+    public void 
testRender_MojoBoundToPackagePhaseAndForkingPackagePhaseGetsFilteredOut()
+        throws LifecycleSpecificationException, LifecycleLoaderException
+    {
+        MojoBinding mb = new MojoBinding();
+        mb.setGroupId( "test" );
+        mb.setArtifactId( "test-plugin" );
+        mb.setVersion( "1" );
+        mb.setGoal( "validate" );
+
+        BuildBinding binding = new BuildBinding();
+        binding.getValidate().addBinding( mb );
+
+        MojoBinding mb2 = new MojoBinding();
+        mb2.setGroupId( "test" );
+        mb2.setArtifactId( "test-plugin" );
+        mb2.setVersion( "1" );
+        mb2.setGoal( "generate-sources" );
+
+        binding.getGenerateSources().addBinding( mb2 );
+
+        MojoBinding assemblyBinding = new MojoBinding();
+        assemblyBinding.setGroupId( "org.apache.maven.plugins" );
+        assemblyBinding.setArtifactId( "maven-assembly-plugin" );
+        assemblyBinding.setVersion( "2.1" );
+        assemblyBinding.setGoal( "assembly" );
+
+        binding.getCreatePackage().addBinding( assemblyBinding );
+
+        List check = new ArrayList();
+
+        check.add( mb );
+        check.add( mb2 );
+        check.add( 
StateManagementUtils.createStartForkedExecutionMojoBinding() );
+        check.add( mb );
+        check.add( mb2 );
+        check.add( StateManagementUtils.createEndForkedExecutionMojoBinding() 
);
+        check.add( assemblyBinding );
+        check.add( 
StateManagementUtils.createClearForkedExecutionMojoBinding() );
+
+        LifecycleBindings bindings = new LifecycleBindings();
+        bindings.setBuildBinding( binding );
+
+        List tasks = Collections.singletonList( "package" );
+
+        BuildPlan plan = new BuildPlan( bindings, tasks );
+
+        plan.addForkedExecution( assemblyBinding, plan.copy( "package" ) );
+
+        List executionPlan = plan.renderExecutionPlan( new Stack() );
+
+        assertBindings( check, executionPlan );
+    }
+
     private void assertBindings( final List check, final List executionPlan )
     {
         assertNotNull( executionPlan );
 
-        System.out.println( "Expected execution plan:\n" + String.valueOf( 
check ).replace( ',', '\n' ) );
+        System.out.println( "\n\nExpected execution plan:\n" + String.valueOf( 
check ).replace( ',', '\n' ) );
         System.out.println( "\nActual execution plan:\n" + String.valueOf( 
executionPlan ).replace( ',', '\n' ) );
 
         assertEquals( "Execution plan does not contain the expected number of 
mojo bindings.", check.size(),

Added: 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java?view=auto&rev=551696
==============================================================================
--- 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java
 (added)
+++ 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java
 Thu Jun 28 13:53:55 2007
@@ -0,0 +1,109 @@
+package org.apache.maven.lifecycle.plan;
+
+import org.apache.maven.lifecycle.LifecycleLoaderException;
+import org.apache.maven.lifecycle.LifecycleSpecificationException;
+import org.apache.maven.lifecycle.MojoBindingUtils;
+import org.apache.maven.lifecycle.model.MojoBinding;
+import org.apache.maven.lifecycle.plan.testutils.TestPluginLoader;
+import org.apache.maven.model.Build;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginExecution;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.loader.PluginLoader;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.PlexusTestCase;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Stack;
+
+public class DefaultBuildPlannerTest
+    extends PlexusTestCase
+{
+
+    private DefaultBuildPlanner buildPlanner;
+
+    private TestPluginLoader pluginLoader;
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        buildPlanner = (DefaultBuildPlanner) lookup( 
BuildPlanner.class.getName(), "default" );
+        pluginLoader = (TestPluginLoader) lookup( 
PluginLoader.class.getName(), "default" );
+    }
+
+    public void test_constructBuildPlan_ForkedPhaseFromMojoBoundInThatPhase()
+        throws LifecycleLoaderException, LifecycleSpecificationException, 
LifecyclePlannerException
+    {
+        Model model = new Model();
+
+        Build build = new Build();
+        model.setBuild( build );
+
+        Plugin plugin = new Plugin();
+        plugin.setGroupId( "org.apache.maven.plugins" );
+        plugin.setArtifactId( "maven-assembly-plugin" );
+        plugin.setVersion( "1" );
+
+        build.addPlugin( plugin );
+
+        PluginExecution exec = new PluginExecution();
+        exec.setId( "assembly" );
+        exec.setPhase( "package" );
+        exec.addGoal( "assembly" );
+
+        plugin.addExecution( exec );
+
+        PluginDescriptor pd = TestPluginLoader.createPluginDescriptor( 
plugin.getArtifactId(), "assembly",
+                                                                       
plugin.getGroupId(), plugin.getVersion() );
+        MojoDescriptor md = TestPluginLoader.createMojoDescriptor( pd, 
"assembly" );
+        md.setExecutePhase( "package" );
+
+        pluginLoader.addPluginDescriptor( pd );
+
+        MavenProject project = new MavenProject( model );
+
+        BuildPlan plan = buildPlanner.constructBuildPlan( 
Collections.singletonList( "package" ), project );
+
+        List rendered = plan.renderExecutionPlan( new Stack() );
+
+        List checkIds = new ArrayList();
+
+        checkIds.add( 
"org.apache.maven.plugins:maven-resources-plugin:resources" );
+        checkIds.add( "org.apache.maven.plugins:maven-compiler-plugin:compile" 
);
+        checkIds.add( 
"org.apache.maven.plugins:maven-resources-plugin:testResources" );
+        checkIds.add( 
"org.apache.maven.plugins:maven-compiler-plugin:testCompile" );
+        checkIds.add( "org.apache.maven.plugins:maven-surefire-plugin:test" );
+        checkIds.add( "org.apache.maven.plugins:maven-jar-plugin:jar" );
+        checkIds.add( 
"org.apache.maven.plugins.internal:maven-state-management:2.1:start-fork" );
+        checkIds.add( 
"org.apache.maven.plugins:maven-resources-plugin:resources" );
+        checkIds.add( "org.apache.maven.plugins:maven-compiler-plugin:compile" 
);
+        checkIds.add( 
"org.apache.maven.plugins:maven-resources-plugin:testResources" );
+        checkIds.add( 
"org.apache.maven.plugins:maven-compiler-plugin:testCompile" );
+        checkIds.add( "org.apache.maven.plugins:maven-surefire-plugin:test" );
+        checkIds.add( "org.apache.maven.plugins:maven-jar-plugin:jar" );
+        checkIds.add( 
"org.apache.maven.plugins.internal:maven-state-management:2.1:end-fork" );
+        checkIds.add( 
"org.apache.maven.plugins:maven-assembly-plugin:1:assembly" );
+        checkIds.add( 
"org.apache.maven.plugins.internal:maven-state-management:2.1:clear-fork-context"
 );
+
+        assertBindingIds( rendered, checkIds );
+    }
+
+    private void assertBindingIds( List bindings, List checkIds )
+    {
+        assertEquals( checkIds.size(), bindings.size() );
+
+        for ( int i = 0; i < bindings.size(); i++ )
+        {
+            MojoBinding binding = (MojoBinding) bindings.get( i );
+            String checkId = (String) checkIds.get( i );
+
+            assertEquals( checkId, MojoBindingUtils.toString( binding ) );
+        }
+    }
+
+}

Propchange: 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/testutils/TestPluginLoader.java
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/testutils/TestPluginLoader.java?view=auto&rev=551696
==============================================================================
--- 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/testutils/TestPluginLoader.java
 (added)
+++ 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/testutils/TestPluginLoader.java
 Thu Jun 28 13:53:55 2007
@@ -0,0 +1,172 @@
+package org.apache.maven.lifecycle.plan.testutils;
+
+import org.apache.maven.lifecycle.MojoBindingUtils;
+import org.apache.maven.lifecycle.model.MojoBinding;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.ReportPlugin;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.loader.PluginLoader;
+import org.apache.maven.plugin.loader.PluginLoaderException;
+import org.apache.maven.project.MavenProject;
+import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TestPluginLoader
+    implements PluginLoader
+{
+
+    private static final Map DEFAULT_PLUGIN_DESCRIPTORS;
+
+    private static final Map DEFAULT_PLUGIN_PREFIXES;
+
+    static
+    {
+        Map descriptors = new HashMap();
+        Map prefixes = new HashMap();
+
+        {
+            PluginDescriptor pd = createPluginDescriptor( 
"maven-resources-plugin", "resources",
+                                                          
"org.apache.maven.plugins", "1" );
+
+            createMojoDescriptor( pd, "resources" );
+            createMojoDescriptor( pd, "testResources" );
+
+            descriptors.put( pd.getId(), pd );
+            prefixes.put( pd.getGoalPrefix(), pd );
+        }
+
+        {
+            PluginDescriptor pd = createPluginDescriptor( 
"maven-compiler-plugin", "compiler",
+                                                          
"org.apache.maven.plugins", "1" );
+
+            createMojoDescriptor( pd, "compile" );
+            createMojoDescriptor( pd, "testCompile" );
+
+            descriptors.put( pd.getId(), pd );
+            prefixes.put( pd.getGoalPrefix(), pd );
+        }
+
+        {
+            PluginDescriptor pd = createPluginDescriptor( 
"maven-surefire-plugin", "surefire",
+                                                          
"org.apache.maven.plugins", "1" );
+
+            createMojoDescriptor( pd, "test" );
+
+            descriptors.put( pd.getId(), pd );
+            prefixes.put( pd.getGoalPrefix(), pd );
+        }
+
+        {
+            PluginDescriptor pd = createPluginDescriptor( "maven-jar-plugin", 
"jar", "org.apache.maven.plugins", "1" );
+
+            createMojoDescriptor( pd, "jar" );
+
+            descriptors.put( pd.getId(), pd );
+            prefixes.put( pd.getGoalPrefix(), pd );
+        }
+
+        DEFAULT_PLUGIN_DESCRIPTORS = descriptors;
+        DEFAULT_PLUGIN_PREFIXES = prefixes;
+    }
+
+    private Map pluginDescriptors = new HashMap( DEFAULT_PLUGIN_DESCRIPTORS );
+
+    private Map pluginPrefixes = new HashMap( DEFAULT_PLUGIN_PREFIXES );
+
+    private Map components = new HashMap();
+
+    public static MojoDescriptor createMojoDescriptor( PluginDescriptor pd, 
String goal )
+    {
+        MojoDescriptor md = new MojoDescriptor();
+        md.setPluginDescriptor( pd );
+        md.setGoal( goal );
+        pd.addComponentDescriptor( md );
+
+        return md;
+    }
+
+    public static PluginDescriptor createPluginDescriptor( String artifactId, 
String goalPrefix, String groupId,
+                                                           String version )
+    {
+        PluginDescriptor pd = new PluginDescriptor();
+        pd.setGroupId( groupId );
+        pd.setArtifactId( artifactId );
+        pd.setGoalPrefix( goalPrefix );
+        pd.setVersion( version );
+
+        return pd;
+    }
+
+    public PluginDescriptor findPluginForPrefix( String prefix, MavenProject 
project )
+        throws PluginLoaderException
+    {
+//        System.out.println( "Find plugin for prefix: " + prefix + " in 
project: " + project.getId() );
+
+        return (PluginDescriptor) pluginPrefixes.get( prefix );
+    }
+
+    public PluginDescriptor loadPlugin( Plugin plugin, MavenProject project )
+        throws PluginLoaderException
+    {
+//        System.out.println( "Load plugin from model definition: " + 
plugin.getKey() + " in project: " + project.getId() );
+
+        return (PluginDescriptor) pluginDescriptors.get( plugin.getKey() );
+    }
+
+    public PluginDescriptor loadPlugin( MojoBinding mojoBinding, MavenProject 
project )
+        throws PluginLoaderException
+    {
+//        System.out.println( "Load plugin for mojo binding: " + 
MojoBindingUtils.toString( mojoBinding )
+//                            + " in project: " + project.getId() );
+
+        return (PluginDescriptor) pluginDescriptors.get( 
MojoBindingUtils.createPluginKey( mojoBinding ) );
+    }
+
+    public Object loadPluginComponent( String role, String roleHint, Plugin 
plugin, MavenProject project )
+        throws ComponentLookupException, PluginLoaderException
+    {
+//        System.out.println( "Load plugin component: " + role + "/" + 
roleHint + " from plugin: " + plugin.getKey()
+//                            + " in project: " + project.getId() );
+
+        String key = createKey( role, roleHint, plugin.getGroupId(), 
plugin.getArtifactId() );
+        return components.get( key );
+    }
+
+    private String createKey( String role, String roleHint, String groupId, 
String artifactId )
+    {
+        return groupId + ":" + artifactId + ":" + role + ":" + roleHint;
+    }
+
+    public PluginDescriptor loadReportPlugin( ReportPlugin plugin, 
MavenProject project )
+        throws PluginLoaderException
+    {
+        System.out.println( "Load report plugin from model definition: " + 
plugin.getKey() + " in project: "
+                            + project.getId() );
+
+        return (PluginDescriptor) pluginDescriptors.get( plugin.getKey() );
+    }
+
+    public PluginDescriptor loadReportPlugin( MojoBinding mojoBinding, 
MavenProject project )
+        throws PluginLoaderException
+    {
+        System.out.println( "Load report plugin for mojo binding: " + 
MojoBindingUtils.toString( mojoBinding )
+                            + " in project: " + project.getId() );
+
+        return (PluginDescriptor) pluginDescriptors.get( 
MojoBindingUtils.createPluginKey( mojoBinding ) );
+    }
+
+    public void addPluginDescriptor( PluginDescriptor pd )
+    {
+        pluginDescriptors.put( pd.getId(), pd );
+        pluginPrefixes.put( pd.getGoalPrefix(), pd );
+    }
+
+    public void addPluginComponent( String groupId, String artifactId, String 
role, String roleHint, Object component )
+    {
+        components.put( createKey( role, roleHint, groupId, artifactId ), 
component );
+    }
+
+}

Propchange: 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/testutils/TestPluginLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/components/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/plan/testutils/TestPluginLoader.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 
maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.xml
URL: 
http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.xml?view=auto&rev=551696
==============================================================================
--- 
maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.xml
 (added)
+++ 
maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.xml
 Thu Jun 28 13:53:55 2007
@@ -0,0 +1,28 @@
+<!--
+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.
+-->
+
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.plugin.loader.PluginLoader</role>
+      <role-hint>default</role-hint>
+      
<implementation>org.apache.maven.lifecycle.plan.testutils.TestPluginLoader</implementation>
+    </component>
+  </components>
+</component-set>

Propchange: 
maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/components/trunk/maven-core/src/test/resources/org/apache/maven/lifecycle/plan/DefaultBuildPlannerTest.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"


Reply via email to