package aQute.bnd.maven.export.plugin;
import static org.apache.maven.plugins.annotations.LifecyclePhase.PACKAGE;
import java.io.File;
import java.util.List;
import org.apache.maven.execution.MavenSession;
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.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectDependenciesResolver;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import aQute.bnd.build.Workspace;
import aQute.bnd.maven.lib.resolve.DependencyResolver;
import aQute.bnd.osgi.Constants;
import aQute.bnd.repository.fileset.FileSetRepository;
import aQute.bnd.service.RepositoryPlugin;
import aQute.lib.io.IO;
import biz.aQute.resolve.Bndrun;
@Mojo(name = "export", defaultPhase = PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
public class ExportMojo extends AbstractMojo {
private static final Logger logger = LoggerFactory.getLogger(ExportMojo.class);
@Parameter(defaultValue = "${project}", readonly = true, required = true)
private MavenProject project;
@Parameter(defaultValue = "${repositorySystemSession}", readonly = true, required = true)
private RepositorySystemSession repositorySession;
@Parameter(readonly = true, required = true)
private List<File> bndruns;
@Parameter(defaultValue = "${project.build.directory}", readonly = true)
private File targetDir;
@Parameter(readonly = true, required = false)
private List<File> bundles;
@Parameter(defaultValue = "true")
private boolean useDefaults;
@Parameter(defaultValue = "false")
private boolean resolve;
@Parameter(defaultValue = "true")
private boolean failOnChanges;
@Parameter(defaultValue = "false")
private boolean bundlesOnly;
@Parameter(defaultValue = "${session}", readonly = true)
private MavenSession session;
private int errors = 0;
@Component
private RepositorySystem system;
@Component
private ProjectDependenciesResolver resolver;
public void execute() throws MojoExecutionException, MojoFailureException {
try {
DependencyResolver dependencyResolver = new DependencyResolver(project, repositorySession, resolver,
system);
FileSetRepository fileSetRepository = dependencyResolver.getFileSetRepository(project.getName(), bundles,
useDefaults);
for (File runFile : bndruns) {
export(runFile, fileSetRepository);
}
} catch (Exception e) {
throw new MojoExecutionException(e.getMessage(), e);
}
if (errors > 0)
throw new MojoExecutionException(errors + " errors found");
}
private void export(File runFile, FileSetRepository fileSetRepository) throws Exception {
if (!runFile.exists()) {
logger.error("Could not find bnd run file {}", runFile);
errors++;
return;
}
String bndrun = getNamePart(runFile);
File temporaryDir = new File(targetDir, "tmp/export/" + bndrun);
File cnf = new File(temporaryDir, Workspace.CNFDIR);
IO.mkdirs(cnf);
try (Bndrun run = Bndrun.createBndrun(null, runFile)) {
run.setBase(temporaryDir);
Workspace workspace = run.getWorkspace();
workspace.setBuildDir(cnf);
workspace.setOffline(session.getSettings().isOffline());
workspace.addBasicPlugin(fileSetRepository);
for (RepositoryPlugin repo : workspace.getRepositories()) {
repo.list(null);
}
run.getInfo(workspace);
report(run);
if (!run.isOk()) {
return;
}
if (resolve) {
try {
String runBundles = run.resolve(failOnChanges, false);
if (!run.isOk()) {
return;
}
run.setProperty(Constants.RUNBUNDLES, runBundles);
} finally {
report(run);
}
}
try {
if (bundlesOnly) {
File runbundlesDir = new File(targetDir, "export/" + bndrun);
IO.mkdirs(runbundlesDir);
run.exportRunbundles(null, runbundlesDir);
} else {
File executableJar = new File(targetDir, bndrun + ".jar");
run.export(null, false, executableJar);
}
} finally {
report(run);
}
}
}
private String getNamePart(File runFile) {
String nameExt = runFile.getName();
int pos = nameExt.lastIndexOf('.');
return (pos > 0) ? nameExt.substring(0, pos) : nameExt;
}
private void report(Bndrun run) {
for (String warning : run.getWarnings()) {
logger.warn("Warning : {}", warning);
}
for (String error : run.getErrors()) {
logger.error("Error : {}", error);
errors++;
}
}
}