blob: c1accb8a71b64547018bf7fb61aeaa25e0cce019 [file] [log] [blame]
/*
* 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
*
* https://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.
*
*/
package org.apache.ivy.plugins.parser.m2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.ivy.core.cache.ArtifactOrigin;
import org.apache.ivy.core.module.descriptor.Artifact;
import org.apache.ivy.core.module.descriptor.Configuration;
import org.apache.ivy.core.module.descriptor.DefaultArtifact;
import org.apache.ivy.core.module.descriptor.DefaultDependencyArtifactDescriptor;
import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
import org.apache.ivy.core.module.descriptor.DefaultExcludeRule;
import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
import org.apache.ivy.core.module.descriptor.ExtraInfoHolder;
import org.apache.ivy.core.module.descriptor.License;
import org.apache.ivy.core.module.descriptor.MDArtifact;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.descriptor.OverrideDependencyDescriptorMediator;
import org.apache.ivy.core.module.id.ArtifactId;
import org.apache.ivy.core.module.id.ModuleId;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.plugins.matcher.ExactPatternMatcher;
import org.apache.ivy.plugins.matcher.PatternMatcher;
import org.apache.ivy.plugins.parser.ModuleDescriptorParser;
import org.apache.ivy.plugins.parser.ParserSettings;
import org.apache.ivy.plugins.parser.m2.PomReader.PomDependencyData;
import org.apache.ivy.plugins.repository.Resource;
import org.apache.ivy.plugins.resolver.DependencyResolver;
import org.apache.ivy.util.Message;
import static org.apache.ivy.core.module.descriptor.Configuration.Visibility.PUBLIC;
import static org.apache.ivy.util.StringUtils.isNullOrEmpty;
/**
* Build a module descriptor. This class handle the complexity of the structure of an ivy
* ModuleDescriptor and isolate the PomModuleDescriptorParser from it.
*/
public class PomModuleDescriptorBuilder {
/**
* The namespace URI which is used to refer to Maven (pom) specific elements within a
* Ivy module descriptor file (ivy.xml)
*/
private static final String IVY_XML_MAVEN_NAMESPACE_URI = "http://ant.apache.org/ivy/maven";
private static final int DEPENDENCY_MANAGEMENT_KEY_PARTS_COUNT = 4;
public static final Configuration[] MAVEN2_CONFIGURATIONS = new Configuration[] {
new Configuration("default", PUBLIC,
"runtime dependencies and master artifact can be used with this conf",
new String[] {"runtime", "master"}, true, null),
new Configuration("master", PUBLIC,
"contains only the artifact published by this module itself, "
+ "with no transitive dependencies", new String[0], true, null),
new Configuration("compile", PUBLIC,
"this is the default scope, used if none is specified. "
+ "Compile dependencies are available in all classpaths.",
new String[0], true, null),
new Configuration("provided", PUBLIC,
"this is much like compile, but indicates you expect the JDK or a container "
+ "to provide it. "
+ "It is only available on the compilation classpath, and is not transitive.",
new String[0], true, null),
new Configuration("runtime", PUBLIC,
"this scope indicates that the dependency is not required for compilation, "
+ "but is for execution. It is in the runtime and test classpaths, "
+ "but not the compile classpath.", new String[] {"compile"}, true,
null),
new Configuration("test", PUBLIC,
"this scope indicates that the dependency is not required for normal use of "
+ "the application, and is only available for the test compilation and "
+ "execution phases.", new String[] {"runtime"}, true, null),
new Configuration("system", PUBLIC,
"this scope is similar to provided except that you have to provide the JAR "
+ "which contains it explicitly. The artifact is always available and is not "
+ "looked up in a repository.", new String[0], true, null),
new Configuration("sources", PUBLIC,
"this configuration contains the source artifact of this module, if any.",
new String[0], true, null),
new Configuration("javadoc", PUBLIC,
"this configuration contains the javadoc artifact of this module, if any.",
new String[0], true, null),
new Configuration("optional", PUBLIC, "contains all optional dependencies",
new String[0], true, null)};
static final Map<String, ConfMapper> MAVEN2_CONF_MAPPING = new HashMap<>();
private static final String DEPENDENCY_MANAGEMENT = "m:dependency.management";
private static final String PROPERTIES = "m:properties";
private static final String EXTRA_INFO_DELIMITER = "__";
private static final Collection<String> JAR_PACKAGINGS = Arrays.asList("ejb",
"bundle", "maven-plugin", "eclipse-plugin", "jbi-component", "jbi-shared-library",
"orbit", "hk2-jar");
interface ConfMapper {
void addMappingConfs(DefaultDependencyDescriptor dd, boolean isOptional);
}
static {
MAVEN2_CONF_MAPPING.put("compile", new ConfMapper() {
public void addMappingConfs(DefaultDependencyDescriptor dd, boolean isOptional) {
if (isOptional) {
dd.addDependencyConfiguration("optional", "compile(*)");
// dd.addDependencyConfiguration("optional", "provided(*)");
dd.addDependencyConfiguration("optional", "master(*)");
} else {
dd.addDependencyConfiguration("compile", "compile(*)");
// dd.addDependencyConfiguration("compile", "provided(*)");
dd.addDependencyConfiguration("compile", "master(*)");
dd.addDependencyConfiguration("runtime", "runtime(*)");
}
}
});
MAVEN2_CONF_MAPPING.put("provided", new ConfMapper() {
public void addMappingConfs(DefaultDependencyDescriptor dd, boolean isOptional) {
if (isOptional) {
dd.addDependencyConfiguration("optional", "compile(*)");
dd.addDependencyConfiguration("optional", "provided(*)");
dd.addDependencyConfiguration("optional", "runtime(*)");
dd.addDependencyConfiguration("optional", "master(*)");
} else {
dd.addDependencyConfiguration("provided", "compile(*)");
dd.addDependencyConfiguration("provided", "provided(*)");
dd.addDependencyConfiguration("provided", "runtime(*)");
dd.addDependencyConfiguration("provided", "master(*)");
}
}
});
MAVEN2_CONF_MAPPING.put("runtime", new ConfMapper() {
public void addMappingConfs(DefaultDependencyDescriptor dd, boolean isOptional) {
if (isOptional) {
dd.addDependencyConfiguration("optional", "compile(*)");
dd.addDependencyConfiguration("optional", "provided(*)");
dd.addDependencyConfiguration("optional", "master(*)");
} else {
dd.addDependencyConfiguration("runtime", "compile(*)");
dd.addDependencyConfiguration("runtime", "runtime(*)");
dd.addDependencyConfiguration("runtime", "master(*)");
}
}
});
MAVEN2_CONF_MAPPING.put("test", new ConfMapper() {
public void addMappingConfs(DefaultDependencyDescriptor dd, boolean isOptional) {
// optional doesn't make sense in the test scope
dd.addDependencyConfiguration("test", "runtime(*)");
dd.addDependencyConfiguration("test", "master(*)");
}
});
MAVEN2_CONF_MAPPING.put("system", new ConfMapper() {
public void addMappingConfs(DefaultDependencyDescriptor dd, boolean isOptional) {
// optional doesn't make sense in the system scope
dd.addDependencyConfiguration("system", "master(*)");
}
});
}
private final PomModuleDescriptor ivyModuleDescriptor;
private ModuleRevisionId mrid;
private DefaultArtifact mainArtifact;
private ParserSettings parserSettings;
private static final String WRONG_NUMBER_OF_PARTS_MSG = "what seemed to be a dependency "
+ "management extra info exclusion had the wrong number of parts (should have 2) ";
public PomModuleDescriptorBuilder(ModuleDescriptorParser parser, Resource res,
ParserSettings ivySettings) {
ivyModuleDescriptor = new PomModuleDescriptor(parser, res);
ivyModuleDescriptor.setResolvedPublicationDate(new Date(res.getLastModified()));
for (Configuration m2conf : MAVEN2_CONFIGURATIONS) {
ivyModuleDescriptor.addConfiguration(m2conf);
}
ivyModuleDescriptor.setMappingOverride(true);
ivyModuleDescriptor.addExtraAttributeNamespace("m", IVY_XML_MAVEN_NAMESPACE_URI);
parserSettings = ivySettings;
}
public ModuleDescriptor getModuleDescriptor() {
return ivyModuleDescriptor;
}
public void setModuleRevId(String groupId, String artifactId, String version) {
mrid = ModuleRevisionId.newInstance(groupId, artifactId, version);
ivyModuleDescriptor.setModuleRevisionId(mrid);
if (version == null || version.endsWith("SNAPSHOT")) {
ivyModuleDescriptor.setStatus("integration");
} else {
ivyModuleDescriptor.setStatus("release");
}
}
public void setHomePage(String homePage) {
ivyModuleDescriptor.setHomePage(homePage);
}
public void setDescription(String description) {
ivyModuleDescriptor.setDescription(description);
}
public void setLicenses(License[] licenses) {
for (License license : licenses) {
ivyModuleDescriptor.addLicense(license);
}
}
public void addMainArtifact(String artifactId, String packaging) {
String ext;
/*
* TODO: we should make packaging to ext mapping configurable, since it's not possible to
* cover all cases.
*/
if ("pom".equals(packaging)) {
// no artifact defined! Add the default artifact if it exist.
DependencyResolver resolver = parserSettings.getResolver(mrid);
if (resolver != null) {
DefaultArtifact artifact = new DefaultArtifact(mrid, new Date(), artifactId, "jar",
"jar");
ArtifactOrigin artifactOrigin = resolver.locate(artifact);
if (!ArtifactOrigin.isUnknown(artifactOrigin)) {
mainArtifact = artifact;
ivyModuleDescriptor.addArtifact("master", mainArtifact);
}
}
return;
} else if (JAR_PACKAGINGS.contains(packaging)) {
ext = "jar";
} else if ("pear".equals(packaging)) {
ext = "phar";
} else {
ext = packaging;
}
mainArtifact = new DefaultArtifact(mrid, new Date(), artifactId, packaging, ext);
ivyModuleDescriptor.addArtifact("master", mainArtifact);
}
public void addDependency(Resource res, PomDependencyData dep) {
String scope = dep.getScope();
if (!isNullOrEmpty(scope) && !MAVEN2_CONF_MAPPING.containsKey(scope)) {
// unknown scope, defaulting to 'compile'
scope = "compile";
}
String version = dep.getVersion();
if (isNullOrEmpty(version)) {
version = getDefaultVersion(dep);
}
ModuleRevisionId moduleRevId = ModuleRevisionId.newInstance(dep.getGroupId(),
dep.getArtifactId(), version);
// Some POMs depend on themselves; Ivy doesn't allow this. Don't add this dependency!
// Example: https://repo1.maven.org/maven2/net/jini/jsk-platform/2.1/jsk-platform-2.1.pom
ModuleRevisionId mRevId = ivyModuleDescriptor.getModuleRevisionId();
if (mRevId != null && mRevId.getModuleId().equals(moduleRevId.getModuleId())) {
return;
}
// 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());
}
final boolean excludeAllTransitiveDeps = shouldExcludeAllTransitiveDeps(excluded);
// the same dependency mrid could appear twice in the module descriptor,
// so we check if we already have created a dependency descriptor for the dependency mrid
final DependencyDescriptor existing = this.ivyModuleDescriptor.depDescriptors.get(moduleRevId);
final DefaultDependencyDescriptor dd = (existing != null && existing instanceof DefaultDependencyDescriptor)
? (DefaultDependencyDescriptor) existing
: new PomDependencyDescriptor(dep, ivyModuleDescriptor, moduleRevId, !excludeAllTransitiveDeps);
if (isNullOrEmpty(scope)) {
scope = getDefaultScope(dep);
}
ConfMapper mapping = MAVEN2_CONF_MAPPING.get(scope);
mapping.addMappingConfs(dd, dep.isOptional());
Map<String, String> extraAtt = new HashMap<>();
if (dep.getClassifier() != null || dep.getType() != null && !"jar".equals(dep.getType())) {
String type = "jar";
if (dep.getType() != null) {
type = dep.getType();
}
String ext = type;
// if type is 'test-jar', the extension is 'jar' and the classifier is 'tests'
// Cfr. http://maven.apache.org/guides/mini/guide-attached-tests.html
if ("test-jar".equals(type)) {
ext = "jar";
extraAtt.put("m:classifier", "tests");
} else if (JAR_PACKAGINGS.contains(type)) {
ext = "jar";
}
// we deal with classifiers by setting an extra attribute and forcing the
// dependency to assume such an artifact is published
if (dep.getClassifier() != null) {
extraAtt.put("m:classifier", dep.getClassifier());
}
DefaultDependencyArtifactDescriptor depArtifact = new DefaultDependencyArtifactDescriptor(
dd, dd.getDependencyId().getName(), 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 (ModuleId excludedModule : excluded) {
// This represents exclude all transitive dependencies, which we have already taken
// in account while defining the DefaultDependencyDescriptor itself
if ("*".equals(excludedModule.getOrganisation()) && "*".equals(excludedModule.getName())) {
continue;
}
for (String conf : dd.getModuleConfigurations()) {
dd.addExcludeRule(conf, new DefaultExcludeRule(new ArtifactId(excludedModule,
PatternMatcher.ANY_EXPRESSION, PatternMatcher.ANY_EXPRESSION,
PatternMatcher.ANY_EXPRESSION), ExactPatternMatcher.INSTANCE, null));
}
}
// intentional identity check to make sure we don't re-add the same dependency
if (existing != dd) {
ivyModuleDescriptor.addDependency(dd);
}
}
private static boolean shouldExcludeAllTransitiveDeps(final List<ModuleId> exclusions) {
if (exclusions == null || exclusions.isEmpty()) {
return false;
}
for (final ModuleId exclusion : exclusions) {
if (exclusion == null) {
continue;
}
if ("*".equals(exclusion.getOrganisation()) && "*".equals(exclusion.getName())) {
return true;
}
}
return false;
}
public void addDependency(DependencyDescriptor descriptor) {
// Some POMs depend on themselves through their parent pom, don't add this dependency
// since Ivy doesn't allow this!
// Example:
// https://repo1.maven.org/maven2/com/atomikos/atomikos-util/3.6.4/atomikos-util-3.6.4.pom
ModuleId dependencyId = descriptor.getDependencyId();
ModuleRevisionId mRevId = ivyModuleDescriptor.getModuleRevisionId();
if (mRevId != null && mRevId.getModuleId().equals(dependencyId)) {
return;
}
ivyModuleDescriptor.addDependency(descriptor);
}
public void addDependencyMgt(PomDependencyMgt dep) {
ivyModuleDescriptor.addDependencyManagement(dep);
String key = getDependencyMgtExtraInfoKeyForVersion(dep.getGroupId(), dep.getArtifactId());
overwriteExtraInfoIfExists(key, dep.getVersion());
if (dep.getScope() != null) {
String scopeKey = getDependencyMgtExtraInfoKeyForScope(dep.getGroupId(),
dep.getArtifactId());
overwriteExtraInfoIfExists(scopeKey, dep.getScope());
}
if (!dep.getExcludedModules().isEmpty()) {
String exclusionPrefix = getDependencyMgtExtraInfoPrefixForExclusion(dep.getGroupId(),
dep.getArtifactId());
int index = 0;
for (ModuleId excludedModule : dep.getExcludedModules()) {
overwriteExtraInfoIfExists(
exclusionPrefix + index,
excludedModule.getOrganisation() + EXTRA_INFO_DELIMITER
+ excludedModule.getName());
index++;
}
}
// dependency management info is also used for version mediation of transitive dependencies
ivyModuleDescriptor.addDependencyDescriptorMediator(
ModuleId.newInstance(dep.getGroupId(), dep.getArtifactId()),
ExactPatternMatcher.INSTANCE,
new OverrideDependencyDescriptorMediator(null, dep.getVersion()));
}
public void addPlugin(PomDependencyMgt plugin) {
String pluginValue = plugin.getGroupId() + EXTRA_INFO_DELIMITER + plugin.getArtifactId()
+ EXTRA_INFO_DELIMITER + plugin.getVersion();
ExtraInfoHolder extraInfoByTagName = ivyModuleDescriptor
.getExtraInfoByTagName("m:maven.plugins");
if (extraInfoByTagName == null) {
extraInfoByTagName = new ExtraInfoHolder();
extraInfoByTagName.setName("m:maven.plugins");
ivyModuleDescriptor.addExtraInfo(extraInfoByTagName);
}
String pluginExtraInfo = extraInfoByTagName.getContent();
if (pluginExtraInfo == null) {
pluginExtraInfo = pluginValue;
} else {
pluginExtraInfo += "|" + pluginValue;
}
extraInfoByTagName.setContent(pluginExtraInfo);
}
public static List<PomDependencyMgt> getPlugins(ModuleDescriptor md) {
List<PomDependencyMgt> result = new ArrayList<>();
String plugins = md.getExtraInfoContentByTagName("m:maven.plugins");
if (plugins == null) {
return new ArrayList<>();
}
for (String plugin : plugins.split("\\|")) {
String[] parts = plugin.split(EXTRA_INFO_DELIMITER);
result.add(new PomPluginElement(parts[0], parts[1], parts[2]));
}
return result;
}
private static class PomPluginElement implements PomDependencyMgt {
private String groupId;
private String artifactId;
private String version;
public PomPluginElement(String groupId, String artifactId, String version) {
this.groupId = groupId;
this.artifactId = artifactId;
this.version = version;
}
public String getGroupId() {
return groupId;
}
public String getArtifactId() {
return artifactId;
}
public String getVersion() {
return version;
}
public String getScope() {
return null;
}
public List<ModuleId> getExcludedModules() {
return Collections.emptyList(); // probably not used?
}
}
private String getDefaultVersion(PomDependencyData dep) {
ModuleId moduleId = ModuleId.newInstance(dep.getGroupId(), dep.getArtifactId());
if (ivyModuleDescriptor.getDependencyManagementMap().containsKey(moduleId)) {
return ivyModuleDescriptor.getDependencyManagementMap().get(moduleId).getVersion();
}
String key = getDependencyMgtExtraInfoKeyForVersion(dep.getGroupId(), dep.getArtifactId());
return ivyModuleDescriptor.getExtraInfoContentByTagName(key);
}
private String getDefaultScope(PomDependencyData dep) {
String result;
ModuleId moduleId = ModuleId.newInstance(dep.getGroupId(), dep.getArtifactId());
if (ivyModuleDescriptor.getDependencyManagementMap().containsKey(moduleId)) {
result = ivyModuleDescriptor.getDependencyManagementMap().get(moduleId).getScope();
} else {
String key = getDependencyMgtExtraInfoKeyForScope(dep.getGroupId(), dep.getArtifactId());
result = ivyModuleDescriptor.getExtraInfoContentByTagName(key);
}
if (result == null || !MAVEN2_CONF_MAPPING.containsKey(result)) {
result = "compile";
}
return result;
}
private static String getDependencyMgtExtraInfoKeyForVersion(String groupId, String artifactId) {
return DEPENDENCY_MANAGEMENT + EXTRA_INFO_DELIMITER + groupId + EXTRA_INFO_DELIMITER
+ artifactId + EXTRA_INFO_DELIMITER + "version";
}
private static String getDependencyMgtExtraInfoKeyForScope(String groupId, String artifactId) {
return DEPENDENCY_MANAGEMENT + EXTRA_INFO_DELIMITER + groupId + EXTRA_INFO_DELIMITER
+ artifactId + EXTRA_INFO_DELIMITER + "scope";
}
private static String getPropertyExtraInfoKey(String propertyName) {
return PROPERTIES + EXTRA_INFO_DELIMITER + propertyName;
}
private static String getDependencyMgtExtraInfoPrefixForExclusion(String groupId,
String artifactId) {
return DEPENDENCY_MANAGEMENT + EXTRA_INFO_DELIMITER + groupId + EXTRA_INFO_DELIMITER
+ artifactId + EXTRA_INFO_DELIMITER + "exclusion_";
}
private static List<ModuleId> getDependencyMgtExclusions(ModuleDescriptor descriptor,
String groupId, String artifactId) {
if (descriptor instanceof PomModuleDescriptor) {
PomDependencyMgt dependencyMgt = ((PomModuleDescriptor) descriptor)
.getDependencyManagementMap().get(ModuleId.newInstance(groupId, artifactId));
if (dependencyMgt != null) {
return dependencyMgt.getExcludedModules();
}
}
String exclusionPrefix = getDependencyMgtExtraInfoPrefixForExclusion(groupId, artifactId);
List<ModuleId> exclusionIds = new LinkedList<>();
for (ExtraInfoHolder extraInfoHolder : descriptor.getExtraInfos()) {
String key = extraInfoHolder.getName();
if (key.startsWith(exclusionPrefix)) {
String fullExclusion = extraInfoHolder.getContent();
String[] exclusionParts = fullExclusion.split(EXTRA_INFO_DELIMITER);
if (exclusionParts.length != 2) {
Message.error(WRONG_NUMBER_OF_PARTS_MSG + exclusionParts.length + " : "
+ fullExclusion);
continue;
}
exclusionIds.add(ModuleId.newInstance(exclusionParts[0], exclusionParts[1]));
}
}
return exclusionIds;
}
public static Map<ModuleId, String> getDependencyManagementMap(ModuleDescriptor md) {
Map<ModuleId, String> ret = new LinkedHashMap<>();
if (md instanceof PomModuleDescriptor) {
for (Map.Entry<ModuleId, PomDependencyMgt> e : ((PomModuleDescriptor) md)
.getDependencyManagementMap().entrySet()) {
PomDependencyMgt dependencyMgt = e.getValue();
ret.put(e.getKey(), dependencyMgt.getVersion());
}
} else {
for (ExtraInfoHolder extraInfoHolder : md.getExtraInfos()) {
String key = extraInfoHolder.getName();
if (key.startsWith(DEPENDENCY_MANAGEMENT)) {
String[] parts = key.split(EXTRA_INFO_DELIMITER);
if (parts.length != DEPENDENCY_MANAGEMENT_KEY_PARTS_COUNT) {
Message.warn("what seem to be a dependency management extra info "
+ "doesn't match expected pattern: " + key);
} else {
ret.put(ModuleId.newInstance(parts[1], parts[2]),
extraInfoHolder.getContent());
}
}
}
}
return ret;
}
public static List<PomDependencyMgt> getDependencyManagements(ModuleDescriptor md) {
List<PomDependencyMgt> result = new ArrayList<>();
if (md instanceof PomModuleDescriptor) {
result.addAll(((PomModuleDescriptor) md).getDependencyManagementMap().values());
} else {
for (ExtraInfoHolder extraInfoHolder : md.getExtraInfos()) {
String key = extraInfoHolder.getName();
if (key.startsWith(DEPENDENCY_MANAGEMENT)) {
String[] parts = key.split(EXTRA_INFO_DELIMITER);
if (parts.length != DEPENDENCY_MANAGEMENT_KEY_PARTS_COUNT) {
Message.warn("what seem to be a dependency management extra info "
+ "doesn't match expected pattern: " + key);
} else {
String versionKey = DEPENDENCY_MANAGEMENT + EXTRA_INFO_DELIMITER + parts[1]
+ EXTRA_INFO_DELIMITER + parts[2] + EXTRA_INFO_DELIMITER
+ "version";
String scopeKey = DEPENDENCY_MANAGEMENT + EXTRA_INFO_DELIMITER + parts[1]
+ EXTRA_INFO_DELIMITER + parts[2] + EXTRA_INFO_DELIMITER + "scope";
String version = md.getExtraInfoContentByTagName(versionKey);
String scope = md.getExtraInfoContentByTagName(scopeKey);
List<ModuleId> exclusions = getDependencyMgtExclusions(md, parts[1],
parts[2]);
result.add(new DefaultPomDependencyMgt(parts[1], parts[2], version, scope,
exclusions));
}
}
}
}
return result;
}
@Deprecated
public void addExtraInfos(Map<String, String> extraAttributes) {
for (Map.Entry<String, String> entry : extraAttributes.entrySet()) {
addExtraInfo(entry.getKey(), entry.getValue());
}
}
private void addExtraInfo(String key, String value) {
if (ivyModuleDescriptor.getExtraInfoByTagName(key) == null) {
ivyModuleDescriptor.getExtraInfos().add(new ExtraInfoHolder(key, value));
}
}
private void overwriteExtraInfoIfExists(String key, String value) {
boolean found = false;
for (ExtraInfoHolder extraInfoHolder : ivyModuleDescriptor.getExtraInfos()) {
if (extraInfoHolder.getName().equals(key)) {
extraInfoHolder.setContent(value);
found = true;
}
}
if (!found) {
ivyModuleDescriptor.getExtraInfos().add(new ExtraInfoHolder(key, value));
}
}
public void addExtraInfos(List<ExtraInfoHolder> extraInfosHolder) {
for (ExtraInfoHolder extraInfoHolder : extraInfosHolder) {
addExtraInfo(extraInfoHolder.getName(), extraInfoHolder.getContent());
}
}
@Deprecated
public static Map<String, String> extractPomProperties(Map<String, String> extraInfo) {
Map<String, String> r = new HashMap<>();
for (Map.Entry<String, String> extraInfoEntry : extraInfo.entrySet()) {
if (extraInfoEntry.getKey().startsWith(PROPERTIES)) {
String prop = extraInfoEntry.getKey().substring(PROPERTIES.length()
+ EXTRA_INFO_DELIMITER.length());
r.put(prop, extraInfoEntry.getValue());
}
}
return r;
}
public static Map<String, String> extractPomProperties(List<ExtraInfoHolder> extraInfos) {
Map<String, String> r = new HashMap<>();
for (ExtraInfoHolder extraInfoHolder : extraInfos) {
if (extraInfoHolder.getName().startsWith(PROPERTIES)) {
String prop = extraInfoHolder.getName().substring(PROPERTIES.length()
+ EXTRA_INFO_DELIMITER.length());
r.put(prop, extraInfoHolder.getContent());
}
}
return r;
}
public void addProperty(String propertyName, String value) {
addExtraInfo(getPropertyExtraInfoKey(propertyName), value);
}
public Artifact getMainArtifact() {
return mainArtifact;
}
public Artifact getSourceArtifact() {
return new MDArtifact(ivyModuleDescriptor, mrid.getName(), "source", "jar", null,
Collections.singletonMap("m:classifier", "sources"));
}
public Artifact getSrcArtifact() {
return new MDArtifact(ivyModuleDescriptor, mrid.getName(), "source", "jar", null,
Collections.singletonMap("m:classifier", "src"));
}
public Artifact getJavadocArtifact() {
return new MDArtifact(ivyModuleDescriptor, mrid.getName(), "javadoc", "jar", null,
Collections.singletonMap("m:classifier", "javadoc"));
}
public void addSourceArtifact() {
ivyModuleDescriptor.addArtifact("sources", getSourceArtifact());
}
public void addSrcArtifact() {
ivyModuleDescriptor.addArtifact("sources", getSrcArtifact());
}
public void addJavadocArtifact() {
ivyModuleDescriptor.addArtifact("javadoc", getJavadocArtifact());
}
/**
* <code>DependencyDescriptor</code> that provides access to the original
* <code>PomDependencyData</code>.
*/
public static class PomDependencyDescriptor extends DefaultDependencyDescriptor {
private final PomDependencyData pomDependencyData;
private PomDependencyDescriptor(PomDependencyData pomDependencyData,
ModuleDescriptor moduleDescriptor, ModuleRevisionId revisionId, final boolean transitive) {
super(moduleDescriptor, revisionId, true, false, transitive);
this.pomDependencyData = pomDependencyData;
}
/**
* Get PomDependencyData.
*
* @return PomDependencyData
*/
public PomDependencyData getPomDependencyData() {
return pomDependencyData;
}
}
public static class PomModuleDescriptor extends DefaultModuleDescriptor {
private final Map<ModuleId, PomDependencyMgt> dependencyManagementMap = new LinkedHashMap<>();
// dependency descriptor keyed by its dependency revision id
private final Map<ModuleRevisionId, DependencyDescriptor> depDescriptors = new HashMap<>();
public PomModuleDescriptor(ModuleDescriptorParser parser, Resource res) {
super(parser, res);
}
public void addDependencyManagement(PomDependencyMgt dependencyMgt) {
dependencyManagementMap.put(
ModuleId.newInstance(dependencyMgt.getGroupId(), dependencyMgt.getArtifactId()),
dependencyMgt);
}
public Map<ModuleId, PomDependencyMgt> getDependencyManagementMap() {
return dependencyManagementMap;
}
@Override
public void addDependency(final DependencyDescriptor dependency) {
super.addDependency(dependency);
this.depDescriptors.put(dependency.getDependencyRevisionId(), dependency);
}
}
}