You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/07/19 23:14:20 UTC

svn commit: r795611 - in /maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model: building/DefaultModelBuilder.java management/DefaultDependencyManagementImporter.java management/DependencyManagementImporter.java

Author: bentmann
Date: Sun Jul 19 21:14:17 2009
New Revision: 795611

URL: http://svn.apache.org/viewvc?rev=795611&view=rev
Log:
[MNG-3220] Allow managed dependencies to be imported into other projects

o Restored import scope for 3.x

Added:
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultDependencyManagementImporter.java   (with props)
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DependencyManagementImporter.java   (with props)
Modified:
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java

Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java?rev=795611&r1=795610&r2=795611&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java Sun Jul 19 21:14:17 2009
@@ -23,9 +23,12 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Parent;
 import org.apache.maven.model.Profile;
@@ -35,6 +38,7 @@
 import org.apache.maven.model.interpolation.ModelInterpolator;
 import org.apache.maven.model.io.ModelParseException;
 import org.apache.maven.model.io.ModelReader;
+import org.apache.maven.model.management.DependencyManagementImporter;
 import org.apache.maven.model.management.DependencyManagementInjector;
 import org.apache.maven.model.management.PluginManagementInjector;
 import org.apache.maven.model.normalization.ModelNormalizer;
@@ -98,6 +102,9 @@
     private DependencyManagementInjector dependencyManagementInjector;
 
     @Requirement
+    private DependencyManagementImporter dependencyManagementImporter;
+
+    @Requirement
     private LifecycleBindingsInjector lifecycleBindingsInjector;
 
     @Requirement
@@ -177,6 +184,8 @@
 
         pluginManagementInjector.injectManagement( resultModel, request );
 
+        importDependencyManagement( resultModel, request, problems );
+
         dependencyManagementInjector.injectManagement( resultModel, request );
 
         modelNormalizer.injectDefaultValues( resultModel, request );
@@ -511,6 +520,86 @@
         return ModelUtils.cloneModel( superPomProvider.getSuperModel( "4.0.0" ) );
     }
 
+    private void importDependencyManagement( Model model, ModelBuildingRequest request, List<ModelProblem> problems )
+    {
+        DependencyManagement depMngt = model.getDependencyManagement();
+
+        if ( depMngt == null )
+        {
+            return;
+        }
+
+        ModelResolver modelResolver = request.getModelResolver();
+
+        ModelBuildingRequest importRequest = null;
+
+        List<Model> importModels = null;
+
+        for ( Iterator<Dependency> it = depMngt.getDependencies().iterator(); it.hasNext(); )
+        {
+            Dependency dependency = it.next();
+
+            if ( !"pom".equals( dependency.getType() ) || !"import".equals( dependency.getScope() ) )
+            {
+                continue;
+            }
+
+            it.remove();
+
+            if ( modelResolver == null )
+            {
+                throw new IllegalArgumentException( "no model resolver provided, cannot resolve import POM "
+                    + toId( dependency ) + " for POM " + toSourceHint( model ) );
+            }
+
+            ModelSource importSource;
+            try
+            {
+                importSource =
+                    modelResolver.resolveModel( dependency.getGroupId(), dependency.getArtifactId(),
+                                                dependency.getVersion() );
+            }
+            catch ( UnresolvableModelException e )
+            {
+                problems.add( new ModelProblem( "Non-resolvable import POM " + toId( dependency ) + " for POM "
+                    + toSourceHint( model ) + ": " + e.getMessage(), ModelProblem.Severity.ERROR,
+                                                toSourceHint( model ), e ) );
+                continue;
+            }
+
+            if ( importRequest == null )
+            {
+                importRequest = new DefaultModelBuildingRequest();
+                importRequest.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );
+            }
+
+            importRequest.setModelSource( importSource );
+            importRequest.setModelResolver( modelResolver.newCopy() );
+
+            ModelBuildingResult importResult;
+            try
+            {
+                importResult = build( importRequest );
+            }
+            catch ( ModelBuildingException e )
+            {
+                problems.addAll( e.getProblems() );
+                continue;
+            }
+
+            problems.addAll( importResult.getProblems() );
+
+            if ( importModels == null )
+            {
+                importModels = new ArrayList<Model>();
+            }
+
+            importModels.add( importResult.getEffectiveModel() );
+        }
+
+        dependencyManagementImporter.importManagement( model, importModels, request );
+    }
+
     private void fireBuildExtensionsAssembled( Model model, ModelBuildingRequest request, List<ModelProblem> problems )
         throws ModelBuildingException
     {
@@ -609,4 +698,17 @@
         return buffer.toString();
     }
 
