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/06/12 21:22:42 UTC

svn commit: r784241 - in /maven/components/trunk: maven-core/src/test/java/org/apache/maven/project/ maven-core/src/test/resources-project-builder/dependencies-different-versions/ maven-core/src/test/resources-project-builder/unique-dependency-key/ mav...

Author: bentmann
Date: Fri Jun 12 19:22:41 2009
New Revision: 784241

URL: http://svn.apache.org/viewvc?rev=784241&view=rev
Log:
[MNG-4005] Throw Validation Error if pom contains a dependency with two different versions.

Added:
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/   (with props)
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/   (with props)
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/   (with props)
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/pom.xml   (with props)
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/pom.xml   (with props)
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/   (with props)
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/   (with props)
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/pom.xml   (with props)
    maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/pom.xml   (with props)
Removed:
    maven/components/trunk/maven-core/src/test/resources-project-builder/dependencies-different-versions/
Modified:
    maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
    maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java

Modified: maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java?rev=784241&r1=784240&r2=784241&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java (original)
+++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java Fri Jun 12 19:22:41 2009
@@ -167,21 +167,69 @@
 
     }
 
-    /*MNG-4005 - not implemented
-    public void testDependenciesDifferentVersions()
+    /** MNG-4005 */
+    public void testValidationErrorUponNonUniqueDependencyKey()
         throws Exception
     {
-        PomTestWrapper pom = buildPom( "dependencies-different-versions" );
+        try
+        {
+            buildPom( "unique-dependency-key/deps" );
+            fail( "Non-unique dependency keys did not cause validation error" );
+        }
+        catch ( ProjectBuildingException e )
+        {
+            // expected
+        }
+    }
 
+    public void testValidationErrorUponNonUniqueDependencyManagementKey()
+        throws Exception
+    {
+        try
+        {
+            buildPom( "unique-dependency-key/dep-mngt" );
+            fail( "Non-unique dependency keys did not cause validation error" );
+        }
+        catch ( ProjectBuildingException e )
+        {
+            // expected
+        }
+    }
+
+    public void testValidationErrorUponNonUniqueDependencyKeyInProfile()
+        throws Exception
+    {
+        try
+        {
+            buildPom( "unique-dependency-key/deps-in-profile" );
+            fail( "Non-unique dependency keys did not cause validation error" );
+        }
+        catch ( ProjectBuildingException e )
+        {
+            // expected
+        }
+    }
+
+    public void testValidationErrorUponNonUniqueDependencyManagementKeyInProfile()
+        throws Exception
+    {
+        try
+        {
+            buildPom( "unique-dependency-key/dep-mngt-in-profile" );
+            fail( "Non-unique dependency keys did not cause validation error" );
+        }
+        catch ( ProjectBuildingException e )
+        {
+            // expected
+        }
     }
-    */
 
     public void testDuplicateDependenciesCauseLastDeclarationToBePickedInLenientMode()
         throws Exception
     {
-        PomTestWrapper pom = buildPom( "dependencies-different-versions", true, null );
+        PomTestWrapper pom = buildPom( "unique-dependency-key/deps", true, null );
         assertEquals( 1, ( (List<?>) pom.getValue( "dependencies" ) ).size() );
-        assertEquals( "1.1", pom.getValue( "dependencies[1]/version" ) );
+        assertEquals( "0.2", pom.getValue( "dependencies[1]/version" ) );
     }
 
     /* MNG-3567*/
@@ -1501,7 +1549,6 @@
         catch ( ProjectBuildingException e )
         {
             // expected
-            e.printStackTrace();
         }
     }
 

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Added: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/pom.xml?rev=784241&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/pom.xml (added)
+++ maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/pom.xml Fri Jun 12 19:22:41 2009
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.mng4005</groupId>
+  <artifactId>b</artifactId>
+  <version>0.1</version>
+  <packaging>jar</packaging>
+
+  <profiles>
+    <profile>
+      <id>test</id>
+      <dependencyManagement>
+        <dependencies>
+          <dependency>
+            <groupId>org.apache.maven.its.mng4005</groupId>
+            <artifactId>a</artifactId>
+            <version>0.1</version>
+          </dependency>
+          <dependency>
+            <groupId>org.apache.maven.its.mng4005</groupId>
+            <artifactId>a</artifactId>
+            <version>0.2</version>
+          </dependency>
+        </dependencies>
+      </dependencyManagement>
+    </profile>
+  </profiles>
+</project>

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt-in-profile/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/pom.xml?rev=784241&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/pom.xml (added)
+++ maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/pom.xml Fri Jun 12 19:22:41 2009
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.mng4005</groupId>
+  <artifactId>b</artifactId>
+  <version>0.1</version>
+  <packaging>jar</packaging>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.maven.its.mng4005</groupId>
+        <artifactId>a</artifactId>
+        <version>0.1</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.maven.its.mng4005</groupId>
+        <artifactId>a</artifactId>
+        <version>0.2</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+</project>

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/dep-mngt/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/
------------------------------------------------------------------------------
    bugtraq:label = Enter issue ID:

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/
------------------------------------------------------------------------------
    bugtraq:message = Issue id: %BUGID%

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/
------------------------------------------------------------------------------
    bugtraq:number = false

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/
------------------------------------------------------------------------------
    bugtraq:url = http://jira.codehaus.org/browse/%BUGID%

