You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by jd...@apache.org on 2005/07/13 23:57:58 UTC

svn commit: r216273 - in /maven/components/trunk: maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/ maven-artifact-manager/src/main/java/org/apache/maven/artifact/repository/metadata/ maven-core/src/main/java/org/apache/maven/life...

Author: jdcasey
Date: Wed Jul 13 14:57:57 2005
New Revision: 216273

URL: http://svn.apache.org/viewcvs?rev=216273&view=rev
Log:
Working on: MNG-576

o Implemented plan from my comments on MNG-576 for looking up lifecycle mappings within plugins.

o Fixed subtle bug in DefaultWagonManager for verifying checksums, where the destination file was being used to verify the checksum rather than the recently download temp destination.

o Fixed the DefaultRepositoryMetadataManager.resolve(..) method to allow the locally-installed metadata to be used if it is newer than the one resolved from the repository.

o Moved the lifecycle mappings for the EJB and WAR plugins out to META-INF/plexus/components.xml in the respective plugin's src/main/resources directory. it0016 and it0017 still pass.

o Changed the distributionManagement repository for maven-plugins/pom.xml to have id of 'central-plugins' and then added a normal artifact repository definition for central-plugins to that pom, to allow locally-installed repository metadata for the plugins to be put in the right place (and these builds should have access to the central plugin repo anyway).

o Changed the DefaultPluginMappingBuilder to only warn when plugins.xml for a particular plugin group is missing.


Added:
    maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/
    maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/
    maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/plexus/
    maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/plexus/components.xml   (with props)
    maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/
    maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/
    maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/plexus/
    maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/plexus/components.xml   (with props)
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/repository/metadata/DefaultRepositoryMetadataManager.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
    maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/DefaultPluginMappingBuilder.java
    maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/PluginMappingManager.java
    maven/components/trunk/maven-plugin-mapping/src/main/mdo/plugins.mdo
    maven/components/trunk/maven-plugins/maven-plugin-plugin/src/main/java/org/apache/maven/plugin/plugin/metadata/GenerateUpdatedMappingMojo.java
    maven/components/trunk/maven-plugins/pom.xml