+    private String toId( Dependency dependency )
+    {
+        StringBuilder buffer = new StringBuilder( 64 );
+
+        buffer.append( dependency.getGroupId() );
+        buffer.append( ':' );
+        buffer.append( dependency.getArtifactId() );
+        buffer.append( ':' );
+        buffer.append( dependency.getVersion() );
+
+        return buffer.toString();
+    }
+
 }

Added: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultDependencyManagementImporter.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultDependencyManagementImporter.java?rev=795611&view=auto
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultDependencyManagementImporter.java (added)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultDependencyManagementImporter.java Sun Jul 19 21:14:17 2009
@@ -0,0 +1,85 @@
+package org.apache.maven.model.management;
+
+/*
+ * 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.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.DependencyManagement;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.building.ModelBuildingRequest;
+import org.codehaus.plexus.component.annotations.Component;
+
+/**
+ * Handles the import of dependency management from other models into the target model.
+ * 
+ * @author Benjamin Bentmann
+ */
+@Component( role = DependencyManagementImporter.class )
+public class DefaultDependencyManagementImporter
+    implements DependencyManagementImporter
+{
+
+    public void importManagement( Model target, List<? extends Model> sources, ModelBuildingRequest request )
+    {
+        if ( sources != null && !sources.isEmpty() )
+        {
+            Map<String, Dependency> dependencies = new LinkedHashMap<String, Dependency>();
+
+            DependencyManagement depMngt = target.getDependencyManagement();
+
+            if ( depMngt != null )
+            {
+                for ( Dependency dependency : depMngt.getDependencies() )
+                {
+                    dependencies.put( dependency.getManagementKey(), dependency );
+                }
+            }
+            else
+            {
+                depMngt = new DependencyManagement();
+                target.setDependencyManagement( depMngt );
+            }
+
+            for ( Model source : sources )
+            {
+                DependencyManagement depMngtImport = source.getDependencyManagement();
+
+                if ( depMngtImport != null )
+                {
+                    for ( Dependency dependency : depMngtImport.getDependencies() )
+                    {
+                        String key = dependency.getManagementKey();
+                        if ( !dependencies.containsKey( key ) )
+                        {
+                            dependencies.put( key, dependency );
+                        }
+                    }
+                }
+            }
+
+            depMngt.setDependencies( new ArrayList<Dependency>( dependencies.values() ) );
+        }
+    }
+
+}

Propchange: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultDependencyManagementImporter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DefaultDependencyManagementImporter.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DependencyManagementImporter.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DependencyManagementImporter.java?rev=795611&view=auto
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DependencyManagementImporter.java (added)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DependencyManagementImporter.java Sun Jul 19 21:14:17 2009
@@ -0,0 +1,44 @@
+package org.apache.maven.model.management;
+
+/*
+ * 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.List;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.model.building.ModelBuildingRequest;
+
+/**
+ * Handles the import of dependency management from other models into the target model.
+ * 
+ * @author Benjamin Bentmann
+ */
+public interface DependencyManagementImporter
+{
+
+    /**
+     * Imports the dependency management of the specified source models into the given target model.
+     * 
+     * @param target The model into which to import the dependency management section, must not be <code>null</code>.
+     * @param sources The models from which to import the dependency management sections, may be <code>null</code>.
+     * @param request The model building request that holds further settings, must not be {@code null}.
+     */
+    void importManagement( Model target, List<? extends Model> sources, ModelBuildingRequest request );
+
+}

Propchange: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DependencyManagementImporter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/management/DependencyManagementImporter.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision