You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by br...@apache.org on 2007/01/03 08:59:09 UTC

svn commit: r492071 - in /maven/components/trunk: maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/ maven-core/src/main/java/org/apache/maven/extension/ maven-core/src/main/java/org/apache/maven/lifecycle/ maven-core/src/main/java...

Author: brett
Date: Tue Jan  2 23:59:08 2007
New Revision: 492071

URL: http://svn.apache.org/viewvc?view=rev&rev=492071
Log:
[MNG-2228] put extensions in a child container. This guarantees separation avoiding root classloader pollution that was causing plugins such as the release plugin to fail when using wagon-webdav.
Merged from: r492068, maven-2.0.x branch

Modified:
    maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
    maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonManager.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java
    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/plugin/DefaultPluginManager.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java
    maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml

Modified: maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java?view=diff&rev=492071&r1=492070&r2=492071
==============================================================================
--- maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java (original)
+++ maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java Tue Jan  2 23:59:08 2007
@@ -53,6 +53,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.security.NoSuchAlgorithmException;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -89,6 +90,9 @@
 
     private boolean interactive = true;
 
+    private Map availableWagons = new HashMap();
+
+    // TODO: this leaks the component in the public api - it is never released back to the container
     public Wagon getWagon( Repository repository )
         throws UnsupportedProtocolException, WagonConfigurationException
     {
@@ -109,26 +113,39 @@
     public Wagon getWagon( String protocol )
         throws UnsupportedProtocolException
     {
-        Wagon wagon;
+        PlexusContainer container = getWagonContainer( protocol );
 
+        Wagon wagon;
         try
         {
             wagon = (Wagon) container.lookup( Wagon.ROLE, protocol );
-            wagon.setInteractive( interactive );
         }
-        catch ( ComponentLookupException e )
+        catch ( ComponentLookupException e1 )
         {
             throw new UnsupportedProtocolException(
-                "Cannot find wagon which supports the requested protocol: " + protocol, e );
+                "Cannot find wagon which supports the requested protocol: " + protocol, e1 );
         }
 
+        wagon.setInteractive( interactive );
+
         return wagon;
     }
 
-    public void putArtifact( File source, Artifact artifact, ArtifactRepository repository )
+    private PlexusContainer getWagonContainer( String protocol )
+    {
+        PlexusContainer container = this.container;
+
+        if ( availableWagons.containsKey( protocol ) )
+        {
+            container = (PlexusContainer) availableWagons.get( protocol );
+        }
+        return container;
+    }
+
+    public void putArtifact( File source, Artifact artifact, ArtifactRepository deploymentRepository )
         throws TransferFailedException
     {
-        putRemoteFile( repository, source, repository.pathOf( artifact ), downloadMonitor );
+        putRemoteFile( deploymentRepository, source, deploymentRepository.pathOf( artifact ), downloadMonitor );
     }
 
     public void putArtifactMetadata( File source, ArtifactMetadata artifactMetadata, ArtifactRepository repository )
@@ -248,7 +265,7 @@
         {
             disconnectWagon( wagon );
 
-            releaseWagon( wagon );
+            releaseWagon( protocol, wagon );
         }
     }
 
@@ -331,8 +348,6 @@
 
         failIfNotOnline();
 
-        Wagon wagon;
-
         ArtifactRepository mirror = getMirror( repository.getId() );
         if ( mirror != null )
         {
@@ -342,6 +357,7 @@
         }
 
         String protocol = repository.getProtocol();
+        Wagon wagon;
         try
         {
             wagon = getWagon( protocol );
@@ -507,7 +523,7 @@
         {
             disconnectWagon( wagon );
 
-            releaseWagon( wagon );
+            releaseWagon( protocol, wagon );
         }
 
         if ( downloaded )
@@ -631,8 +647,9 @@
         }
     }
 
