blob: d3743f801fb2fa4c32cd762b580cb25f4efd1400 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 Lablicate GmbH 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:
* Christoph Läubrich - initial API and implementation derived from TychoModelReader
*******************************************************************************/
package org.eclipse.tycho.pomless;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.io.ModelParseException;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.sonatype.maven.polyglot.mapping.Mapping;
import org.w3c.dom.Element;
/**
*
* Responsible for parsing eclipse-repository artifacts (updatesites, catgory.xml)
*/
@Component(role = Mapping.class, hint = TychoRepositoryMapping.PACKAGING)
public class TychoRepositoryMapping extends AbstractXMLTychoMapping {
private static final String CATEGORY_XML = "category.xml";
private static final String PRODUCT_EXTENSION = ".product";
public static final String PACKAGING = "eclipse-repository";
private static final String UPDATE_SITE_SUFFIX = "." + PACKAGING;
@Override
protected String getPackaging() {
return PACKAGING;
}
@Override
protected void initModelFromXML(Model model, Element xml, File artifactFile)
throws ModelParseException, IOException {
if (artifactFile.getName().endsWith(PRODUCT_EXTENSION)) {
initFromProdcut(model, xml);
} else {
initFromCategory(model, xml, artifactFile);
}
}
private void initFromCategory(Model model, Element xml, File categoryXml) {
String name = categoryXml.getParentFile().getName();
if (!name.endsWith(UPDATE_SITE_SUFFIX)) {
name = name + UPDATE_SITE_SUFFIX;
}
model.setArtifactId(name);
model.setName(name);
}
private void initFromProdcut(Model model, Element xml) throws ModelParseException {
model.setArtifactId(getRequiredXMLAttributeValue(xml, "uid"));
String version = getXMLAttributeValue(xml, "version");
if (version != null) {
model.setVersion(getPomVersion(version));
}
String name = getXMLAttributeValue(xml, "name");
if (name != null) {
model.setName(name);
}
Build build = new Build();
Plugin plugin = new Plugin();
build.addPlugin(plugin);
plugin.setArtifactId("tycho-p2-director-plugin");
plugin.setGroupId("org.eclipse.tycho");
PluginExecution materialize = new PluginExecution();
materialize.setId("materialize-prodcuts");
materialize.setGoals(Arrays.asList("materialize-products"));
plugin.addExecution(materialize);
Xpp3Dom config = new Xpp3Dom("configuration");
Xpp3Dom products = new Xpp3Dom("products");
Xpp3Dom product = new Xpp3Dom("product");
Xpp3Dom id = new Xpp3Dom("id");
id.setValue(model.getArtifactId());
config.addChild(products);
products.addChild(product);
product.addChild(id);
materialize.setConfiguration(config);
PluginExecution archive = new PluginExecution();
archive.setId("archive-prodcuts");
archive.setGoals(Arrays.asList("archive-products"));
archive.setConfiguration(config);
plugin.addExecution(archive);
model.setBuild(build);
}
@Override
protected boolean isValidLocation(String location) {
return location.endsWith(PRODUCT_EXTENSION) || location.endsWith(CATEGORY_XML);
}
@Override
protected File getPrimaryArtifact(File projectRoot) {
File[] productFiles = projectRoot.listFiles(
(File dir, String name) -> name.endsWith(PRODUCT_EXTENSION) && !name.startsWith(".polyglot"));
if (productFiles != null && productFiles.length > 0) {
for (File file : productFiles) {
if (file.isFile()) {
return file;
}
}
}
File category = new File(projectRoot, CATEGORY_XML);
if (category.exists()) {
return category;
}
return null;
}
}