Added: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/pom.xml?rev=784241&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/pom.xml (added)
+++ maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/pom.xml Fri Jun 12 19:22:41 2009
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.mng4005</groupId>
+  <artifactId>b</artifactId>
+  <version>0.1</version>
+  <packaging>jar</packaging>
+
+  <profiles>
+    <profile>
+      <id>test</id>
+      <dependencies>
+        <dependency>
+          <groupId>org.apache.maven.its.mng4005</groupId>
+          <artifactId>a</artifactId>
+          <version>0.1</version>
+        </dependency>
+        <dependency>
+          <groupId>org.apache.maven.its.mng4005</groupId>
+          <artifactId>a</artifactId>
+          <version>0.2</version>
+        </dependency>
+      </dependencies>
+    </profile>
+  </profiles>
+</project>

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps-in-profile/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/pom.xml?rev=784241&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/pom.xml (added)
+++ maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/pom.xml Fri Jun 12 19:22:41 2009
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<project>
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.mng4005</groupId>
+  <artifactId>b</artifactId>
+  <version>0.1</version>
+  <packaging>jar</packaging>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.its.mng4005</groupId>
+      <artifactId>a</artifactId>
+      <version>0.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.its.mng4005</groupId>
+      <artifactId>a</artifactId>
+      <version>0.2</version>
+    </dependency>
+  </dependencies>
+</project>

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/resources-project-builder/unique-dependency-key/deps/pom.xml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java?rev=784241&r1=784240&r2=784241&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/validation/DefaultModelValidator.java Fri Jun 12 19:22:41 2009
@@ -20,9 +20,9 @@
  */
 
 import java.io.File;
-import java.util.Collection;
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Dependency;
@@ -72,12 +72,29 @@
 
         if ( !request.istLenientValidation() )
         {
+            validateDependencies( result, model.getDependencies(), "dependencies" );
+
+            if ( model.getDependencyManagement() != null )
+            {
+                validateDependencies( result, model.getDependencyManagement().getDependencies(),
+                                      "dependencyManagment.dependencies" );
+            }
+
             validateRepositories( result, model.getRepositories(), "repositories.repository" );
 
             validateRepositories( result, model.getPluginRepositories(), "pluginRepositories.pluginRepository" );
 
             for ( Profile profile : model.getProfiles() )
             {
+                validateDependencies( result, profile.getDependencies(), "profiles.profile[" + profile.getId()
+                    + "].dependencies" );
+
+                if ( profile.getDependencyManagement() != null )
+                {
+                    validateDependencies( result, profile.getDependencyManagement().getDependencies(),
+                                          "profiles.profile[" + profile.getId() + "].dependencyManagment.dependencies" );
+                }
+
                 validateRepositories( result, profile.getRepositories(), "profiles.profile[" + profile.getId()
                     + "].repositories.repository" );
 
@@ -246,20 +263,50 @@
         }
     }
 
+    private void validateDependencies( ModelValidationResult result, List<Dependency> dependencies, String prefix )
+    {
+        Map<String, Dependency> index = new HashMap<String, Dependency>();
+
+        for ( Dependency dependency : dependencies )
+        {
+            String key = dependency.getManagementKey();
+
+            Dependency existing = index.get( key );
+
+            if ( existing != null )
+            {
+                result.addMessage( "'" + prefix + ".(groupId:artifactId:type:classifier)' must be unique: " + key
+                    + " -> " + existing.getVersion() + " vs " + dependency.getVersion() );
+            }
+            else
+            {
+                index.put( key, dependency );
+            }
+        }
+    }
+
     private void validateRepositories( ModelValidationResult result, List<Repository> repositories, String prefix )
     {
-        Collection<String> ids = new HashSet<String>();
+        Map<String, Repository> index = new HashMap<String, Repository>();
 
-        for ( Repository repository :  repositories )
+        for ( Repository repository : repositories )
         {
             validateStringNotEmpty( prefix + ".id", result, repository.getId() );
 
             validateStringNotEmpty( prefix + ".url", result, repository.getUrl() );
 
-            if ( !ids.add( repository.getId() ) )
+            String key = repository.getId();
+
+            Repository existing = index.get( key );
+
+            if ( existing != null )
             {
                 result.addMessage( "'" + prefix + ".id' must be unique: " + repository.getId() + " -> "
-                    + repository.getUrl() );
+                    + existing.getUrl() + " vs " + repository.getUrl() );
+            }
+            else
+            {
+                index.put( key, repository );
             }
         }
     }