blob: 0af2a48b62aa33868319f4bca1f63d413b2adf65 [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.io.File;
import java.io.IOException;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.archiver.util.DefaultFileSet;
import org.codehaus.plexus.archiver.zip.ZipArchiver;
import org.eclipse.tycho.artifacts.TargetPlatform;
import org.eclipse.tycho.core.osgitools.DefaultReactorProject;
import org.eclipse.tycho.core.utils.TychoProjectUtils;
import org.eclipse.tycho.model.IU;
/**
* Creates the zip for the IU and attaches it as an artifact
*/
@Mojo(name = "package-iu", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.RUNTIME)
public class PackageIUMojo extends AbstractTychoPackagingMojo {
@Parameter(property = "project.build.directory", required = true, readonly = true)
protected File outputDirectory;
/**
* Folder containing the files to include in the final zip.
*/
@Parameter(property = "project.build.outputDirectory")
private String artifactContentFolder;
@Parameter(property = "project.basedir", required = true, readonly = true)
private File basedir;
@Component
private IUXmlTransformer iuTransformer;
@Component(role = Archiver.class, hint = "zip")
private ZipArchiver zipArchiver;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
outputDirectory.mkdirs();
IU iu = IU.loadIU(basedir);
File iuXML = new File(outputDirectory, IU.SOURCE_FILE_NAME);
try {
addSelfCapability(iu);
addArtifactReference(iu);
addMavenProperties(iu);
expandVersions(iu);
IU.write(iu, iuXML);
} catch (IOException e) {
throw new MojoExecutionException("Error updating " + IU.SOURCE_FILE_NAME, e);
}
//Create the artifact
File artifactForIU = createArtifact();
project.getArtifact().setFile(artifactForIU);
}
private void addMavenProperties(IU iu) {
iuTransformer.injectMavenProperties(iu, project);
}
private void addSelfCapability(IU iu) {
iuTransformer.addSelfCapability(iu);
}
private void addArtifactReference(IU iu) {
if (!hasPayload())
return;
if (hasArtifactReference(iu))
return;
iu.addArtifact("binary", iu.getId(), iu.getVersion());
}
private void expandVersions(IU iu) throws MojoFailureException {
iuTransformer.replaceSelfQualifiers(iu, DefaultReactorProject.adapt(project).getExpandedVersion(),
DefaultReactorProject.adapt(project).getBuildQualifier());
iuTransformer.replaceQualifierInCapabilities(iu.getProvidedCapabilites(),
DefaultReactorProject.adapt(project).getBuildQualifier());
TargetPlatform targetPlatform = TychoProjectUtils.getTargetPlatformIfAvailable(project);
if (targetPlatform == null) {
getLog().warn(
"Skipping version reference expansion in p2iu project using the deprecated -Dtycho.targetPlatform configuration");
return;
}
iuTransformer.replaceZerosInRequirements(iu, targetPlatform);
iuTransformer.replaceQualifierInRequirements(iu, targetPlatform);
}
private boolean hasPayload() {
return getPayloadDir().isDirectory();
}
private File createArtifact() throws MojoExecutionException {
try {
File payload = getPayloadDir();
File newArtifact = new File(outputDirectory, project.getArtifactId() + "-" + project.getVersion() + ".zip");
if (newArtifact.exists()) {
newArtifact.delete();
}
if (hasPayload()) {
DefaultFileSet fs = new DefaultFileSet();
fs.setDirectory(payload);
zipArchiver.addFileSet(fs);
zipArchiver.setDestFile(newArtifact);
zipArchiver.setCompress(true);
zipArchiver.createArchive();
} else {
//Force create the file
newArtifact.createNewFile();
}
return newArtifact;
} catch (IOException | ArchiverException e) {
throw new MojoExecutionException("Error assembling ZIP", e);
}
}
private File getPayloadDir() {
return new File(artifactContentFolder);
}
private boolean hasArtifactReference(IU iu) {
return iu.getSelfArtifact() != null;
}
}