Adding aspect-bound error reporting for BuildFailureException descendants.

git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@598900 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
John Dennis Casey 2007-11-28 08:11:49 +00:00
parent afe12e42e6
commit 941a11381c
13 changed files with 621 additions and 423 deletions

View File

@ -0,0 +1,23 @@
package org.apache.maven.errors;
public abstract aspect AbstractCoreReporterManagerAspect
{
private CoreErrorReporter reporter;
public void setCoreErrorReporter( CoreErrorReporter reporter )
{
this.reporter = reporter;
}
protected CoreErrorReporter getReporter()
{
if ( reporter == null )
{
reporter = new DefaultCoreErrorReporter();
}
return reporter;
}
}

View File

@ -0,0 +1,99 @@
package org.apache.maven.errors;
import org.apache.maven.project.MavenProject;
import org.apache.maven.lifecycle.TaskValidationResult;
import org.apache.maven.lifecycle.LifecycleLoaderException;
import org.apache.maven.lifecycle.LifecycleSpecificationException;
import org.apache.maven.plugin.loader.PluginLoaderException;
import org.apache.maven.ProjectCycleException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.lifecycle.model.MojoBinding;
import org.apache.maven.lifecycle.LifecycleExecutor;
import org.apache.maven.NoGoalsSpecifiedException;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ReactorManager;
import org.apache.maven.AggregatedBuildFailureException;
import org.apache.maven.ProjectBuildFailureException;
import org.apache.maven.Maven;
public aspect BuildFailureReporterAspect
extends AbstractCoreReporterManagerAspect
{
private pointcut le_execute( MavenSession session, ReactorManager reactorManager ):
execution( void LifecycleExecutor+.execute( MavenSession, ReactorManager, .. ) )
&& args( session, reactorManager, .. );
after( ReactorManager reactorManager, NoGoalsSpecifiedException err ):
cflow( le_execute( MavenSession, reactorManager ) )
&& execution( NoGoalsSpecifiedException.new( .. ) )
&& this( err )
{
getReporter().reportNoGoalsSpecifiedException( reactorManager.getTopLevelProject(), err );
}
private pointcut aggregatedBuildFailureException_ctor( MojoBinding binding, MojoFailureException cause ):
execution( AggregatedBuildFailureException.new( .., MojoBinding, MojoFailureException ) )
&& args( .., binding, cause );
after( MavenSession session, MojoBinding binding, MojoFailureException cause ):
cflow( le_execute( session, ReactorManager ) )
&& aggregatedBuildFailureException_ctor( binding, cause )
{
getReporter().reportAggregatedMojoFailureException( session, binding, cause );
}
private pointcut projectBuildFailureException_ctor( MojoBinding binding, MojoFailureException cause ):
execution( ProjectBuildFailureException.new( .., MojoBinding, MojoFailureException ) )
&& args( .., binding, cause );
after( MavenSession session, MojoBinding binding, MojoFailureException cause ):
cflow( le_execute( session, ReactorManager ) )
&& projectBuildFailureException_ctor( binding, cause )
{
getReporter().reportProjectMojoFailureException( session, binding, cause );
}
private pointcut mvn_createReactorManager():
execution( ReactorManager Maven+.createReactorManager( .. ) );
after( ProjectCycleException err ):
cflow( mvn_createReactorManager() )
&& execution( ProjectCycleException.new( .. ) )
&& this( err )
{
getReporter().reportProjectCycle( err );
}
private pointcut le_isTaskValid( MavenSession session, MavenProject rootProject ):
execution( TaskValidationResult LifecycleExecutor+.isTaskValid( .., MavenSession, MavenProject ) )
&& args( .., session, rootProject );
before( MavenSession session, MavenProject rootProject, PluginLoaderException cause, TaskValidationResult result ):
cflow( le_isTaskValid( session, rootProject ) )
&& execution( TaskValidationResult.new( .., PluginLoaderException ) )
&& args( .., cause )
&& this( result )
{
getReporter().reportPluginErrorWhileValidatingTask( session, rootProject, cause, result );
}
before( MavenSession session, MavenProject rootProject, LifecycleSpecificationException cause, TaskValidationResult result ):
cflow( le_isTaskValid( session, rootProject ) )
&& execution( TaskValidationResult.new( .., LifecycleSpecificationException ) )
&& args( .., cause )
&& this( result )
{
getReporter().reportLifecycleSpecErrorWhileValidatingTask( session, rootProject, cause, result );
}
before( MavenSession session, MavenProject rootProject, LifecycleLoaderException cause, TaskValidationResult result ):
cflow( le_isTaskValid( session, rootProject ) )
&& execution( TaskValidationResult.new( .., LifecycleLoaderException ) )
&& args( .., cause )
&& this( result )
{
getReporter().reportLifecycleLoaderErrorWhileValidatingTask( session, rootProject, cause, result );
}
}

