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;
     }
 }


Reply via email to