Author: krosenvold
Date: Tue Apr 27 13:07:17 2010
New Revision: 938443

URL: http://svn.apache.org/viewvc?rev=938443&view=rev
Log:
[MNG-4642] Extended MojoDescriptor with threadSafe attribute

Added support for detecting @threadSafe annotation and a nice noisy, warning 
message.

Modified:
    
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
    
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/MavenExecutionPlan.java
    
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/BuilderCommon.java
    
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java
    
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java
    
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilderTest.java
    
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
    
maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java

Modified: 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=938443&r1=938442&r2=938443&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
 Tue Apr 27 13:07:17 2010
@@ -14,10 +14,7 @@
  */
 package org.apache.maven.lifecycle;
 
-import org.apache.maven.execution.ExecutionEvent;
-import org.apache.maven.execution.MavenExecutionRequest;
-import org.apache.maven.execution.MavenExecutionResult;
-import org.apache.maven.execution.MavenSession;
+import org.apache.maven.execution.*;
 import org.apache.maven.lifecycle.internal.BuildListCalculator;
 import org.apache.maven.lifecycle.internal.ConcurrencyDependencyGraph;
 import org.apache.maven.lifecycle.internal.ExecutionEventCatapult;

Modified: 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/MavenExecutionPlan.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/MavenExecutionPlan.java?rev=938443&r1=938442&r2=938443&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/MavenExecutionPlan.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/MavenExecutionPlan.java
 Tue Apr 27 13:07:17 2010
@@ -20,16 +20,10 @@ package org.apache.maven.lifecycle;
  */
 
 import org.apache.maven.lifecycle.internal.ExecutionPlanItem;
+import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.MojoExecution;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 //TODO: lifecycles being executed
 //TODO: what runs in each phase
@@ -196,6 +190,21 @@ public class MavenExecutionPlan
         return result;
     }
 
+
+    public Set<Plugin> getNonThreadSafePlugins()
+    {
+        Set<Plugin> plugins = new HashSet<Plugin>();
+        for ( ExecutionPlanItem executionPlanItem : planItem )
+        {
+            final MojoExecution mojoExecution = 
executionPlanItem.getMojoExecution();
+            if ( !mojoExecution.getMojoDescriptor().isThreadSafe() )
+            {
+                plugins.add( mojoExecution.getPlugin() );
+            }
+        }
+        return plugins;
+    }
+    
     // Used by m2e but will be removed, really. 
 
     @SuppressWarnings({"UnusedDeclaration"})

Modified: 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/BuilderCommon.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/BuilderCommon.java?rev=938443&r1=938442&r2=938443&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/BuilderCommon.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/BuilderCommon.java
 Tue Apr 27 13:07:17 2010
@@ -24,13 +24,19 @@ import org.apache.maven.lifecycle.Lifecy
 import org.apache.maven.lifecycle.LifecycleNotFoundException;
 import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException;
 import org.apache.maven.lifecycle.MavenExecutionPlan;
-import org.apache.maven.plugin.*;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.InvalidPluginDescriptorException;
+import org.apache.maven.plugin.MojoNotFoundException;
+import org.apache.maven.plugin.PluginDescriptorParsingException;
+import org.apache.maven.plugin.PluginNotFoundException;
+import org.apache.maven.plugin.PluginResolutionException;
 import org.apache.maven.plugin.prefix.NoPluginFoundForPrefixException;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.component.annotations.Component;
 import org.codehaus.plexus.component.annotations.Requirement;
+import org.codehaus.plexus.logging.Logger;
 
 import java.util.Set;
 
@@ -56,18 +62,24 @@ public class BuilderCommon
     @Requirement
     private ExecutionEventCatapult eventCatapult;
 
+    @Requirement
+    private Logger logger;
+    
+
+
     @SuppressWarnings({"UnusedDeclaration"})
     public BuilderCommon()
     {
     }
 
