o adding a validation method to the lifecycle executor so that I can tell users what is wrong before actually trying

to execute the lifecycle. Trying to do this validation shows in detail how tangled some of our code is as I need
  to create the dispatcher in order to create the session which is required to make the reactorManager which 
  is required to get the project required to validate the goal name ... yah.


git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@572214 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jason van Zyl 2007-09-03 02:35:05 +00:00
parent 5c5c39e8ec
commit 2425f945fb
5 changed files with 122 additions and 50 deletions

View File

@ -37,7 +37,7 @@ import org.apache.maven.execution.SessionContext;
import org.apache.maven.extension.BuildExtensionScanner; import org.apache.maven.extension.BuildExtensionScanner;
import org.apache.maven.extension.ExtensionScanningException; import org.apache.maven.extension.ExtensionScanningException;
import org.apache.maven.lifecycle.LifecycleExecutor; import org.apache.maven.lifecycle.LifecycleExecutor;
import org.apache.maven.lifecycle.LifecycleUtils; import org.apache.maven.lifecycle.TaskValidationResult;
import org.apache.maven.monitor.event.DefaultEventDispatcher; import org.apache.maven.monitor.event.DefaultEventDispatcher;
import org.apache.maven.monitor.event.EventDispatcher; import org.apache.maven.monitor.event.EventDispatcher;
import org.apache.maven.monitor.event.MavenEvents; import org.apache.maven.monitor.event.MavenEvents;
@ -171,7 +171,16 @@ public class DefaultMaven
{ {
request.setStartTime( new Date() ); request.setStartTime( new Date() );
initializeBuildContext( request ); MavenExecutionResult result = new DefaultMavenExecutionResult();
ReactorManager reactorManager = createReactorManager(
request,
result );
if ( result.hasExceptions() )
{
return result;
}
EventDispatcher dispatcher = new DefaultEventDispatcher( request.getEventMonitors() ); EventDispatcher dispatcher = new DefaultEventDispatcher( request.getEventMonitors() );
@ -181,20 +190,26 @@ public class DefaultMaven
event, event,
request.getBaseDirectory() ); request.getBaseDirectory() );
MavenExecutionResult result = new DefaultMavenExecutionResult(); MavenSession session = createSession(
getLogger().info( "Scanning for projects..." );
ReactorManager reactorManager = createReactorManager(
request, request,
result ); reactorManager,
dispatcher );
// Check and make sure the creation of the reactor manager didn't cause a problem. for ( Iterator i = request.getGoals().iterator(); i.hasNext(); )
if ( result.hasExceptions() )
{ {
String goal = (String) i.next();
TaskValidationResult tvr = lifecycleExecutor.isTaskValid( goal, session, reactorManager.getTopLevelProject() );
if ( !tvr.isTaskValid() )
{
result.addException( new BuildFailureException( tvr.getMessage() ) );
return result; return result;
} }
}
getLogger().info( "Scanning for projects..." );
if ( reactorManager.hasMultipleProjects() ) if ( reactorManager.hasMultipleProjects() )
{ {
@ -208,10 +223,7 @@ public class DefaultMaven
} }
} }
MavenSession session = createSession( initializeBuildContext( request );
request,
reactorManager,
dispatcher );
try try
{ {

View File

@ -533,6 +533,53 @@ public class DefaultLifecycleExecutor
return false; return false;
} }
public TaskValidationResult isTaskValid( String task, MavenSession session, MavenProject rootProject )
{
if ( LifecycleUtils.isValidPhaseName( task ) )
{
return new TaskValidationResult();
}
else
{
MojoDescriptor mojo = null;
// definitely a CLI goal, can use prefix
try
{
mojo = getMojoDescriptorForDirectInvocation(
task,
session,
rootProject );
return new TaskValidationResult();
}
catch ( PluginLoaderException e )
{
// TODO: shouldn't hit this, investigate using the same resolution logic as
// others for plugins in the reactor
return new TaskValidationResult( task, "Cannot find mojo descriptor for: \'" + task
+ "\' - Treating as non-aggregator." );
}
catch ( LifecycleSpecificationException e )
{
String message =
"Invalid task '"
+ task
+ "': you must specify a valid lifecycle phase, or"
+ " a goal in the format plugin:goal or pluginGroupId:pluginArtifactId:pluginVersion:goal";
return new TaskValidationResult( task, message );
}
catch ( LifecycleLoaderException e )
{
String message = "Cannot find plugin to match task '" + task + "'.";
return new TaskValidationResult( task, message );
}
}
}
private List segmentTaskListByAggregationNeeds( final List tasks, private List segmentTaskListByAggregationNeeds( final List tasks,
final MavenSession session, final MavenSession session,
final MavenProject rootProject ) final MavenProject rootProject )
@ -542,8 +589,8 @@ public class DefaultLifecycleExecutor
if ( rootProject != null ) if ( rootProject != null )
{ {
TaskSegment currentSegment = null; TaskSegment currentSegment = null;
for ( Iterator it = tasks.iterator(); it.hasNext(); ) for ( Iterator it = tasks.iterator(); it.hasNext(); )
{ {
String task = (String) it.next(); String task = (String) it.next();
@ -568,7 +615,7 @@ public class DefaultLifecycleExecutor
else else
{ {
MojoDescriptor mojo = null; MojoDescriptor mojo = null;
// definitely a CLI goal, can use prefix
try try
{ {
mojo = getMojoDescriptorForDirectInvocation( mojo = getMojoDescriptorForDirectInvocation(
@ -576,37 +623,10 @@ public class DefaultLifecycleExecutor
session, session,
rootProject ); rootProject );
} }
catch ( PluginLoaderException e ) catch ( Exception e )
{ {
// TODO: shouldn't hit this, investigate using the same resolution logic as // Won't happen as we've validated. So we need to change the code so that
// others for plugins in the reactor // we don't have to do this.
getLogger().info(
"Cannot find mojo descriptor for: \'" + task
+ "\' - Treating as non-aggregator." );
getLogger().debug(
"",
e );
}
catch ( LifecycleSpecificationException e )
{
String message =
"Invalid task '"
+ task
+ "': you must specify a valid lifecycle phase, or"
+ " a goal in the format plugin:goal or pluginGroupId:pluginArtifactId:pluginVersion:goal";
throw new BuildFailureException(
message,
e );
}
catch ( LifecycleLoaderException e )
{
String message = "Cannot find plugin to match task '" + task + "'.";
throw new BuildFailureException(
message,
e );
} }
// if the mojo descriptor was found, determine aggregator status according to: // if the mojo descriptor was found, determine aggregator status according to:

View File

@ -20,6 +20,7 @@ package org.apache.maven.lifecycle;
*/ */
import org.apache.maven.BuildFailureException; import org.apache.maven.BuildFailureException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.execution.MavenSession; import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ReactorManager; import org.apache.maven.execution.ReactorManager;
import org.apache.maven.monitor.event.EventDispatcher; import org.apache.maven.monitor.event.EventDispatcher;
@ -32,6 +33,8 @@ public interface LifecycleExecutor
{ {
String ROLE = LifecycleExecutor.class.getName(); String ROLE = LifecycleExecutor.class.getName();
TaskValidationResult isTaskValid( String task, MavenSession session, MavenProject rootProject );
void execute( MavenSession session, ReactorManager rm, EventDispatcher dispatcher ) void execute( MavenSession session, ReactorManager rm, EventDispatcher dispatcher )
throws LifecycleExecutionException, BuildFailureException; throws LifecycleExecutionException, BuildFailureException;

View File

@ -0,0 +1,35 @@
package org.apache.maven.lifecycle;
/** @author Jason van Zyl */
public class TaskValidationResult
{
private String invalidTask;
private String message;
public TaskValidationResult()
{
}
public TaskValidationResult( String invalidTask, String message )
{
this.invalidTask = invalidTask;
this.message = message;
}
public String getInvalidTask()
{
return invalidTask;
}
public String getMessage()
{
return message;
}
public boolean isTaskValid()
{
return invalidTask == null;
}
}

View File

@ -402,7 +402,9 @@ public class MavenCli
Exception e, Exception e,
boolean show ) boolean show )
{ {
System.err.println();
System.err.println( message ); System.err.println( message );
System.err.println();
if ( show ) if ( show )
{ {