You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2008/02/01 00:29:23 UTC

svn commit: r617293 - in /maven/components/trunk: maven-core/src/main/aspect/org/apache/maven/errors/ maven-core/src/main/java/org/apache/maven/lifecycle/binding/ maven-core/src/main/java/org/apache/maven/plugin/ maven-core/src/main/java/org/apache/mav...

Author: jdcasey
Date: Thu Jan 31 15:29:18 2008
New Revision: 617293

URL: http://svn.apache.org/viewvc?rev=617293&view=rev
Log:
Refactor the artifact-scanning logic from the realm manager and the plugin-artifact resolution logic in the plugin manager into two separate classes, one a component and one a static class, to allow the new PluginPrefixLoader to reuse some of both and create a lighter-weight approach to grabbing the PluginDescriptor for build-planning purposes...also avoids some needless error messages during build planning.

Added:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManagerSupport.java   (with props)
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManagerSupport.java   (with props)
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginPrefixLoader.java   (with props)
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginPrefixLoader.java   (with props)
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/RealmScanningUtils.java   (with props)
Modified:
    maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/ExtensionErrorReporterAspect.aj
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultMojoBindingFactory.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/loader/DefaultPluginLoader.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginLoader.java
    maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml
    maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/DefaultMavenRealmManager.java

Modified: maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/ExtensionErrorReporterAspect.aj
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/ExtensionErrorReporterAspect.aj?rev=617293&r1=617292&r2=617293&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/ExtensionErrorReporterAspect.aj (original)
+++ maven/components/trunk/maven-core/src/main/aspect/org/apache/maven/errors/ExtensionErrorReporterAspect.aj Thu Jan 31 15:29:18 2008
@@ -14,6 +14,7 @@
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.plugin.InvalidPluginException;
 import org.apache.maven.plugin.PluginManager;
+import org.apache.maven.plugin.PluginManagerSupport;
 import org.apache.maven.plugin.PluginManagerException;
 import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.model.Model;
@@ -215,7 +216,7 @@
         cflow( dem_addPluginAsExtension( Plugin, originModel, remoteRepos, request ) )
         && cflow( execution( * PluginManager+.verifyPlugin( .. ) ) )
         && cflow( dpm_verifyVersionedPlugin( plugin ) )
-        && call( private void DefaultPluginManager.checkRequiredMavenVersion( .. ) )
+        && call( void PluginManagerSupport+.checkRequiredMavenVersion( .. ) )
     {
         getReporter().reportIncompatibleMavenVersionForExtensionPlugin( plugin, originModel, remoteRepos, request, requiredVersion, currentVersion, err );
     }

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultMojoBindingFactory.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultMojoBindingFactory.java?rev=617293&r1=617292&r2=617293&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultMojoBindingFactory.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/binding/DefaultMojoBindingFactory.java Thu Jan 31 15:29:18 2008
@@ -4,9 +4,10 @@
 import org.apache.maven.lifecycle.LifecycleLoaderException;
 import org.apache.maven.lifecycle.LifecycleSpecificationException;
 import org.apache.maven.lifecycle.model.MojoBinding;
-import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.model.Plugin;
 import org.apache.maven.plugin.loader.PluginLoader;
 import org.apache.maven.plugin.loader.PluginLoaderException;
+import org.apache.maven.plugin.loader.PluginPrefixLoader;
 import org.apache.maven.project.MavenProject;
 
 import java.util.StringTokenizer;