-    private void releaseWagon( Wagon wagon )
+    private void releaseWagon( String protocol, Wagon wagon )
     {
+        PlexusContainer container = getWagonContainer( protocol );
         try
         {
             container.release( wagon );
@@ -765,6 +782,13 @@
         this.interactive = interactive;
     }
 
+    public void registerWagons( Collection wagons, PlexusContainer extensionContainer )
+    {
+        for ( Iterator i = wagons.iterator(); i.hasNext(); )
+        {
+            availableWagons.put( i.next(), extensionContainer );
+        }
+    }
 
     /**
      * Applies the server configuration to the wagon

Modified: maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonManager.java?view=diff&rev=492071&r1=492070&r2=492071
==============================================================================
--- maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonManager.java (original)
+++ maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonManager.java Tue Jan  2 23:59:08 2007
@@ -27,14 +27,16 @@
 import org.apache.maven.wagon.events.TransferListener;
 import org.apache.maven.wagon.proxy.ProxyInfo;
 import org.apache.maven.wagon.repository.Repository;
+import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
 
 import java.io.File;
+import java.util.Collection;
 import java.util.List;
 
 /**
  * Manages <a href="http://maven.apache.org/wagon">Wagon</a> related operations in Maven.
- * 
+ *
  * @author <a href="michal.maczka@dimatics.com">Michal Maczka </a>
  * @version $Id$
  */
@@ -45,12 +47,11 @@
     /**
      * Get a Wagon provider that understands the protocol passed as argument.
      * It doesn't configure the Wagon.
-     * 
-     * @deprecated prone to errors. use {@link #getWagon(Repository)} instead.
-     * 
+     *
      * @param protocol the protocol the {@link Wagon} will handle
      * @return the {@link Wagon} instance able to handle the protocol provided
      * @throws UnsupportedProtocolException if there is no provider able to handle the protocol
+     * @deprecated prone to errors. use {@link #getWagon(Repository)} instead.
      */
     Wagon getWagon( String protocol )
         throws UnsupportedProtocolException;
@@ -58,11 +59,11 @@
     /**
      * Get a Wagon provider for the provided repository.
      * It will configure the Wagon for that repository.
-     * 
+     *
      * @param repository the repository
      * @return the {@link Wagon} instance that can be used to connect to the repository
      * @throws UnsupportedProtocolException if there is no provider able to handle the protocol
-     * @throws WagonConfigurationException if the wagon can't be configured for the repository
+     * @throws WagonConfigurationException  if the wagon can't be configured for the repository
      */
     Wagon getWagon( Repository repository )
         throws UnsupportedProtocolException, WagonConfigurationException;
@@ -82,9 +83,9 @@
     void getArtifactMetadata( ArtifactMetadata metadata, ArtifactRepository remoteRepository, File destination,
                               String checksumPolicy )
         throws TransferFailedException, ResourceDoesNotExistException;
-    
+
     void setOnline( boolean online );
-    
+
     boolean isOnline();
 
     void addProxy( String protocol, String host, int port, String username, String password, String nonProxyHosts );
@@ -103,12 +104,14 @@
     AuthenticationInfo getAuthenticationInfo( String id );
 
     /**
-     * Set the configuration for a repository 
-     * 
-     * @param repositoryId id of the repository to set the configuration to
-     * @param configuration dom tree of the xml with the configuration for the {@link Wagon} 
+     * Set the configuration for a repository
+     *
+     * @param repositoryId  id of the repository to set the configuration to
+     * @param configuration dom tree of the xml with the configuration for the {@link Wagon}
      */
     void addConfiguration( String repositoryId, Xpp3Dom configuration );
 
     void setInteractive( boolean interactive );
+
+    void registerWagons( Collection wagons, PlexusContainer extensionContainer );
 }

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java?view=diff&rev=492071&r1=492070&r2=492071
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java Tue Jan  2 23:59:08 2007
@@ -19,6 +19,7 @@
 import org.apache.maven.MavenArtifactFilterManager;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.artifact.manager.WagonManager;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
@@ -26,21 +27,21 @@
 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
 import org.apache.maven.model.Extension;
