You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by ma...@apache.org on 2009/03/03 22:56:28 UTC

svn commit: r749782 - in /ant/ivy/core/trunk: ./ src/java/org/apache/ivy/plugins/parser/m2/ test/java/org/apache/ivy/plugins/parser/m2/

Author: maartenc
Date: Tue Mar  3 21:56:28 2009
New Revision: 749782

URL: http://svn.apache.org/viewvc?rev=749782&view=rev
Log:
FIX: Dependencies don't inherit exclusions from dependencyManagement (IVY-974) (thanks to John Gibson)

Modified:
    ant/ivy/core/trunk/CHANGES.txt
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java
    ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/test-dependencyMgt.pom

Modified: ant/ivy/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=749782&r1=749781&r2=749782&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Tue Mar  3 21:56:28 2009
@@ -31,6 +31,7 @@
 	Danno Ferrin
 	Benjamin Francisoud	
 	Jacob Grydholt Jensen
+	John Gibson
 	Scott Goldstein
 	Pierre Hägnestrand
 	Scott Hebert
@@ -98,6 +99,7 @@
 - IMPROVEMENT: Error message is not clear when specifying an invalid value for checksums (IVY-977)
 - IMPROVEMENT: catch AccessControlException on System.getProperties() (IVY-1015)
 
+- FIX: Dependencies don't inherit exclusions from dependencyManagement (IVY-974) (thanks to John Gibson)
 - FIX: Dependency Configuration Negation does not work (IVY-982)
 - FIX: Ivy retrieve does not honor validate="false" from ivysettings (IVY-992)
 - FIX: Snapshot issues when using ibiblio resolver with m2compatible is false (IVY-1028)

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java?rev=749782&r1=749781&r2=749782&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java Tue Mar  3 21:56:28 2009
@@ -17,18 +17,22 @@
  */
 package org.apache.ivy.plugins.parser.m2;
 
+import java.util.List;
+
 public class DefaultPomDependencyMgt implements PomDependencyMgt {
     private String groupId;
     private String artifactId;
     private String version;
     private String scope;
+    private List /*<ModuleId>*/ excludedModules;
     
     public DefaultPomDependencyMgt(
-            String groupId, String artifactId, String version, String scope) {
+            String groupId, String artifactId, String version, String scope, List /*<ModuleId>*/ excludedModules) {
         this.groupId = groupId;
         this.artifactId = artifactId;
         this.version = version;
         this.scope = scope;
+        this.excludedModules = excludedModules;
     }
     
     public String getScope() {
@@ -38,12 +42,16 @@
     public String getGroupId() {
         return groupId;
     }
+    
     public String getArtifactId() {
         return artifactId;
     }
+    
     public String getVersion() {
         return version;
     }
     
-    
+    public List /*<ModuleId>*/ getExcludedModules() {
+        return excludedModules;
+    }
 }

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java?rev=749782&r1=749781&r2=749782&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java Tue Mar  3 21:56:28 2009
@@ -17,6 +17,8 @@
  */
 package org.apache.ivy.plugins.parser.m2;
 
+import java.util.List;
+
 public interface PomDependencyMgt {
 
     public abstract String getGroupId();
@@ -27,4 +29,5 @@
     
     public abstract String getScope();
 
+    public List /*<ModuleId>*/ getExcludedModules();
 }
\ No newline at end of file

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java?rev=749782&r1=749781&r2=749782&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java Tue Mar  3 21:56:28 2009
@@ -25,6 +25,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -305,7 +306,15 @@
             dd.addDependencyArtifact(optionalizedScope, depArtifact);
         }
         