@@ -22,7 +23,7 @@
     implements MojoBindingFactory
 {
 
-    PluginLoader pluginLoader;
+    PluginPrefixLoader pluginPrefixLoader;
 
     /**
      * Parse the specified mojo string into a MojoBinding, optionally allowing plugin-prefix references.
@@ -49,10 +50,10 @@
 
             String prefix = tok.nextToken();
 
-            PluginDescriptor pluginDescriptor;
+            Plugin plugin;
             try
             {
-                pluginDescriptor = pluginLoader.findPluginForPrefix( prefix, project, session );
+                plugin = pluginPrefixLoader.findPluginForPrefix( prefix, project, session );
             }
             catch ( PluginLoaderException e )
             {
@@ -61,8 +62,8 @@
                                                     e );
             }
 
-            binding = createMojoBinding( pluginDescriptor.getGroupId(), pluginDescriptor.getArtifactId(),
-                                         pluginDescriptor.getVersion(), tok.nextToken(), project );
+            binding = createMojoBinding( plugin.getGroupId(), plugin.getArtifactId(),
+                                         plugin.getVersion(), tok.nextToken(), project );
         }
         else if ( ( numTokens == 3 ) || ( numTokens == 4 ) )
         {

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?rev=617293&r1=617292&r2=617293&view=diff
==============================================================================
--- 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 Thu Jan 31 15:29:18 2008
@@ -53,7 +53,6 @@
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectBuilder;
-import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.project.artifact.InvalidDependencyVersionException;
 import org.apache.maven.project.artifact.MavenMetadataSource;
 import org.apache.maven.project.path.PathTranslator;
@@ -133,6 +132,8 @@
 
     protected PluginMappingManager pluginMappingManager;
 
+    private PluginManagerSupport pluginManagerSupport;
+
     // END component requirements
 
     public DefaultPluginManager()
@@ -201,37 +202,7 @@
             // if the groupId is internal, don't try to resolve it...
             if ( !RESERVED_GROUP_IDS.contains( plugin.getGroupId() ) )
             {
-                VersionRange versionRange;
-                try
-                {
-                    versionRange = VersionRange.createFromVersionSpec( plugin.getVersion() );
-                }
-                catch ( InvalidVersionSpecificationException e )
-                {
-                    throw new PluginManagerException( plugin, e );
-                }
-
-                List remoteRepositories = new ArrayList();
-
-//                remoteRepositories.addAll( project.getPluginArtifactRepositories() );
-
-                remoteRepositories.addAll( project.getRemoteArtifactRepositories() );
-
-                MavenProject pluginProject = buildPluginProject( plugin, localRepository, remoteRepositories );
-
-                checkRequiredMavenVersion( plugin, pluginProject, localRepository, remoteRepositories );
-
-                checkPluginDependencySpec( plugin, pluginProject );
-
-                Artifact pluginArtifact = artifactFactory.createPluginArtifact(
-                                                                                plugin.getGroupId(),
-                                                                                plugin.getArtifactId(),
-                                                                                versionRange );
-
-                pluginArtifact = project.replaceWithActiveArtifact( pluginArtifact );
-
-                artifactResolver.resolve( pluginArtifact, project.getRemoteArtifactRepositories(),
-                                          localRepository );
+                Artifact pluginArtifact = pluginManagerSupport.resolvePluginArtifact( plugin, project, session );
 
                 addPlugin( plugin, pluginArtifact, project, session );
             }
@@ -272,70 +243,6 @@
         setDescriptorClassAndArtifactInfo( pluginDescriptor, project, session, new ArrayList() );
 
         return pluginDescriptor;
-    }
-
-    private void checkPluginDependencySpec( Plugin plugin,
-                                            MavenProject pluginProject )
-        throws InvalidPluginException
-    {
-        ArtifactFilter filter = new ScopeArtifactFilter( "runtime" );
-        try
-        {
-            pluginProject.createArtifacts( artifactFactory, null, filter );
-        }
-        catch ( InvalidDependencyVersionException e )
-        {
-            throw new InvalidPluginException( "Plugin: " + plugin.getKey() + " has a dependency with an invalid version.", e );
-        }
-    }
-
-    private MavenProject buildPluginProject( Plugin plugin,
-                                             ArtifactRepository localRepository,
-                                             List remoteRepositories )
-        throws InvalidPluginException
-    {
-        Artifact artifact = artifactFactory.createProjectArtifact( plugin.getGroupId(),
-                                                                   plugin.getArtifactId(),
-                                                                   plugin.getVersion() );
-
-        try
-        {
-            return mavenProjectBuilder.buildFromRepository( artifact,
-                                                            remoteRepositories,
-                                                            localRepository );
-        }
-        catch ( ProjectBuildingException e )
-        {
-            throw new InvalidPluginException( "Unable to build project for plugin '"
-                                              + plugin.getKey() + "': " + e.getMessage(), e );
-        }
-    }
-
-    /**
-     * @param pluginProject
-     * @todo would be better to store this in the plugin descriptor, but then it won't be available to the version
-     * manager which executes before the plugin is instantiated
-     */
-    private void checkRequiredMavenVersion( Plugin plugin,
-                                            MavenProject pluginProject,
-                                            ArtifactRepository localRepository,
-                                            List remoteRepositories )
-        throws PluginVersionResolutionException, InvalidPluginException
-    {
-        // if we don't have the required Maven version, then ignore an update
-        if ( ( pluginProject.getPrerequisites() != null )
-             && ( pluginProject.getPrerequisites().getMaven() != null ) )
-        {
-            DefaultArtifactVersion requiredVersion = new DefaultArtifactVersion( pluginProject.getPrerequisites().getMaven() );
-
-            if ( runtimeInformation.getApplicationVersion().compareTo( requiredVersion ) < 0 )
-            {
-                throw new PluginVersionResolutionException( plugin.getGroupId(),
-                                                            plugin.getArtifactId(),
-                                                            "Plugin requires Maven version "
-                                                                            + requiredVersion );
-            }
-        }
     }
 
     protected void addPlugin( Plugin plugin,

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManagerSupport.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManagerSupport.java?rev=617293&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManagerSupport.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManagerSupport.java Thu Jan 31 15:29:18 2008
@@ -0,0 +1,262 @@
+package org.apache.maven.plugin;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+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.ArtifactResolver;
+import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
+import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
+import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.execution.RuntimeInformation;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.version.PluginVersionManager;
+import org.apache.maven.plugin.version.PluginVersionNotFoundException;
+import org.apache.maven.plugin.version.PluginVersionResolutionException;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.project.MavenProjectBuilder;
+import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.project.artifact.InvalidDependencyVersionException;
+import org.apache.maven.realm.RealmManagementException;
+import org.apache.maven.realm.RealmScanningUtils;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
+import org.codehaus.plexus.logging.LogEnabled;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DefaultPluginManagerSupport
+    implements PluginManagerSupport, LogEnabled, Contextualizable
+{
+
+    private ArtifactResolver artifactResolver;
+
+    private ArtifactFactory artifactFactory;
+
+    private MavenProjectBuilder mavenProjectBuilder;
+
+    private RuntimeInformation runtimeInformation;
+
+    private PluginVersionManager pluginVersionManager;
+
+    private Logger logger;
+
+    private Context containerContext;
+
+    public Artifact resolvePluginArtifact( Plugin plugin,
+                                           MavenProject project,
+                                           MavenSession session )
+        throws PluginManagerException, InvalidPluginException, PluginVersionResolutionException,
+        ArtifactResolutionException, ArtifactNotFoundException
+    {
+        ArtifactRepository localRepository = session.getLocalRepository();
+
+        VersionRange versionRange;
+        try
+        {
+            versionRange = VersionRange.createFromVersionSpec( plugin.getVersion() );
+        }
+        catch ( InvalidVersionSpecificationException e )
+        {
+            throw new PluginManagerException( plugin, e );
+        }
+
+        List remoteRepositories = new ArrayList();
+
+//        remoteRepositories.addAll( project.getPluginArtifactRepositories() );
+
+        remoteRepositories.addAll( project.getRemoteArtifactRepositories() );
+
+        MavenProject pluginProject = buildPluginProject( plugin,
+                                                         localRepository,
+                                                         remoteRepositories );
+
+        checkRequiredMavenVersion( plugin, pluginProject, localRepository, remoteRepositories );
+
+        checkPluginDependencySpec( plugin, pluginProject );
+
+        Artifact pluginArtifact = artifactFactory.createPluginArtifact( plugin.getGroupId(),
+                                                                        plugin.getArtifactId(),
+                                                                        versionRange );
+
+        pluginArtifact = project.replaceWithActiveArtifact( pluginArtifact );
+
+        artifactResolver.resolve( pluginArtifact, remoteRepositories, localRepository );
+
+        return pluginArtifact;
+    }
+
+    public MavenProject buildPluginProject( Plugin plugin,
+                                            ArtifactRepository localRepository,
+                                            List remoteRepositories )
+        throws InvalidPluginException
+    {
+        Artifact artifact = artifactFactory.createProjectArtifact( plugin.getGroupId(),
+                                                                   plugin.getArtifactId(),
+                                                                   plugin.getVersion() );
+
+        try
+        {
+            return mavenProjectBuilder.buildFromRepository( artifact,
+                                                            remoteRepositories,
+                                                            localRepository );
+        }
+        catch ( ProjectBuildingException e )
+        {
+            throw new InvalidPluginException( "Unable to build project for plugin '"
+                                              + plugin.getKey() + "': " + e.getMessage(), e );
+        }
+    }
+
+    /**
+     * @param pluginProject
+     * @todo would be better to store this in the plugin descriptor, but then it won't be available to the version
+     * manager which executes before the plugin is instantiated
+     */
+    public void checkRequiredMavenVersion( Plugin plugin,
+                                           MavenProject pluginProject,
+                                           ArtifactRepository localRepository,
+                                           List remoteRepositories )
+        throws PluginVersionResolutionException, InvalidPluginException
+    {
+        // if we don't have the required Maven version, then ignore an update
+        if ( ( pluginProject.getPrerequisites() != null )
+             && ( pluginProject.getPrerequisites().getMaven() != null ) )
+        {
+            DefaultArtifactVersion requiredVersion = new DefaultArtifactVersion(
+                                                                                 pluginProject.getPrerequisites()
+                                                                                              .getMaven() );
+
+            if ( runtimeInformation.getApplicationVersion().compareTo( requiredVersion ) < 0 )
+            {
+                throw new PluginVersionResolutionException( plugin.getGroupId(),
+                                                            plugin.getArtifactId(),
+                                                            "Plugin requires Maven version "
+                                                                            + requiredVersion );
+            }
+        }
+    }
+
+    public void checkPluginDependencySpec( Plugin plugin,
+                                           MavenProject pluginProject )
+        throws InvalidPluginException
+    {
+        ArtifactFilter filter = new ScopeArtifactFilter( "runtime" );
+        try
+        {
+            pluginProject.createArtifacts( artifactFactory, null, filter );
+        }
+        catch ( InvalidDependencyVersionException e )
+        {
+            throw new InvalidPluginException( "Plugin: " + plugin.getKey()
+                                              + " has a dependency with an invalid version.", e );
+        }
+    }
+
+    public PluginDescriptor loadIsolatedPluginDescriptor( Plugin plugin,
+                                                          MavenProject project,
+                                                          MavenSession session )
+    {
+        if ( plugin.getVersion() == null )
+        {
+            try
+            {
+                plugin.setVersion( pluginVersionManager.resolvePluginVersion( plugin.getGroupId(),
+                                                                              plugin.getArtifactId(),
+                                                                              project,
+                                                                              session ) );
+            }
+            catch ( PluginVersionResolutionException e )
+            {
+                logger.debug( "Failed to load plugin descriptor for: " + plugin.getKey(), e );
+            }
+            catch ( InvalidPluginException e )
+            {
+                logger.debug( "Failed to load plugin descriptor for: " + plugin.getKey(), e );
+            }
+            catch ( PluginVersionNotFoundException e )
+            {
+                logger.debug( "Failed to load plugin descriptor for: " + plugin.getKey(), e );
+            }
+        }
+
+        if ( plugin.getVersion() == null )
+        {
+            return null;
+        }
+
+        Artifact artifact = null;
+        try
+        {
+            artifact = resolvePluginArtifact( plugin, project, session );
+        }
+        catch ( ArtifactResolutionException e )
+        {
+            logger.debug( "Failed to load plugin descriptor for: " + plugin.getKey(), e );
+        }
+        catch ( ArtifactNotFoundException e )
+        {
+            logger.debug( "Failed to load plugin descriptor for: " + plugin.getKey(), e );
+        }
+        catch ( PluginManagerException e )
+        {
+            logger.debug( "Failed to load plugin descriptor for: " + plugin.getKey(), e );
+        }
+        catch ( InvalidPluginException e )
+        {
+            logger.debug( "Failed to load plugin descriptor for: " + plugin.getKey(), e );
+        }
+        catch ( PluginVersionResolutionException e )
+        {
+            logger.debug( "Failed to load plugin descriptor for: " + plugin.getKey(), e );
+        }
+
+        if ( artifact == null )
+        {
+            return null;
+        }
+
+        MavenPluginDiscoverer discoverer = new MavenPluginDiscoverer();
+        discoverer.setManager( RealmScanningUtils.getDummyComponentDiscovererManager() );
+
+        try
+        {
+            List componentSetDescriptors = RealmScanningUtils.scanForComponentSetDescriptors( artifact,
+                                                                                              discoverer,
+                                                                                              containerContext,
+                                                                                              "Plugin: "
+                                                                                                              + plugin.getKey() );
+
+            if ( !componentSetDescriptors.isEmpty() )
+            {
+                return (PluginDescriptor) componentSetDescriptors.get( 0 );
+            }
+        }
+        catch ( RealmManagementException e )
+        {
+            logger.debug( "Failed to scan plugin artifact: " + artifact.getId()
+                          + " for descriptors.", e );
+        }
+
+        return null;
+    }
+
+    public void enableLogging( Logger logger )
+    {
+        this.logger = logger;
+    }
+
+    public void contextualize( Context context )
+        throws ContextException
+    {
+        containerContext = context;
+    }
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManagerSupport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManagerSupport.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManagerSupport.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManagerSupport.java?rev=617293&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManagerSupport.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManagerSupport.java Thu Jan 31 15:29:18 2008
@@ -0,0 +1,48 @@
+package org.apache.maven.plugin;
+
+import org.apache.maven.artifact.Artifact;
+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.execution.MavenSession;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.plugin.version.PluginVersionResolutionException;
+import org.apache.maven.project.MavenProject;
+
+import java.util.List;
+
+public interface PluginManagerSupport
+{
+
+    Artifact resolvePluginArtifact( Plugin plugin,
+                                    MavenProject project,
+                                    MavenSession session )
+        throws PluginManagerException, InvalidPluginException, PluginVersionResolutionException,
+        ArtifactResolutionException, ArtifactNotFoundException;
+
+    MavenProject buildPluginProject( Plugin plugin,
+                                     ArtifactRepository localRepository,
+                                     List remoteRepositories )
+        throws InvalidPluginException;
+
+    /**
+     * @param pluginProject
+     * @todo would be better to store this in the plugin descriptor, but then it won't be available to the version
+     * manager which executes before the plugin is instantiated
+     */
+    void checkRequiredMavenVersion( Plugin plugin,
+                                    MavenProject pluginProject,
+                                    ArtifactRepository localRepository,
+                                    List remoteRepositories )
+        throws PluginVersionResolutionException, InvalidPluginException;
+
+    void checkPluginDependencySpec( Plugin plugin,
+                                    MavenProject pluginProject )
+        throws InvalidPluginException;
+
+    PluginDescriptor loadIsolatedPluginDescriptor( Plugin plugin,
+                                                   MavenProject project,
+                                                   MavenSession session );
+
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManagerSupport.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManagerSupport.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginLoader.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginLoader.java?rev=617293&r1=617292&r2=617293&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginLoader.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginLoader.java Thu Jan 31 15:29:18 2008
@@ -8,23 +8,16 @@
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.plugin.InvalidPluginException;
-import org.apache.maven.plugin.MavenPluginCollector;
 import org.apache.maven.plugin.PluginManager;
 import org.apache.maven.plugin.PluginManagerException;
-import org.apache.maven.plugin.PluginMappingManager;
 import org.apache.maven.plugin.PluginNotFoundException;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
 import org.apache.maven.plugin.version.PluginVersionNotFoundException;
 import org.apache.maven.plugin.version.PluginVersionResolutionException;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.settings.Settings;
 import org.codehaus.plexus.logging.LogEnabled;
 import org.codehaus.plexus.logging.Logger;
 
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
 /**
  * Responsible for loading plugins, reports, and any components contained therein. Will resolve
  * plugin versions and plugin prefixes as necessary for plugin resolution.
@@ -41,10 +34,6 @@
     // FIXME: Move the functionality used from this into the PluginLoader when PluginManager refactor is complete.
     private PluginManager pluginManager;
 
-    private PluginMappingManager pluginMappingManager;
-
-    private MavenPluginCollector pluginCollector;
-
     /**
      * Load the {@link PluginDescriptor} instance for the plugin implied by the specified MojoBinding,
      * using the project for {@link ArtifactRepository} and other supplemental plugin information as
@@ -68,117 +57,6 @@
             mojoBinding.setGroupId( pluginDescriptor.getGroupId() );
             mojoBinding.setArtifactId( pluginDescriptor.getArtifactId() );
             mojoBinding.setVersion( pluginDescriptor.getVersion() );
-        }
-
-        return pluginDescriptor;
-    }
-
-    /**
-     * Determine the appropriate {@link PluginDescriptor} instance for use with the specified plugin
-     * prefix, using the following strategies (in order):
-     * <br/>
-     * <ol>
-     *   <li>Search for a plugin that has already been loaded with the specified prefix</li>
-     *   <li>Search for a plugin configured in the POM that has a matching prefix</li>
-     *   <li>Search the pluginGroups specified in the settings.xml for a matching plugin</li>
-     *   <li>Use groupId == org.apache.maven.plugins, and artifactId == maven-&lt;prefix&gt;-plugin,
-     *         and try to resolve based on that.</li>
-     * </ol>
-     */
-    public PluginDescriptor findPluginForPrefix( String prefix, MavenProject project, MavenSession session )
-        throws PluginLoaderException
-    {
-        Set descriptors = pluginCollector.getPluginDescriptorsForPrefix( prefix );
-        Map projectPluginMap = project.getBuild().getPluginsAsMap();
-
-        PluginDescriptor pluginDescriptor = null;
-        if ( descriptors != null )
-        {
-            for ( Iterator it = descriptors.iterator(); it.hasNext(); )
-            {
-                PluginDescriptor pd = (PluginDescriptor) it.next();
-
-                Plugin projectPlugin = (Plugin) projectPluginMap.get( pd.getPluginLookupKey() );
-                if ( ( projectPlugin != null ) && ( projectPlugin.getVersion() != null ) && projectPlugin.getVersion().equals( pd.getVersion() ) )
-                {
-                    pluginDescriptor = pd;
-                    break;
-                }
-            }
-        }
-
-        if ( pluginDescriptor == null )
-        {
-            pluginDescriptor = loadFromProject( prefix, project, session );
-        }
-
-        if ( pluginDescriptor == null )
-        {
-            pluginDescriptor = loadByPrefix( prefix, project, session );
-        }
-
-        if ( pluginDescriptor == null )
-        {
-            Plugin plugin = new Plugin();
-            plugin.setArtifactId( PluginDescriptor.getDefaultPluginArtifactId( prefix ) );
-
-            pluginDescriptor = loadPlugin( plugin, project, session );
-        }
-
-        if ( pluginDescriptor == null )
-        {
-            throw new PluginLoaderException( "Cannot find plugin with prefix: " + prefix );
-        }
-
-        return pluginDescriptor;
-    }
-
-    /**
-     * Look for a plugin configured in the current project that has a prefix matching the one
-     * specified. Return the {@link PluginDescriptor} if a match is found.
-     */
-    private PluginDescriptor loadFromProject( String prefix, MavenProject project, MavenSession session )
-        throws PluginLoaderException
-    {
-        PluginDescriptor result = null;
-
-        for ( Iterator it = project.getBuildPlugins().iterator(); it.hasNext(); )
-        {
-            Plugin plugin = (Plugin) it.next();
-
-            PluginDescriptor pluginDescriptor = loadPlugin( plugin, project, session );
-            if ( prefix.equals( pluginDescriptor.getGoalPrefix() ) )
-            {
-                result = pluginDescriptor;
-                break;
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Look for a plugin in the pluginGroups specified in the settings.xml that has a prefix
-     * matching the one specified. Return the {@link PluginDescriptor} if a match is found.
-     */
-    private PluginDescriptor loadByPrefix( String prefix, MavenProject project, MavenSession session )
-        throws PluginLoaderException
-    {
-        Settings settings = session.getSettings();
-
-        Plugin plugin = pluginMappingManager.getByPrefix( prefix, settings.getPluginGroups(),
-                                                          project.getRemoteArtifactRepositories(), session.getLocalRepository() );
-
-        PluginDescriptor pluginDescriptor = null;
-        if ( plugin != null )
-        {
-            Plugin projectPlugin = (Plugin) project.getBuild().getPluginsAsMap().get( plugin.getKey() );
-            if ( ( projectPlugin != null ) && ( projectPlugin.getVersion() != null ) )
-            {
-                plugin.setVersion( projectPlugin.getVersion() );
-            }
-
-            pluginDescriptor = loadPlugin( plugin, project, session );
         }
 
         return pluginDescriptor;

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginPrefixLoader.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginPrefixLoader.java?rev=617293&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginPrefixLoader.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginPrefixLoader.java Thu Jan 31 15:29:18 2008
@@ -0,0 +1,182 @@
+package org.apache.maven.plugin.loader;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.MavenPluginCollector;
+import org.apache.maven.plugin.PluginManagerSupport;
+import org.apache.maven.plugin.PluginMappingManager;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.project.MavenProject;
+import org.apache.maven.settings.Settings;
+import org.codehaus.plexus.logging.LogEnabled;
+import org.codehaus.plexus.logging.Logger;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+public class DefaultPluginPrefixLoader
+    implements PluginPrefixLoader, LogEnabled
+{
+
+    private Logger logger;
+
+    private PluginMappingManager pluginMappingManager;
+
+    private MavenPluginCollector pluginCollector;
+
+    private PluginManagerSupport pluginManagerSupport;
+
+    /**
+     * Determine the appropriate {@link PluginDescriptor} instance for use with the specified plugin
+     * prefix, using the following strategies (in order):
+     * <br/>
+     * <ol>
+     *   <li>Search for a plugin that has already been loaded with the specified prefix</li>
+     *   <li>Search for a plugin configured in the POM that has a matching prefix</li>
+     *   <li>Search the pluginGroups specified in the settings.xml for a matching plugin</li>
+     *   <li>Use groupId == org.apache.maven.plugins, and artifactId == maven-&lt;prefix&gt;-plugin,
+     *         and try to resolve based on that.</li>
+     * </ol>
+     */
+    public Plugin findPluginForPrefix( String prefix,
+                                       MavenProject project,
+                                       MavenSession session )
+        throws PluginLoaderException
+    {
+        Set descriptors = pluginCollector.getPluginDescriptorsForPrefix( prefix );
+        Map projectPluginMap = project.getBuild().getPluginsAsMap();
+
+        Plugin plugin = null;
+
+        if ( descriptors != null )
+        {
+            PluginDescriptor pluginDescriptor = null;
+
+            for ( Iterator it = descriptors.iterator(); it.hasNext(); )
+            {
+                PluginDescriptor pd = (PluginDescriptor) it.next();
+
+                Plugin projectPlugin = (Plugin) projectPluginMap.get( pd.getPluginLookupKey() );
+                if ( ( projectPlugin != null ) && ( projectPlugin.getVersion() != null )
+                     && projectPlugin.getVersion().equals( pd.getVersion() ) )
+                {
+                    pluginDescriptor = pd;
+                    break;
+                }
+            }
+
+            plugin = toPlugin( pluginDescriptor );
+        }
+
+        if ( plugin == null )
+        {
+            PluginDescriptor pluginDescriptor = loadFromProjectForPrefixQuery( prefix, project, session );
+
+            plugin = toPlugin( pluginDescriptor );
+        }
+
+        if ( plugin == null )
+        {
+            plugin = loadFromPrefixMapper( prefix, project, session );
+        }
+
+
+        if ( plugin == null )
+        {
+            plugin = new Plugin();
+            plugin.setArtifactId( PluginDescriptor.getDefaultPluginArtifactId( prefix ) );
+
+            PluginDescriptor pluginDescriptor = pluginManagerSupport.loadIsolatedPluginDescriptor( plugin,
+                                                                                                   project,
+                                                                                                   session );
+            plugin = toPlugin( pluginDescriptor );
+        }
+
+        if ( plugin == null )
+        {
+            throw new PluginLoaderException( "Cannot find plugin with prefix: " + prefix );
+        }
+
+        return plugin;
+    }
+
+    private Plugin toPlugin( PluginDescriptor pluginDescriptor )
+    {
+        if ( pluginDescriptor == null )
+        {
+            return null;
+        }
+
+        Plugin plugin = new Plugin();
+
+        plugin.setGroupId( pluginDescriptor.getGroupId() );
+        plugin.setArtifactId( pluginDescriptor.getArtifactId() );
+        plugin.setVersion( pluginDescriptor.getVersion() );
+
+        return plugin;
+    }
+
+    /**
+     * Look for a plugin configured in the current project that has a prefix matching the one
+     * specified. Return the {@link PluginDescriptor} if a match is found.
+     */
+    private PluginDescriptor loadFromProjectForPrefixQuery( String prefix,
+                                                            MavenProject project,
+                                                            MavenSession session )
+        throws PluginLoaderException
+    {
+        PluginDescriptor result = null;
+
+        for ( Iterator it = project.getBuildPlugins().iterator(); it.hasNext(); )
+        {
+            Plugin plugin = (Plugin) it.next();
+
+            PluginDescriptor pluginDescriptor = pluginManagerSupport.loadIsolatedPluginDescriptor( plugin,
+                                                                                                   project,
+                                                                                                   session );
+
+            if ( ( pluginDescriptor != null ) && prefix.equals( pluginDescriptor.getGoalPrefix() ) )
+            {
+                result = pluginDescriptor;
+                break;
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Look for a plugin in the pluginGroups specified in the settings.xml that has a prefix
+     * matching the one specified. Return the {@link PluginDescriptor} if a match is found.
+     */
+    private Plugin loadFromPrefixMapper( String prefix,
+                                         MavenProject project,
+                                         MavenSession session )
+        throws PluginLoaderException
+    {
+        Settings settings = session.getSettings();
+
+        Plugin plugin = pluginMappingManager.getByPrefix( prefix,
+                                                          settings.getPluginGroups(),
+                                                          project.getRemoteArtifactRepositories(),
+                                                          session.getLocalRepository() );
+
+        if ( plugin != null )
+        {
+            Plugin projectPlugin = (Plugin) project.getBuild().getPluginsAsMap().get( plugin.getKey() );
+            if ( ( projectPlugin != null ) && ( projectPlugin.getVersion() != null ) )
+            {
+                plugin.setVersion( projectPlugin.getVersion() );
+            }
+        }
+
+        return plugin;
+    }
+
+    public void enableLogging( Logger logger )
+    {
+        this.logger = logger;
+    }
+
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginPrefixLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/DefaultPluginPrefixLoader.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginLoader.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginLoader.java?rev=617293&r1=617292&r2=617293&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginLoader.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginLoader.java Thu Jan 31 15:29:18 2008
@@ -48,19 +48,4 @@
     PluginDescriptor loadReportPlugin( MojoBinding mojoBinding, MavenProject project, MavenSession session )
         throws PluginLoaderException;
 
-    /**
-     * Determine the appropriate {@link PluginDescriptor} instance for use with the specified plugin
-     * prefix, using the following strategies (in order):
-     * <br/>
-     * <ol>
-     *   <li>Search for a plugin that has already been loaded with the specified prefix</li>
-     *   <li>Search for a plugin configured in the POM that has a matching prefix</li>
-     *   <li>Search the pluginGroups specified in the settings.xml for a matching plugin</li>
-     *   <li>Use groupId == org.apache.maven.plugins, and artifactId == maven-&lt;prefix&gt;-plugin,
-     *         and try to resolve based on that.</li>
-     * </ol>
-     */
-    PluginDescriptor findPluginForPrefix( String prefix, MavenProject project, MavenSession session )
-        throws PluginLoaderException;
-
 }

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginPrefixLoader.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginPrefixLoader.java?rev=617293&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginPrefixLoader.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginPrefixLoader.java Thu Jan 31 15:29:18 2008
@@ -0,0 +1,25 @@
+package org.apache.maven.plugin.loader;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.project.MavenProject;
+
+public interface PluginPrefixLoader
+{
+
+    /**
+     * Determine the appropriate {@link Plugin} instance for use with the specified plugin
+     * prefix, using the following strategies (in order):
+     * <br/>
+     * <ol>
+     *   <li>Search for a plugin that has already been loaded with the specified prefix</li>
+     *   <li>Search for a plugin configured in the POM that has a matching prefix</li>
+     *   <li>Search the pluginGroups specified in the settings.xml for a matching plugin</li>
+     *   <li>Use groupId == org.apache.maven.plugins, and artifactId == maven-&lt;prefix&gt;-plugin,
+     *         and try to resolve based on that.</li>
+     * </ol>
+     */
+    Plugin findPluginForPrefix( String prefix, MavenProject project, MavenSession session )
+        throws PluginLoaderException;
+
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginPrefixLoader.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/loader/PluginPrefixLoader.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

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?rev=617293&r1=617292&r2=617293&view=diff
==============================================================================
--- 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 Thu Jan 31 15:29:18 2008
@@ -210,6 +210,9 @@
       <implementation>org.apache.maven.plugin.DefaultPluginManager</implementation>
       <requirements>
         <requirement>
+          <role>org.apache.maven.plugin.PluginManagerSupport</role>
+        </requirement>
+        <requirement>
           <role>org.apache.maven.ArtifactFilterManager</role>
         </requirement>
         <requirement>
@@ -690,10 +693,21 @@
       <implementation>org.apache.maven.plugin.loader.DefaultPluginLoader</implementation>
       <requirements>
         <requirement>
-          <role>org.apache.maven.plugin.MavenPluginCollector</role>
+          <role>org.apache.maven.plugin.PluginManager</role>
+        </requirement>
+      </requirements>
+    </component>
+
+    <component>
+      <role>org.apache.maven.plugin.loader.PluginPrefixLoader</role>
+      <role-hint>default</role-hint>
+      <implementation>org.apache.maven.plugin.loader.DefaultPluginPrefixLoader</implementation>
+      <requirements>
+        <requirement>
+          <role>org.apache.maven.plugin.PluginManagerSupport</role>
         </requirement>
         <requirement>
-          <role>org.apache.maven.plugin.PluginManager</role>
+          <role>org.apache.maven.plugin.MavenPluginCollector</role>
         </requirement>
         <requirement>
           <role>org.apache.maven.plugin.PluginMappingManager</role>
@@ -821,7 +835,7 @@
       <implementation>org.apache.maven.lifecycle.binding.DefaultMojoBindingFactory</implementation>
       <requirements>
         <requirement>
-          <role>org.apache.maven.plugin.loader.PluginLoader</role>
+          <role>org.apache.maven.plugin.loader.PluginPrefixLoader</role>
         </requirement>
       </requirements>
     </component>
@@ -847,6 +861,29 @@
       <requirements>
         <requirement>
           <role>org.apache.maven.settings.validation.SettingsValidator</role>
+        </requirement>
+      </requirements>
+    </component>
+    
+    <component>
+      <role>org.apache.maven.plugin.PluginManagerSupport</role>
+      <role-hint>default</role-hint>
+      <implementation>org.apache.maven.plugin.DefaultPluginManagerSupport</implementation>
+      <requirements>
+        <requirement>
+          <role>org.apache.maven.plugin.version.PluginVersionManager</role>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.artifact.resolver.ArtifactResolver</role>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.artifact.factory.ArtifactFactory</role>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.project.MavenProjectBuilder</role>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.execution.RuntimeInformation</role>
         </requirement>
       </requirements>
     </component>

Modified: maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/DefaultMavenRealmManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/DefaultMavenRealmManager.java?rev=617293&r1=617292&r2=617293&view=diff
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/DefaultMavenRealmManager.java (original)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/DefaultMavenRealmManager.java Thu Jan 31 15:29:18 2008
@@ -28,14 +28,10 @@
 import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
 import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
 import org.codehaus.plexus.component.discovery.ComponentDiscoverer;
-import org.codehaus.plexus.component.discovery.ComponentDiscovererManager;
-import org.codehaus.plexus.component.discovery.ComponentDiscoveryEvent;
-import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
 import org.codehaus.plexus.component.discovery.DefaultComponentDiscoverer;
 import org.codehaus.plexus.component.repository.ComponentDescriptor;
 import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
 import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
-import org.codehaus.plexus.configuration.PlexusConfigurationException;
 import org.codehaus.plexus.logging.Logger;
 
 import java.net.MalformedURLException;
@@ -152,106 +148,53 @@
             throw new RealmManagementException( extensionRealmId, "Cannot import project extensions; extension artifact has no associated file that can be scanned for extension components (extension: " + extensionArtifact.getId() + ")" );
         }
 
-        ClassWorld discoveryWorld = new ClassWorld();
 
-        List componentSetDescriptors;
-        try
-        {
-            // Create an entire new ClassWorld, ClassRealm for discovering
-            // the immediate components of the extension artifact, so we don't pollute the
-            // container with component descriptors or realms that don't have any meaning beyond discovery.
-            ClassRealm discoveryRealm;
-            try
-            {
-                discoveryRealm = discoveryWorld.newRealm( "discovery: " + extensionRealmId );
-            }
-            catch ( DuplicateRealmException e )
-            {
-                throw new RealmManagementException( extensionRealmId, "Unable to create temporary ClassRealm for local-component discovery.", e );
-            }
+        ComponentDiscoverer discoverer = new DefaultComponentDiscoverer();
+        discoverer.setManager( RealmScanningUtils.getDummyComponentDiscovererManager() );
 
-            try
-            {
-                discoveryRealm.addURL( extensionArtifact.getFile().toURL() );
-            }
-            catch ( MalformedURLException e )
-            {
-                throw new RealmManagementException( extensionRealmId, extensionArtifact, "Unable to generate URL from extension artifact file: " + extensionArtifact.getFile() + " for local-component discovery.", e );
-            }
-
-            ComponentDiscoverer discoverer = new DefaultComponentDiscoverer();
-            discoverer.setManager( new DummyDiscovererManager() );
-
-            try
-            {
-                // Find the extension component descriptors that exist ONLY in the immediate extension
-                // artifact...this prevents us from adding plexus-archiver components to the mix, for instance,
-                // when the extension uses that dependency.
-                componentSetDescriptors = discoverer.findComponents( container.getContext(), discoveryRealm );
-            }
-            catch ( PlexusConfigurationException e )
-            {
-                throw new RealmManagementException( extensionRealmId, "Unable to discover components in extension artifact: " + extensionArtifact.getId(), e );
-            }
+        List componentSetDescriptors = RealmScanningUtils.scanForComponentSetDescriptors( extensionArtifact, discoverer, container.getContext(), extensionRealmId );
 
-            ClassRealm realm = getProjectRealm( projectGroupId, projectArtifactId, projectVersion, true );
+        ClassRealm realm = getProjectRealm( projectGroupId, projectArtifactId, projectVersion, true );
 
-            for ( Iterator it = componentSetDescriptors.iterator(); it.hasNext(); )
-            {
-                ComponentSetDescriptor compSet = (ComponentSetDescriptor) it.next();
-                for ( Iterator compIt = compSet.getComponents().iterator(); compIt.hasNext(); )
-                {
-                    // For each component in the extension artifact:
-                    ComponentDescriptor comp = (ComponentDescriptor) compIt.next();
-                    String implementation = comp.getImplementation();
-
-                    try
-                    {
-                        logger.debug( "Importing: " + implementation + "\nwith role: " + comp.getRole() + "\nand hint: " + comp.getRoleHint() + "\nfrom extension realm: " + extensionRealmId + "\nto project realm: " + realm.getId() );
-
-                        // Import the extension component's implementation class into the project-level
-                        // realm.
-                        realm.importFrom( extensionRealmId, implementation );
-
-                        // Set the realmId to be used in looking up this extension component to the
-                        // project-level realm, since we now have a restricted import
-                        // that allows most of the extension to stay hidden, and the
-                        // specific local extension components are still accessible
-                        // from the project-level realm.
-                        comp.setRealmId( realm.getId() );
-
-                        // Finally, add the extension component's descriptor (with projectRealm
-                        // set as the lookup realm) to the container.
-                        container.addComponentDescriptor( comp );
-                    }
-                    catch ( NoSuchRealmException e )
-                    {
-                        throw new RealmManagementException( extensionRealmId, "Failed to create import for component: " + implementation + " from extension realm: " + extensionRealmId + " to project realm: " + realm.getId(), e );
-                    }
-                    catch ( ComponentRepositoryException e )
-                    {
-                        String projectId = RealmUtils.createProjectId( projectGroupId, projectArtifactId, projectVersion );
-                        throw new RealmManagementException( extensionRealmId, "Unable to discover components from imports to project: " + projectId + " from extension artifact: " + extensionArtifact.getId(), e );
-                    }
-                }
-            }
-        }
-        finally
+        for ( Iterator it = componentSetDescriptors.iterator(); it.hasNext(); )
         {
-            Collection realms = discoveryWorld.getRealms();
-            for ( Iterator it = realms.iterator(); it.hasNext(); )
+            ComponentSetDescriptor compSet = (ComponentSetDescriptor) it.next();
+            for ( Iterator compIt = compSet.getComponents().iterator(); compIt.hasNext(); )
             {
-                ClassRealm realm = (ClassRealm) it.next();
+                // For each component in the extension artifact:
+                ComponentDescriptor comp = (ComponentDescriptor) compIt.next();
+                String implementation = comp.getImplementation();
+
                 try
                 {
-                    discoveryWorld.disposeRealm( realm.getId() );
+                    logger.debug( "Importing: " + implementation + "\nwith role: " + comp.getRole() + "\nand hint: " + comp.getRoleHint() + "\nfrom extension realm: " + extensionRealmId + "\nto project realm: " + realm.getId() );
+
+                    // Import the extension component's implementation class into the project-level
+                    // realm.
+                    realm.importFrom( extensionRealmId, implementation );
+
+                    // Set the realmId to be used in looking up this extension component to the
+                    // project-level realm, since we now have a restricted import
+                    // that allows most of the extension to stay hidden, and the
+                    // specific local extension components are still accessible
+                    // from the project-level realm.
+                    comp.setRealmId( realm.getId() );
+
+                    // Finally, add the extension component's descriptor (with projectRealm
+                    // set as the lookup realm) to the container.
+                    container.addComponentDescriptor( comp );
                 }
                 catch ( NoSuchRealmException e )
                 {
+                    throw new RealmManagementException( extensionRealmId, "Failed to create import for component: " + implementation + " from extension realm: " + extensionRealmId + " to project realm: " + realm.getId(), e );
+                }
+                catch ( ComponentRepositoryException e )
+                {
+                    String projectId = RealmUtils.createProjectId( projectGroupId, projectArtifactId, projectVersion );
+                    throw new RealmManagementException( extensionRealmId, "Unable to discover components from imports to project: " + projectId + " from extension artifact: " + extensionArtifact.getId(), e );
                 }
             }
         }
-
     }
 
     public ClassRealm getProjectRealm( String projectGroupId, String projectArtifactId, String projectVersion )
@@ -285,42 +228,6 @@
         }
 
         return realm;
-    }
-
-    private static final class DummyDiscovererManager implements ComponentDiscovererManager
-    {
-
-        public void fireComponentDiscoveryEvent( ComponentDiscoveryEvent arg0 )
-        {
-        }
-
-        public List getComponentDiscoverers()
-        {
-            return null;
-        }
-
-        public Map getComponentDiscoveryListeners()
-        {
-            return null;
-        }
-
-        public List getListeners()
-        {
-            return null;
-        }
-
-        public void initialize()
-        {
-        }
-
-        public void registerComponentDiscoveryListener( ComponentDiscoveryListener l )
-        {
-        }
-
-        public void removeComponentDiscoveryListener( ComponentDiscoveryListener l )
-        {
-        }
-
     }
 
     public ClassRealm getPluginRealm( Plugin plugin )

Added: maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/RealmScanningUtils.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/RealmScanningUtils.java?rev=617293&view=auto
==============================================================================
--- maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/RealmScanningUtils.java (added)
+++ maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/RealmScanningUtils.java Thu Jan 31 15:29:18 2008
@@ -0,0 +1,130 @@
+package org.apache.maven.realm;
+
+import org.apache.maven.artifact.Artifact;
+import org.codehaus.plexus.classworlds.ClassWorld;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
+import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
+import org.codehaus.plexus.component.discovery.ComponentDiscoverer;
+import org.codehaus.plexus.component.discovery.ComponentDiscovererManager;
+import org.codehaus.plexus.component.discovery.ComponentDiscoveryEvent;
+import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
+import org.codehaus.plexus.configuration.PlexusConfigurationException;
+import org.codehaus.plexus.context.Context;
+
+import java.net.MalformedURLException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class RealmScanningUtils
+{
+
+    private static final String DISCOVERY_REALM_ID = "discovery realm";
+
+    public static List scanForComponentSetDescriptors( Artifact artifact,
+                                        ComponentDiscoverer discoverer,
+                                        Context context,
+                                        String discoveryContextId )
+        throws RealmManagementException
+    {
+        ClassWorld discoveryWorld = new ClassWorld();
+
+        List componentSetDescriptors;
+        try
+        {
+            // Create an entire new ClassWorld, ClassRealm for discovering
+            // the immediate components of the extension artifact, so we don't pollute the
+            // container with component descriptors or realms that don't have any meaning beyond discovery.
+            ClassRealm discoveryRealm;
+            try
+            {
+                discoveryRealm = discoveryWorld.newRealm( DISCOVERY_REALM_ID );
+            }
+            catch ( DuplicateRealmException e )
+            {
+                throw new RealmManagementException( discoveryContextId, "Unable to create temporary ClassRealm for local-component discovery.", e );
+            }
+
+            try
+            {
+                discoveryRealm.addURL( artifact.getFile().toURL() );
+            }
+            catch ( MalformedURLException e )
+            {
+                throw new RealmManagementException( discoveryContextId, artifact, "Unable to generate URL from artifact file: " + artifact.getFile() + " for local-component discovery.", e );
+            }
+
+            try
+            {
+                // Find the extension component descriptors that exist ONLY in the immediate extension
+                // artifact...this prevents us from adding plexus-archiver components to the mix, for instance,
+                // when the extension uses that dependency.
+                componentSetDescriptors = discoverer.findComponents( context, discoveryRealm );
+            }
+            catch ( PlexusConfigurationException e )
+            {
+                throw new RealmManagementException( discoveryContextId, "Unable to discover components in artifact: " + artifact.getId(), e );
+            }
+        }
+        finally
+        {
+            Collection realms = discoveryWorld.getRealms();
+            for ( Iterator it = realms.iterator(); it.hasNext(); )
+            {
+                ClassRealm realm = (ClassRealm) it.next();
+                try
+                {
+                    discoveryWorld.disposeRealm( realm.getId() );
+                }
+                catch ( NoSuchRealmException e )
+                {
+                }
+            }
+        }
+
+        return componentSetDescriptors;
+    }
+
+    public static ComponentDiscovererManager getDummyComponentDiscovererManager()
+    {
+        return new DummyDiscovererManager();
+    }
+
+    private static final class DummyDiscovererManager implements ComponentDiscovererManager
+    {
+
+        public void fireComponentDiscoveryEvent( ComponentDiscoveryEvent arg0 )
+        {
+        }
+
+        public List getComponentDiscoverers()
+        {
+            return null;
+        }
+
+        public Map getComponentDiscoveryListeners()
+        {
+            return null;
+        }
+
+        public List getListeners()
+        {
+            return null;
+        }
+
+        public void initialize()
+        {
+        }
+
+        public void registerComponentDiscoveryListener( ComponentDiscoveryListener l )
+        {
+        }
+
+        public void removeComponentDiscoveryListener( ComponentDiscoveryListener l )
+        {
+        }
+
+    }
+}

Propchange: maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/RealmScanningUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-project/src/main/java/org/apache/maven/realm/RealmScanningUtils.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"