-import org.apache.maven.plugin.PluginManager;
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.wagon.Wagon;
 import org.codehaus.plexus.PlexusConstants;
 import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.PlexusContainerException;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.codehaus.plexus.context.Context;
 import org.codehaus.plexus.context.ContextException;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.List;
-import java.util.ArrayList;
+import java.util.Map;
 
 /**
  * Used to locate extensions.
@@ -50,6 +51,7 @@
  * @version $Id$
  */
 public class DefaultExtensionManager
+    extends AbstractLogEnabled
     implements ExtensionManager, Contextualizable
 {
     private ArtifactResolver artifactResolver;
@@ -58,15 +60,19 @@
 
     private PlexusContainer container;
 
-    private PluginManager pluginManager;
-
     private ArtifactFilter artifactFilter = MavenArtifactFilterManager.createStandardFilter();
 
+    private WagonManager wagonManager;
+
+    private static final String CONTAINER_NAME = "extensions";
+
     public void addExtension( Extension extension, MavenProject project, ArtifactRepository localRepository )
         throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException
     {
         String extensionId = ArtifactUtils.versionlessKey( extension.getGroupId(), extension.getArtifactId() );
 
+        getLogger().debug( "Initialising extension: " + extensionId );
+
         Artifact artifact = (Artifact) project.getExtensionArtifactMap().get( extensionId );
 
         if ( artifact != null )
@@ -79,19 +85,51 @@
                                                                                     project.getRemoteArtifactRepositories(),
                                                                                     artifactMetadataSource, filter );
 
-            List excludedArtifacts = new ArrayList( result.getArtifacts().size() );
+            // 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 = container.createChildContainer( CONTAINER_NAME,
+                                                                     Collections.singletonList( artifact.getFile() ),
+                                                                     Collections.EMPTY_MAP );
+            }
+
             for ( Iterator i = result.getArtifacts().iterator(); i.hasNext(); )
             {
                 Artifact a = (Artifact) i.next();
 
-                excludedArtifacts.add( ArtifactUtils.versionlessKey( a ) );
-
                 a = project.replaceWithActiveArtifact( a );
 
-                container.addJarResource( a.getFile() );
+                getLogger().debug( "Adding to extension classpath: " + a.getFile() );
+
+                extensionContainer.addJarResource( a.getFile() );
             }
-            pluginManager.addToArtifactFilter( new ExcludesArtifactFilter( excludedArtifacts )  );
         }
+    }
+
+    public void registerWagons()
+    {
+        PlexusContainer extensionContainer = getExtensionContainer();
+        if ( extensionContainer != null )
+        {
+            try
+            {
+                Map wagons = extensionContainer.lookupMap( Wagon.ROLE );
+                wagonManager.registerWagons( wagons.keySet(), extensionContainer );
+            }
+            catch ( ComponentLookupException e )
+            {
+                // now wagons found in the extension
+            }
+        }
+    }
+
+    private PlexusContainer getExtensionContainer()
+    {
+        // note: ideally extensions would live in their own realm, but this would mean that things like wagon-scm would
+        // have no way to obtain SCM extensions
+        return container.getChildContainer( CONTAINER_NAME );
     }
 
     public void contextualize( Context context )

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java?view=diff&rev=492071&r1=492070&r2=492071
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java Tue Jan  2 23:59:08 2007
@@ -33,4 +33,6 @@
 {
     void addExtension( Extension extension, MavenProject project, ArtifactRepository localRepository )
         throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException;
+
+    void registerWagons();
 }

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?view=diff&rev=492071&r1=492070&r2=492071
==============================================================================
--- 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 Tue Jan  2 23:59:08 2007
@@ -168,6 +168,8 @@
                 }
             }
 
