blob: 1a0e9a05a0cdb6694d30f64ee18814ccbf7dfc2d [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2009 The University of Manchester
*
* Modifications to the initial code base are copyright of their
* respective authors, or their employers as appropriate.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
******************************************************************************/
package net.sf.taverna.t2.maven.plugins;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.Artifact;
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.LifecyclePhase;
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.apache.maven.shared.osgi.DefaultMaven2OsgiConverter;
import org.apache.maven.shared.osgi.Maven2OsgiConverter;
import org.eclipse.aether.RepositorySystemSession;
import uk.org.taverna.commons.profile.xml.jaxb.ApplicationProfile;
import uk.org.taverna.commons.profile.xml.jaxb.BundleInfo;
import uk.org.taverna.commons.profile.xml.jaxb.FrameworkConfiguration;
import uk.org.taverna.commons.profile.xml.jaxb.Updates;
/**
* Generates an application profile file.
*
* @author David Withers
*/
@Mojo(name = "profile-generate", defaultPhase = LifecyclePhase.GENERATE_RESOURCES, requiresDependencyResolution = ResolutionScope.RUNTIME)
public class TavernaProfileGenerateMojo extends AbstractMojo {
public static final String SYSTEM_PACKAGES = "org.osgi.framework.system.packages.extra";
public static final String SCHEMA_LOCATION = "http://ns.taverna.org.uk/2013/application/profile http://localhost/2013/application/profile/ApplicationProfile.xsd";
public static final String TAVERNA_TMP = "taverna-tmp";
public static final String APPLICATION_PROFILE_FILE = "ApplicationProfile.xml";
@Component
private MavenProject project;
@Component
private ProjectDependenciesResolver projectDependenciesResolver;
@Parameter(defaultValue = "${repositorySystemSession}", readonly = true)
private RepositorySystemSession repositorySystemSession;
/**
* The directory where the generated <code>ApplicationProfile.xml</code> file will be put.
*/
@Parameter(defaultValue = "${project.build.directory}", required = true)
protected File outputDirectory;
@Parameter(defaultValue = "SNAPSHOT")
private String buildNumber;
@Parameter
private List<FrameworkConfiguration> frameworkConfigurations;
@Parameter(required = true)
private String updateSite;
@Parameter(defaultValue = "updates.xml")
private String updatesFile;
@Parameter(defaultValue = "lib")
private String libDirectory;
@Parameter(required = true)
private String pluginSite;
@Parameter(defaultValue = "plugins.xml")
private String pluginsFile;
private Maven2OsgiConverter maven2OsgiConverter = new DefaultMaven2OsgiConverter();
private MavenOsgiUtils osgiUtils;
private File tempDirectory;
public void execute() throws MojoExecutionException, MojoFailureException {
try {
osgiUtils = new MavenOsgiUtils(project, repositorySystemSession,
projectDependenciesResolver, getSystemPackages(), getLog());
tempDirectory = new File(outputDirectory, TAVERNA_TMP);
File profileFile = createApplicationProfile();
project.getArtifact().setFile(profileFile);
copyDependencies();
} catch (JAXBException e) {
throw new MojoExecutionException("Error generating application profile", e);
}
}
private void copyDependencies() throws MojoExecutionException {
File libDirectory = new File(tempDirectory, "lib");
libDirectory.mkdirs();
try {
for (Artifact artifact : project.getArtifacts()) {
FileUtils.copyFileToDirectory(artifact.getFile(),
new File(libDirectory, artifact.getGroupId()));
}
} catch (IOException e) {
throw new MojoExecutionException("Error copying dependecies to lib directory", e);
}
}
/**
* Generates the application profile file.
*
* @return the <code>File</code> that the application profile has been written to
* @throws JAXBException
* if the application profile cannot be created
* @throws MojoExecutionException
*/
private File createApplicationProfile() throws JAXBException, MojoExecutionException {
String groupId = project.getGroupId();
String artifactId = project.getArtifactId();
String version = maven2OsgiConverter.getVersion(project.getVersion());
if (version.endsWith("SNAPSHOT")) {
version = version.substring(0, version.indexOf("SNAPSHOT")) + buildNumber;
}
tempDirectory.mkdirs();
File applicationProfileFile = new File(tempDirectory, APPLICATION_PROFILE_FILE);
ApplicationProfile applicationProfile = new ApplicationProfile();
applicationProfile.setId(groupId + "." + artifactId);
applicationProfile.setName(project.getName());
applicationProfile.setVersion(version);
Updates updates = new Updates();
updates.setUpdateSite(updateSite);
updates.setUpdatesFile(updatesFile);
updates.setLibDirectory(libDirectory);
updates.setPluginSite(pluginSite);
updates.setPluginsFile(pluginsFile);
applicationProfile.setUpdates(updates);
List<FrameworkConfiguration> frameworkConfiguration = applicationProfile
.getFrameworkConfiguration();
for (FrameworkConfiguration configuration : frameworkConfigurations) {
frameworkConfiguration.add(configuration);
}
Set<BundleArtifact> bundleDependencies = osgiUtils.getBundleDependencies(
Artifact.SCOPE_COMPILE, Artifact.SCOPE_RUNTIME);
List<BundleInfo> runtimeBundles = osgiUtils.getBundles(bundleDependencies);
if (!runtimeBundles.isEmpty()) {
List<BundleInfo> bundles = applicationProfile.getBundle();
for (BundleInfo bundle : runtimeBundles) {
bundles.add(bundle);
}
}
JAXBContext jaxbContext = JAXBContext.newInstance(ApplicationProfile.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, SCHEMA_LOCATION);
marshaller.marshal(applicationProfile, applicationProfileFile);
return applicationProfileFile;
}
private Set<String> getSystemPackages() {
Set<String> systemPackages = new HashSet<String>();
if (frameworkConfigurations != null) {
for (FrameworkConfiguration configuration : frameworkConfigurations) {
if (SYSTEM_PACKAGES.equals(configuration.getName())) {
String packagesString = configuration.getValue();
if (packagesString != null) {
String[] packages = packagesString.split(",");
for (String packageString : packages) {
String[] packageProperties = packageString.split(";");
if (packageProperties.length > 0) {
systemPackages.add(packageProperties[0]);
}
}
}
}
}
}
return systemPackages;
}
}