You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2008/01/31 01:36:31 UTC

svn commit: r616968 - in /maven/components/trunk: maven-core/src/main/aspect/org/apache/maven/errors/ maven-core/src/main/java/org/apache/maven/errors/ maven-core/src/main/java/org/apache/maven/lifecycle/plan/ maven-core/src/test/java/org/apache/maven/...

Author: jdcasey
Date: Wed Jan 30 16:36:26 2008
New Revision: 616968

URL: http://svn.apache.org/viewvc?rev=616968&view=rev
Log:
Fixing the case where there were exceptions in the build, but for whatever reason they didn't trigger a reactor-manager build failure flag...in cases where there isn't really a project against which to log the error, for instance.

Added:
    maven/components/trunk/maven-core/src/test/java/org/apache/maven/errors/
    maven/components/trunk/maven-core/src/test/java/org/apache/maven/errors/DefaultCoreErrorReporterTest.java   (with props)
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/pom.xml   (with props)
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/
    maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/TestPlugin.java   (with props)
Modified:
    maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/errors/DefaultCoreErrorReporter.java
    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-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
    maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java

Modified: maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj?rev=616968&r1=616967&r2=616968&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj (original)
+++ maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/LifecycleErrorReporterAspect.aj Wed Jan 30 16:36:26 2008
@@ -75,6 +75,7 @@
         execution( private * DefaultLifecycleExecutor.getMojoDescriptorForDirectInvocation( String, MavenSession, MavenProject ) )
         && args( task, session, project )
     {
+        System.out.println( "BINGO" );
         getReporter().reportInvalidPluginForDirectInvocation( task, session, project, cause );
     }
 

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/errors/DefaultCoreErrorReporter.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/errors/DefaultCoreErrorReporter.java?rev=616968&r1=616967&r2=616968&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/errors/DefaultCoreErrorReporter.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/errors/DefaultCoreErrorReporter.java Wed Jan 30 16:36:26 2008
@@ -1685,6 +1685,7 @@
         writer.write( NEWLINE );
         writer.write( NEWLINE );
         writer.write( "Error message:" );
+        writer.write( NEWLINE );
         writer.write( err.getMessage() );
 
         addTips( CoreErrorTips.getInvalidPluginForDirectInvocationTips( task, session, project, err ), writer );

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?rev=616968&r1=616967&r2=616968&view=diff
==============================================================================
--- 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 Wed Jan 30 16:36:26 2008
@@ -8,14 +8,17 @@
 import org.apache.maven.lifecycle.model.LifecycleBinding;
 import org.apache.maven.lifecycle.model.LifecycleBindings;
 import org.apache.maven.lifecycle.model.MojoBinding;
+import org.apache.maven.lifecycle.model.Phase;
 import org.apache.maven.lifecycle.statemgmt.StateManagementUtils;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.Stack;
 
 public class BuildPlan
@@ -32,6 +35,10 @@
 
     private final Map directInvocationBindings;
 
+    private Set fullyResolvedBindings = new HashSet();
+
+    private boolean includingReports = false;
+
     public BuildPlan( final LifecycleBindings packaging, final LifecycleBindings projectBindings,
                       final LifecycleBindings defaults, final List tasks )
         throws LifecycleSpecificationException, LifecycleLoaderException
@@ -50,15 +57,66 @@
     }
 
     private BuildPlan( final LifecycleBindings bindings, final Map forkedDirectInvocations, final Map forkedPhases,
-                       final Map directInvocationBindings, final List tasks )
+                       final Map directInvocationBindings, final Set fullyResolvedMojoBindings, final List tasks,
+                       boolean includingReports )
     {
         this.bindings = LifecycleUtils.cloneBindings( bindings );
         this.forkedDirectInvocations = new HashMap( forkedDirectInvocations );
         this.forkedPhases = new HashMap( forkedPhases );
+        fullyResolvedBindings = new HashSet( fullyResolvedMojoBindings );
         this.tasks = tasks;
+        this.includingReports = includingReports;
         this.directInvocationBindings = new HashMap( directInvocationBindings );
     }
 