-    public BuilderCommon( LifecycleDebugLogger lifecycleDebugLogger,
-                          LifecycleExecutionPlanCalculator 
lifeCycleExecutionPlanCalculator,
-                          LifecycleDependencyResolver 
lifecycleDependencyResolver )
+    public BuilderCommon(LifecycleDebugLogger lifecycleDebugLogger,
+                         LifecycleExecutionPlanCalculator 
lifeCycleExecutionPlanCalculator,
+                         LifecycleDependencyResolver 
lifecycleDependencyResolver, Logger logger)
     {
         this.lifecycleDebugLogger = lifecycleDebugLogger;
         this.lifeCycleExecutionPlanCalculator = 
lifeCycleExecutionPlanCalculator;
         this.lifecycleDependencyResolver = lifecycleDependencyResolver;
+        this.logger = logger;
     }
 
     public MavenExecutionPlan resolveBuildPlan( MavenSession session, 
MavenProject project, TaskSegment taskSegment,
@@ -81,6 +93,29 @@ public class BuilderCommon
             lifeCycleExecutionPlanCalculator.calculateExecutionPlan( session, 
project, taskSegment.getTasks() );
         lifecycleDebugLogger.debugProjectPlan( project, executionPlan );
 
+        if ( session.getRequest().isThreadConfigurationPresent() )
+        {
+            final Set<Plugin> unsafePlugins = 
executionPlan.getNonThreadSafePlugins();
+            if ( !unsafePlugins.isEmpty() )
+            {
+                logger.warn( 
"*****************************************************************" );
+                logger.warn( "* Your build is requesting parallel execution, 
but project      *" );
+                logger.warn( "* contains the following plugin(s) that are not 
marked as       *" );
+                logger.warn( "* @threadSafe to support parallel building.      
               *" );
+                logger.warn( "* While this /may/ work fine, please look for 
plugin updates    *" );
+                logger.warn( "* and/or request plugins be made thread-safe.    
               *" );
+                logger.warn( "* If reporting an issue, report it against the 
plugin in        *" );
+                logger.warn( "* question, not against maven-core               
               *" );
+                logger.warn( 
"*****************************************************************" );
+                logger.warn( "The following plugins are not marked @threadSafe 
in " + project.getName() + ":" );
+                for ( Plugin unsafePlugin : unsafePlugins )
+                {
+                    logger.warn( unsafePlugin.getId() );
+                }
+                logger.warn( 
"*****************************************************************" );
+            }
+        }
+
         // TODO: once we have calculated the build plan then we should 
accurately be able to download
         // the project dependencies. Having it happen in the plugin manager is 
a tangled mess. We can optimize
         // this later by looking at the build plan. Would be better to just 
batch download everything required

Modified: 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java?rev=938443&r1=938442&r2=938443&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/MavenExecutionPlanTest.java
 Tue Apr 27 13:07:17 2010
@@ -19,9 +19,11 @@ import junit.framework.TestCase;
 import org.apache.maven.lifecycle.internal.ExecutionPlanItem;
 import org.apache.maven.lifecycle.internal.stub.DefaultLifecyclesStub;
 import 
org.apache.maven.lifecycle.internal.stub.LifecycleExecutionPlanCalculatorStub;
+import org.apache.maven.model.Plugin;
 
 import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author Kristian Rosenvold
@@ -34,7 +36,7 @@ public class MavenExecutionPlanTest
     {
         final List<Scheduling> cycles = 
DefaultLifecyclesStub.getSchedulingList();
         final Schedule schedule = cycles.get( 0 ).getSchedules().get( 0 );
-        assertNotNull( schedule);
+        assertNotNull( schedule );
 
     }
 
@@ -59,13 +61,25 @@ public class MavenExecutionPlanTest
         assertNotNull( expected );
     }
 
+    public void testThreadSafeMojos()
+        throws Exception
+    {
+        MavenExecutionPlan plan = 
LifecycleExecutionPlanCalculatorStub.getProjectAExceutionPlan();
+        final Set<Plugin> unSafePlugins = plan.getNonThreadSafePlugins();
+        // There is only a single threadsafe plugin here...
+        assertEquals( plan.size() - 1, unSafePlugins.size() );
+
+    }
+
+
     public void testFindLastWhenFirst()
         throws Exception
     {
         MavenExecutionPlan plan = 
LifecycleExecutionPlanCalculatorStub.getProjectAExceutionPlan();
 
-        ExecutionPlanItem beerPhase = plan.findLastInPhase(  
LifecycleExecutionPlanCalculatorStub.VALIDATE.getPhase());  // Beer comes 
straight after package in stub
-        assertNull ( beerPhase);
+        ExecutionPlanItem beerPhase = plan.findLastInPhase(
+            LifecycleExecutionPlanCalculatorStub.VALIDATE.getPhase() );  // 
Beer comes straight after package in stub
+        assertNull( beerPhase );
     }
 
     public void testFindLastInPhaseMisc()
@@ -73,8 +87,8 @@ public class MavenExecutionPlanTest
     {
         MavenExecutionPlan plan = 
LifecycleExecutionPlanCalculatorStub.getProjectAExceutionPlan();
 
-        assertNull( plan.findLastInPhase( "pacXkage" ));
-         // Beer comes straight after package in stub, much like real life.
-        assertNotNull(  plan.findLastInPhase(  
LifecycleExecutionPlanCalculatorStub.INITIALIZE.getPhase()));
+        assertNull( plan.findLastInPhase( "pacXkage" ) );
+        // Beer comes straight after package in stub, much like real life.
+        assertNotNull( plan.findLastInPhase( 
LifecycleExecutionPlanCalculatorStub.INITIALIZE.getPhase() ) );
     }
 }

Modified: 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java?rev=938443&r1=938442&r2=938443&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/BuilderCommonTest.java
 Tue Apr 27 13:07:17 2010
@@ -70,7 +70,8 @@ public class BuilderCommonTest
         final LifecycleDebugLogger logger = new LifecycleDebugLogger( new 
LoggerStub() );
         final LifecycleDependencyResolver lifecycleDependencyResolver =
             new LifecycleDependencyResolver( new 
ProjectDependenciesResolverStub(), new LoggerStub() );
-        return new BuilderCommon( logger, new 
LifecycleExecutionPlanCalculatorStub(), lifecycleDependencyResolver );
+        return new BuilderCommon( logger, new 
LifecycleExecutionPlanCalculatorStub(), lifecycleDependencyResolver,
+                                  new LoggerStub() );
     }
 
 }

Modified: 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilderTest.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilderTest.java?rev=938443&r1=938442&r2=938443&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilderTest.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/LifecycleWeaveBuilderTest.java
 Tue Apr 27 13:07:17 2010
@@ -20,7 +20,14 @@ import org.apache.maven.execution.MavenE
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.lifecycle.LifecycleNotFoundException;
 import org.apache.maven.lifecycle.LifecyclePhaseNotFoundException;
-import org.apache.maven.lifecycle.internal.stub.*;
+import org.apache.maven.lifecycle.internal.stub.CompletionServiceStub;
+import org.apache.maven.lifecycle.internal.stub.ExecutionEventCatapultStub;
+import 
org.apache.maven.lifecycle.internal.stub.LifecycleExecutionPlanCalculatorStub;
+import 
org.apache.maven.lifecycle.internal.stub.LifecycleTaskSegmentCalculatorStub;
+import org.apache.maven.lifecycle.internal.stub.LoggerStub;
+import org.apache.maven.lifecycle.internal.stub.MojoExecutorStub;
+import 
org.apache.maven.lifecycle.internal.stub.ProjectDependenciesResolverStub;
+import org.apache.maven.lifecycle.internal.stub.ProjectDependencyGraphStub;
 import org.apache.maven.plugin.InvalidPluginDescriptorException;
 import org.apache.maven.plugin.MojoNotFoundException;
 import org.apache.maven.plugin.PluginDescriptorParsingException;
@@ -127,6 +134,7 @@ public class LifecycleWeaveBuilderTest
         final LifecycleDebugLogger logger = new LifecycleDebugLogger( new 
LoggerStub() );
         final LifecycleDependencyResolver lifecycleDependencyResolver =
             new LifecycleDependencyResolver( new 
ProjectDependenciesResolverStub(), new LoggerStub() );
-        return new BuilderCommon( logger, new 
LifecycleExecutionPlanCalculatorStub(), lifecycleDependencyResolver );
+        return new BuilderCommon( logger, new 
LifecycleExecutionPlanCalculatorStub(), lifecycleDependencyResolver,
+                                  new LoggerStub() );
     }
 }

Modified: 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java?rev=938443&r1=938442&r2=938443&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
 (original)
+++ 
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/LifecycleExecutionPlanCalculatorStub.java
 Tue Apr 27 13:07:17 2010
@@ -50,22 +50,26 @@ public class LifecycleExecutionPlanCalcu
     implements LifecycleExecutionPlanCalculator
 {
     // clean
+
     public final static MojoDescriptor PRE_CLEAN = createMojoDescriptor( 
"pre-clean" );
+
     public final static MojoDescriptor CLEAN = createMojoDescriptor( "clean" );
+
     public final static MojoDescriptor POST_CLEAN = createMojoDescriptor( 
"post-clean" );
 
     // default (or at least some of them)
+
     public final static MojoDescriptor VALIDATE = createMojoDescriptor( 
"validate" );
 
     public final static MojoDescriptor INITIALIZE = createMojoDescriptor( 
"initialize" );
-    
+
     public final static MojoDescriptor TEST_COMPILE = createMojoDescriptor( 
"test-compile" );
 
     public final static MojoDescriptor PROCESS_TEST_RESOURCES = 
createMojoDescriptor( "process-test-resources" );
 
     public final static MojoDescriptor PROCESS_RESOURCES = 
createMojoDescriptor( "process-resources" );
 
-    public final static MojoDescriptor COMPILE = createMojoDescriptor( 
"compile" );
+    public final static MojoDescriptor COMPILE = createMojoDescriptor( 
"compile", true );
 
     public final static MojoDescriptor TEST = createMojoDescriptor( "test" );
 
@@ -73,13 +77,15 @@ public class LifecycleExecutionPlanCalcu
 
     public final static MojoDescriptor INSTALL = createMojoDescriptor( 
"install" );
 
-
     // site
+
     public final static MojoDescriptor PRE_SITE = createMojoDescriptor( 
"pre-site" );
+
     public final static MojoDescriptor SITE = createMojoDescriptor( "site" );
+
     public final static MojoDescriptor POST_SITE = createMojoDescriptor( 
"post-site" );
-    public final static MojoDescriptor SITE_DEPLOY = createMojoDescriptor( 
"site-deploy" );
 
+    public final static MojoDescriptor SITE_DEPLOY = createMojoDescriptor( 
"site-deploy" );
 
 
     public int getNumberOfExceutions( ProjectBuildList projectBuildList )
@@ -112,8 +118,8 @@ public class LifecycleExecutionPlanCalcu
         }
         // The remaining are basically "for future expansion"
         List<MojoExecution> me = new ArrayList<MojoExecution>();
-        me.add( createMojoExecution( new Plugin(), "resources", 
"default-resources", PROCESS_RESOURCES ) );
-        me.add( createMojoExecution( new Plugin(), "compile", 
"default-compile", COMPILE ) );
+        me.add( createMojoExecution( "resources", "default-resources", 
PROCESS_RESOURCES ) );
+        me.add( createMojoExecution( "compile", "default-compile", COMPILE ) );
         return createExecutionPlan( project, me );
     }
 
@@ -123,30 +129,29 @@ public class LifecycleExecutionPlanCalcu
         NoPluginFoundForPrefixException, LifecycleNotFoundException, 
PluginVersionResolutionException
     {
         List<MojoExecution> me = new ArrayList<MojoExecution>();
-        me.add( createMojoExecution( new Plugin(), "initialize", 
"default-initialize", INITIALIZE ) ); 
-        me.add( createMojoExecution( new Plugin(), "resources", 
"default-resources", PROCESS_RESOURCES ) );
-        me.add( createMojoExecution( new Plugin(), "compile", 
"default-compile", COMPILE ) );
-        me.add( createMojoExecution( new Plugin(), "testResources", 
"default-testResources", PROCESS_TEST_RESOURCES ) );
-        me.add( createMojoExecution( new Plugin(), "testCompile", 
"default-testCompile", TEST_COMPILE ) );
-        me.add( createMojoExecution( new Plugin(), "test", "default-test", 
TEST ) );
-        me.add( createMojoExecution( new Plugin(), "war", "default-war", 
PACKAGE ) );
-        me.add( createMojoExecution( new Plugin(), "install", 
"default-install", INSTALL ) );
+        me.add( createMojoExecution( "initialize", "default-initialize", 
INITIALIZE ) );
+        me.add( createMojoExecution( "resources", "default-resources", 
PROCESS_RESOURCES ) );
+        me.add( createMojoExecution( "compile", "default-compile", COMPILE ) );
+        me.add( createMojoExecution( "testResources", "default-testResources", 
PROCESS_TEST_RESOURCES ) );
+        me.add( createMojoExecution( "testCompile", "default-testCompile", 
TEST_COMPILE ) );
+        me.add( createMojoExecution( "test", "default-test", TEST ) );
+        me.add( createMojoExecution( "war", "default-war", PACKAGE ) );
+        me.add( createMojoExecution( "install", "default-install", INSTALL ) );
         return createExecutionPlan( 
ProjectDependencyGraphStub.A.getExecutionProject(), me );
     }
 
-
     public static MavenExecutionPlan getProjectBExecutionPlan()
         throws PluginNotFoundException, PluginResolutionException, 
LifecyclePhaseNotFoundException,
         PluginDescriptorParsingException, MojoNotFoundException, 
InvalidPluginDescriptorException,
         NoPluginFoundForPrefixException, LifecycleNotFoundException, 
PluginVersionResolutionException
     {
         List<MojoExecution> me = new ArrayList<MojoExecution>();
-        me.add( createMojoExecution( new Plugin(), "enforce", 
"enforce-versions", VALIDATE ) );
-        me.add( createMojoExecution( new Plugin(), "resources", 
"default-resources", PROCESS_RESOURCES ) );
-        me.add( createMojoExecution( new Plugin(), "compile", 
"default-compile", COMPILE ) );
-        me.add( createMojoExecution( new Plugin(), "testResources", 
"default-testResources", PROCESS_TEST_RESOURCES ) );
-        me.add( createMojoExecution( new Plugin(), "testCompile", 
"default-testCompile", TEST_COMPILE ) );
-        me.add( createMojoExecution( new Plugin(), "test", "default-test", 
TEST ) );
+        me.add( createMojoExecution( "enforce", "enforce-versions", VALIDATE ) 
);
+        me.add( createMojoExecution( "resources", "default-resources", 
PROCESS_RESOURCES ) );
+        me.add( createMojoExecution( "compile", "default-compile", COMPILE ) );
+        me.add( createMojoExecution( "testResources", "default-testResources", 
PROCESS_TEST_RESOURCES ) );
+        me.add( createMojoExecution( "testCompile", "default-testCompile", 
TEST_COMPILE ) );
+        me.add( createMojoExecution( "test", "default-test", TEST ) );
         return createExecutionPlan( 
ProjectDependencyGraphStub.B.getExecutionProject(), me );
     }
 
@@ -162,24 +167,35 @@ public class LifecycleExecutionPlanCalcu
                                        
DefaultLifecyclesStub.createDefaultLifecycles() );
     }
 
