blob: 09dcab9b14dcb040c0116a60598368180ea338e0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 SAP AG 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:
* Tobias Oberlies - initial API and implementation
*******************************************************************************/
package org.eclipse.tycho.plugins.p2.extras;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.plugin.AbstractMojo;
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.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.cli.CommandLineUtils;
import org.eclipse.sisu.equinox.launching.internal.P2ApplicationLauncher;
/**
* This goal invokes the feature and bundle publisher on a folder.
*
* @see http://wiki.eclipse.org/Equinox/p2/Publisher#Features_And_Bundles_Publisher_Application
*/
@Mojo(name = "publish-features-and-bundles")
public class PublishFeaturesAndBundlesMojo extends AbstractMojo {
private static String CONTENT_PUBLISHER_APP_NAME = "org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher";
/**
* Location of the metadata repository to write. The AssembleRepositoryMojo of
* tycho-p2-repository-plugin will only work with the predefined default
* ${project.build.directory}/repository.
*/
@Parameter(defaultValue = "${project.build.directory}/repository")
private String metadataRepositoryLocation;
/**
* Location of the artifact repository to write. Note: The AssembleRepositoryMojo of
* tycho-p2-repository-plugin will only work with the predefined default
* ${project.build.directory}/repository.
*
*/
@Parameter(defaultValue = "${project.build.directory}/repository")
private String artifactRepositoryLocation;
/**
* Location with features and/or plugins directories on which the features and bundles publisher
* shall be called.
*/
@Parameter(defaultValue = "${project.build.directory}/source")
private String sourceLocation;
/**
* Create compressed jars rather than plain xml
*/
@Parameter(defaultValue = "true")
private boolean compress;
/**
* Optional flag to append artifacts to an existing repository
*/
@Parameter(defaultValue = "false")
private boolean append;
/**
* Publish artifacts to repository
*/
@Parameter(defaultValue = "true")
private boolean publishArtifacts;
/**
* Optional flag to include .pack.gz files
*/
@Parameter(defaultValue = "false")
private boolean reusePack200Files;
/**
* Optional line of additional arguments passed to the p2 application launcher.
*/
@Parameter(defaultValue = "")
private String additionalArgs;
/**
* Kill the forked process after a certain number of seconds. If set to 0, wait forever for the
* process, never timing out.
*/
@Parameter(property = "p2.timeout", defaultValue = "0")
private int forkedProcessTimeoutInSeconds;
@Parameter(property = "project")
private MavenProject project;
@Component
private P2ApplicationLauncher launcher;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
publishContent();
}
private void publishContent() throws MojoExecutionException, MojoFailureException {
try {
File sourceRepositoryDir = new File(sourceLocation).getCanonicalFile();
File artifactRepositoryDir = new File(artifactRepositoryLocation).getCanonicalFile();
File metadataRepositoryDir = new File(metadataRepositoryLocation).getCanonicalFile();
List<String> contentArgs = new ArrayList<>();
contentArgs.add("-source");
contentArgs.add(sourceRepositoryDir.toString());
launcher.setWorkingDirectory(project.getBasedir());
launcher.setApplicationName(CONTENT_PUBLISHER_APP_NAME);
launcher.addArguments("-artifactRepository", artifactRepositoryDir.toURL().toString(), //
"-metadataRepository", metadataRepositoryDir.toURL().toString());
launcher.addArguments(getPublishArtifactFlag());
launcher.addArguments(getAppendFlag());
launcher.addArguments(getCompressFlag());
launcher.addArguments(getReusePack200FilesFlag());
launcher.addArguments(getAdditionalArgs());
launcher.addArguments(contentArgs.toArray(new String[contentArgs.size()]));
int result = launcher.execute(forkedProcessTimeoutInSeconds);
if (result != 0) {
throw new MojoFailureException("P2 publisher return code was " + result);
}
} catch (IOException ioe) {
throw new MojoExecutionException("Unable to execute the publisher", ioe);
}
}
/**
* @return The '-compress' flag or empty if we don't want to compress.
*/
private String[] getCompressFlag() {
return compress ? new String[] { "-compress" } : new String[0];
}
/**
* @return The '-append' flag or empty if we don't want to append.
*/
private String[] getAppendFlag() {
return append ? new String[] { "-append" } : new String[0];
}
/**
* @return The '-publishArtifacts' flag or empty if we don't want to publish artifacts.
*/
private String[] getPublishArtifactFlag() {
return publishArtifacts ? new String[] { "-publishArtifacts" } : new String[0];
}
/**
* @return The '-reusePack200Files' flag or empty if we don't want to include .pack.gz files.
*/
private String[] getReusePack200FilesFlag() {
return reusePack200Files ? new String[] { "-reusePack200Files" } : new String[0];
}
/**
* @return array of parsed space separated list of additional arguments. Empty array if not
* defined.
* @throws MojoExecutionException
* is thrown if parsing of additional arguments fails
*/
private String[] getAdditionalArgs() throws MojoExecutionException {
if (additionalArgs == null || "".equals(additionalArgs)) {
return new String[0];
} else {
try {
return CommandLineUtils.translateCommandline(additionalArgs);
} catch (Exception e) {
throw new MojoExecutionException("Unable to translate additional arguments into command line array", e);
}
}
}
}