-        for (Iterator itExcl = dep.getExcludedModules().iterator(); itExcl.hasNext();) {
+        // experimentation shows the following, excluded modules are
+        // inherited from parent POMs if either of the following is true:
+        // the <exclusions> element is missing or the <exclusions> element
+        // is present, but empty.
+        List /*<ModuleId>*/ excluded = dep.getExcludedModules();
+        if (excluded.isEmpty()) {
+            excluded = getDependencyMgtExclusions(ivyModuleDescriptor, dep.getGroupId(), dep.getArtifactId());
+        }
+        for (Iterator itExcl = excluded.iterator(); itExcl.hasNext();) {
             ModuleId excludedModule = (ModuleId) itExcl.next();
             String[] confs = dd.getModuleConfigurations();
             for (int k = 0; k < confs.length; k++) {
@@ -334,6 +343,17 @@
                                     dep.getGroupId(), dep.getArtifactId());
             ivyModuleDescriptor.addExtraInfo(scopeKey, dep.getScope());
         }
+        if(!dep.getExcludedModules().isEmpty()) {
+            final String exclusionPrefix = getDependencyMgtExtraInfoPrefixForExclusion(
+                    dep.getGroupId(), dep.getArtifactId());
+            int index = 0;
+            for (final Iterator iter = dep.getExcludedModules().iterator(); iter.hasNext();) {
+                final ModuleId excludedModule = (ModuleId) iter.next();
+                ivyModuleDescriptor.addExtraInfo(exclusionPrefix + index,
+                        excludedModule.getOrganisation() + EXTRA_INFO_DELIMITER + excludedModule.getName());
+                index += 1;
+            }
+        }
         // dependency management info is also used for version mediation of transitive dependencies
         ivyModuleDescriptor.addDependencyDescriptorMediator(
             ModuleId.newInstance(dep.getGroupId(), dep.getArtifactId()), 
@@ -394,6 +414,10 @@
         public String getScope() {
             return null;
         }
+
+        public List /*<ModuleId>*/ getExcludedModules() {
+            return Collections.EMPTY_LIST; // probably not used?
+        }
     }
 
     private String getDefaultVersion(PomDependencyData dep) {
@@ -425,6 +449,38 @@
         return PROPERTIES + EXTRA_INFO_DELIMITER + propertyName;
     }
 
+    private static String getDependencyMgtExtraInfoPrefixForExclusion(
+                                String groupId, String artifaceId) {
+        return DEPENDENCY_MANAGEMENT + EXTRA_INFO_DELIMITER + groupId
+                + EXTRA_INFO_DELIMITER + artifaceId + EXTRA_INFO_DELIMITER + "exclusion_";
+    }
+
+    private static List /*<ModuleId>*/ getDependencyMgtExclusions(
+                                final ModuleDescriptor descriptor,
+                                final String groupId,
+                                final String artifactId) {
+        final String exclusionPrefix = getDependencyMgtExtraInfoPrefixForExclusion(
+                groupId, artifactId);
+        final List /*<ModuleId>*/ exclusionIds = new LinkedList /*<ModuleId>*/ ();
+        final Map /*<String,String>*/ extras = descriptor.getExtraInfo();
+        for (final Iterator entIter = extras.entrySet().iterator(); entIter.hasNext();) {
+            final Map.Entry /*<String,String>*/ ent = (Map.Entry) entIter.next();
+            final String key = (String) ent.getKey();
+            if (key.startsWith(exclusionPrefix)) {
+                final String full_exclusion = (String) ent.getValue();
+                final String[] exclusion_parts = full_exclusion.split(EXTRA_INFO_DELIMITER);
+                if(exclusion_parts.length != 2) {
+                    Message.error("what seemed to be a dependency management extra info exclusion " +
+                            "had the wrong number of parts (should have 2) " + exclusion_parts.length + " : " + full_exclusion);
+                    continue;
+                }
+                exclusionIds.add(ModuleId.newInstance(exclusion_parts[0], exclusion_parts[1]));
+            }
+        }
+
+        return exclusionIds;
+    }
+
     public static Map/*<ModuleId, String version>*/ 
             getDependencyManagementMap(ModuleDescriptor md) {
         Map ret = new LinkedHashMap();
@@ -466,7 +522,8 @@
                     String version = (String) md.getExtraInfo().get(versionKey);
                     String scope = (String) md.getExtraInfo().get(scopeKey);
                     
-                    result.add(new DefaultPomDependencyMgt(parts[1], parts[2], version, scope));
+                    List /*<ModuleId>*/ exclusions = getDependencyMgtExclusions(md, parts[1], parts[2]);
+                    result.add(new DefaultPomDependencyMgt(parts[1], parts[2], version, scope, exclusions));
                 }
             }
         }

Modified: ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java?rev=749782&r1=749781&r2=749782&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java (original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/PomReader.java Tue Mar  3 21:56:28 2009
@@ -25,6 +25,7 @@
 import java.io.LineNumberReader;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -325,6 +326,24 @@
             return replaceProps(val);
         }
         
+        public List /*<ModuleId>*/ getExcludedModules() {
+            Element exclusionsElement = getFirstChildElement(depElement, EXCLUSIONS);
+            LinkedList exclusions = new LinkedList();
+            if (exclusionsElement != null) {
+                NodeList childs = exclusionsElement.getChildNodes();
+                for (int i = 0; i < childs.getLength(); i++) {
+                    Node node = childs.item(i);
+                    if (node instanceof Element && EXCLUSION.equals(node.getNodeName())) {
+                        String groupId = getFirstChildText((Element) node, GROUP_ID);
+                        String artifactId = getFirstChildText((Element) node, ARTIFACT_ID);
+                        if ((groupId != null) && (artifactId != null)) {
+                            exclusions.add(ModuleId.newInstance(groupId, artifactId));
+                        }
+                    }
+                }
+            }
+            return exclusions;
+        }
     }
     
     public List /* <PomPluginElement> */ getPlugins() {
@@ -374,6 +393,9 @@
             return null; // not used
         }
         
