You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ol...@apache.org on 2010/11/27 15:35:03 UTC

svn commit: r1039690 - in /maven/plugins/trunk/maven-invoker-plugin: pom.xml src/main/java/org/apache/maven/plugin/invoker/AbstractInvokerMojo.java

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;
+    }
 
 }