+    public void markAsIncludingReports()
+    {
+        includingReports = true;
+    }
+
+    public boolean isIncludingReports()
+    {
+        return includingReports;
+    }
+
+    public boolean isFullyResolved( final MojoBinding mojoBinding )
+    {
+        String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+
+        return fullyResolvedBindings.contains( key );
+    }
+
+    public void markFullyResolved()
+    {
+        for ( Iterator bindingIterator = bindings.getBindingList().iterator(); bindingIterator.hasNext(); )
+        {
+            LifecycleBinding binding = (LifecycleBinding) bindingIterator.next();
+
+            for ( Iterator phaseIterator = binding.getPhasesInOrder().iterator(); phaseIterator.hasNext(); )
+            {
+                Phase phase = (Phase) phaseIterator.next();
+
+                for ( Iterator mojoBindingIterator = phase.getBindings().iterator(); mojoBindingIterator.hasNext(); )
+                {
+                    MojoBinding mojoBinding = (MojoBinding) mojoBindingIterator.next();
+
+                    String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+
+                    fullyResolvedBindings.add( key );
+                }
+            }
+        }
+
+        for ( Iterator it = directInvocationBindings.values().iterator(); it.hasNext(); )
+        {
+            MojoBinding mojoBinding = (MojoBinding) it.next();
+
+            String key = MojoBindingUtils.createMojoBindingKey( mojoBinding, false );
+
+            fullyResolvedBindings.add( key );
+        }
+    }
+
     public void addLifecycleOverlay( final LifecycleBindings overlay )
     {
         bindings = LifecycleUtils.mergeBindings( overlay, bindings, null, true, true );
@@ -135,7 +193,7 @@
 
     public BuildPlan copy( final List newTasks )
     {
-        return new BuildPlan( bindings, forkedDirectInvocations, forkedPhases, directInvocationBindings, newTasks );
+        return new BuildPlan( bindings, forkedDirectInvocations, forkedPhases, directInvocationBindings, fullyResolvedBindings, newTasks, includingReports );
     }
 
     public void resetExecutionProgress()

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?rev=616968&r1=616967&r2=616968&view=diff
==============================================================================
--- 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 Wed Jan 30 16:36:26 2008
@@ -102,6 +102,8 @@
         addForkedLifecycleModifiers( plan, project, session, new LinkedList() );
         addReportingLifecycleModifiers( plan, project, session, new LinkedList() );
 
+        plan.markFullyResolved();
+
         // TODO: Inject relative-ordered project/plugin executions as plan modifiers.
 
         return plan;
@@ -152,7 +154,10 @@
         {
             MojoBinding mojoBinding = (MojoBinding) it.next();
 
-            findForkModifiers( mojoBinding, plan, project, session, callStack );
+            if ( !plan.isFullyResolved( mojoBinding ) )
+            {
+                findForkModifiers( mojoBinding, plan, project, session, callStack );
+            }
         }
     }
 
