--- D:/DOCUME~1/Lomakin/LOCALS~1/Temp/PomModuleDescriptorBuilder.java-rev749781.svn000.tmp.java Ââ Êâ³ 7 13:13:49 2009 +++ E:/MyDocs/IvySrc/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorBuilder.java Ââ Êâ³ 7 12:46:08 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; @@ -291,6 +292,12 @@ if (dep.getType() != null) { type = dep.getType(); } + final String ext; + if (JAR_PACKAGINGS.contains(type)) { + ext = "jar"; + } else { + ext = type; + } // we deal with classifiers by setting an extra attribute and forcing the // dependency to assume such an artifact is published if (dep.getClassifier() != null) { @@ -298,14 +305,22 @@ } DefaultDependencyArtifactDescriptor depArtifact = new DefaultDependencyArtifactDescriptor(dd, dd.getDependencyId().getName(), - type, type, null, extraAtt); + type, ext, null, extraAtt); // here we have to assume a type and ext for the artifact, so this is a limitation // compared to how m2 behave with classifiers String optionalizedScope = dep.isOptional() ? "optional" : scope; 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 element is missing or the element + // is present, but empty. + List /**/ 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 +349,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 +420,10 @@ public String getScope() { return null; } + + public List /**/ getExcludedModules() { + return Collections.EMPTY_LIST; // probably not used? + } } private String getDefaultVersion(PomDependencyData dep) { @@ -425,6 +455,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 /**/ getDependencyMgtExclusions( + final ModuleDescriptor descriptor, + final String groupId, + final String artifactId) { + final String exclusionPrefix = getDependencyMgtExtraInfoPrefixForExclusion( + groupId, artifactId); + final List /**/ exclusionIds = new LinkedList /**/ (); + final Map /**/ extras = descriptor.getExtraInfo(); + 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(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/**/ getDependencyManagementMap(ModuleDescriptor md) { Map ret = new LinkedHashMap(); @@ -466,7 +528,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 /**/ exclusions = getDependencyMgtExclusions(md, parts[1], parts[2]); + result.add(new DefaultPomDependencyMgt(parts[1], parts[2], version, scope, exclusions)); } } }