You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2009/05/20 01:07:09 UTC
svn commit: r776494 - in /maven/components/branches/MNG-2766/maven-core/src:
main/java/org/apache/maven/exception/ main/java/org/apache/maven/lifecycle/
test/java/org/apache/maven/lifecycle/ test/java/org/apache/maven/project/
test/projects/lifecycle-e...
Author: jvanzyl
Date: Tue May 19 23:07:08 2009
New Revision: 776494
URL: http://svn.apache.org/viewvc?rev=776494&view=rev
Log:
o moving version resolution when not specified to the lifecycle executor, what goes into the plugin manager will be completely
and entirely resolved.
Added:
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/NoPluginFoundForPrefixException.java (with props)
Modified:
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleExecutor.java
maven/components/branches/MNG-2766/maven-core/src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml
Modified: maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java
URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java?rev=776494&r1=776493&r2=776494&view=diff
==============================================================================
--- maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java (original)
+++ maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/exception/DefaultExceptionHandler.java Tue May 19 23:07:08 2009
@@ -2,6 +2,7 @@
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.lifecycle.NoPluginFoundForPrefixException;
import org.apache.maven.plugin.CycleDetectedInPluginGraphException;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
@@ -81,7 +82,11 @@
{
message = exception.getMessage();
}
-
+ else if ( exception instanceof NoPluginFoundForPrefixException )
+ {
+ message = exception.getMessage();
+ }
+
// Project dependency downloading problems.
else if ( exception instanceof ArtifactNotFoundException )
{
Modified: maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=776494&r1=776493&r2=776494&view=diff
==============================================================================
--- maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original)
+++ maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Tue May 19 23:07:08 2009
@@ -16,6 +16,9 @@
*/
import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.Reader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -28,6 +31,9 @@
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.RepositoryMetadataReadException;
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
@@ -52,6 +58,8 @@
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.RepositorySystem;
+import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.apache.maven.wagon.TransferFailedException;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
@@ -59,8 +67,11 @@
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.StringUtils;
import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
//TODO: The configuration for the lifecycle needs to be externalized so that I can use the annotations
// properly for the wiring and reference and external source for the lifecycle configuration.
@@ -141,7 +152,7 @@
try
{
- lifecyclePlan = calculateLifecyclePlan( goal, session );
+ lifecyclePlan = calculateBuildPlan( goal, session );
}
catch ( Exception e )
{
@@ -221,178 +232,219 @@
// 3. Find the mojos associated with the lifecycle given the project packaging (jar lifecycle mapping for the default lifecycle)
// 4. Bind those mojos found in the lifecycle mapping for the packaging to the lifecycle
// 5. Bind mojos specified in the project itself to the lifecycle
- public List<MojoExecution> calculateLifecyclePlan( String lifecyclePhase, MavenSession session )
- throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException
+ public List<MojoExecution> calculateBuildPlan( String task, MavenSession session )
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException
{
- // Extract the project from the session
MavenProject project = session.getCurrentProject();
- // 1.
- //
- // Based on the lifecycle phase we are given, let's find the corresponding lifecycle.
- //
- Lifecycle lifecycle = phaseToLifecycleMap.get( lifecyclePhase );
-
- // 2.
- //
- // If we are dealing with the "clean" or "site" lifecycle then there are currently no lifecycle mappings but there are default phases
- // that need to be run instead.
- //
- // Now we need to take into account the packaging type of the project. For a project of type WAR, the lifecycle where mojos are mapped
- // on to the given phases in the lifecycle are going to be a little different then, say, a project of type JAR.
- //
-
- Map<String, String> lifecyclePhasesForPackaging;
+ List<String> phasesWithMojosToExecute = new ArrayList<String>();
- if ( lifecyclePhase.equals( "clean" ) )
+ List<MojoExecution> lifecyclePlan = new ArrayList<MojoExecution>();
+
+ if ( task.indexOf( ":" ) > 0 )
{
- lifecyclePhasesForPackaging = new HashMap<String,String>();
+ MojoDescriptor mojoDescriptor = getMojoDescriptor( task, session );
+
+ MojoExecution mojoExecution = getMojoExecution( project, mojoDescriptor );
- for( String phase : lifecycle.getDefaultPhases() )
- {
- lifecyclePhasesForPackaging.put( "clean", "org.apache.maven.plugins:maven-clean-plugin:clean" );
- }
+ lifecyclePlan.add( mojoExecution );
}
else
{
- LifecycleMapping lifecycleMappingForPackaging = lifecycleMappings.get( project.getPackaging() );
-
- lifecyclePhasesForPackaging = lifecycleMappingForPackaging.getLifecycles().get( lifecycle.getId() ).getPhases();
- }
-
- // 3.
- //
- // Once we have the lifecycle mapping for the given packaging, we need to know whats phases we need to worry about executing.
- //
-
- // Create an ordered Map of the phases in the lifecycle to a list of mojos to execute.
- Map<String,List<String>> phaseToMojoMapping = new LinkedHashMap<String,List<String>>();
-
- // 4.
-
- //TODO: need to separate the lifecycles
-
- for ( String phase : lifecycle.getPhases() )
- {
- List<String> mojos = new ArrayList<String>();
- // This is just just laying out the initial structure of the mojos to run in each phase of the
- // lifecycle. Everything is now done in the project builder correctly so this could likely
- // go away shortly. We no longer need to pull out bits from the default lifecycle. The MavenProject
- // comes to us intact as it should.
-
- phaseToMojoMapping.put( phase, mojos );
- }
-
- // 5. Just build up the list of mojos that will execute for every phase.
- //
- // This will be useful for having the complete build plan and then we can filter/optimize later.
- //
- for( Plugin plugin : project.getBuild().getPlugins() )
- {
- for( PluginExecution execution : plugin.getExecutions() )
- {
- // if the phase is specified then I don't have to go fetch the plugin yet and pull it down
- // to examine the phase it is associated to.
- if ( execution.getPhase() != null )
- {
- for( String goal : execution.getGoals() )
- {
- String s = plugin.getGroupId() + ":" + plugin.getArtifactId() + ":" + plugin.getVersion() + ":" + goal;
-
- if ( phaseToMojoMapping.get( execution.getPhase() ) == null )
- {
- // This is happening because executions in the POM are getting mixed into the clean lifecycle
- // So for the lifecycle mapping we need a map with the phases as keys so we can easily check
- // if this phase belongs to the given lifecycle. this shows the system is messed up. this
- // shouldn't happen.
- phaseToMojoMapping.put( execution.getPhase(), new ArrayList<String>() );
- }
-
- phaseToMojoMapping.get( execution.getPhase() ).add( s );
- }
- }
- // if not then i need to grab the mojo descriptor and look at the phase that is specified
- else
+ // 1.
+ //
+ // Based on the lifecycle phase we are given, let's find the corresponding lifecycle.
+ //
+ Lifecycle lifecycle = phaseToLifecycleMap.get( task );
+
+ // 2.
+ //
+ // If we are dealing with the "clean" or "site" lifecycle then there are currently no lifecycle mappings but there are default phases
+ // that need to be run instead.
+ //
+ // Now we need to take into account the packaging type of the project. For a project of type WAR, the lifecycle where mojos are mapped
+ // on to the given phases in the lifecycle are going to be a little different then, say, a project of type JAR.
+ //
+
+ Map<String, String> lifecyclePhasesForPackaging;
+
+ if ( task.equals( "clean" ) )
+ {
+ lifecyclePhasesForPackaging = new HashMap<String, String>();
+
+ for ( String phase : lifecycle.getDefaultPhases() )
+ {
+ lifecyclePhasesForPackaging.put( "clean", "org.apache.maven.plugins:maven-clean-plugin:clean" );
+ }
+ }
+ else
+ {
+ LifecycleMapping lifecycleMappingForPackaging = lifecycleMappings.get( project.getPackaging() );
+
+ lifecyclePhasesForPackaging = lifecycleMappingForPackaging.getLifecycles().get( lifecycle.getId() ).getPhases();
+ }
+
+ // 3.
+ //
+ // Once we have the lifecycle mapping for the given packaging, we need to know whats phases we need to worry about executing.
+ //
+
+ // Create an ordered Map of the phases in the lifecycle to a list of mojos to execute.
+ Map<String, List<String>> phaseToMojoMapping = new LinkedHashMap<String, List<String>>();
+
+ // 4.
+
+ //TODO: need to separate the lifecycles
+
+ for ( String phase : lifecycle.getPhases() )
+ {
+ List<String> mojos = new ArrayList<String>();
+
+ // This is just just laying out the initial structure of the mojos to run in each phase of the
+ // lifecycle. Everything is now done in the project builder correctly so this could likely
+ // go away shortly. We no longer need to pull out bits from the default lifecycle. The MavenProject
+ // comes to us intact as it should.
+
+ phaseToMojoMapping.put( phase, mojos );
+ }
+
+ // 5. Just build up the list of mojos that will execute for every phase.
+ //
+ // This will be useful for having the complete build plan and then we can filter/optimize later.
+ //
+ for ( Plugin plugin : project.getBuild().getPlugins() )
+ {
+ for ( PluginExecution execution : plugin.getExecutions() )
{
- for( String goal : execution.getGoals() )
+ // if the phase is specified then I don't have to go fetch the plugin yet and pull it down
+ // to examine the phase it is associated to.
+ if ( execution.getPhase() != null )
+ {
+ for ( String goal : execution.getGoals() )
+ {
+ String s = plugin.getGroupId() + ":" + plugin.getArtifactId() + ":" + plugin.getVersion() + ":" + goal;
+
+ if ( phaseToMojoMapping.get( execution.getPhase() ) == null )
+ {
+ // This is happening because executions in the POM are getting mixed into the clean lifecycle
+ // So for the lifecycle mapping we need a map with the phases as keys so we can easily check
+ // if this phase belongs to the given lifecycle. this shows the system is messed up. this
+ // shouldn't happen.
+ phaseToMojoMapping.put( execution.getPhase(), new ArrayList<String>() );
+ }
+
+ phaseToMojoMapping.get( execution.getPhase() ).add( s );
+ }
+ }
+ // if not then i need to grab the mojo descriptor and look at the phase that is specified
+ else
{
- String s = plugin.getGroupId() + ":" + plugin.getArtifactId() + ":" + plugin.getVersion() + ":" + goal;
- MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor( plugin, goal, session.getLocalRepository(), project.getRemoteArtifactRepositories() );
-
- if ( mojoDescriptor.getPhase() != null && phaseToMojoMapping.get( mojoDescriptor.getPhase() ) != null )
+ for ( String goal : execution.getGoals() )
{
- phaseToMojoMapping.get( mojoDescriptor.getPhase() ).add( s );
+ String s = plugin.getGroupId() + ":" + plugin.getArtifactId() + ":" + plugin.getVersion() + ":" + goal;
+ MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor( plugin, goal, session.getLocalRepository(), project.getRemoteArtifactRepositories() );
+
+ if ( mojoDescriptor.getPhase() != null && phaseToMojoMapping.get( mojoDescriptor.getPhase() ) != null )
+ {
+ phaseToMojoMapping.get( mojoDescriptor.getPhase() ).add( s );
+ }
}
}
}
}
- }
- // 6.
- //
- // We are only interested in the phases that correspond to the lifecycle we are trying to run. If we are running the "clean"
- // lifecycle we are not interested in goals -- like "generate-sources -- that belong to the default lifecycle.
- //
-
- List<String> phasesWithMojosToExecute = new ArrayList<String>();
-
- for( String phase : phaseToMojoMapping.keySet() )
- {
- phasesWithMojosToExecute.addAll( phaseToMojoMapping.get( phase ) );
-
- if ( phase.equals( lifecyclePhase ) )
+ // 6.
+ //
+ // We are only interested in the phases that correspond to the lifecycle we are trying to run. If we are running the "clean"
+ // lifecycle we are not interested in goals -- like "generate-sources -- that belong to the default lifecycle.
+ //
+
+ for ( String phase : phaseToMojoMapping.keySet() )
{
- break;
+ phasesWithMojosToExecute.addAll( phaseToMojoMapping.get( phase ) );
+
+ if ( phase.equals( task ) )
+ {
+ break;
+ }
}
- }
-
-
- // 7. Now we create the correct configuration for the mojo to execute.
- //TODO: this needs to go to the model builder.
-
- List<MojoExecution> lifecyclePlan = new ArrayList<MojoExecution>();
+
+ // 7. Now we create the correct configuration for the mojo to execute.
+ //TODO: this needs to go to the model builder.
- for ( String mojo : phasesWithMojosToExecute )
- {
- // These are bits that look like this:
- //
- // org.apache.maven.plugins:maven-remote-resources-plugin:1.0:process
- //
-
- String[] s = StringUtils.split( mojo, ":" );
-
- MojoDescriptor mojoDescriptor = getMojoDescriptor( mojo, session );
+ for ( String mojo : phasesWithMojosToExecute )
+ {
+ // These are bits that look like this:
+ //
+ // org.apache.maven.plugins:maven-remote-resources-plugin:1.0:process
+ //
- MojoExecution mojoExecution = new MojoExecution( mojoDescriptor );
+ MojoDescriptor mojoDescriptor = getMojoDescriptor( mojo, session );
- String g = mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId();
+ MojoExecution mojoExecution = getMojoExecution( project, mojoDescriptor );
+
+ /*
+ MojoExecution mojoExecution = new MojoExecution( mojoDescriptor );
- String a = mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId();
+ String g = mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId();
- Plugin p = project.getPlugin( g + ":" + a );
+ String a = mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId();
- for ( PluginExecution e : p.getExecutions() )
- {
- for ( String goal : e.getGoals() )
+ Plugin p = project.getPlugin( g + ":" + a );
+
+ for ( PluginExecution e : p.getExecutions() )
{
- if ( mojoDescriptor.getGoal().equals( goal ) )
+ for ( String goal : e.getGoals() )
{
- Xpp3Dom executionConfiguration = (Xpp3Dom) e.getConfiguration();
+ if ( mojoDescriptor.getGoal().equals( goal ) )
+ {
+ Xpp3Dom executionConfiguration = (Xpp3Dom) e.getConfiguration();
- Xpp3Dom mojoConfiguration = extractMojoConfiguration( executionConfiguration, mojoDescriptor );
+ Xpp3Dom mojoConfiguration = extractMojoConfiguration( executionConfiguration, mojoDescriptor );
- mojoExecution.setConfiguration( mojoConfiguration );
+ mojoExecution.setConfiguration( mojoConfiguration );
+ }
}
}
- }
+ */
- lifecyclePlan.add( mojoExecution );
+ lifecyclePlan.add( mojoExecution );
+ }
}
return lifecyclePlan;
}
+ private MojoExecution getMojoExecution( MavenProject project, MojoDescriptor mojoDescriptor )
+ {
+ MojoExecution mojoExecution = new MojoExecution( mojoDescriptor );
+
+ String g = mojoDescriptor.getPluginDescriptor().getGroupId();
+
+ String a = mojoDescriptor.getPluginDescriptor().getArtifactId();
+
+ Plugin p = project.getPlugin( g + ":" + a );
+
+ for ( PluginExecution e : p.getExecutions() )
+ {
+ for ( String goal : e.getGoals() )
+ {
+ if ( mojoDescriptor.getGoal().equals( goal ) )
+ {
+ Xpp3Dom executionConfiguration = (Xpp3Dom) e.getConfiguration();
+
+ Xpp3Dom mojoConfiguration = extractMojoConfiguration( executionConfiguration, mojoDescriptor );
+
+ mojoExecution.setConfiguration( mojoConfiguration );
+ }
+ }
+ }
+
+ return mojoExecution;
+ }
+
+
/**
* Extracts the configuration for a single mojo from the specified execution configuration by discarding any
* non-applicable parameters. This is necessary because a plugin execution can have multiple goals with different
@@ -421,10 +473,10 @@
return mojoConfiguration;
}
-
+
// org.apache.maven.plugins:maven-remote-resources-plugin:1.0:process
MojoDescriptor getMojoDescriptor( String task, MavenSession session )
- throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException
{
MavenProject project = session.getCurrentProject();
@@ -464,7 +516,69 @@
goal = tok.nextToken();
}
-
+
+ if ( plugin.getVersion() == null )
+ {
+ // We need to get it from the POM first before anything else
+ //
+ for ( Plugin pluginInPom : project.getBuildPlugins() )
+ {
+ if ( pluginInPom.getArtifactId().equals( plugin.getArtifactId() ) )
+ {
+ plugin.setVersion( pluginInPom.getVersion() );
+ break;
+ }
+ }
+
+ // If there is no version to be found then we need to look in the repository metadata for
+ // this plugin and see what's specified as the latest release.
+ //
+ if ( plugin.getVersion() == null )
+ {
+ for ( ArtifactRepository repository : session.getCurrentProject().getRemoteArtifactRepositories() )
+ {
+ String localPath = plugin.getGroupId().replace( '.', '/' ) + "/" + plugin.getArtifactId() + "/maven-metadata-" + repository.getId() + ".xml";
+
+ File destination = new File( session.getLocalRepository().getBasedir(), localPath );
+
+ if ( !destination.exists() )
+ {
+ try
+ {
+ String remotePath = plugin.getGroupId().replace( '.', '/' ) + "/" + plugin.getArtifactId() + "/maven-metadata.xml";
+
+ repositorySystem.retrieve( repository, destination, remotePath, session.getRequest().getTransferListener() );
+ }
+ catch ( TransferFailedException e )
+ {
+ continue;
+ }
+ catch ( ResourceDoesNotExistException e )
+ {
+ continue;
+ }
+ }
+
+ // We have retrieved the metadata
+ try
+ {
+ Metadata pluginMetadata = readMetadata( destination );
+
+ String release = pluginMetadata.getVersioning().getRelease();
+
+ if ( release != null )
+ {
+ plugin.setVersion( release );
+ }
+ }
+ catch ( RepositoryMetadataReadException e )
+ {
+ logger.warn( "Error reading plugin metadata: ", e );
+ }
+ }
+ }
+ }
+
return pluginManager.getMojoDescriptor( plugin, goal, session.getLocalRepository(), project.getRemoteArtifactRepositories() );
}
@@ -715,7 +829,142 @@
return mojoExecution.getConfiguration();
}
+
+ private void downloadProjectDependencies( MavenSession session, String scope )
+ throws ArtifactResolutionException, ArtifactNotFoundException
+ {
+ MavenProject project = session.getCurrentProject();
+
+ Artifact artifact =
+ repositorySystem.createProjectArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion() );
+ artifact.setFile( project.getFile() );
+
+ ArtifactFilter filter = new ScopeArtifactFilter( scope );
+
+ ArtifactResolutionRequest request = new ArtifactResolutionRequest()
+ .setArtifact( artifact )
+ .setResolveRoot( false )
+ .setResolveTransitively( true )
+ .setLocalRepository( session.getLocalRepository() )
+ .setRemoteRepostories( project.getRemoteArtifactRepositories() )
+ .setManagedVersionMap( project.getManagedVersionMap() )
+ .setFilter( filter );
+
+ ArtifactResolutionResult result = repositorySystem.resolve( request );
+ resolutionErrorHandler.throwErrors( request, result );
+ project.setArtifacts( result.getArtifacts() );
+ }
+
+ private Map<String,Plugin> pluginPrefixes = new HashMap<String,Plugin>();
+
+ public Plugin findPluginForPrefix( String prefix, MavenSession session )
+ throws NoPluginFoundForPrefixException
+ {
+ // [prefix]:[goal]
+
+ Plugin plugin = pluginPrefixes.get( prefix );
+
+ if ( plugin != null )
+ {
+ return plugin;
+ }
+
+ for ( ArtifactRepository repository : session.getCurrentProject().getRemoteArtifactRepositories() )
+ {
+ for ( String pluginGroup : session.getPluginGroups() )
+ {
+ // org.apache.maven.plugins
+ // org/apache/maven/plugins/maven-metadata.xml
+
+ String localPath = pluginGroup.replace( '.', '/' ) + "/" + "maven-metadata-" + repository.getId() + ".xml";
+
+ File destination = new File( session.getLocalRepository().getBasedir(), localPath );
+
+ if ( !destination.exists() )
+ {
+ try
+ {
+ String remotePath = pluginGroup.replace( '.', '/' ) + "/" + "maven-metadata.xml";
+
+ repositorySystem.retrieve( repository, destination, remotePath, session.getRequest().getTransferListener() );
+ }
+ catch ( TransferFailedException e )
+ {
+ continue;
+ }
+ catch ( ResourceDoesNotExistException e )
+ {
+ continue;
+ }
+ }
+
+ // We have retrieved the metadata
+ try
+ {
+ Metadata pluginGroupMetadata = readMetadata( destination );
+
+ List<org.apache.maven.artifact.repository.metadata.Plugin> plugins = pluginGroupMetadata.getPlugins();
+
+ if ( plugins != null )
+ {
+ for ( org.apache.maven.artifact.repository.metadata.Plugin metadataPlugin : plugins )
+ {
+ Plugin p = new Plugin();
+ p.setGroupId( pluginGroup );
+ p.setArtifactId( metadataPlugin.getArtifactId() );
+ pluginPrefixes.put( metadataPlugin.getPrefix(), p );
+ }
+ }
+ }
+ catch ( RepositoryMetadataReadException e )
+ {
+ logger.warn( "Error reading plugin group metadata: ", e );
+ }
+ }
+ }
+
+ plugin = pluginPrefixes.get( prefix );
+
+ if ( plugin != null )
+ {
+ return plugin;
+ }
+
+ throw new NoPluginFoundForPrefixException( prefix );
+ }
+ protected Metadata readMetadata( File mappingFile )
+ throws RepositoryMetadataReadException
+ {
+ Metadata result;
+
+ Reader reader = null;
+ try
+ {
+ reader = ReaderFactory.newXmlReader( mappingFile );
+
+ MetadataXpp3Reader mappingReader = new MetadataXpp3Reader();
+
+ result = mappingReader.read( reader, false );
+ }
+ catch ( FileNotFoundException e )
+ {
+ throw new RepositoryMetadataReadException( "Cannot read metadata from '" + mappingFile + "'", e );
+ }
+ catch ( IOException e )
+ {
+ throw new RepositoryMetadataReadException( "Cannot read metadata from '" + mappingFile + "': " + e.getMessage(), e );
+ }
+ catch ( XmlPullParserException e )
+ {
+ throw new RepositoryMetadataReadException( "Cannot read metadata from '" + mappingFile + "': " + e.getMessage(), e );
+ }
+ finally
+ {
+ IOUtil.close( reader );
+ }
+ return result;
+ }
// These are checks that should be available in real time to IDEs
@@ -912,42 +1161,5 @@
}
}
- */
-
- private void downloadProjectDependencies( MavenSession session, String scope )
- throws ArtifactResolutionException, ArtifactNotFoundException
- {
- MavenProject project = session.getCurrentProject();
-
- Artifact artifact =
- repositorySystem.createProjectArtifact( project.getGroupId(), project.getArtifactId(), project.getVersion() );
- artifact.setFile( project.getFile() );
-
- ArtifactFilter filter = new ScopeArtifactFilter( scope );
-
- ArtifactResolutionRequest request = new ArtifactResolutionRequest()
- .setArtifact( artifact )
- .setResolveRoot( false )
- .setResolveTransitively( true )
- .setLocalRepository( session.getLocalRepository() )
- .setRemoteRepostories( project.getRemoteArtifactRepositories() )
- .setManagedVersionMap( project.getManagedVersionMap() )
- .setFilter( filter );
-
- ArtifactResolutionResult result = repositorySystem.resolve( request );
- resolutionErrorHandler.throwErrors( request, result );
- project.setArtifacts( result.getArtifacts() );
- }
-
- // This would ideally be kept up
- public Plugin findPluginForPrefix( String prefix, MavenSession session )
- {
- // [prefix]:[goal]
- //
- // eclipse:eclipse
- // idea:idea
-
- return null;
- //return getByPrefix( prefix, session.getPluginGroups(), project.getRemoteArtifactRepositories(), session.getLocalRepository() );
- }
+ */
}
Modified: maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java?rev=776494&r1=776493&r2=776494&view=diff
==============================================================================
--- maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java (original)
+++ maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java Tue May 19 23:07:08 2009
@@ -52,8 +52,8 @@
* @return
* @throws LifecycleExecutionException
*/
- List<MojoExecution> calculateLifecyclePlan( String lifecyclePhase, MavenSession session )
- throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException;
+ List<MojoExecution> calculateBuildPlan( String lifecyclePhase, MavenSession session )
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException;
// For a given project packaging find all the plugins that are bound to any registered
// lifecycles. The project builder needs to now what default plugin information needs to be
Added: maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/NoPluginFoundForPrefixException.java
URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/NoPluginFoundForPrefixException.java?rev=776494&view=auto
==============================================================================
--- maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/NoPluginFoundForPrefixException.java (added)
+++ maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/NoPluginFoundForPrefixException.java Tue May 19 23:07:08 2009
@@ -0,0 +1,12 @@
+package org.apache.maven.lifecycle;
+
+public class NoPluginFoundForPrefixException
+ extends Exception
+{
+ private String prefix;
+
+ public NoPluginFoundForPrefixException( String prefix )
+ {
+ super( "No plugin found for prefix '" + prefix + "'" );
+ }
+}
Propchange: maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/NoPluginFoundForPrefixException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/lifecycle/NoPluginFoundForPrefixException.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java?rev=776494&r1=776493&r2=776494&view=diff
==============================================================================
--- maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java (original)
+++ maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java Tue May 19 23:07:08 2009
@@ -26,11 +26,13 @@
lifecycleExecutor = (DefaultLifecycleExecutor) lookup( LifecycleExecutor.class );
lookup( ExceptionHandler.class );
}
-
+
@Override
- protected void tearDown() throws Exception {
- lifecycleExecutor = null;
- super.tearDown();
+ protected void tearDown()
+ throws Exception
+ {
+ lifecycleExecutor = null;
+ super.tearDown();
}
protected String getProjectsDirectory()
@@ -51,6 +53,24 @@
// Tests which exercise the lifecycle executor when it is dealing with default lifecycle phases.
// -----------------------------------------------------------------------------------------------
+ public void testCalculationOfBuildPlanWithIndividualTaskWherePluginIsSpecifiedInThePom()
+ throws Exception
+ {
+ // We are doing something like "mvn resources:resources" where no version is specified but this
+ // project we are working on has the version specified in the POM so the version should come from there.
+ File pom = getProject( "project-with-additional-lifecycle-elements" );
+ MavenSession session = createMavenSession( pom );
+ assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
+ assertEquals( "1.0", session.getCurrentProject().getVersion() );
+ List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateBuildPlan( "resources:resources", session );
+ assertEquals( 1, lifecyclePlan.size() );
+ MojoExecution mojoExecution = lifecyclePlan.get( 0 );
+ assertNotNull( mojoExecution );
+ assertEquals( "org.apache.maven.plugins", mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId() );
+ assertEquals( "maven-resources-plugin", mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId() );
+ assertEquals( "2.3", mojoExecution.getMojoDescriptor().getPluginDescriptor().getVersion() );
+ }
+
public void testLifecycleQueryingUsingADefaultLifecyclePhase()
throws Exception
{
@@ -58,7 +78,7 @@
MavenSession session = createMavenSession( pom );
assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
assertEquals( "1.0", session.getCurrentProject().getVersion() );
- List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateLifecyclePlan( "package", session );
+ List<MojoExecution> lifecyclePlan = lifecycleExecutor.calculateBuildPlan( "package", session );
// resources:resources
// compiler:compile
@@ -96,5 +116,14 @@
Xpp3Dom dom = lifecycleExecutor.convert( mojoDescriptor );
System.out.println( dom );
}
-
+
+ public void testPluginPrefixRetrieval()
+ throws Exception
+ {
+ File pom = getProject( "project-with-additional-lifecycle-elements" );
+ MavenSession session = createMavenSession( pom );
+ Plugin plugin = lifecycleExecutor.findPluginForPrefix( "resources", session );
+ assertEquals( "org.apache.maven.plugins", plugin.getGroupId() );
+ assertEquals( "maven-resources-plugin", plugin.getArtifactId() );
+ }
}
Modified: maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleExecutor.java?rev=776494&r1=776493&r2=776494&view=diff
==============================================================================
--- maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleExecutor.java (original)
+++ maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/EmptyLifecycleExecutor.java Tue May 19 23:07:08 2009
@@ -49,7 +49,7 @@
implements LifecycleExecutor
{
- public List<MojoExecution> calculateLifecyclePlan( String lifecyclePhase, MavenSession session )
+ public List<MojoExecution> calculateBuildPlan( String lifecyclePhase, MavenSession session )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException
{
return Collections.emptyList();
Modified: maven/components/branches/MNG-2766/maven-core/src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml?rev=776494&r1=776493&r2=776494&view=diff
==============================================================================
--- maven/components/branches/MNG-2766/maven-core/src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml (original)
+++ maven/components/branches/MNG-2766/maven-core/src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml Tue May 19 23:07:08 2009
@@ -30,6 +30,11 @@
</execution>
</executions>
</plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <version>2.3</version>
+ </plugin>
</plugins>
</build>
</project>