[MSHARED-266] always fork, since it is expected by cobertura plugin for example, but don't execute aggregate reports automatically added if not root execution

git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@1595568 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.java b/src/main/java/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.java
index 68bb64a..31f2af5 100644
--- a/src/main/java/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.java
+++ b/src/main/java/org/apache/maven/reporting/exec/DefaultMavenReportExecutor.java
@@ -236,6 +236,13 @@
                 throw new MojoNotFoundException( report.getGoal(), pluginDescriptor );
             }
 
+            MavenProject project = mavenReportExecutorRequest.getProject();
+            if ( !userDefinedReports && mojoDescriptor.isAggregator() && !canAggregate( project ) )
+            {
+                // aggregator mojos automatically added from plugin are only run at execution root
+                continue;
+            }
+
             MojoExecution mojoExecution = new MojoExecution( plugin, report.getGoal(), null );
 
             mojoExecution.setMojoDescriptor( mojoDescriptor );
@@ -267,32 +274,32 @@
                 new MavenReportExecution( report.getGoal(), mojoExecution.getPlugin(), mavenReport,
                                           pluginDescriptor.getClassRealm() );
 
-            if ( canGenerateReport( mavenReport, mojoExecution ) )
+            lifecycleExecutor.calculateForkedExecutions( mojoExecution,
+                                                         mavenReportExecutorRequest.getMavenSession() );
+
+            if ( !mojoExecution.getForkedExecutions().isEmpty() )
             {
-                lifecycleExecutor.calculateForkedExecutions( mojoExecution,
-                                                             mavenReportExecutorRequest.getMavenSession() );
-
-                if ( !mojoExecution.getForkedExecutions().isEmpty() )
+                String msg = report.getGoal() + " report requires ";
+                if ( StringUtils.isNotEmpty( mojoDescriptor.getExecutePhase() ) )
                 {
-                    String msg = report.getGoal() + " report requires ";
-                    if ( StringUtils.isNotEmpty( mojoDescriptor.getExecutePhase() ) )
-                    {
-                        // forked phase
-                        String lifecycleId =
-                            StringUtils.isEmpty( mojoDescriptor.getExecuteLifecycle() ) ? ""
-                                            : ( '[' + mojoDescriptor.getExecuteLifecycle() + ']' );
-                        logger.info( msg + lifecycleId + mojoDescriptor.getExecutePhase() + " forked phase execution" );
-                    }
-                    else
-                    {
-                        // forked goal
-                        logger.info( msg + mojoDescriptor.getExecuteGoal() + " forked goal execution" );
-                    }
-
-                    lifecycleExecutor.executeForkedExecutions( mojoExecution,
-                                                               mavenReportExecutorRequest.getMavenSession() );
+                    // forked phase
+                    String lifecycleId =
+                        StringUtils.isEmpty( mojoDescriptor.getExecuteLifecycle() ) ? ""
+                                        : ( '[' + mojoDescriptor.getExecuteLifecycle() + ']' );
+                    logger.info( msg + lifecycleId + mojoDescriptor.getExecutePhase() + " forked phase execution" );
+                }
+                else
+                {
+                    // forked goal
+                    logger.info( msg + mojoDescriptor.getExecuteGoal() + " forked goal execution" );
                 }
 
+                lifecycleExecutor.executeForkedExecutions( mojoExecution,
+                                                           mavenReportExecutorRequest.getMavenSession() );
+            }
+
+            if ( canGenerateReport( mavenReport, mojoExecution ) )
+            {
                 reports.add( mavenReportExecution );
             }
         }
@@ -300,6 +307,12 @@
         return reports;
     }
 
+    private boolean canAggregate( MavenProject project )
+    {
+        return project.isExecutionRoot() && "pom".equals( project.getPackaging() ) && ( project.getModules() != null )
+            && !project.getModules().isEmpty();
+    }
+
     private boolean canGenerateReport( MavenReport mavenReport, MojoExecution mojoExecution )
     {
         ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();