@@ -197,6 +202,11 @@
                                                  LinkedList callStack )
         throws LifecyclePlannerException, LifecycleSpecificationException, LifecycleLoaderException
     {
+        if ( plan.isIncludingReports() )
+        {
+            return;
+        }
+
         List planBindings = plan.renderExecutionPlan( new Stack() );
         plan.resetExecutionProgress();
 
@@ -204,6 +214,11 @@
         {
             MojoBinding mojoBinding = (MojoBinding) it.next();
 
+            if ( plan.isFullyResolved( mojoBinding ) )
+            {
+                continue;
+            }
+
             PluginDescriptor pluginDescriptor = loadPluginDescriptor( mojoBinding,
                                                                       plan,
                                                                       project,
@@ -234,6 +249,11 @@
                     {
                         MojoBinding reportBinding = (MojoBinding) reportBindingIt.next();
 
+                        if ( plan.isFullyResolved( reportBinding ) )
+                        {
+                            continue;
+                        }
+
                         PluginDescriptor pd = loadPluginDescriptor( reportBinding,
                                                                     plan,
                                                                     project,
@@ -251,6 +271,8 @@
                         }
                     }
                 }
+
+                plan.markAsIncludingReports();
 
                 // NOTE: the first sighting of a mojo requiring reports should satisfy this condition.
                 // therefore, we can break out as soon as we find one.

Added: maven/components/trunk/maven-core/src/test/java/org/apache/maven/errors/DefaultCoreErrorReporterTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/errors/DefaultCoreErrorReporterTest.java?rev=616968&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/java/org/apache/maven/errors/DefaultCoreErrorReporterTest.java (added)
+++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/errors/DefaultCoreErrorReporterTest.java Wed Jan 30 16:36:26 2008
@@ -0,0 +1,35 @@
+package org.apache.maven.errors;
+
+import org.apache.maven.InvalidTaskException;
+import org.apache.maven.lifecycle.TaskValidationResult;
+import org.apache.maven.plugin.InvalidPluginException;
+
+import junit.framework.TestCase;
+
+public class DefaultCoreErrorReporterTest
+    extends TestCase
+{
+
+    public void testReportInvalidPluginForDirectInvocation()
+    {
+        CoreErrorReporter reporter = new DefaultCoreErrorReporter();
+
+        InvalidPluginException err = new InvalidPluginException( "Test message" );
+        reporter.reportInvalidPluginForDirectInvocation( "test", null, null, err );
+
+        TaskValidationResult tvr = new TaskValidationResult( "test", "This is a test invalid task.", err );
+        InvalidTaskException exception = tvr.generateInvalidTaskException();
+
+        Throwable realCause = reporter.findReportedException( exception );
+
+        assertSame( err, realCause );
+
+        String message = reporter.getFormattedMessage( realCause );
+
+        System.out.println( message );
+
+        assertNotNull( message );
+        assertTrue( message.length() > 0 );
+    }
+
+}

Propchange: maven/components/trunk/maven-core/src/test/java/org/apache/maven/errors/DefaultCoreErrorReporterTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

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

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java?rev=616968&r1=616967&r2=616968&view=diff
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java Wed Jan 30 16:36:26 2008
@@ -95,7 +95,7 @@
         logReactorSummary( reactorManager, logger );
 
         boolean printSuccess = true;
-        if ( ( reactorManager == null ) || reactorManager.hasBuildFailures() )
+        if ( result.hasExceptions() )
         {
             for ( Iterator i = result.getExceptions().iterator(); i.hasNext(); )
             {

Added: maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/pom.xml?rev=616968&view=auto
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/pom.xml (added)
+++ maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/pom.xml Wed Jan 30 16:36:26 2008
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<project>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.errortest</groupId>
+  <artifactId>missing-direct-invoke-mojo-maven-plugin</artifactId>
+  <packaging>maven-plugin</packaging>
+  <version>1</version>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-plugin-api</artifactId>
+      <version>2.0</version>
+    </dependency>
+  </dependencies>
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>2.3.1</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-deploy-plugin</artifactId>
+          <version>2.3</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-install-plugin</artifactId>
+          <version>2.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-resources-plugin</artifactId>
+          <version>2.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-jar-plugin</artifactId>
+          <version>2.1</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-compiler-plugin</artifactId>
+          <version>2.0.2</version>
+        </plugin>
+        <plugin>
+          <artifactId>maven-plugin-plugin</artifactId>
+          <version>2.3</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+</project>

Propchange: maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/pom.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/TestPlugin.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/TestPlugin.java?rev=616968&view=auto
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/TestPlugin.java (added)
+++ maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/TestPlugin.java Wed Jan 30 16:36:26 2008
@@ -0,0 +1,36 @@
+package org.plugin;
+
+import org.apache.maven.plugin.Mojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugin.logging.Log;
+
+/**
+ * @goal test-unused
+ * @aggregator
+ *
+ * @author jdcasey
+ */
+public class TestPlugin
+    implements Mojo
+{
+
+    private Log log;
+
+    public void execute()
+        throws MojoExecutionException, MojoFailureException
+    {
+        throw new MojoFailureException( this, "This mojo will always fail.", "This mojo is programmed to fail at all times, to express certain error-reporting functions." );
+    }
+
+    public Log getLog()
+    {
+        return log;
+    }
+
+    public void setLog( Log log )
+    {
+        this.log = log;
+    }
+
+}

Propchange: maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/TestPlugin.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-embedder/src/test/error-reporting-projects/missing-direct-invoke-mojo/plugin/src/main/java/org/plugin/TestPlugin.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java?rev=616968&r1=616967&r2=616968&view=diff
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java (original)
+++ maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/error/ErrorReporterPointcutTest.java Wed Jan 30 16:36:26 2008
@@ -203,6 +203,15 @@
     private void reportExceptions( MavenExecutionResult result,
                                    File basedir )
     {
+        reportExceptions( result, basedir, false );
+    }
+
+    private void reportExceptions( MavenExecutionResult result,
+                                   File basedir,
+                                   boolean expectExceptions )
+    {
+        assertTrue( !expectExceptions || result.hasExceptions() );
+
         StringWriter writer = new StringWriter();
         PrintWriter pWriter = new PrintWriter( writer );
 
@@ -217,7 +226,14 @@
             error.printStackTrace( pWriter );
         }
 
-        fail( writer.toString() );
+        if ( expectExceptions )
+        {
+            fail( writer.toString() );
+        }
+        else
+        {
+            System.out.println( writer.toString() );
+        }
     }
 
     public void testReportErrorResolvingExtensionDirectDependencies()
@@ -1451,6 +1467,40 @@
                                                                           } ) );
 
         maven.execute( request );
+
+        reporterCtl.verify();
+    }
+
+    public void testReportInvalidPluginForDirectInvocation()
+        throws IOException
+    {
+        File projectDir = prepareProjectDir( "missing-direct-invoke-mojo" );
+
+        File plugin = new File( projectDir, "plugin" );
+
+        buildTestAccessory( plugin );
+
+        Settings settings = new Settings();
+        settings.addPluginGroup( "org.apache.maven.errortest" );
+
+        reporter.reportInvalidPluginForDirectInvocation( null, null, null, null );
+        reporterCtl.setMatcher( MockControl.ALWAYS_MATCHER );
+        reporterCtl.setVoidCallable();
+
+        reporterCtl.replay();
+
+        MavenExecutionRequest request = new DefaultMavenExecutionRequest().setBaseDirectory( projectDir )
+                                                                          .setSettings( settings )
+                                                                          .setShowErrors( true )
+                                                                          .setErrorReporter( reporter )
+                                                                          .setGoals( Arrays.asList( new String[] {
+                                                                              "missing-direct-invoke-mojo:test"
+                                                                          } ) );
+
+        MavenExecutionResult result = maven.execute( request );
+
+        assertTrue( result.hasExceptions() );
+        reportExceptions( result, projectDir );
 
         reporterCtl.verify();
     }