View File

@ -0,0 +1,14 @@
package org.apache.maven.errors;
import org.aspectj.lang.Aspects;
public aspect CoreReporterManagerAspect
{
public void setReporter( CoreErrorReporter reporter )
{
BuildFailureReporterAspect buildFailureReporterAspect = (BuildFailureReporterAspect) Aspects.aspectOf( BuildFailureReporterAspect.class );
buildFailureReporterAspect.setCoreErrorReporter( reporter );
}
}

View File

@ -0,0 +1,41 @@
package org.apache.maven.errors;
import org.apache.maven.NoGoalsSpecifiedException;
import org.apache.maven.ProjectCycleException;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.lifecycle.LifecycleLoaderException;
import org.apache.maven.lifecycle.LifecycleSpecificationException;
import org.apache.maven.lifecycle.TaskValidationResult;
import org.apache.maven.lifecycle.model.MojoBinding;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.loader.PluginLoaderException;
import org.apache.maven.project.MavenProject;
public interface CoreErrorReporter
{
String NEWLINE = "\n";
void clearErrors();
String getFormattedMessage( Throwable error );
Throwable getRealCause( Throwable error );
Throwable findReportedException( Throwable error );
void reportNoGoalsSpecifiedException( MavenProject rootProject, NoGoalsSpecifiedException error );
void reportAggregatedMojoFailureException( MavenSession session, MojoBinding binding, MojoFailureException cause );
void reportProjectMojoFailureException( MavenSession session, MojoBinding binding, MojoFailureException cause );
void reportProjectCycle( ProjectCycleException error );
void reportPluginErrorWhileValidatingTask( MavenSession session, MavenProject rootProject, PluginLoaderException cause, TaskValidationResult result );
void reportLifecycleSpecErrorWhileValidatingTask( MavenSession session, MavenProject rootProject, LifecycleSpecificationException cause, TaskValidationResult result );
void reportLifecycleLoaderErrorWhileValidatingTask( MavenSession session, MavenProject rootProject, LifecycleLoaderException cause, TaskValidationResult result );
}

View File

@ -0,0 +1,52 @@
package org.apache.maven.errors;
import org.apache.maven.ProjectCycleException;
import org.apache.maven.lifecycle.TaskValidationResult;
import org.apache.maven.lifecycle.model.MojoBinding;
import java.util.Arrays;
import java.util.List;
// NOTE: The strange String[] syntax is a backward adaptation from java5 stuff, where
// I was using varargs in listOf(..). I'm not moving them to constants because I'd like
// to go back to this someday...
// TODO: Optimize the String[] instances in here to List constants, and remove listOf(..)
public final class CoreErrorTips
{
private static final List NO_GOALS_TIPS = Arrays.asList( new String[] {
"Maven in 5 Minutes guide (http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html)",
"Maven User's documentation (http://maven.apache.org/users/)",
"Maven Plugins page (http://maven.apache.org/plugins/)",
"CodeHaus Mojos Project page (http://mojo.codehaus.org/plugins.html)"
} );
private CoreErrorTips()
{
}
public static List getNoGoalsTips()
{
return NO_GOALS_TIPS;
}
public static List getMojoFailureTips( MojoBinding binding )
{
// TODO Auto-generated method stub
return null;
}
public static List getProjectCycleTips( ProjectCycleException error )
{
// TODO Auto-generated method stub
return null;
}
public static List getTaskValidationTips( TaskValidationResult result, Exception cause )
{
// TODO Auto-generated method stub
return null;
}
}

View File