+            extensionManager.registerWagons();
+
             try
             {
                 Map handlers = findArtifactTypeHandlers( project, session.getSettings(), session.getLocalRepository() );

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?view=diff&rev=492071&r1=492070&r2=492071
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java Tue Jan  2 23:59:08 2007
@@ -1198,12 +1198,4 @@
     {
         return container.lookupMap( role );
     }
-
-    public void addToArtifactFilter( ArtifactFilter filter )
-    {
-        AndArtifactFilter newFilter = new AndArtifactFilter();
-        newFilter.add( filter );
-        newFilter.add( artifactFilter );
-        artifactFilter = newFilter;
-    }
 }

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java?view=diff&rev=492071&r1=492070&r2=492071
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java Tue Jan  2 23:59:08 2007
@@ -19,8 +19,6 @@
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
-import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Plugin;
@@ -73,5 +71,4 @@
     Map getPluginComponents( Plugin plugin, String role )
         throws ComponentLookupException, PluginManagerException;
 
-    void addToArtifactFilter( ArtifactFilter filter );
 }

Modified: maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml?view=diff&rev=492071&r1=492070&r2=492071
==============================================================================
--- maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml (original)
+++ maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml Tue Jan  2 23:59:08 2007
@@ -45,7 +45,7 @@
           <role>org.apache.maven.artifact.metadata.ArtifactMetadataSource</role>
         </requirement>
         <requirement>
-          <role>org.apache.maven.plugin.PluginManager</role>
+          <role>org.apache.maven.artifact.manager.WagonManager</role>
         </requirement>
       </requirements>
     </component>
@@ -328,7 +328,8 @@
               <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
               <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
               <process-test-resources>
-                org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
+                org.apache.maven.plugins:maven-resources-plugin:testResources
+              </process-test-resources>
               <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
               <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
               <package>
@@ -357,7 +358,8 @@
               <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
               <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
               <process-test-resources>
-                org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
+                org.apache.maven.plugins:maven-resources-plugin:testResources
+              </process-test-resources>
               <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
               <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
               <package>
@@ -391,7 +393,8 @@
               <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
               <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
               <process-test-resources>
-                org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
+                org.apache.maven.plugins:maven-resources-plugin:testResources
+              </process-test-resources>
               <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
               <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
               <package>
@@ -419,7 +422,8 @@
               <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
               <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
               <process-test-resources>
-                org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
+                org.apache.maven.plugins:maven-resources-plugin:testResources
+              </process-test-resources>
               <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
               <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
               <package>org.apache.maven.plugins:maven-war-plugin:war</package>
@@ -443,7 +447,8 @@
             <!-- START SNIPPET: ear-lifecycle -->
             <phases>
               <generate-resources>
-                org.apache.maven.plugins:maven-ear-plugin:generate-application-xml</generate-resources>
+                org.apache.maven.plugins:maven-ear-plugin:generate-application-xml
+              </generate-resources>
               <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
               <package>org.apache.maven.plugins:maven-ear-plugin:ear</package>
               <install>org.apache.maven.plugins:maven-install-plugin:install</install>
@@ -468,7 +473,8 @@
               <process-resources>org.apache.maven.plugins:maven-resources-plugin:resources</process-resources>
               <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
               <process-test-resources>
-                org.apache.maven.plugins:maven-resources-plugin:testResources</process-test-resources>
+                org.apache.maven.plugins:maven-resources-plugin:testResources
+              </process-test-resources>
               <test-compile>org.apache.maven.plugins:maven-compiler-plugin:testCompile</test-compile>
               <test>org.apache.maven.plugins:maven-surefire-plugin:test</test>
               <package>org.apache.maven.plugins:maven-rar-plugin:rar</package>
@@ -480,7 +486,7 @@
         </lifecycles>
       </configuration>
     </component>
-    
+
     <component>
       <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
       <role-hint>par</role-hint>
@@ -502,7 +508,7 @@
         <!-- END SNIPPET: par-lifecycle -->
       </configuration>
     </component>
-    
+
     <component>
       <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
       <role-hint>ejb3</role-hint>
@@ -524,7 +530,7 @@
         <!-- END SNIPPET: ejb3-lifecycle -->
       </configuration>
     </component>
- 
+
     <component>
       <role>org.apache.maven.plugin.version.PluginVersionManager</role>
       <role-hint>default</role-hint>