Author: jvanzyl Date: Sun Jun 3 23:09:27 2007 New Revision: 544061 URL: http://svn.apache.org/viewvc?view=rev&rev=544061 Log: MNG-2831 Do a custom check for extensions with lifecycles as not to disrupt the fine balance in the extension manager. This fixes a regression in 2.0.6.
Modified: maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java Modified: maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java URL: http://svn.apache.org/viewvc/maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java?view=diff&rev=544061&r1=544060&r2=544061 ============================================================================== --- maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java (original) +++ maven/components/branches/maven-2.0.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java Sun Jun 3 23:09:27 2007 @@ -20,14 +20,13 @@ */ import org.apache.maven.MavenArtifactFilterManager; -import org.apache.maven.plugin.DefaultPluginManager; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.manager.WagonManager; +import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; import org.apache.maven.artifact.metadata.ArtifactMetadataSource; import org.apache.maven.artifact.metadata.ResolutionGroup; -import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; @@ -35,6 +34,7 @@ import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.resolver.filter.ArtifactFilter; import org.apache.maven.model.Extension; +import org.apache.maven.plugin.DefaultPluginManager; import org.apache.maven.project.MavenProject; import org.apache.maven.wagon.Wagon; import org.codehaus.plexus.PlexusConstants; @@ -45,12 +45,14 @@ import org.codehaus.plexus.context.ContextException; import org.codehaus.plexus.logging.AbstractLogEnabled; import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable; +import org.codehaus.plexus.util.xml.Xpp3Dom; +import org.codehaus.plexus.util.xml.Xpp3DomBuilder; -import java.util.Collections; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.HashSet; +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.*; +import java.util.jar.JarFile; /** * Used to locate extensions. @@ -69,6 +71,7 @@ private ArtifactMetadataSource artifactMetadataSource; + private PlexusContainer container; private ArtifactFilter artifactFilter = MavenArtifactFilterManager.createStandardFilter(); @@ -119,7 +122,9 @@ artifactMetadataSource, filter ); // create a child container for the extension // TODO: this could surely be simpler/different on trunk with the new classworlds + PlexusContainer extensionContainer = getExtensionContainer(); + if ( extensionContainer == null ) { extensionContainer = @@ -133,7 +138,25 @@ Set artifacts = result.getArtifacts(); - if ( artifacts.size() == 2 ) + // Lifecycles are loaded by the Lifecycle executor by looking up lifecycle definitions from the + // core container. So we need to look if an extension has a lifecycle mapping and use the container + // and not an extension container. (MNG-2831) + + if ( extensionContainsLifeycle( artifact.getFile() ) ) + { + for ( Iterator i = artifacts.iterator(); i.hasNext(); ) + { + Artifact a = (Artifact) i.next(); + + if ( artifactFilter.include( a ) ) + { + getLogger().debug( "Adding extension to core container: " + a.getFile() ); + + container.addJarResource( a.getFile() ); + } + } + } + else if ( artifacts.size() == 2 ) { for ( Iterator i = artifacts.iterator(); i.hasNext(); ) { @@ -215,5 +238,40 @@ return projectDependencyConflictId.equals( depConflictId ) || passThroughFilter.include( artifact ); } + } + + private boolean extensionContainsLifeycle( File extension ) + { + JarFile f; + + try + { + f = new JarFile( extension ); + + InputStream is = f.getInputStream( f.getEntry( "META-INF/plexus/components.xml" ) ); + + if ( is == null ) + { + return false; + } + + Xpp3Dom dom = Xpp3DomBuilder.build( new InputStreamReader( is ) ); + + Xpp3Dom[] components = dom.getChild( "components" ).getChildren( "component" ); + + for ( int i = 0; i < components.length; i++ ) + { + if ( components[i].getChild( "role" ).getValue().equals( "org.apache.maven.lifecycle.mapping.LifecycleMapping" ) ) + { + return true; + } + } + } + catch( Exception e ) + { + // do nothingls + } + + return false; } }