@ -0,0 +1,327 @@
package org.apache.maven.errors;
import org.apache.maven.NoGoalsSpecifiedException;
import org.apache.maven.ProjectCycleException;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.lifecycle.LifecycleLoaderException;
import org.apache.maven.lifecycle.LifecycleSpecificationException;
import org.apache.maven.lifecycle.MojoBindingUtils;
import org.apache.maven.lifecycle.TaskValidationResult;
import org.apache.maven.lifecycle.model.MojoBinding;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.loader.PluginLoaderException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.dag.CycleDetectedException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class DefaultCoreErrorReporter
implements CoreErrorReporter
{
private Map formattedMessages = new HashMap();
private Map realCauses = new HashMap();
/**
* @see org.apache.maven.project.error.ProjectErrorReporter#clearErrors()
*/
public void clearErrors()
{
formattedMessages.clear();
realCauses.clear();
}
/**
* @see org.apache.maven.project.error.ProjectErrorReporter#hasInformationFor(java.lang.Throwable)
*/
public Throwable findReportedException( Throwable error )
{
if ( formattedMessages.containsKey( error ) )
{
return error;
}
else if ( error.getCause() != null )
{
return findReportedException( error.getCause() );
}
return null;
}
/**
* @see org.apache.maven.project.error.ProjectErrorReporter#getFormattedMessage(java.lang.Throwable)
*/
public String getFormattedMessage( Throwable error )
{
return (String) formattedMessages.get( error );
}
/**
* @see org.apache.maven.project.error.ProjectErrorReporter#getRealCause(java.lang.Throwable)
*/
public Throwable getRealCause( Throwable error )
{
return (Throwable) realCauses.get( error );
}
private void registerBuildError( Throwable error,
String formattedMessage,
Throwable realCause )
{
formattedMessages.put( error, formattedMessage );
if ( realCause != null )
{
realCauses.put( error, realCause );
}
}
private void registerBuildError( Throwable error,
String formattedMessage )
{
formattedMessages.put( error, formattedMessage );
}
public void reportNoGoalsSpecifiedException( MavenProject rootProject, NoGoalsSpecifiedException error )
{
StringWriter writer = new StringWriter();
writer.write( NEWLINE );
writer.write( "You have not specified any goals or lifecycle phases for Maven to execute." );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Either specify a goal or lifecycle phase on the command line" );
writer.write( NEWLINE );
writer.write( "(you may want to try \'package\' to get started), or configure the " );
writer.write( NEWLINE );
writer.write( "<defaultGoal/> element in the build section of your project POM." );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "NOTE: You can also chain multiple goals/phases together, as in the following example:" );
writer.write( NEWLINE );
writer.write( "mvn clean package" );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( NEWLINE );
addTips( CoreErrorTips.getNoGoalsTips(), writer );
registerBuildError( error, writer.toString() );
}
private void addTips( List tips,
StringWriter writer )
{
if ( ( tips != null ) && !tips.isEmpty() )
{
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Some tips:" );
for ( Iterator it = tips.iterator(); it.hasNext(); )
{
String tip = (String) it.next();
writer.write( NEWLINE );
writer.write( "\t- " );
writer.write( tip );
}
}
}
public void reportAggregatedMojoFailureException( MavenSession session,
MojoBinding binding,
MojoFailureException cause )
{
StringWriter writer = new StringWriter();
writer.write( NEWLINE );
writer.write( "Mojo (aggregator): " );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( " " );
writer.write( MojoBindingUtils.toString( binding ) );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "FAILED while executing in directory:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( " " );
writer.write( session.getExecutionRootDirectory() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Reason:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
handleMojoFailureException( cause, writer );
addTips( CoreErrorTips.getMojoFailureTips( binding ), writer );
registerBuildError( cause, writer.toString(), cause.getCause() );
}
public void reportProjectMojoFailureException( MavenSession session,
MojoBinding binding,
MojoFailureException cause )
{
StringWriter writer = new StringWriter();
writer.write( NEWLINE );
writer.write( "Mojo: " );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( " " );
writer.write( MojoBindingUtils.toString( binding ) );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "FAILED for project: " );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( " " );
writer.write( session.getCurrentProject().getId() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Reason:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
handleMojoFailureException( cause, writer );
addTips( CoreErrorTips.getMojoFailureTips( binding ), writer );
registerBuildError( cause, writer.toString(), cause.getCause() );
}
private void handleMojoFailureException( MojoFailureException error,
StringWriter writer )
{
String message = error.getLongMessage();
if ( message == null )
{
message = error.getMessage();
}
writer.write( message );
writer.write( NEWLINE );
}
public void reportProjectCycle( ProjectCycleException error )
{
StringWriter writer = new StringWriter();
writer.write( NEWLINE );
writer.write( "Maven has detected a cyclic relationship among a set of projects in the current build." );
writer.write( NEWLINE );
writer.write( "The projects involved are:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
List projects = error.getProjects();
Map projectsByVersionlessId = new HashMap();
for ( Iterator it = projects.iterator(); it.hasNext(); )
{
MavenProject project = (MavenProject) it.next();
projectsByVersionlessId.put( ArtifactUtils.versionlessKey( project.getGroupId(), project.getArtifactId() ), project );
}
CycleDetectedException cause = (CycleDetectedException) error.getCause();
List cycle = cause.getCycle();
for ( Iterator it = cycle.iterator(); it.hasNext(); )
{
String id = (String) it.next();
MavenProject project = (MavenProject) projectsByVersionlessId.get( id );
writer.write( "- " );
writer.write( project.getId() );
writer.write( " (path: " );
writer.write( project.getFile().getPath() );
writer.write( ")" );
writer.write( NEWLINE );
}
writer.write( NEWLINE );
writer.write( "NOTE: This cycle usually indicates two projects listing one another as dependencies, but" );
writer.write( NEWLINE );
writer.write( "may also indicate one project using another as a parent, plugin, or extension." );
writer.write( NEWLINE );
writer.write( NEWLINE );
addTips( CoreErrorTips.getProjectCycleTips( error ), writer );
registerBuildError( error, writer.toString(), cause );
}
public void reportLifecycleLoaderErrorWhileValidatingTask( MavenSession session,
MavenProject rootProject,
LifecycleLoaderException cause,
TaskValidationResult result )
{
StringWriter writer = new StringWriter();
writer.write( NEWLINE );
writer.write( "Invalid mojo or lifecycle phase: " );
writer.write( result.getInvalidTask() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Original error message was: " );
writer.write( cause.getMessage() );
addTips( CoreErrorTips.getTaskValidationTips( result, cause ), writer );
registerBuildError( cause, writer.toString(), cause.getCause() );
}
public void reportLifecycleSpecErrorWhileValidatingTask( MavenSession session,
MavenProject rootProject,
LifecycleSpecificationException cause,
TaskValidationResult result )
{
StringWriter writer = new StringWriter();
writer.write( NEWLINE );
writer.write( "Invalid mojo or lifecycle phase: " );
writer.write( result.getInvalidTask() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Original error message was: " );
writer.write( cause.getMessage() );
addTips( CoreErrorTips.getTaskValidationTips( result, cause ), writer );
registerBuildError( cause, writer.toString(), cause.getCause() );
}
public void reportPluginErrorWhileValidatingTask( MavenSession session,
MavenProject rootProject,
PluginLoaderException cause,
TaskValidationResult result )
{
StringWriter writer = new StringWriter();
writer.write( NEWLINE );
writer.write( "Invalid mojo or lifecycle phase: " );
writer.write( result.getInvalidTask() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Failed to load plugin: " );
writer.write( cause.getPluginKey() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Original error message was: " );
writer.write( cause.getMessage() );
addTips( CoreErrorTips.getTaskValidationTips( result, cause ), writer );
registerBuildError( cause, writer.toString(), cause.getCause() );
}
}

View File

@ -5,8 +5,12 @@ import org.aspectj.lang.Aspects;
import java.io.StringWriter;
import java.io.PrintWriter;
import org.apache.maven.BuildFailureException;
import org.apache.maven.cli.CLIReportingUtils;
import org.apache.maven.embedder.MavenEmbedder;
import org.apache.maven.errors.CoreErrorReporter;
import org.apache.maven.errors.CoreReporterManagerAspect;
import org.apache.maven.errors.DefaultCoreErrorReporter;
import org.apache.maven.execution.MavenExecutionResult;
import org.apache.maven.project.aspect.ProjectReporterManagerAspect;
import org.apache.maven.project.error.DefaultProjectErrorReporter;
@ -18,9 +22,12 @@ public privileged aspect ErrorReportingAspect
private ProjectErrorReporter projectErrorReporter;
private CoreErrorReporter coreErrorReporter;
private pointcut embedderCalls():
execution( public MavenExecutionResult MavenEmbedder.*( .. ) );
// TODO: Use MavenExecutionRequest to allow configuration of the reporters to be used.
before():
embedderCalls() && !cflow( embedderCalls() )
{
@ -28,32 +35,23 @@ public privileged aspect ErrorReportingAspect
ProjectReporterManagerAspect prma = (ProjectReporterManagerAspect) Aspects.aspectOf( ProjectReporterManagerAspect.class );
prma.setReporter( projectErrorReporter );
}
private pointcut cliReportingUtilsCalls():
execution( * CLIReportingUtils.*( .. ) );
coreErrorReporter = new DefaultCoreErrorReporter();
before():
cliReportingUtilsCalls()
&& !cflow( cliReportingUtilsCalls() )
&& !cflow( embedderCalls() )
{
projectErrorReporter = new DefaultProjectErrorReporter();
ProjectReporterManagerAspect prma = (ProjectReporterManagerAspect) Aspects.aspectOf( ProjectReporterManagerAspect.class );
prma.setReporter( projectErrorReporter );
CoreReporterManagerAspect crma = (CoreReporterManagerAspect) Aspects.aspectOf( CoreReporterManagerAspect.class );
crma.setReporter( coreErrorReporter );
}
boolean around( ProjectBuildingException e, boolean showStackTraces, StringWriter writer ):
execution( private static boolean CLIReportingUtils.handleProjectBuildingException( ProjectBuildingException, boolean, StringWriter ) )
&& args( e, showStackTraces, writer )
{
// if ( projectErrorReporter == null )
// {
// return proceed( e, showStackTraces, writer );
// }
// else
// {
if ( projectErrorReporter == null )
{
return proceed( e, showStackTraces, writer );
}
else
{
Throwable reportingError = projectErrorReporter.findReportedException( e );
boolean result = false;
@ -81,7 +79,47 @@ public privileged aspect ErrorReportingAspect
}
return result;
// }
}
}
boolean around( BuildFailureException e, boolean showStackTraces, StringWriter writer ):
execution( private static boolean CLIReportingUtils.handleBuildFailureException( BuildFailureException, boolean, StringWriter ) )
&& args( e, showStackTraces, writer )
{
if ( coreErrorReporter == null )
{
return proceed( e, showStackTraces, writer );
}
else
{
Throwable reportingError = coreErrorReporter.findReportedException( e );
boolean result = false;
if ( reportingError != null )
{
writer.write( coreErrorReporter.getFormattedMessage( reportingError ) );
if ( showStackTraces )
{
writer.write( CLIReportingUtils.NEWLINE );
writer.write( CLIReportingUtils.NEWLINE );
Throwable cause = coreErrorReporter.getRealCause( reportingError );
cause.printStackTrace( new PrintWriter( writer ) );
}
writer.write( CLIReportingUtils.NEWLINE );
writer.write( CLIReportingUtils.NEWLINE );
result = true;
}
else
{
result = proceed( e, showStackTraces, writer );
}
return result;
}
}
}

View File

@ -1,11 +1,6 @@
package org.apache.maven.cli;
import org.apache.maven.AggregatedBuildFailureException;
import org.apache.maven.BuildFailureException;
import org.apache.maven.InvalidTaskException;
import org.apache.maven.NoGoalsSpecifiedException;
import org.apache.maven.ProjectBuildFailureException;
import org.apache.maven.ProjectCycleException;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.embedder.MavenEmbedderConsoleLogger;
@ -16,11 +11,8 @@ import org.apache.maven.execution.MavenExecutionResult;
import org.apache.maven.execution.ReactorManager;
import org.apache.maven.extension.ExtensionScanningException;
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.lifecycle.MojoBindingUtils;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.loader.PluginLoaderException;
import org.apache.maven.plugin.version.PluginVersionNotFoundException;
import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.project.DuplicateProjectException;
@ -37,7 +29,6 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.TimeZone;
@ -566,192 +557,11 @@ public final class CLIReportingUtils
return result;
}
// NOTE: This method is an aspect target.
private static boolean handleProjectBuildingException( ProjectBuildingException e,
boolean showStackTraces,
StringWriter writer )
{
// =====================================================================
// Cases covered:
// =====================================================================
//
// ProjectBuildingException(String, String, File, XmlPullParserException)
//
// ProjectBuildingException(String, String, IOException)
// ProjectBuildingException(String, String, File, IOException)
//
// ProjectBuildingException(String, String, ArtifactNotFoundException)
// ProjectBuildingException(String, String, File, ArtifactNotFoundException)
//
// ProjectBuildingException(String, String, ArtifactResolutionException)
// ProjectBuildingException(String, String, File, ArtifactResolutionException)
//
// ProjectBuildingException(String, String, File, ProfileActivationException)
//
// ProjectBuildingException(String, String, InvalidRepositoryException)
// ProjectBuildingException(String, String, File, InvalidRepositoryException)
//
// =====================================================================
// Subclass cases:
// =====================================================================
//
// InvalidProjectModelException(all)
// InvalidProjectVersionException(all)
// InvalidDependencyVersionException(all)
// Start by looking at whether we can handle the PBE as a specific sub-class of ProjectBuildingException...
// if ( e instanceof InvalidProjectModelException )
// {
// InvalidProjectModelException error = (InvalidProjectModelException) e;
//
// writer.write( error.getMessage() );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( "The following POM validation errors were detected:" );
// writer.write( NEWLINE );
//
// for ( Iterator it = error.getValidationResult().getMessages().iterator(); it.hasNext(); )
// {
// String message = (String) it.next();
// writer.write( NEWLINE );
// writer.write( " - " );
// writer.write( message );
// }
//
// writer.write( NEWLINE );
// writer.write( NEWLINE );
//
// result = true;
// }
// else if ( e instanceof InvalidDependencyVersionException )
// {
// writer.write( NEWLINE );
// writer.write( "Your project declares a dependency with an invalid version." );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
//
// Dependency dep = ((InvalidDependencyVersionException)e).getDependency();
// writer.write( "Dependency:" );
// writer.write( NEWLINE );
// writer.write( "Group-Id: " );
// writer.write( dep.getGroupId() );
// writer.write( NEWLINE );
// writer.write( "Artifact-Id: " );
// writer.write( dep.getArtifactId() );
// writer.write( NEWLINE );
// writer.write( "Version: " );
// writer.write( dep.getVersion() );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
//
// writer.write( "Reason: " );
// writer.write( cause.getMessage() );
// writer.write( NEWLINE );
//
// result = true;
// }
// InvalidDependencyVersionException extends from InvalidProjectVersionException, so it comes first.
// else if ( e instanceof InvalidProjectVersionException )
// {
// writer.write( NEWLINE );
// writer.write( "You have an invalid version in your POM:" );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( "Location: " );
// writer.write( ((InvalidProjectVersionException)e).getLocationInPom() );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( "Reason: " );
// writer.write( cause.getMessage() );
// writer.write( NEWLINE );
//
// result = true;
// }
// now that we've sorted through all the sub-classes of ProjectBuildingException,
// let's look at causes of a basic PBE instance.
// else if ( ( cause instanceof ArtifactNotFoundException )
// || ( cause instanceof ArtifactResolutionException ) )
// {
// writer.write( NEWLINE );
// writer.write( e.getMessage() );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( "Reason: " );
// writer.write( cause.getMessage() );
// writer.write( NEWLINE );
//
// result = true;
// }
// handled by aspect binding to ProjectErrorReporter now.
// else if ( cause instanceof ProfileActivationException )
// {
// writer.write( NEWLINE );
// writer.write( "Profile activation failed. One or more named profile activators may be missing." );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( "Reason: " );
// writer.write( cause.getMessage() );
// writer.write( NEWLINE );
//
// result = true;
// }
// else if ( cause instanceof IOException )
// {
// writer.write( NEWLINE );
// if ( e.getPomFile() == null )
// {
// writer.write( "Error reading built-in super POM!" );
// }
// else
// {
// writer.write( "Error reading POM." );
// }
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( cause.getMessage() );
// writer.write( NEWLINE );
// }
// else if ( cause instanceof XmlPullParserException )
// {
// writer.write( NEWLINE );
// if ( e.getPomFile() == null )
// {
// writer.write( "Error parsing built-in super POM!" );
// }
// else
// {
// writer.write( "Error parsing POM." );
// }
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( cause.getMessage() );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( "Line: " );
// writer.write( "" + ( (XmlPullParserException) cause ).getLineNumber() );
// writer.write( NEWLINE );
// writer.write( "Column: " );
// writer.write( "" + ( (XmlPullParserException) cause ).getColumnNumber() );
// writer.write( NEWLINE );
//
// result = true;
// }
// else if ( cause instanceof InvalidRepositoryException )
// {
// writer.write( NEWLINE );
// writer.write( "You have an invalid repository/pluginRepository declaration in your POM:" );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( "Repository-Id: " );
// writer.write( ((InvalidRepositoryException)cause).getRepositoryId() );
// writer.write( NEWLINE );
// writer.write( NEWLINE );
// writer.write( "Reason: " );
// writer.write( cause.getMessage() );
// writer.write( NEWLINE );
//
// result = true;
// }
handleGenericException( e, showStackTraces, writer );
writer.write( NEWLINE );
@ -772,216 +582,12 @@ public final class CLIReportingUtils
return true;
}
// NOTE: This method is an aspect target.
private static boolean handleBuildFailureException( BuildFailureException e,
boolean showStackTraces,
StringWriter writer )
{
// =====================================================================
// Cases covered (listed exceptions extend BuildFailureException):
// =====================================================================
//
// AggregatedBuildFailureException(String, MojoBinding, MojoFailureException)
//
// InvalidTaskException(TaskValidationResult, LifecycleLoaderException)
// InvalidTaskException(TaskValidationResult, LifecycleSpecificationException)
// InvalidTaskException(TaskValidationResult, PluginLoaderException)
//
// NoGoalsSpecifiedException(String)
//
// ProjectBuildFailureException(String, MojoBinding, MojoFailureException)
//
// ProjectCycleException(List, String, CycleDetectedException)
if ( e instanceof NoGoalsSpecifiedException )
{
writer.write( NEWLINE );
writer.write( "You have not specified any goals or lifecycle phases for Maven to execute." );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Please, either specify a goal or lifecycle phase on the command line" );
writer.write( NEWLINE );
writer.write( "(you may want to try \'package\' to get started), or configure the " );
writer.write( NEWLINE );
writer.write( "<defaultGoal/> element in the build section of your project POM." );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "NOTE: You can also chain multiple goals/phases together, as in the following example:" );
writer.write( NEWLINE );
writer.write( "mvn clean package" );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "For more information about which goals and phases are available, see the following:" );
writer.write( NEWLINE );
writer.write( "- Maven in 5 Minutes guide (http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html)" );
writer.write( NEWLINE );
writer.write( "- Maven User's documentation (http://maven.apache.org/users/)" );
writer.write( NEWLINE );
writer.write( "- Maven Plugins page (http://maven.apache.org/plugins/)" );
writer.write( NEWLINE );
writer.write( "- CodeHaus Mojos Project page (http://mojo.codehaus.org/plugins.html)" );
writer.write( NEWLINE );
writer.write( NEWLINE );
return true;
}
else if ( e instanceof AggregatedBuildFailureException )
{
writer.write( NEWLINE );
writer.write( "Mojo (aggregator): " );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( " " );
writer.write( MojoBindingUtils.toString( ( (AggregatedBuildFailureException) e ).getBinding() ) );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "FAILED while executing in directory:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( " " );
writer.write( ( (AggregatedBuildFailureException) e ).getExecutionRootDirectory() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Reason:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
handleMojoFailureException( ( (AggregatedBuildFailureException) e ).getMojoFailureException(),
writer );
return true;
}
else if ( e instanceof ProjectBuildFailureException )
{
writer.write( NEWLINE );
writer.write( "Mojo: " );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( " " );
writer.write( MojoBindingUtils.toString( ( (ProjectBuildFailureException) e ).getBinding() ) );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "FAILED for project: " );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( " " );
writer.write( ( (ProjectBuildFailureException) e ).getProjectId() );
writer.write( NEWLINE );
writer.write( NEWLINE );
writer.write( "Reason:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
handleMojoFailureException( ( (ProjectBuildFailureException) e ).getMojoFailureException(),
writer );
return true;
}
else if ( e instanceof InvalidTaskException )
{
String task = ( (InvalidTaskException) e ).getTask();
Throwable cause = e.getCause();
writer.write( NEWLINE );
writer.write( "Invalid mojo or lifecycle phase: " );
writer.write( task );
writer.write( NEWLINE );
writer.write( NEWLINE );
if ( cause instanceof PluginLoaderException )
{
writer.write( "Failed to load plugin: " );
writer.write( ( (PluginLoaderException) cause ).getPluginKey() );
writer.write( NEWLINE );
writer.write( NEWLINE );
}
else
{
writer.write( "Error message was: " );
writer.write( e.getMessage() );
writer.write( NEWLINE );
writer.write( NEWLINE );
}
if ( showStackTraces )
{
writer.write( "Original error:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
handleGenericException( cause, showStackTraces, writer );
}
else
{
writer.write( "Original error message was: " );
writer.write( cause.getMessage() );
writer.write( NEWLINE );
writer.write( NEWLINE );
}
return true;
}
else if ( e instanceof ProjectCycleException )
{
writer.write( NEWLINE );
writer.write( "Maven has detected a cyclic relationship among a set of projects in the current build." );
writer.write( NEWLINE );
writer.write( "The projects involved are:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
List projects = ( (ProjectCycleException) e ).getProjects();
for ( Iterator it = projects.iterator(); it.hasNext(); )
{
MavenProject project = (MavenProject) it.next();
writer.write( "- " );
writer.write( project.getId() );
writer.write( " (path: " );
writer.write( project.getFile().getPath() );
writer.write( ")" );
writer.write( NEWLINE );
}
writer.write( NEWLINE );
writer.write( "NOTE: This cycle usually indicates two projects listing one another as dependencies, but" );
writer.write( NEWLINE );
writer.write( "may also indicate one project using another as a parent, plugin, or extension." );
writer.write( NEWLINE );
writer.write( NEWLINE );
if ( showStackTraces )
{
writer.write( "Original error:" );
writer.write( NEWLINE );
writer.write( NEWLINE );
handleGenericException( ( (ProjectCycleException) e ).getCause(),
showStackTraces,
writer );
writer.write( NEWLINE );
writer.write( NEWLINE );
}
return true;
}
return false;
}
private static boolean handleMojoFailureException( MojoFailureException error,
StringWriter writer )
{
String message = error.getLongMessage();
if ( message == null )
{
message = error.getMessage();
}
writer.write( message );
writer.write( NEWLINE );
handleGenericException( e, showStackTraces, writer );
return true;
}

View File

@ -3,7 +3,7 @@ package org.apache.maven.project.aspect;
import org.apache.maven.project.error.DefaultProjectErrorReporter;
import org.apache.maven.project.error.ProjectErrorReporter;
public abstract aspect ProjectErrorReporterAspect
public abstract aspect AbstractProjectErrorReporterAspect
{
private ProjectErrorReporter reporter;

View File

@ -20,7 +20,7 @@ import java.io.File;
import java.util.Set;
public privileged aspect PBEDerivativeReporterAspect
extends ProjectErrorReporterAspect
extends AbstractProjectErrorReporterAspect
{
// UnknownRepositoryLayoutException

View File

@ -1,8 +1,6 @@
package org.apache.maven.project.aspect;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.error.DefaultProjectErrorReporter;
import org.apache.maven.project.error.ProjectErrorReporter;
import org.apache.maven.profiles.activation.ProfileActivator;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.model.Model;
@ -31,7 +29,7 @@ import java.io.IOException;
* coming from {@link DefaultProfileAdvisor}.
*/
public privileged aspect ProfileErrorReporterAspect
extends ProjectErrorReporterAspect
extends AbstractProjectErrorReporterAspect
{
protected pointcut componentLookupException( ComponentLookupException cause ):

View File

@ -10,7 +10,7 @@ import java.io.File;
import java.util.List;
public privileged aspect ProjectArtifactErrorReporterAspect
extends ProjectErrorReporterAspect
extends AbstractProjectErrorReporterAspect
{
private pointcut mlbldr_resolveParentFromRepositories( Parent parentRef, ArtifactRepository localRepo,

View File

@ -9,7 +9,7 @@ import java.io.File;
import java.io.IOException;
public privileged aspect ProjectIOErrorReporterAspect
extends ProjectErrorReporterAspect
extends AbstractProjectErrorReporterAspect
{
private pointcut pbldr_readProject( String projectId, File pomFile ):