Modified: maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonManager.java?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- 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 Wed Jul 13 14:57:57 2005
@@ -337,7 +337,7 @@
                 // try to verify the SHA-1 checksum for this file.
                 try
                 {
-                    verifyChecksum( sha1ChecksumObserver, destination, remotePath, ".sha1", wagon );
+                    verifyChecksum( sha1ChecksumObserver, temp, remotePath, ".sha1", wagon );
                 }
                 catch ( WagonException sha1TryException )
                 {
@@ -364,7 +364,7 @@
                     {
                         try
                         {
-                            verifyChecksum( md5ChecksumObserver, destination, remotePath, ".md5", wagon );
+                            verifyChecksum( md5ChecksumObserver, temp, remotePath, ".md5", wagon );
                         }
                         catch ( WagonException md5TryException )
                         {
@@ -386,7 +386,7 @@
                             // otherwise, this was a failed transfer, and we don't want to retry.
                             else
                             {
-                                handleChecksumFailure( repository, "Error retrieving checksum file for " + destination,
+                                handleChecksumFailure( repository, "Error retrieving checksum file for " + remotePath,
                                                        md5TryException );
                             }
                         }

Modified: maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java (original)
+++ maven/components/trunk/maven-artifact-manager/src/main/java/org/apache/maven/artifact/repository/metadata/DefaultRepositoryMetadataManager.java Wed Jul 13 14:57:57 2005
@@ -21,12 +21,12 @@
     private WagonManager wagonManager;
 
     // only resolve repository metadata once per session...
-    private Map resolved = new HashMap();
+    private Map cachedMetadata = new HashMap();
 
     public void resolve( RepositoryMetadata metadata, ArtifactRepository remote, ArtifactRepository local )
         throws RepositoryMetadataManagementException
     {
-        File metadataFile = (File) resolved.get( metadata.getRepositoryPath() );
+        File metadataFile = (File) cachedMetadata.get( metadata.getRepositoryPath() );
 
         if ( metadataFile == null )
         {
@@ -41,8 +41,39 @@
             {
                 try
                 {
-                    wagonManager.getRepositoryMetadata( metadata, remote, metadataFile );
-
+                    File tempMetadataFile = File.createTempFile( "plugins.xml", null );
+                    
+                    try
+                    {
+                        wagonManager.getRepositoryMetadata( metadata, remote, tempMetadataFile );
+                        
+                        if( !metadataFile.exists() || ( metadataFile.lastModified() <= tempMetadataFile.lastModified() ) )
+                        {
+                            if ( !tempMetadataFile.renameTo( metadataFile ) )
+                            {
+                                FileUtils.copyFile( tempMetadataFile, metadataFile );
+                                
+                                tempMetadataFile.delete();
+                            }
+                        }
+                    }
+                    catch ( ResourceDoesNotExistException e )
+                    {
+                        if ( !metadataFile.exists() )
+                        {
+                            throw new RepositoryMetadataManagementException( metadata, "Remote repository metadata not found.",
+                                                                             e );
+                        }
+                        else
+                        {
+                            String message = "Cannot find " + metadata + " in remote repository - Using local copy.";
+                            
+                            getLogger().info( message );
+                            
+                            getLogger().debug( message, e );
+                        }
+                    }
+                    
                     metadata.setFile( metadataFile );
                 }
                 catch ( TransferFailedException e )
@@ -50,10 +81,9 @@
                     throw new RepositoryMetadataManagementException( metadata,
                                                                      "Failed to download repository metadata.", e );
                 }
-                catch ( ResourceDoesNotExistException e )
+                catch ( IOException e )
                 {
-                    throw new RepositoryMetadataManagementException( metadata, "Remote repository metadata not found.",
-                                                                     e );
+                    throw new RepositoryMetadataManagementException( metadata, "Error constructing temporary metadata download file.", e );
                 }
             }
         }

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Wed Jul 13 14:57:57 2005
@@ -255,23 +255,11 @@
     private Map bindLifecycleForPackaging( MavenSession session, String selectedPhase, MavenProject project )
         throws ArtifactResolutionException, LifecycleExecutionException
     {
-        Map mappings;
-        String packaging = project.getPackaging();
-        try
-        {
-            LifecycleMapping m = (LifecycleMapping) session.lookup( LifecycleMapping.ROLE, packaging );
-            mappings = m.getPhases();
-        }
-        catch ( ComponentLookupException e )
-        {
-            getLogger().error( "No lifecycle mapping for type '" + packaging + "': using defaults" );
-            mappings = defaultPhases;
-        }
+        Map mappings = findMappingsForLifecycle( session, project );
 
         Map lifecycleMappings = new HashMap();
 
-        boolean finished = false;
-        for ( Iterator i = phases.iterator(); i.hasNext() && !finished; )
+        for ( Iterator i = phases.iterator(); i.hasNext(); )
         {
             String phase = (String) i.next();
 
@@ -291,13 +279,114 @@
 
             if ( phase.equals( selectedPhase ) )
             {
-                finished = true;
+                break;
             }
         }
 
         return lifecycleMappings;
     }
 
+    private Map findMappingsForLifecycle( MavenSession session, MavenProject project ) 
+        throws LifecycleExecutionException
+    {
+        Map mappings;
+        
+        String packaging = project.getPackaging();
+        try
+        {
+            PluginMappingManager mappingManager = getPluginMappingManager( session, project );
+
+            Plugin pluginContainingLifecycleMapping = mappingManager.getByPackaging( packaging );
+
+            LifecycleMapping m = null;
+
+            if ( pluginContainingLifecycleMapping != null )
+            {
+                try
+                {
+                    pluginManager.verifyPlugin( pluginContainingLifecycleMapping, project, session.getSettings(), session.getLocalRepository() );
+                    
+                    m = (LifecycleMapping) pluginManager.getPluginComponent( pluginContainingLifecycleMapping,
+                                                                             LifecycleMapping.ROLE, packaging );
+
+                    mappings = m.getPhases();
+                }
+                catch ( ComponentLookupException e )
+                {
+                    throw new LifecycleExecutionException( "Plugin: " + pluginContainingLifecycleMapping.getKey()
+                        + " declares lifecycle mapping for: \'" + packaging
+                        + "\', but does not appear to contain the actual mapping among its component descriptors.", e );
+                }
+            }
+            else
+            {
+                try
+                {
+                    m = (LifecycleMapping) session.lookup( LifecycleMapping.ROLE, packaging );
+
+                    mappings = m.getPhases();
+                }
+                catch ( ComponentLookupException e )
+                {
+                    getLogger().warn(
+                                      "Lifecycle mappings not found for packaging: \'" + packaging
+                                          + "\'. Using defaults." );
+
+                    getLogger().debug( "Lifecycle mappings not found for packaging: \'" + packaging + "\'.", e );
+
+                    mappings = defaultPhases;
+                }
+            }
+        }
+        catch ( ArtifactResolutionException e )
+        {
+            throw new LifecycleExecutionException( "Cannot load plugin which defines lifecycle mappings for: \'" + packaging + "\'.", e );
+        }
+        catch ( PluginVersionResolutionException e )
+        {
+            throw new LifecycleExecutionException( "Cannot load plugin which defines lifecycle mappings for: \'" + packaging + "\'.", e );
+        }
+        catch ( PluginManagerException e )
+        {
+            throw new LifecycleExecutionException( "Cannot load lifecycle mappings.", e );
+        }
+        
+        return mappings;
+    }
+
+    private PluginMappingManager getPluginMappingManager( MavenSession session, MavenProject project ) 
+        throws LifecycleExecutionException
+    {
+        PluginMappingManager mappingManager = session.getPluginMappingManager();
+
+        // don't reassemble the plugin mappings if the session has already been configured with them.
+        if ( mappingManager == null )
+        {
+            try
+            {
+                List pluginGroupIds = session.getSettings().getPluginGroups();
+                List pluginRepositories = project.getPluginArtifactRepositories();
+                ArtifactRepository localRepository = session.getLocalRepository();
+
+                mappingManager = pluginMappingBuilder.loadPluginMappings( pluginGroupIds, pluginRepositories,
+                                                                          localRepository );
+
+                // lazily configure this on the session.
+                session.setPluginMappingManager( mappingManager );
+            }
+            catch ( RepositoryMetadataManagementException e )
+            {
+                throw new LifecycleExecutionException( "Cannot load plugin mappings.", e );
+            }
+            catch ( PluginMappingManagementException e )
+            {
+                throw new LifecycleExecutionException( "Cannot load plugin mappings.", e );
+            }
+        }
+        
+        return mappingManager;
+    }
+
     /**
      * Take each mojo contained with a plugin, look to see whether it contributes to a
      * phase in the lifecycle and if it does place it at the end of the list of goals
@@ -482,11 +571,11 @@
             // Steps for retrieving the plugin model instance:
             // 1. request directly from the plugin collector by prefix
             pluginDescriptor = pluginManager.getPluginDescriptorForPrefix( prefix );
-            
+
             if ( pluginDescriptor != null )
             {
                 plugin = new Plugin();
-                
+
                 plugin.setGroupId( pluginDescriptor.getGroupId() );
                 plugin.setArtifactId( pluginDescriptor.getArtifactId() );
                 plugin.setVersion( pluginDescriptor.getVersion() );
@@ -495,32 +584,7 @@
             // 2. use the plugin resolver to resolve the prefix in the search groups
             if ( plugin == null )
             {
-                PluginMappingManager mappingManager = session.getPluginMappingManager();
-
-                // don't reassemble the plugin mappings if the session has already been configured with them.
-                if ( mappingManager == null )
-                {
-                    try
-                    {
-                        List pluginGroupIds = session.getSettings().getPluginGroups();
-                        List pluginRepositories = project.getPluginArtifactRepositories();
-                        ArtifactRepository localRepository = session.getLocalRepository();
-
-                        mappingManager = pluginMappingBuilder.loadPluginMappings( pluginGroupIds, pluginRepositories,
-                                                                                  localRepository );
-                        
-                        // lazily configure this on the session.
-                        session.setPluginMappingManager( mappingManager );
-                    }
-                    catch ( RepositoryMetadataManagementException e )
-                    {
-                        throw new LifecycleExecutionException( "Cannot load plugin mappings.", e );
-                    }
-                    catch ( PluginMappingManagementException e )
-                    {
-                        throw new LifecycleExecutionException( "Cannot load plugin mappings.", e );
-                    }
-                }
+                PluginMappingManager mappingManager = getPluginMappingManager( session, project );
 
                 plugin = mappingManager.getByPrefix( prefix );
             }
@@ -547,7 +611,7 @@
         else if ( numTokens == 4 )
         {
             plugin = new Plugin();
-            
+
             plugin.setGroupId( tok.nextToken() );
             plugin.setArtifactId( tok.nextToken() );
             plugin.setVersion( tok.nextToken() );
@@ -592,7 +656,7 @@
     private void injectHandlerPluginConfiguration( MavenProject project, Plugin plugin )
     {
         String key = plugin.getKey();
-        
+
         Plugin buildPlugin = (Plugin) project.getBuild().getPluginsAsMap().get( key );
 
         if ( buildPlugin == null )
@@ -601,7 +665,7 @@
             if ( pluginManagement != null )
             {
                 Plugin managedPlugin = (Plugin) pluginManagement.getPluginsAsMap().get( key );
-                
+
                 if ( managedPlugin != null )
                 {
                     modelDefaultsInjector.mergePluginWithDefaults( plugin, managedPlugin );

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?rev=216273&r1=216272&r2=216273&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 Wed Jul 13 14:57:57 2005
@@ -914,4 +914,14 @@
         }
     }
 
+    public Object getPluginComponent( Plugin plugin, String role, String roleHint )
+        throws ComponentLookupException, PluginManagerException
+    {
+        PluginDescriptor pluginDescriptor = pluginCollector.getPluginDescriptor( plugin );
+
+        PlexusContainer pluginContainer = getPluginContainer( pluginDescriptor );
+
+        return pluginContainer.lookup( role, roleHint );
+    }
+
 }

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- 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 Wed Jul 13 14:57:57 2005
@@ -26,6 +26,7 @@
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.ReportPlugin;
 import org.apache.maven.model.ReportSet;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 
 import java.util.List;
 
@@ -50,4 +51,7 @@
                     ArtifactRepository localRepository )
         throws PluginManagerException, PluginVersionResolutionException, PluginConfigurationException,
         ArtifactResolutionException;
+
+    Object getPluginComponent( Plugin plugin, String role, String roleHint )
+        throws ComponentLookupException, PluginManagerException;
 }

Modified: maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-core/src/main/resources/META-INF/plexus/components.xml?rev=216273&r1=216272&r2=216273&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 Wed Jul 13 14:57:57 2005
@@ -201,46 +201,6 @@
       </configuration>
     </component>
 
-    <component>
-      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
-      <role-hint>ejb</role-hint>
-      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
-      <configuration>
-        <!-- START SNIPPET: ejb-lifecycle -->
-        <phases>
-          <process-resources>resources:resources</process-resources>
-          <compile>compiler:compile</compile>
-          <process-test-resources>resources:testResources</process-test-resources>
-          <test-compile>compiler:testCompile</test-compile>
-          <test>surefire:test</test>
-          <package>ejb:ejb,source:jar</package>
-          <install>install:install</install>
-          <deploy>deploy:deploy</deploy>
-        </phases>
-        <!-- END SNIPPET: ejb-lifecycle -->
-      </configuration>
-    </component>
-
-    <component>
-      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
-      <role-hint>war</role-hint>
-      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
-      <configuration>
-        <!-- START SNIPPET: war-lifecycle -->
-        <phases>
-          <process-resources>resources:resources</process-resources>
-          <compile>compiler:compile</compile>
-          <process-test-resources>resources:testResources</process-test-resources>
-          <test-compile>compiler:testCompile</test-compile>
-          <test>surefire:test</test>
-          <package>war:war</package>
-          <install>install:install</install>
-          <deploy>deploy:deploy</deploy>
-        </phases>
-        <!-- END SNIPPET: war-lifecycle -->
-      </configuration>
-    </component>
-
     <!-- TODO: move to the plexus plugin -->
     <component>
       <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>

Modified: maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/DefaultPluginMappingBuilder.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/DefaultPluginMappingBuilder.java?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/DefaultPluginMappingBuilder.java (original)
+++ maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/DefaultPluginMappingBuilder.java Wed Jul 13 14:57:57 2005
@@ -5,6 +5,7 @@
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
 import org.apache.maven.plugin.mapping.io.xpp3.PluginMappingXpp3Reader;
 import org.apache.maven.plugin.mapping.metadata.PluginMappingMetadata;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
@@ -12,20 +13,29 @@
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.Reader;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
 public class DefaultPluginMappingBuilder
+    extends AbstractLogEnabled
     implements MavenPluginMappingBuilder
 {
 
     // component requirement
     private RepositoryMetadataManager repositoryMetadataManager;
 
-    public PluginMappingManager loadPluginMappings( List pluginGroupIds, List pluginRepositories,
+    public PluginMappingManager loadPluginMappings( List groupIds, List pluginRepositories,
                                                    ArtifactRepository localRepository )
         throws RepositoryMetadataManagementException, PluginMappingManagementException
     {
+        List pluginGroupIds = new ArrayList( groupIds );
+        
+        if ( !pluginGroupIds.contains( "org.apache.maven.plugins" ) )
+        {
+            pluginGroupIds.add( "org.apache.maven.plugins" );
+        }
+        
         PluginMappingManager mappingManager = new PluginMappingManager();
 
         if ( pluginGroupIds != null )
@@ -34,13 +44,22 @@
             {
                 String groupId = (String) it.next();
 
-                File mappingFile = resolveMappingMetadata( groupId, pluginRepositories, localRepository );
+                try
+                {
+                    File mappingFile = resolveMappingMetadata( groupId, pluginRepositories, localRepository );
+
+                    PluginMap pluginMap = readPluginMap( mappingFile );
 
-                PluginMap pluginMap = readPluginMap( mappingFile );
-                
-                if ( pluginMap != null )
+                    if ( pluginMap != null )
+                    {
+                        mappingManager.addPluginMap( pluginMap );
+                    }
+                }
+                catch ( RepositoryMetadataManagementException e )
                 {
-                    mappingManager.addPluginMap( pluginMap );
+                    getLogger().warn( "Cannot resolve plugin-mapping metadata for groupId: " + groupId + " - IGNORING." );
+                    
+                    getLogger().debug( "Error resolving plugin-mapping metadata for groupId: " + groupId + ".", e );
                 }
             }
         }

Modified: maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/PluginMappingManager.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/PluginMappingManager.java?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/PluginMappingManager.java (original)
+++ maven/components/trunk/maven-plugin-mapping/src/main/java/org/apache/maven/plugin/mapping/PluginMappingManager.java Wed Jul 13 14:57:57 2005
@@ -14,6 +14,7 @@
     private List mappings = new ArrayList();
 
     private Map pluginDefinitionsByPrefix = new HashMap();
+    private Map pluginDefinitionsByPackaging = new HashMap();
 
     public void addPluginMap( PluginMap pluginMap )
     {
@@ -21,6 +22,7 @@
         
         // flush the cache.
         pluginDefinitionsByPrefix = null;
+        pluginDefinitionsByPackaging = null;
     }
 
     public Plugin getByPrefix( String pluginPrefix )
@@ -34,6 +36,51 @@
         }
 
         return (Plugin) pluginDefinitionsByPrefix.get( pluginPrefix );
+    }
+
+    public Plugin getByPackaging( String packaging )
+    {
+        synchronized ( this )
+        {
+            if ( pluginDefinitionsByPackaging == null )
+            {
+                calculatePluginDefinitionsByPackaging();
+            }
+        }
+
+        return (Plugin) pluginDefinitionsByPackaging.get( packaging );
+    }
+
+    private void calculatePluginDefinitionsByPackaging()
+    {
+        pluginDefinitionsByPackaging = new HashMap();
+
+        for ( Iterator it = mappings.iterator(); it.hasNext(); )
+        {
+            PluginMap pluginMap = (PluginMap) it.next();
+
+            String groupId = pluginMap.getGroupId();
+
+            for ( Iterator pluginIterator = pluginMap.getPlugins().iterator(); pluginIterator.hasNext(); )
+            {
+                MappedPlugin mapping = (MappedPlugin) pluginIterator.next();
+
+                String artifactId = mapping.getArtifactId();
+
+                Plugin plugin = new Plugin();
+
+                plugin.setGroupId( groupId );
+
+                plugin.setArtifactId( artifactId );
+
+                for ( Iterator packagingIterator = mapping.getPackagingHandlers().iterator(); packagingIterator.hasNext(); )
+                {
+                    String packaging = (String) packagingIterator.next();
+                    
+                    pluginDefinitionsByPackaging.put( packaging, plugin );
+                }
+            }
+        }
     }
 
     private void calculatePluginDefinitionsByPrefix()

Modified: maven/components/trunk/maven-plugin-mapping/src/main/mdo/plugins.mdo
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugin-mapping/src/main/mdo/plugins.mdo?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- maven/components/trunk/maven-plugin-mapping/src/main/mdo/plugins.mdo (original)
+++ maven/components/trunk/maven-plugin-mapping/src/main/mdo/plugins.mdo Wed Jul 13 14:57:57 2005
@@ -53,6 +53,15 @@
           <version>1.0.0</version>
           <description>The plugin artifactId</description>
         </field>
+        <field>
+          <name>packagingHandlers</name>
+          <version>1.0.0</version>
+          <description>A list of the packaging types supported by this plugin.</description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
       </fields>
     </class>
   </classes>

Added: maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/plexus/components.xml?rev=216273&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/plexus/components.xml (added)
+++ maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/plexus/components.xml Wed Jul 13 14:57:57 2005
@@ -0,0 +1,23 @@
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
+      <role-hint>ejb</role-hint>
+      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
+      <configuration>
+        <!-- START SNIPPET: ejb-lifecycle -->
+        <phases>
+          <process-resources>resources:resources</process-resources>
+          <compile>compiler:compile</compile>
+          <process-test-resources>resources:testResources</process-test-resources>
+          <test-compile>compiler:testCompile</test-compile>
+          <test>surefire:test</test>
+          <package>ejb:ejb,source:jar</package>
+          <install>install:install</install>
+          <deploy>deploy:deploy</deploy>
+        </phases>
+        <!-- END SNIPPET: ejb-lifecycle -->
+      </configuration>
+    </component>
+  </components>
+</component-set>

Propchange: maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-plugins/maven-ejb-plugin/src/main/resources/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/components/trunk/maven-plugins/maven-plugin-plugin/src/main/java/org/apache/maven/plugin/plugin/metadata/GenerateUpdatedMappingMojo.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-plugin-plugin/src/main/java/org/apache/maven/plugin/plugin/metadata/GenerateUpdatedMappingMojo.java?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- maven/components/trunk/maven-plugins/maven-plugin-plugin/src/main/java/org/apache/maven/plugin/plugin/metadata/GenerateUpdatedMappingMojo.java (original)
+++ maven/components/trunk/maven-plugins/maven-plugin-plugin/src/main/java/org/apache/maven/plugin/plugin/metadata/GenerateUpdatedMappingMojo.java Wed Jul 13 14:57:57 2005
@@ -4,6 +4,7 @@
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManagementException;
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
+import org.apache.maven.lifecycle.mapping.LifecycleMapping;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
@@ -14,6 +15,20 @@
 import org.apache.maven.plugin.mapping.metadata.PluginMappingMetadata;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.wagon.ResourceDoesNotExistException;
+import org.codehaus.classworlds.ClassRealm;
+import org.codehaus.classworlds.ClassWorld;
+import org.codehaus.classworlds.DuplicateRealmException;
+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.discovery.PlexusXmlComponentDiscoverer;
+import org.codehaus.plexus.component.repository.ComponentDescriptor;
+import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
+import org.codehaus.plexus.configuration.PlexusConfigurationException;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.DefaultContext;
 import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
@@ -23,6 +38,8 @@
 import java.io.IOException;
 import java.io.Reader;
 import java.io.Writer;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
@@ -51,7 +68,14 @@
      * @required
      * @readonly
      */
-    private String outputDirectory;
+    private String metadataDirectory;
+
+    /**
+     * @parameter expression="${project.build.outputDirectory}"
+     * @required
+     * @readonly
+     */
+    private String classesDirectory;
 
     /**
      * @parameter expression="${component.org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager}"
@@ -67,10 +91,11 @@
      */
     private ArtifactRepository localRepository;
 
-    public void execute() throws MojoExecutionException
+    public void execute()
+        throws MojoExecutionException
     {
         ArtifactRepository distributionRepository = project.getDistributionManagementArtifactRepository();
-        
+
         String distributionRepositoryId = distributionRepository.getId();
 
         List remoteArtifactRepositories = project.getRemoteArtifactRepositories();
@@ -84,25 +109,25 @@
             if ( distributionRepositoryId.equals( currentRepository.getId() ) )
             {
                 readRemoteRepository = currentRepository;
-                
+
                 break;
             }
         }
-        
+
         PluginMappingXpp3Reader mappingReader = new PluginMappingXpp3Reader();
-        
+
         PluginMap pluginMap = null;
-        
+
         RepositoryMetadata metadata = new PluginMappingMetadata( project.getGroupId() );
-        
+
         try
         {
             repositoryMetadataManager.resolve( metadata, readRemoteRepository, localRepository );
-            
+
             Reader reader = null;
-            
+
             File metadataFile = metadata.getFile();
-            
+
             try
             {
                 reader = new FileReader( metadataFile );
@@ -125,12 +150,12 @@
         catch ( RepositoryMetadataManagementException e )
         {
             Throwable cause = e.getCause();
-            
+
             if ( cause != null && ( cause instanceof ResourceDoesNotExistException ) )
             {
                 getLog().info( "Cannot find " + metadata + " on remote repository. Creating a new one." );
                 getLog().debug( "Metadata " + metadata + " cannot be resolved.", e );
-                
+
                 pluginMap = new PluginMap();
                 pluginMap.setGroupId( project.getGroupId() );
             }
@@ -139,81 +164,177 @@
                 throw new MojoExecutionException( "Failed to resolve " + metadata, e );
             }
         }
-        
-        boolean prefixAlreadyMapped = false;
-        
+
         for ( Iterator it = pluginMap.getPlugins().iterator(); it.hasNext(); )
         {
             MappedPlugin preExisting = (MappedPlugin) it.next();
-            
-            if ( preExisting.getPrefix().equals( getGoalPrefix() ) )
+
+            if ( preExisting.getArtifactId().equals( project.getArtifactId() ) )
             {
-                prefixAlreadyMapped = true;
-                
-                if ( !preExisting.getArtifactId().equals( project.getArtifactId() ) )
-                {
-                    // TODO: In this case, should we rather just replace the existing plugin mapping??
-                    
-                    throw new MojoExecutionException( "Cannot map plugin to it's prefix in plugins.xml metadata; the prefix: \'" + getGoalPrefix() + "\' is already mapped to: " + preExisting.getArtifactId() ); 
-                }
-                else
-                {
-                    getLog().info( "NOT updating plugins.xml metadata; this plugin is already mapped." ); 
-                }
-                
+                getLog().info( "Updating pre-existing plugin-mapping metadata." );
+
+                pluginMap.removePlugin( preExisting );
+
                 break;
             }
         }
+
+        MappedPlugin mappedPlugin = new MappedPlugin();
+
+        mappedPlugin.setArtifactId( project.getArtifactId() );
+
+        mappedPlugin.setPrefix( getGoalPrefix() );
+
+        mappedPlugin.setPackagingHandlers( extractPackagingHandlers() );
+
+        pluginMap.addPlugin( mappedPlugin );
+
+        Writer writer = null;
+        try
+        {
+            File updatedMetadataFile = new File( metadataDirectory, metadata.getRepositoryPath() ).getAbsoluteFile();
+
+            File dir = updatedMetadataFile.getParentFile();
+
+            if ( !dir.exists() )
+            {
+                dir.mkdirs();
+            }
+
+            writer = new FileWriter( updatedMetadataFile );
+
+            PluginMappingXpp3Writer mappingWriter = new PluginMappingXpp3Writer();
+
+            mappingWriter.write( writer, pluginMap );
+
+            metadata.setFile( updatedMetadataFile );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException( "Error writing repository metadata to build directory.", e );
+        }
+        finally
+        {
+            IOUtil.close( writer );
+        }
+    }
+
+    private List extractPackagingHandlers()
+        throws MojoExecutionException
+    {
+        List packagingHandlers = new ArrayList();
+
+        Context ctx = new DefaultContext();
+
+        ClassWorld discoveryWorld = new ClassWorld();
+
+        try
+        {
+            ClassRealm discoveryRealm = discoveryWorld.newRealm( "packageHandler-discovery" );
+
+            File classDir = new File( classesDirectory ).getAbsoluteFile();
+
+            discoveryRealm.addConstituent( classDir.toURL() );
+
+            packagingHandlers
+                .addAll( discoverLifecycleMappings( ctx, discoveryRealm, new DefaultComponentDiscoverer() ) );
+
+            packagingHandlers.addAll( discoverLifecycleMappings( ctx, discoveryRealm,
+                                                                 new PlexusXmlComponentDiscoverer() ) );
+        }
+        catch ( DuplicateRealmException e )
+        {
+            throw new MojoExecutionException( "Error constructing class-realm for lifecycle-mapping detection.", e );
+        }
+        catch ( MalformedURLException e )
+        {
+            throw new MojoExecutionException( "Error constructing class-realm for lifecycle-mapping detection.", e );
+        }
+        catch ( PlexusConfigurationException e )
+        {
+            throw new MojoExecutionException( "Error detecting lifecycle-mappings.", e );
+        }
+
+        return packagingHandlers;
+    }
+
+    private List discoverLifecycleMappings( Context ctx, ClassRealm discoveryRealm, ComponentDiscoverer discoverer )
+        throws PlexusConfigurationException
+    {
+        discoverer.setManager( new DummyComponentDiscovererManager() );
         
-        if ( !prefixAlreadyMapped )
+        List packagingHandlers = new ArrayList();
+
+        List componentSetDescriptors = discoverer.findComponents( ctx, discoveryRealm );
+
+        if ( componentSetDescriptors != null )
         {
-            MappedPlugin mappedPlugin = new MappedPlugin();
-            
-            mappedPlugin.setArtifactId( project.getArtifactId() );
-            
-            mappedPlugin.setPrefix( getGoalPrefix() );
-            
-            pluginMap.addPlugin( mappedPlugin );
-            
-            Writer writer = null;
-            try
+            for ( Iterator it = componentSetDescriptors.iterator(); it.hasNext(); )
             {
-                File updatedMetadataFile = new File( outputDirectory, metadata.getRepositoryPath() ).getAbsoluteFile();
+                ComponentSetDescriptor setDescriptor = (ComponentSetDescriptor) it.next();
 
-                File dir = updatedMetadataFile.getParentFile();
+                List components = setDescriptor.getComponents();
 
-                if ( !dir.exists() )
+                if ( components != null )
                 {
-                    dir.mkdirs();
+                    for ( Iterator componentIterator = components.iterator(); componentIterator.hasNext(); )
+                    {
+                        ComponentDescriptor descriptor = (ComponentDescriptor) componentIterator.next();
+
+                        if ( LifecycleMapping.ROLE.equals( descriptor.getRole() ) )
+                        {
+                            packagingHandlers.add( descriptor.getRoleHint() );
+                        }
+                    }
                 }
-                
-                writer = new FileWriter( updatedMetadataFile );
-                
-                PluginMappingXpp3Writer mappingWriter = new PluginMappingXpp3Writer();
-                
-                mappingWriter.write( writer, pluginMap );
-                
-                metadata.setFile( updatedMetadataFile );
-            }
-            catch ( IOException e )
-            {
-                throw new MojoExecutionException( "Error writing repository metadata to build directory.", e );
-            }
-            finally
-            {
-                IOUtil.close( writer );
             }
         }
+
+        return packagingHandlers;
     }
-    
+
     private String getGoalPrefix()
     {
         if ( goalPrefix == null )
         {
             goalPrefix = PluginDescriptor.getGoalPrefixFromArtifactId( project.getArtifactId() );
         }
-        
+
         return goalPrefix;
     }
 
+    public static class DummyComponentDiscovererManager implements ComponentDiscovererManager
+    {
+
+        DummyComponentDiscovererManager()
+        {
+        }
+        
+        public List getComponentDiscoverers()
+        {
+            return null;
+        }
+
+        public void registerComponentDiscoveryListener( ComponentDiscoveryListener listener )
+        {
+        }
+
+        public void removeComponentDiscoveryListener( ComponentDiscoveryListener listener )
+        {
+        }
+
+        public void fireComponentDiscoveryEvent( ComponentDiscoveryEvent event )
+        {
+        }
+
+        public void initialize()
+        {
+        }
+
+        public List getListenerDescriptors()
+        {
+            return null;
+        }
+        
+    }
 }

Added: maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/plexus/components.xml?rev=216273&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/plexus/components.xml (added)
+++ maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/plexus/components.xml Wed Jul 13 14:57:57 2005
@@ -0,0 +1,23 @@
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
+      <role-hint>war</role-hint>
+      <implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
+      <configuration>
+        <!-- START SNIPPET: war-lifecycle -->
+        <phases>
+          <process-resources>resources:resources</process-resources>
+          <compile>compiler:compile</compile>
+          <process-test-resources>resources:testResources</process-test-resources>
+          <test-compile>compiler:testCompile</test-compile>
+          <test>surefire:test</test>
+          <package>war:war</package>
+          <install>install:install</install>
+          <deploy>deploy:deploy</deploy>
+        </phases>
+        <!-- END SNIPPET: war-lifecycle -->
+      </configuration>
+    </component>
+  </components>
+</component-set>

Propchange: maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-plugins/maven-war-plugin/src/main/resources/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Modified: maven/components/trunk/maven-plugins/pom.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/pom.xml?rev=216273&r1=216272&r2=216273&view=diff
==============================================================================
--- maven/components/trunk/maven-plugins/pom.xml (original)
+++ maven/components/trunk/maven-plugins/pom.xml Wed Jul 13 14:57:57 2005
@@ -71,8 +71,8 @@
   </organization>
   <distributionManagement>
     <repository>
-      <id>central</id>
-      <name>Maven Central Repository</name>
+      <id>central-plugins</id>
+      <name>Maven Central Plugins Repository</name>
       <url>scp://repo1.maven.org/home/projects/maven/repository-staging/to-ibiblio/maven2/plugins</url>
     </repository>
     <site>
@@ -80,6 +80,13 @@
       <url>scp://minotaur.apache.org/www/maven.apache.org/maven2/plugins/</url>
     </site>
   </distributionManagement>
+  <repositories>
+    <repository>
+      <id>central-plugins</id>
+      <name>Maven Central Plugins Repository</name>
+      <url>scp://repo1.maven.org/home/projects/maven/repository-staging/to-ibiblio/maven2/plugins</url>
+    </repository>
+  </repositories>
   <modules>
     <module>maven-ant-plugin</module>
     <module>maven-assembly-plugin</module>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org