blob: e650fe6351eb1e4ccc0bf6f142e99f8e99453a59 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Rapicorp, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Rapicorp, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.packaging;
import java.util.List;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
import org.eclipse.tycho.ArtifactKey;
import org.eclipse.tycho.ArtifactType;
import org.eclipse.tycho.artifacts.IllegalArtifactReferenceException;
import org.eclipse.tycho.artifacts.TargetPlatform;
import org.eclipse.tycho.model.IU;
import de.pdark.decentxml.Element;
@Component(role = IUXmlTransformer.class)
public class IUXmlTransformer {
private static final String MAVEN_ARTIFACT_ID = "maven-artifactId";
private static final String MAVEN_VERSION = "maven-version";
private static final String MAVEN_GROUP_ID = "maven-groupId";
@Requirement
private Logger log;
public IUXmlTransformer() {
}
public IUXmlTransformer(Logger log) {
this.log = log;
}
//Replace the qualifier representing the version of the IU
public void replaceSelfQualifiers(IU iu, String version, String qualifier) {
iu.setVersion(version);
replaceSelfVersionInArtifact(iu, version);
replaceQualifierInCapabilities(iu.getSelfCapabilities(), qualifier);
}
private void replaceSelfVersionInArtifact(IU iu, String version) {
Element artifact = iu.getSelfArtifact();
if (artifact == null)
return;
String currentVersion = artifact.getAttributeValue(IU.VERSION);
if (hasQualifier(currentVersion) && iu.getId().equals(artifact.getAttributeValue(IU.ID)))
artifact.setAttribute(IU.VERSION, version);
}
//Replace the qualifier found in the capabilities.
public void replaceQualifierInCapabilities(List<Element> providedCapabilities, String qualifier) {
if (providedCapabilities == null)
return;
for (Element capability : providedCapabilities) {
String currentVersion = capability.getAttributeValue(IU.VERSION);
if (hasQualifier(currentVersion))
capability.setAttribute(IU.VERSION, currentVersion.replaceAll("qualifier", qualifier));
}
}
private boolean hasQualifier(String v) {
if (v == null)
return false;
return v.endsWith(".qualifier");
}
public void replaceQualifierInRequirements(IU iu, TargetPlatform targetPlatform) throws MojoFailureException {
List<Element> requirements = iu.getRequiredCapabilites();
if (requirements == null)
return;
for (Element req : requirements) {
String range = req.getAttributeValue(IU.RANGE);
if (range != null && range.endsWith(".qualifier")
&& IU.P2_IU_NAMESPACE.equals(req.getAttributeValue(IU.NAMESPACE))) {
ArtifactKey artifact = resolveRequirementReference(targetPlatform, req.getAttributeValue(IU.NAME),
range, req.toString());
req.setAttribute(IU.RANGE, artifact.getVersion());
}
}
}
public void replaceZerosInRequirements(IU iu, TargetPlatform targetPlatform) throws MojoFailureException {
List<Element> requirements = iu.getRequiredCapabilites();
if (requirements == null)
return;
for (Element req : requirements) {
String range = req.getAttributeValue(IU.RANGE);
if ("0.0.0".equals(range) && IU.P2_IU_NAMESPACE.equals(req.getAttributeValue(IU.NAMESPACE))) {
ArtifactKey artifact = resolveRequirementReference(targetPlatform, req.getAttributeValue(IU.NAME),
range, req.toString());
req.setAttribute(IU.RANGE, artifact.getVersion());
}
}
}
private ArtifactKey resolveRequirementReference(TargetPlatform targetPlatform, String name, String version,
String xml) throws MojoFailureException {
try {
return targetPlatform.resolveArtifact(ArtifactType.TYPE_INSTALLABLE_UNIT, name, version);
} catch (IllegalArtifactReferenceException e) {
throw new MojoFailureException("Can't resolve reference " + xml);
}
}
public void injectMavenProperties(IU iu, MavenProject project) {
List<Element> properties = iu.getProperties();
if (properties != null) {
for (Element property : properties) {
String key = property.getAttributeValue("name");
if (MAVEN_GROUP_ID.equals(key) || MAVEN_ARTIFACT_ID.equals(key) || MAVEN_VERSION.equals(key)) {
property.getParent().removeNode(property);
}
}
}
iu.addProperty(MAVEN_GROUP_ID, project.getGroupId());
iu.addProperty(MAVEN_ARTIFACT_ID, project.getArtifactId());
iu.addProperty(MAVEN_VERSION, project.getVersion());
}
public void addSelfCapability(IU iu) {
if (iu.getSelfCapabilities().size() == 0)
return;
iu.addSelfCapability();
}
}