-    private static MojoExecution createMojoExecution( Plugin plugin, String 
goal, String executionId,
-                                                      MojoDescriptor 
mojoDescriptor )
+    private static MojoExecution createMojoExecution( String goal, String 
executionId, MojoDescriptor mojoDescriptor )
     {
+        final Plugin plugin = mojoDescriptor.getPluginDescriptor().getPlugin();
         MojoExecution result = new MojoExecution( plugin, goal, executionId );
         result.setConfiguration( new Xpp3Dom( executionId + "-" + goal ) );
         result.setMojoDescriptor( mojoDescriptor );
-        result.setLifecyclePhase(  mojoDescriptor.getPhase() );
+        result.setLifecyclePhase( mojoDescriptor.getPhase() );
+
         return result;
 
     }
 
     public static MojoDescriptor createMojoDescriptor( String phaseName )
     {
+        return createMojoDescriptor( phaseName, false );
+    }
+
+    public static MojoDescriptor createMojoDescriptor( String phaseName, 
boolean threadSafe )
+    {
         final MojoDescriptor mojoDescriptor = new MojoDescriptor();
         mojoDescriptor.setPhase( phaseName );
         final PluginDescriptor descriptor = new PluginDescriptor();
+        Plugin plugin = new Plugin();
+        plugin.setArtifactId( "org.apache.maven.test.MavenExecutionPlan" );
+        plugin.setGroupId( "stub-plugin-" + phaseName );
+        descriptor.setPlugin( plugin );
         descriptor.setArtifactId( "artifact." + phaseName );
         mojoDescriptor.setPluginDescriptor( descriptor );
+        mojoDescriptor.setThreadSafe( threadSafe );
         return mojoDescriptor;
     }
 

Modified: 
maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
URL: 
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java?rev=938443&r1=938442&r2=938443&view=diff
==============================================================================
--- 
maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
 (original)
+++ 
maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/MojoDescriptor.java
 Tue Apr 27 13:07:17 2010
@@ -117,6 +117,9 @@ public class MojoDescriptor
     /**  By default, the Mojo don't need reports to run */
     private boolean requiresReports = false;
 
+    /** By default, mojos are not threadsafe */
+    private boolean threadSafe = false;
+
     /**
      * Default constructor.
      */
@@ -642,6 +645,23 @@ public class MojoDescriptor
         return executeGoal;
     }
 
+
+    /**
+     * @return True if the <code>Mojo</code> is thread-safe and can be run 
safely in parallel
+     */
+    public boolean isThreadSafe()
+    {
+        return threadSafe;
+    }
+
+    /**
+     * @param threadSafe indicates that the mojo is thread-safe and can be run 
safely in parallel
+     */
+    public void setThreadSafe( boolean threadSafe )
+    {
+        this.threadSafe = threadSafe;
+    }
+
     /**
      * @return {...@code true} if this mojo forks either a goal or the 
lifecycle, {...@code false} otherwise.
      */


Reply via email to