Author: olamy
Date: Sat Nov 27 14:35:02 2010
New Revision: 1039690

URL: http://svn.apache.org/viewvc?rev=1039690&view=rev
Log:
[MINVOKER-110] It tests must be runnable in parrallel.

Modified:
    maven/plugins/trunk/maven-invoker-plugin/pom.xml
    
maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java

Modified: maven/plugins/trunk/maven-invoker-plugin/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-invoker-plugin/pom.xml?rev=1039690&r1=1039689&r2=1039690&view=diff
==============================================================================
--- maven/plugins/trunk/maven-invoker-plugin/pom.xml (original)
+++ maven/plugins/trunk/maven-invoker-plugin/pom.xml Sat Nov 27 14:35:02 2010
@@ -194,6 +194,14 @@ under the License.
   <build>
     <plugins>
       <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.5</source>
+          <target>1.5</target>
+        </configuration>
+      </plugin>    
+      <plugin>
         <groupId>org.codehaus.modello</groupId>
         <artifactId>modello-maven-plugin</artifactId>
         <executions>

Modified: 
maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java
URL: 
http://svn.apache.org/viewvc/maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java?rev=1039690&r1=1039689&r2=1039690&view=diff
==============================================================================
--- 
maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java
 (original)
+++ 
maven/plugins/trunk/maven-invoker-plugin/src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java
 Sat Nov 27 14:35:02 2010
@@ -70,6 +70,9 @@ import java.util.HashMap;
 import java.util.StringTokenizer;
 import java.util.Collections;
 import java.util.Locale;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 import java.text.DecimalFormat;
 import java.text.DecimalFormatSymbols;
 
@@ -526,6 +529,14 @@ public abstract class AbstractInvokerMoj
     private boolean showVersion;
     
     /**
+     * number of threads for running tests in parallel.
+     * This will be the number of maven forked process in parallel.
+     * @parameter expression="${invoker.parrallelThreads}" default-value="1"
+     * @since 1.6
+     */
+    private int parrallelThreads;
+    
+    /**
      * The scripter runner that is responsible to execute hook scripts.
      */
     private ScriptRunner scriptRunner;
@@ -557,6 +568,12 @@ public abstract class AbstractInvokerMoj
                 + " If this is incorrect, ensure the skipInvocation parameter 
is not set to true." );
             return;
         }
+        
+        // done it here to prevent issues with concurrent access in case of 
parallel run
+        if (!disableReports && !reportsDirectory.exists() )
+        {
+            reportsDirectory.mkdirs();
+        }        
 
         BuildJob[] buildJobs;
         if ( pom != null )
@@ -943,7 +960,7 @@ public abstract class AbstractInvokerMoj
      * @param buildJobs The build jobs to run must not be <code>null</code> 
nor contain <code>null</code> elements.
      * @throws org.apache.maven.plugin.MojoExecutionException If any build 
could not be launched.
      */
-    private void runBuilds( File projectsDir, BuildJob[] buildJobs )
+    private void runBuilds( final File projectsDir, BuildJob[] buildJobs )
         throws MojoExecutionException
     {
         if ( !localRepositoryPath.exists() )
@@ -968,10 +985,50 @@ public abstract class AbstractInvokerMoj
 
         try
         {
-            for ( int i = 0; i < buildJobs.length; i++ )
+            if ( isParrallelRun() )
+            {
+                getLog().info( "use parrallelThreads " + parrallelThreads );
+                final File finalInterpolatedSettingsFile = 
interpolatedSettingsFile;
+                ExecutorService executorService = 
Executors.newFixedThreadPool( parrallelThreads );
+                for ( int i = 0; i < buildJobs.length; i++ )
+                {
+                    final BuildJob project = buildJobs[i];
+                    executorService.execute( new Runnable()
+                    {
+
+                        public void run()
+                        {
+                            try
+                            {
+                                runBuild( projectsDir, project, 
finalInterpolatedSettingsFile );
+                            }
+                            catch ( MojoExecutionException e )
+                            {
+                                throw new RuntimeException( e.getMessage(), e 
);
+                            }
+                        }
+                    } );
+                }
+
+                try
+                {
+                    executorService.shutdown();
+                    // TODO add a configurable time out
+                    executorService.awaitTermination( Long.MAX_VALUE, 
TimeUnit.MILLISECONDS );
+                }
+                catch ( InterruptedException e )
+                {
+                    throw new MojoExecutionException( e.getMessage(), e );
+                }
+                
+            }
+            else
             {
-                BuildJob project = buildJobs[i];
-                runBuild( projectsDir, project, interpolatedSettingsFile );
+                for ( int i = 0; i < buildJobs.length; i++ )
+                {
+                    BuildJob project = buildJobs[i];
+                    runBuild( projectsDir, project, interpolatedSettingsFile );
+                }
             }
         }
         finally
@@ -1155,11 +1212,6 @@ public abstract class AbstractInvokerMoj
             return;
         }
 
-        if ( !reportsDirectory.exists() )
-        {
-            reportsDirectory.mkdirs();
-        }
-
         String safeFileName = buildJob.getProject().replace( '/', '_' 
).replace( '\\', '_' ).replace( ' ', '_' );
         if ( safeFileName.endsWith( "_pom.xml" ) )
         {
@@ -1954,5 +2006,10 @@ public abstract class AbstractInvokerMoj
         }
         return new InvokerProperties( props );
     }
+    
+    protected boolean isParrallelRun()
+    {
+        return parrallelThreads > 1;
+    }
 
 }


Reply via email to