Author: jdcasey Date: Mon Jul 13 23:24:10 2009 New Revision: 793745 URL: http://svn.apache.org/viewvc?rev=793745&view=rev Log: [MNG-3506] Allow projects to specify a build extension that provides an artifact handler which will then be used for the project's own artifact.
Modified: maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonProviderMapping.java maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonProviderMapping.java maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java maven/maven-2/branches/maven-2.2.x/maven-core/src/test/java/org/apache/maven/WagonSelectorTest.java maven/maven-2/branches/maven-2.2.x/maven-core/src/test/resources/org/apache/maven/WagonSelectorTest.xml maven/maven-2/branches/maven-2.2.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java Modified: maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonProviderMapping.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonProviderMapping.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonProviderMapping.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/DefaultWagonProviderMapping.java Mon Jul 13 23:24:10 2009 @@ -1,5 +1,24 @@ package org.apache.maven.artifact.manager; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + import java.util.HashMap; import java.util.Map; Modified: maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonProviderMapping.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonProviderMapping.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonProviderMapping.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-artifact-manager/src/main/java/org/apache/maven/artifact/manager/WagonProviderMapping.java Mon Jul 13 23:24:10 2009 @@ -1,5 +1,24 @@ package org.apache.maven.artifact.manager; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + public interface WagonProviderMapping { Modified: maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java Mon Jul 13 23:24:10 2009 @@ -160,7 +160,7 @@ return settings; } - public List getSortedProjects() + public List<MavenProject> getSortedProjects() { return reactorManager.getSortedProjects(); } Modified: maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/execution/ReactorManager.java Mon Jul 13 23:24:10 2009 @@ -203,7 +203,7 @@ return sorter.hasMultipleProjects(); } - public List getSortedProjects() + public List<MavenProject> getSortedProjects() { return sorter.getSortedProjects(); } Modified: maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java Mon Jul 13 23:24:10 2009 @@ -23,6 +23,7 @@ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.artifact.manager.WagonManager; import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException; import org.apache.maven.artifact.metadata.ArtifactMetadataSource; @@ -45,6 +46,7 @@ import org.codehaus.plexus.PlexusConstants; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.PlexusContainerException; +import org.codehaus.plexus.component.repository.ComponentDescriptor; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.context.Context; import org.codehaus.plexus.context.ContextException; @@ -57,6 +59,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; @@ -261,11 +264,12 @@ return child; } + @SuppressWarnings( "unchecked" ) public void registerWagons() { if ( extensionContainer != null ) { - Map wagons = extensionContainer.getComponentDescriptorMap( Wagon.ROLE ); + Map<String, ComponentDescriptor> wagons = extensionContainer.getComponentDescriptorMap( Wagon.ROLE ); if ( wagons != null && !wagons.isEmpty() ) { getLogger().debug( "Wagons to register: " + wagons.keySet() ); @@ -277,6 +281,37 @@ getLogger().debug( "Wagons could not be registered as the extension container was never created" ); } } + + @SuppressWarnings( "unchecked" ) + public Map<String, ArtifactHandler> getArtifactTypeHandlers() + { + Map<String, ArtifactHandler> result = new HashMap<String, ArtifactHandler>(); + + if ( extensionContainer != null ) + { + try + { + result.putAll( extensionContainer.lookupMap( ArtifactHandler.ROLE ) ); + } + catch ( ComponentLookupException e ) + { + getLogger().debug( "ArtifactHandler extensions could not be loaded: " + e.getMessage(), e ); + } + } + else + { + try + { + result.putAll( container.lookupMap( ArtifactHandler.ROLE ) ); + } + catch ( ComponentLookupException e ) + { + getLogger().debug( "ArtifactHandler extensions could not be loaded: " + e.getMessage(), e ); + } + } + + return result; + } public void contextualize( Context context ) throws ContextException Modified: maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/extension/ExtensionManager.java Mon Jul 13 23:24:10 2009 @@ -19,6 +19,7 @@ * under the License. */ +import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; @@ -26,6 +27,8 @@ import org.apache.maven.project.MavenProject; import org.codehaus.plexus.PlexusContainerException; +import java.util.Map; + /** * Used to locate extensions. * @@ -38,4 +41,6 @@ throws ArtifactResolutionException, PlexusContainerException, ArtifactNotFoundException; void registerWagons(); + + Map<String, ArtifactHandler> getArtifactTypeHandlers(); } Modified: maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Mon Jul 13 23:24:10 2009 @@ -185,10 +185,9 @@ throws LifecycleExecutionException { // TODO: MNG-4081. What about extensions within the current reactor?? - for ( Iterator i = session.getSortedProjects().iterator(); i.hasNext(); ) + Map<String, ArtifactHandler> handlers = new HashMap<String, ArtifactHandler>(); + for ( MavenProject project : session.getSortedProjects() ) { - MavenProject project = (MavenProject) i.next(); - for ( Iterator j = project.getBuildExtensions().iterator(); j.hasNext(); ) { Extension extension = (Extension) j.next(); @@ -211,19 +210,37 @@ } } - extensionManager.registerWagons(); + } + + extensionManager.registerWagons(); + + handlers.putAll( extensionManager.getArtifactTypeHandlers() ); + for ( MavenProject project : session.getSortedProjects() ) + { try { - Map handlers = findArtifactTypeHandlers( project, session.getSettings(), session.getLocalRepository() ); + handlers.putAll( findArtifactTypeHandlersInPlugins( project, session.getSettings(), session.getLocalRepository() ) ); - artifactHandlerManager.addHandlers( handlers ); + // shudder... + for ( ArtifactHandler handler : handlers.values() ) + { + if ( project.getPackaging().equals( handler.getPackaging() ) ) + { + project.getArtifact().setArtifactHandler( handler ); + + // NOTE: Adding this (maven 2.2.1) to short-circuit things. This means first match is used, NOT LAST. + break; + } + } } catch ( PluginNotFoundException e ) { throw new LifecycleExecutionException( e.getMessage(), e ); } } + + artifactHandlerManager.addHandlers( handlers ); } private void executeTaskSegments( List taskSegments, ReactorManager rm, MavenSession session, @@ -1443,10 +1460,11 @@ * @todo Not particularly happy about this. Would like WagonManager and ArtifactTypeHandlerManager to be able to * lookup directly, or have them passed in */ - private Map findArtifactTypeHandlers( MavenProject project, Settings settings, ArtifactRepository localRepository ) + private Map<String, ArtifactHandler> findArtifactTypeHandlersInPlugins( MavenProject project, Settings settings, + ArtifactRepository localRepository ) throws LifecycleExecutionException, PluginNotFoundException { - Map map = new HashMap(); + Map<String, ArtifactHandler> map = new HashMap<String, ArtifactHandler>(); for ( Iterator i = project.getBuildPlugins().iterator(); i.hasNext(); ) { Plugin plugin = (Plugin) i.next(); @@ -1470,16 +1488,6 @@ throw new LifecycleExecutionException( "Error looking up available components from plugin '" + plugin.getKey() + "': " + e.getMessage(), e ); } - - // shudder... - for ( Iterator j = map.values().iterator(); j.hasNext(); ) - { - ArtifactHandler handler = (ArtifactHandler) j.next(); - if ( project.getPackaging().equals( handler.getPackaging() ) ) - { - project.getArtifact().setArtifactHandler( handler ); - } - } } } return map; Modified: maven/maven-2/branches/maven-2.2.x/maven-core/src/test/java/org/apache/maven/WagonSelectorTest.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-core/src/test/java/org/apache/maven/WagonSelectorTest.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-core/src/test/java/org/apache/maven/WagonSelectorTest.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-core/src/test/java/org/apache/maven/WagonSelectorTest.java Mon Jul 13 23:24:10 2009 @@ -1,5 +1,24 @@ package org.apache.maven; +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + import org.apache.maven.artifact.manager.WagonConfigurationException; import org.apache.maven.artifact.manager.WagonManager; import org.apache.maven.artifact.repository.ArtifactRepository; Modified: maven/maven-2/branches/maven-2.2.x/maven-core/src/test/resources/org/apache/maven/WagonSelectorTest.xml URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-core/src/test/resources/org/apache/maven/WagonSelectorTest.xml?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-core/src/test/resources/org/apache/maven/WagonSelectorTest.xml (original) +++ maven/maven-2/branches/maven-2.2.x/maven-core/src/test/resources/org/apache/maven/WagonSelectorTest.xml Mon Jul 13 23:24:10 2009 @@ -1,3 +1,22 @@ +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + <component-set> <components> <component> Modified: maven/maven-2/branches/maven-2.2.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java URL: http://svn.apache.org/viewvc/maven/maven-2/branches/maven-2.2.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java?rev=793745&r1=793744&r2=793745&view=diff ============================================================================== --- maven/maven-2/branches/maven-2.2.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java (original) +++ maven/maven-2/branches/maven-2.2.x/maven-project/src/main/java/org/apache/maven/project/ProjectSorter.java Mon Jul 13 23:24:10 2009 @@ -52,7 +52,7 @@ private final Map projectMap; - private final List sortedProjects; + private final List<MavenProject> sortedProjects; private MavenProject topLevelProject; @@ -369,7 +369,7 @@ return topLevelProject; } - public List getSortedProjects() + public List<MavenProject> getSortedProjects() { return sortedProjects; }