diff -wur src.orig/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java --- src.orig/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java 2008-12-04 17:11:26 -0500 +++ src/java/org/apache/ivy/plugins/parser/m2/DefaultPomDependencyMgt.java 2009-02-21 13:32:12 -0500 @@ -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 /**/ excludedModules; public DefaultPomDependencyMgt( - String groupId, String artifactId, String version, String scope) { + String groupId, String artifactId, String version, String scope, List /**/ excludedModules) { this.groupId = groupId; this.artifactId = artifactId; this.version = version; this.scope = scope; + this.excludedModules = excludedModules; } public String getScope() { @@ -45,5 +49,7 @@ return version; } - + public List /**/ getExcludedModules() { + return excludedModules; + } } diff -wur src.orig/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java --- src.orig/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java 2008-12-04 17:11:26 -0500 +++ src/java/org/apache/ivy/plugins/parser/m2/PomDependencyMgt.java 2009-02-21 13:32:23 -0500 @@ -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 /**/ getExcludedModules(); } \ No newline at end of file diff -wur src.orig/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java --- src.orig/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java 2009-01-07 15:46:18 -0500 +++ src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java 2009-02-21 13:33:08 -0500 @@ -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; @@ -316,6 +317,20 @@ ExactPatternMatcher.INSTANCE, null)); } } + if(dep.getExcludedModules().isEmpty()) { + final List /*ModuleId*/ exclusions = getDependencyMgtExclusions(ivyModuleDescriptor, dep.getGroupId(), dep.getArtifactId()); + for(final Iterator iter = exclusions.iterator(); iter.hasNext(); ) { + ModuleId id = (ModuleId) iter.next(); + String[] confs = dd.getModuleConfigurations(); + for (int k = 0; k < confs.length; k++) { + dd.addExcludeRule(confs[k], new DefaultExcludeRule(new ArtifactId(id, + PatternMatcher.ANY_EXPRESSION, + PatternMatcher.ANY_EXPRESSION, + PatternMatcher.ANY_EXPRESSION), + ExactPatternMatcher.INSTANCE, null)); + } + } + } ivyModuleDescriptor.addDependency(dd); } @@ -334,6 +349,19 @@ dep.getGroupId(), dep.getArtifactId()); ivyModuleDescriptor.addExtraInfo(scopeKey, dep.getScope()); } + if(!dep.getExcludedModules().isEmpty()) { + final String groupPrefix = getDependencyMgtExtraInfoPrefixForExclusionGroup( + dep.getGroupId(), dep.getArtifactId()); + final String artifactPrefix = getDependencyMgtExtraInfoPrefixForExclusionArtifact( + dep.getGroupId(), dep.getArtifactId()); + int index = 0; + for(final Iterator iter = dep.getExcludedModules().iterator(); iter.hasNext(); ) { + final ModuleId excludedModule = (ModuleId) iter.next(); + ivyModuleDescriptor.addExtraInfo(groupPrefix + index, excludedModule.getOrganisation()); + ivyModuleDescriptor.addExtraInfo(artifactPrefix + index, 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 +422,10 @@ public String getScope() { return null; } + + public List /**/ getExcludedModules() { + return Collections.EMPTY_LIST; // probably not used? at any rate I don't care about it. -jgibson + } } private String getDefaultVersion(PomDependencyData dep) { @@ -425,6 +457,97 @@ return PROPERTIES + EXTRA_INFO_DELIMITER + propertyName; } + private static String getDependencyMgtExtraInfoPrefixForExclusionGroup( + String groupId, String artifaceId) { + return DEPENDENCY_MANAGEMENT + EXTRA_INFO_DELIMITER + groupId + + EXTRA_INFO_DELIMITER + artifaceId + EXTRA_INFO_DELIMITER + "exclusion_group_"; + } + + private static String getDependencyMgtExtraInfoPrefixForExclusionArtifact( + String groupId, String artifaceId) { + return DEPENDENCY_MANAGEMENT + EXTRA_INFO_DELIMITER + groupId + + EXTRA_INFO_DELIMITER + artifaceId + EXTRA_INFO_DELIMITER + "exclusion_artifact_"; + } + + private static Integer getIndexForExtraInfoExclusionGroup( + String groupId, String artifaceId, String groupKey) throws + IndexOutOfBoundsException, NumberFormatException { + final String sub = groupKey.substring(getDependencyMgtExtraInfoPrefixForExclusionGroup(groupId, artifaceId).length()); + return Integer.valueOf(sub); + } + + private static Integer getIndexForExtraInfoExclusionArtifact( + String groupId, String artifaceId, String artifactKey) throws + IndexOutOfBoundsException, NumberFormatException { + final String sub = artifactKey.substring(getDependencyMgtExtraInfoPrefixForExclusionArtifact(groupId, artifaceId).length()); + return Integer.valueOf(sub); + } + + private static List /**/ getDependencyMgtExclusions( + final ModuleDescriptor descriptor, + final String groupId, + final String artifactId) { + final String groupPrefix = getDependencyMgtExtraInfoPrefixForExclusionGroup( + groupId, artifactId); + final String artifactPrefix = getDependencyMgtExtraInfoPrefixForExclusionArtifact( + groupId, artifactId); + final List /**/ exclusionIds = new LinkedList /**/ (); + final Map /**/ extras = descriptor.getExtraInfo(); + final Map /**/ excludedGroups = new HashMap /**/(); + final Map /**/ excludedArtifacts = new HashMap /**/(); + for (final Iterator entIter = extras.entrySet().iterator(); entIter.hasNext();) { + final Map.Entry /**/ ent = (Map.Entry) entIter.next(); + final String key = (String) ent.getKey(); + if (key.startsWith(groupPrefix)) { + final String excluded_group = (String) ent.getValue(); + try { + final String sub = key.substring(groupPrefix.length()); + final Integer index = Integer.valueOf(sub); + excludedGroups.put(index, excluded_group); + } catch (IndexOutOfBoundsException e) { + Message.error("what seemed to be a dependency management extra info exclusion " + + "was too short: " + key); + } catch (NumberFormatException e) { + Message.error("what seemed to be a dependency management extra info exclusion " + + "had a bad index: " + key + ", " + e.getMessage()); + } + } else if (key.startsWith(artifactPrefix)) { + final String excluded_artifact = (String) ent.getValue(); + try { + final String sub = key.substring(artifactPrefix.length()); + final Integer index = Integer.valueOf(sub); + excludedArtifacts.put(index, excluded_artifact); + } catch (IndexOutOfBoundsException e) { + Message.error("what seemed to be a dependency management extra info exclusion " + + "was too short: " + key); + } catch (NumberFormatException e) { + Message.error("what seemed to be a dependency management extra info exclusion " + + "had a bad index: " + key + ", " + e.getMessage()); + } + } + } + + if (excludedGroups.size() != excludedArtifacts.size()) { + Message.error("Total count of dependency management extra info exclusions did not match " + + "groups: " + excludedGroups.size() + ", artifacts: " + excludedArtifacts.size()); + } + + for (final Iterator iter = excludedGroups.entrySet().iterator(); iter.hasNext();) { + final Map.Entry /**/ ent = (Map.Entry) iter.next(); + final Integer key = (Integer) ent.getKey(); + final String group = (String) ent.getValue(); + final String artifact = (String) excludedArtifacts.get(key); + if (artifact == null) { + Message.error("Saw a dependency management extra info exclusion group index " + + key + " with no matching artifact."); + continue; + } + exclusionIds.add(ModuleId.newInstance(group, artifact)); + } + + return exclusionIds; + } + public static Map/**/ getDependencyManagementMap(ModuleDescriptor md) { Map ret = new LinkedHashMap(); @@ -466,7 +589,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)); } } } diff -wur src.orig/java/org/apache/ivy/plugins/parser/m2/PomReader.java src/java/org/apache/ivy/plugins/parser/m2/PomReader.java --- src.orig/java/org/apache/ivy/plugins/parser/m2/PomReader.java 2008-12-15 17:35:28 -0500 +++ src/java/org/apache/ivy/plugins/parser/m2/PomReader.java 2009-02-21 13:33:27 -0500 @@ -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 /**/ 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 /* */ getPlugins() { @@ -374,6 +393,9 @@ return null; // not used } + public List /**/ getExcludedModules() { + return Collections.EMPTY_LIST; // probably not used? at any rate I don't care about it. -jgibson + } }