You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/07/30 17:07:00 UTC
svn commit: r799310 - in /maven/components/trunk:
maven-core/src/main/java/org/apache/maven/lifecycle/
maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/
Author: bentmann
Date: Thu Jul 30 15:06:59 2009
New Revision: 799310
URL: http://svn.apache.org/viewvc?rev=799310&view=rev
Log:
o Restored lifecycle forking
Added:
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleNotFoundException.java (with props)
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhaseNotFoundException.java (with props)
Modified:
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=799310&r1=799309&r2=799310&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Thu Jul 30 15:06:59 2009
@@ -56,6 +56,8 @@
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.Parameter;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.lifecycle.Execution;
+import org.apache.maven.plugin.lifecycle.Phase;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.wagon.ResourceDoesNotExistException;
@@ -265,7 +267,10 @@
}
public MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
- throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException, PluginManagerException
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
+ CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException,
+ InvalidPluginDescriptorException, PluginManagerException, LifecyclePhaseNotFoundException,
+ LifecycleNotFoundException
{
MavenProject project = session.getCurrentProject();
@@ -306,7 +311,7 @@
populateMojoExecutionConfiguration( project, mojoExecution, false );
- calculateForkedExecutions( mojoExecution, project, new HashSet<MojoDescriptor>() );
+ calculateForkedExecutions( mojoExecution, session, project, new HashSet<MojoDescriptor>() );
collectDependencyResolutionScopes( requiredDependencyResolutionScopes, mojoExecution );
}
@@ -379,93 +384,93 @@
// 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
- private void calculateExecutionForLifecyclePhase( MavenSession session, List<MojoExecution> lifecyclePlan, String lifecyclePhase )
- throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException
- {
- 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.
- //
-
- // 3.
- //
- // Once we have the lifecycle mapping for the given packaging, we need to know whats phases we need to worry about executing.
- //
+ private void calculateExecutionForLifecyclePhase( MavenSession session, List<MojoExecution> lifecyclePlan,
+ String lifecyclePhase )
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
+ CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException,
+ InvalidPluginDescriptorException, LifecyclePhaseNotFoundException
+ {
+ Map<String, List<MojoExecution>> phaseToMojoMapping = calculateLifecycleMappings( session, lifecyclePhase );
- // Create an ordered Map of the phases in the lifecycle to a list of mojos to execute.
- Map<String, List<MojoExecution>> phaseToMojoMapping = new LinkedHashMap<String, List<MojoExecution>>();
+ for ( List<MojoExecution> mojoExecutions : phaseToMojoMapping.values() )
+ {
+ lifecyclePlan.addAll( mojoExecutions );
+ }
+ }
- // 4.
+ private Map<String, List<MojoExecution>> calculateLifecycleMappings( MavenSession session, String lifecyclePhase )
+ throws LifecyclePhaseNotFoundException, PluginNotFoundException, PluginResolutionException,
+ PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException,
+ InvalidPluginDescriptorException
+ {
+ /*
+ * Determine the lifecycle that corresponds to the given phase.
+ */
- //TODO: need to separate the lifecycles
+ Lifecycle lifecycle = phaseToLifecycleMap.get( lifecyclePhase );
if ( lifecycle == null )
{
- logger.info( "Invalid task '"
- + lifecyclePhase
- + "' : you must specify a valid lifecycle phase, or a goal in the format plugin:goal or pluginGroupId:pluginArtifactId:pluginVersion:goal" );
- throw new MojoNotFoundException( lifecyclePhase, null );
+ logger.info( "Invalid task '" + lifecyclePhase + "' : you must specify a valid lifecycle phase"
+ + ", or a goal in the format <plugin-prefix>:<goal> or"
+ + " <plugin-group-id>:<plugin-artifact-id>:<plugin-version>:<goal>" );
+ throw new LifecyclePhaseNotFoundException( lifecyclePhase );
}
-
+
+ /*
+ * Initialize mapping from lifecycle phase to bound mojos. The key set of this map denotes the phases the caller
+ * is interested in, i.e. all phases up to and including the specified phase.
+ */
+
+ Map<String, List<MojoExecution>> lifecycleMappings = new LinkedHashMap<String, List<MojoExecution>>();
+
for ( String phase : lifecycle.getPhases() )
{
- List<MojoExecution> mojos = new ArrayList<MojoExecution>();
+ List<MojoExecution> mojoExecutions = new ArrayList<MojoExecution>();
- //TODO: remove hard coding
+ // TODO: remove hard coding
if ( phase.equals( "clean" ) )
{
Plugin plugin = new Plugin();
plugin.setGroupId( "org.apache.maven.plugins" );
plugin.setArtifactId( "maven-clean-plugin" );
plugin.setVersion( "2.3" );
- mojos.add( new MojoExecution( plugin, "clean", "default-clean" ) );
+ mojoExecutions.add( new MojoExecution( plugin, "clean", "default-clean" ) );
}
- // 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.
+ lifecycleMappings.put( phase, mojoExecutions );
- phaseToMojoMapping.put( phase, mojos );
+ if ( phase.equals( lifecyclePhase ) )
+ {
+ break;
+ }
}
- // 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.
- //
+ /*
+ * Grab plugin executions that are bound to the selected lifecycle phases from project. The effective model of
+ * the project already contains the plugin executions induced by the project's packaging type. Remember, all
+ * phases of interest and only those are in the lifecyle mapping, if a phase has no value in the map, we are not
+ * interested in any of the executions bound to it.
+ */
+
+ MavenProject project = session.getCurrentProject();
+
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.
+ // to examine the phase it is associated to.
if ( execution.getPhase() != null )
{
- for ( String goal : execution.getGoals() )
+ List<MojoExecution> mojoExecutions = lifecycleMappings.get( execution.getPhase() );
+ if ( mojoExecutions != null )
{
- if ( phaseToMojoMapping.get( execution.getPhase() ) == null )
+ for ( String goal : execution.getGoals() )
{
- // 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<MojoExecution>() );
+ MojoExecution mojoExecution = new MojoExecution( plugin, goal, execution.getId() );
+ mojoExecutions.add( mojoExecution );
}
-
- MojoExecution mojoExecution = new MojoExecution( plugin, goal, execution.getId() );
- phaseToMojoMapping.get( execution.getPhase() ).add( mojoExecution );
}
}
// if not then i need to grab the mojo descriptor and look at the phase that is specified
@@ -473,37 +478,29 @@
{
for ( String goal : execution.getGoals() )
{
- MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor( plugin, goal, session.getLocalRepository(), project.getPluginArtifactRepositories() );
+ MojoDescriptor mojoDescriptor =
+ pluginManager.getMojoDescriptor( plugin, goal, session.getLocalRepository(),
+ project.getPluginArtifactRepositories() );
- if ( mojoDescriptor.getPhase() != null && phaseToMojoMapping.get( mojoDescriptor.getPhase() ) != null )
+ List<MojoExecution> mojoExecutions = lifecycleMappings.get( mojoDescriptor.getPhase() );
+ if ( mojoExecutions != null )
{
MojoExecution mojoExecution = new MojoExecution( plugin, goal, execution.getId() );
- phaseToMojoMapping.get( mojoDescriptor.getPhase() ).add( mojoExecution );
+ mojoExecutions.add( mojoExecution );
}
}
}
}
}
- // 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() )
- {
- lifecyclePlan.addAll( phaseToMojoMapping.get( phase ) );
-
- if ( phase.equals( lifecyclePhase ) )
- {
- break;
- }
- }
- }
+ return lifecycleMappings;
+ }
- private void calculateForkedExecutions( MojoExecution mojoExecution, MavenProject project,
+ private void calculateForkedExecutions( MojoExecution mojoExecution, MavenSession session, MavenProject project,
Collection<MojoDescriptor> alreadyForkedExecutions )
- throws MojoNotFoundException
+ throws MojoNotFoundException, PluginNotFoundException, PluginResolutionException,
+ PluginDescriptorParsingException, CycleDetectedInPluginGraphException, NoPluginFoundForPrefixException,
+ InvalidPluginDescriptorException, LifecyclePhaseNotFoundException, LifecycleNotFoundException
{
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
@@ -516,8 +513,115 @@
if ( StringUtils.isNotEmpty( mojoDescriptor.getExecutePhase() ) )
{
- // TODO
+ String forkedPhase = mojoDescriptor.getExecutePhase();
+
+ Map<String, List<MojoExecution>> lifecycleMappings = calculateLifecycleMappings( session, forkedPhase );
+ for ( List<MojoExecution> forkedExecutions : lifecycleMappings.values() )
+ {
+ for ( MojoExecution forkedExecution : forkedExecutions )
+ {
+ if ( forkedExecution.getMojoDescriptor() == null )
+ {
+ MojoDescriptor forkedMojoDescriptor =
+ pluginManager.getMojoDescriptor( forkedExecution.getPlugin(), forkedExecution.getGoal(),
+ session.getLocalRepository(),
+ project.getPluginArtifactRepositories() );
+
+ forkedExecution.setMojoDescriptor( forkedMojoDescriptor );
+ }
+
+ populateMojoExecutionConfiguration( project, forkedExecution, false );
+ }
+ }
+
+ String forkedLifecycle = mojoDescriptor.getExecuteLifecycle();
+
+ if ( StringUtils.isNotEmpty( forkedLifecycle ) )
+ {
+ org.apache.maven.plugin.lifecycle.Lifecycle lifecycleOverlay;
+
+ try
+ {
+ lifecycleOverlay = pluginDescriptor.getLifecycleMapping( forkedLifecycle );
+ }
+ catch ( IOException e )
+ {
+ throw new PluginDescriptorParsingException( pluginDescriptor.getPlugin(), e );
+ }
+ catch ( XmlPullParserException e )
+ {
+ throw new PluginDescriptorParsingException( pluginDescriptor.getPlugin(), e );
+ }
+
+ if ( lifecycleOverlay == null )
+ {
+ throw new LifecycleNotFoundException( forkedLifecycle );
+ }
+
+ for ( Phase phase : lifecycleOverlay.getPhases() )
+ {
+ List<MojoExecution> forkedExecutions = lifecycleMappings.get( phase.getId() );
+ if ( forkedExecutions != null )
+ {
+ for ( Execution execution : phase.getExecutions() )
+ {
+ for ( String goal : execution.getGoals() )
+ {
+ MojoDescriptor forkedMojoDescriptor;
+
+ if ( goal.indexOf( ':' ) < 0 )
+ {
+ forkedMojoDescriptor = pluginDescriptor.getMojo( goal );
+ if ( forkedMojoDescriptor == null )
+ {
+ throw new MojoNotFoundException( goal, pluginDescriptor );
+ }
+ }
+ else
+ {
+ forkedMojoDescriptor = getMojoDescriptor( goal, session );
+ }
+
+ MojoExecution forkedExecution =
+ new MojoExecution( forkedMojoDescriptor, mojoExecution.getExecutionId() );
+
+ Xpp3Dom forkedConfiguration = (Xpp3Dom) execution.getConfiguration();
+
+ forkedExecution.setConfiguration( forkedConfiguration );
+
+ populateMojoExecutionConfiguration( project, forkedExecution, true );
+
+ forkedExecutions.add( forkedExecution );
+ }
+ }
+
+ Xpp3Dom phaseConfiguration = (Xpp3Dom) phase.getConfiguration();
+ if ( phaseConfiguration != null )
+ {
+ for ( MojoExecution forkedExecution : forkedExecutions )
+ {
+ Xpp3Dom executionConfiguration = forkedExecution.getConfiguration();
+
+ Xpp3Dom mergedConfiguration =
+ Xpp3Dom.mergeXpp3Dom( phaseConfiguration, executionConfiguration );
+
+ forkedExecution.setConfiguration( mergedConfiguration );
+ }
+ }
+ }
+ }
+ }
+
+ for ( List<MojoExecution> forkedExecutions : lifecycleMappings.values() )
+ {
+ for ( MojoExecution forkedExecution : forkedExecutions )
+ {
+ calculateForkedExecutions( forkedExecution, session, project, alreadyForkedExecutions );
+
+ mojoExecution.addForkedExecution( forkedExecution );
+ }
+ }
}
else if ( StringUtils.isNotEmpty( mojoDescriptor.getExecuteGoal() ) )
{
@@ -533,7 +637,7 @@
populateMojoExecutionConfiguration( project, forkedExecution, true );
- calculateForkedExecutions( forkedExecution, project, alreadyForkedExecutions );
+ calculateForkedExecutions( forkedExecution, session, project, alreadyForkedExecutions );
mojoExecution.addForkedExecution( forkedExecution );
}
@@ -555,7 +659,7 @@
Plugin plugin = project.getPlugin( g + ":" + a );
- if ( plugin != null )
+ if ( plugin != null && StringUtils.isNotEmpty( mojoExecution.getExecutionId() ) )
{
for ( PluginExecution e : plugin.getExecutions() )
{
@@ -565,7 +669,10 @@
Xpp3Dom mojoConfiguration = extractMojoConfiguration( executionConfiguration, mojoExecution.getMojoDescriptor() );
- mojoExecution.setConfiguration( mojoConfiguration );
+ Xpp3Dom mergedConfiguration =
+ Xpp3Dom.mergeXpp3Dom( mojoExecution.getConfiguration(), mojoConfiguration );
+
+ mojoExecution.setConfiguration( mergedConfiguration );
return;
}
@@ -576,18 +683,20 @@
{
Xpp3Dom defaultDom = convert( mojoExecution.getMojoDescriptor() );
+ Xpp3Dom mojoDom = defaultDom;
+
if ( plugin != null && plugin.getConfiguration() != null )
{
Xpp3Dom projectDom = (Xpp3Dom) plugin.getConfiguration();
projectDom = extractMojoConfiguration( projectDom, mojoExecution.getMojoDescriptor() );
- mojoExecution.setConfiguration( Xpp3Dom.mergeXpp3Dom( projectDom, defaultDom, Boolean.TRUE ) );
- }
- else
- {
- mojoExecution.setConfiguration( defaultDom );
+ mojoDom = Xpp3Dom.mergeXpp3Dom( projectDom, defaultDom, Boolean.TRUE );
}
+
+ mojoDom = Xpp3Dom.mergeXpp3Dom( mojoExecution.getConfiguration(), mojoDom );
+
+ mojoExecution.setConfiguration( mojoDom );
}
- }
+ }
/**
* Extracts the configuration for a single mojo from the specified execution configuration by discarding any
@@ -699,7 +808,7 @@
plugin.setArtifactId( tok.nextToken() );
goal = tok.nextToken();
}
- if ( numTokens == 2 )
+ else if ( numTokens == 2 )
{
// We have a prefix and goal
//
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java?rev=799310&r1=799309&r2=799310&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java Thu Jul 30 15:06:59 2009
@@ -49,7 +49,10 @@
* @throws LifecycleExecutionException
*/
MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
- throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException, PluginManagerException;
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
+ CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException,
+ InvalidPluginDescriptorException, PluginManagerException, LifecyclePhaseNotFoundException,
+ LifecycleNotFoundException;
// 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/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleNotFoundException.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleNotFoundException.java?rev=799310&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleNotFoundException.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleNotFoundException.java Thu Jul 30 15:06:59 2009
@@ -0,0 +1,54 @@
+package org.apache.maven.lifecycle;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Signals a failure to locate a lifecycle.
+ *
+ * @author Benjamin Bentmann
+ */
+public class LifecycleNotFoundException
+ extends Exception
+{
+
+ private final String lifecycleId;
+
+ /**
+ * Creates a new exception to indicate that the specified lifecycle is unknown.
+ *
+ * @param lifecycleId The identifier of the lifecycle that could not be located, may be {@code null}.
+ */
+ public LifecycleNotFoundException( String lifecycleId )
+ {
+ super( "Unknown lifecycle " + lifecycleId );
+ this.lifecycleId = ( lifecycleId != null ) ? lifecycleId : "";
+ }
+
+ /**
+ * Gets the identifier of the lifecycle that was not found.
+ *
+ * @return The identifier of the lifecycle that was not found, never {@code null}.
+ */
+ public String getLifecycleId()
+ {
+ return lifecycleId;
+ }
+
+}
Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleNotFoundException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleNotFoundException.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhaseNotFoundException.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhaseNotFoundException.java?rev=799310&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhaseNotFoundException.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhaseNotFoundException.java Thu Jul 30 15:06:59 2009
@@ -0,0 +1,54 @@
+package org.apache.maven.lifecycle;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Signals a failure to locate the lifecycle for some phase.
+ *
+ * @author Benjamin Bentmann
+ */
+public class LifecyclePhaseNotFoundException
+ extends Exception
+{
+
+ private final String lifecyclePhase;
+
+ /**
+ * Creates a new exception to indicate that the specified lifecycle phase is not defined by any known lifecycle.
+ *
+ * @param lifecyclePhase The name of the lifecycle phase that could not be located, may be {@code null}.
+ */
+ public LifecyclePhaseNotFoundException( String lifecyclePhase )
+ {
+ super( "Unknown lifecycle phase " + lifecyclePhase );
+ this.lifecyclePhase = ( lifecyclePhase != null ) ? lifecyclePhase : "";
+ }
+
+ /**
+ * Gets the lifecycle phase that was not found.
+ *
+ * @return The lifecycle phase that was not found, never {@code null}.
+ */
+ public String getLifecyclePhase()
+ {
+ return lifecyclePhase;
+ }
+
+}
Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhaseNotFoundException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecyclePhaseNotFoundException.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java?rev=799310&r1=799309&r2=799310&view=diff
==============================================================================
--- maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java (original)
+++ maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java Thu Jul 30 15:06:59 2009
@@ -19,7 +19,15 @@
* under the License.
*/
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -28,8 +36,14 @@
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.lifecycle.Lifecycle;
+import org.apache.maven.plugin.lifecycle.LifecycleConfiguration;
+import org.apache.maven.plugin.lifecycle.io.xpp3.LifecycleMappingsXpp3Reader;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.ReaderFactory;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* @author Jason van Zyl
@@ -37,6 +51,9 @@
public class PluginDescriptor
extends ComponentSetDescriptor
{
+
+ private static final String LIFECYCLE_DESCRIPTOR = "META-INF/maven/lifecycle.xml";
+
private String groupId;
private String artifactId;
@@ -49,14 +66,14 @@
private boolean inheritedByDefault = true;
- private List artifacts;
+ private List<Artifact> artifacts;
private ClassRealm classRealm;
// calculated on-demand.
- private Map artifactMap;
+ private Map<String, Artifact> artifactMap;
- private Set introducedDependencyArtifacts;
+ private Set<Artifact> introducedDependencyArtifacts;
private String name;
@@ -66,6 +83,8 @@
private Artifact pluginArtifact;
+ private Map<String, Lifecycle> lifecycleMappings;
+
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
@@ -208,12 +227,12 @@
this.inheritedByDefault = inheritedByDefault;
}
- public List getArtifacts()
+ public List<Artifact> getArtifacts()
{
return artifacts;
}
- public void setArtifacts( List artifacts )
+ public void setArtifacts( List<Artifact> artifacts )
{
this.artifacts = artifacts;
@@ -221,7 +240,7 @@
artifactMap = null;
}
- public Map getArtifactMap()
+ public Map<String, Artifact> getArtifactMap()
{
if ( artifactMap == null )
{
@@ -280,14 +299,15 @@
return classRealm;
}
- public void setIntroducedDependencyArtifacts( Set introducedDependencyArtifacts )
+ public void setIntroducedDependencyArtifacts( Set<Artifact> introducedDependencyArtifacts )
{
this.introducedDependencyArtifacts = introducedDependencyArtifacts;
}
- public Set getIntroducedDependencyArtifacts()
+ public Set<Artifact> getIntroducedDependencyArtifacts()
{
- return introducedDependencyArtifacts != null ? introducedDependencyArtifacts : Collections.EMPTY_SET;
+ return ( introducedDependencyArtifacts != null ) ? introducedDependencyArtifacts
+ : Collections.<Artifact> emptySet();
}
public void setName( String name )
@@ -329,4 +349,61 @@
{
this.pluginArtifact = pluginArtifact;
}
+
+ public Lifecycle getLifecycleMapping( String lifecycleId )
+ throws IOException, XmlPullParserException
+ {
+ if ( lifecycleMappings == null )
+ {
+ LifecycleConfiguration lifecycleConfiguration;
+
+ Reader reader = null;
+ try
+ {
+ reader = ReaderFactory.newXmlReader( getDescriptorStream( LIFECYCLE_DESCRIPTOR ) );
+
+ lifecycleConfiguration = new LifecycleMappingsXpp3Reader().read( reader );
+ }
+ finally
+ {
+ IOUtil.close( reader );
+ }
+
+ lifecycleMappings = new HashMap<String, Lifecycle>();
+
+ for ( Lifecycle lifecycle : lifecycleConfiguration.getLifecycles() )
+ {
+ lifecycleMappings.put( lifecycle.getId(), lifecycle );
+ }
+ }
+
+ return lifecycleMappings.get( lifecycleId );
+ }
+
+ private InputStream getDescriptorStream( String descriptor )
+ throws IOException
+ {
+ File pluginFile = ( pluginArtifact != null ) ? pluginArtifact.getFile() : null;
+ if ( pluginFile == null )
+ {
+ throw new IllegalStateException( "plugin main artifact has not been resolved" );
+ }
+
+ if ( pluginFile.isFile() )
+ {
+ try
+ {
+ return new URL( "jar:" + pluginFile.toURI() + "!/" + descriptor ).openStream();
+ }
+ catch ( MalformedURLException e )
+ {
+ throw new IllegalStateException( e );
+ }
+ }
+ else
+ {
+ return new FileInputStream( new File( pluginFile, descriptor ) );
+ }
+ }
+
}