+        public List /*<ModuleId>*/ getExcludedModules() {
+            return Collections.EMPTY_LIST; // probably not used?
+        }
     }
     
     
@@ -403,26 +425,6 @@
             Element e = getFirstChildElement(depElement, OPTIONAL); 
             return (e != null) && "true".equalsIgnoreCase(getTextContent(e));
         }
-        
-        public List /*<ModuleId>*/ getExcludedModules() {
-            Element exclusionsElement = getFirstChildElement(depElement, EXCLUSIONS);
-            LinkedList exclusions = new LinkedList();
-            if (exclusionsElement != null) {
-                NodeList childs = exclusionsElement.getChildNodes();
-                for (int i = 0; i < childs.getLength(); i++) {
-                    Node node = childs.item(i);
-                    if (node instanceof Element && EXCLUSION.equals(node.getNodeName())) {
-                        String groupId = getFirstChildText((Element) node, GROUP_ID);
-                        String artifactId = getFirstChildText((Element) node, ARTIFACT_ID);
-                        if ((groupId != null) && (artifactId != null)) {
-                            exclusions.add(ModuleId.newInstance(groupId, artifactId));
-                        }
-                    }
-                }
-            }
-            return exclusions;            
-        }
-
     }
     
     /**

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java?rev=749782&r1=749781&r2=749782&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorParserTest.java Tue Mar  3 21:56:28 2009
@@ -28,6 +28,7 @@
 import org.apache.ivy.core.module.descriptor.Artifact;
 import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
 import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
+import org.apache.ivy.core.module.descriptor.ExcludeRule;
 import org.apache.ivy.core.module.descriptor.License;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.core.module.id.ModuleId;
@@ -629,6 +630,14 @@
             dds[0].getDependencyRevisionId());
         assertEquals(ModuleRevisionId.newInstance("commons-logging", "commons-logging", "1.0.4"),
             dds[1].getDependencyRevisionId());
+        
+        ExcludeRule[] excludes = dds[0].getAllExcludeRules();
+        assertNotNull(excludes);
+        assertEquals(2, excludes.length);
+        assertEquals("javax.mail", excludes[0].getId().getModuleId().getOrganisation());
+        assertEquals("mail", excludes[0].getId().getModuleId().getName());
+        assertEquals("javax.jms", excludes[1].getId().getModuleId().getOrganisation());
+        assertEquals("jms", excludes[1].getId().getModuleId().getName());
     }
 
     public void testParentProperties() throws ParseException, IOException {

Modified: ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/test-dependencyMgt.pom
URL: http://svn.apache.org/viewvc/ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/test-dependencyMgt.pom?rev=749782&r1=749781&r2=749782&view=diff
==============================================================================
--- ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/test-dependencyMgt.pom (original)
+++ ant/ivy/core/trunk/test/java/org/apache/ivy/plugins/parser/m2/test-dependencyMgt.pom Tue Mar  3 21:56:28 2009
@@ -18,34 +18,44 @@
    under the License.    
 -->
 <project>
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.apache</groupId>
-  <artifactId>test-depMgt</artifactId>
-  <name>Test Module for Ivy M2 parsing</name>
-  <version>1.0</version>
-  <url>http://ivy.jayasoft.org/</url>
-  <organization>
-    <name>Jayasoft</name>
-    <url>http://www.jayasoft.org/</url>
-  </organization>
-  <dependencyManagement>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.apache</groupId>
+    <artifactId>test-depMgt</artifactId>
+    <name>Test Module for Ivy M2 parsing</name>
+    <version>1.0</version>
+    <url>http://ivy.jayasoft.org/</url>
+    <organization>
+        <name>Jayasoft</name>
+        <url>http://www.jayasoft.org/</url>
+    </organization>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>commons-logging</groupId>
+                <artifactId>commons-logging</artifactId>
+                <version>1.0.4</version>
+            </dependency>
+            <dependency>
+                <groupId>commons-collection</groupId>
+                <artifactId>commons-collection</artifactId>
+                <version>1.0.5</version>
+                <exclusions>
+                    <exclusion>
+                        <groupId>javax.mail</groupId>
+                        <artifactId>mail</artifactId>
+                    </exclusion>
+                    <exclusion>
+                        <groupId>javax.jms</groupId>
+                        <artifactId>jms</artifactId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
     <dependencies>
-		<dependency>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-	      <version>1.0.4</version>
-        </dependency>
-		<dependency>
-          <groupId>commons-collection</groupId>
-          <artifactId>commons-collection</artifactId>
-	      <version>1.0.5</version>
+        <dependency>
+            <groupId>commons-logging</groupId>
+            <artifactId>commons-logging</artifactId>
         </dependency>
     </dependencies>
-  </dependencyManagement>
-  <dependencies>
-    <dependency>
-      <groupId>commons-logging</groupId>
-      <artifactId>commons-logging</artifactId>
-    </dependency>
-  </dependencies>
 </project>