blob: b7dc8d1ed8a81321600cb9af9438058c3e54bbbc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with this
* work for additional information regarding copyright ownership. The ASF
* licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.sling.maven.projectsupport;
import static org.apache.sling.maven.projectsupport.BundleListUtils.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.maven.AbstractMavenLifecycleParticipant;
import org.apache.maven.MavenExecutionException;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.Bundle;
import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.BundleList;
import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.StartLevel;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
/**
* Maven lifecycle participant which adds the default bundle list, the
* jar web support bundle, and the contents of any local bundle list.
*/
@Component(role = AbstractMavenLifecycleParticipant.class)
public class LaunchpadPluginLifecycleParticipant extends AbstractMavenLifecycleParticipant {
private static final String PLUGIN_ID = "maven-launchpad-plugin";
private static final String PROVIDED = "provided";
@Requirement
private Logger log;
@Override
public void afterProjectsRead(MavenSession session) throws MavenExecutionException {
try {
Map<String, MavenProject> projectMap = new HashMap<String, MavenProject>();
for (MavenProject project : session.getProjects()) {
projectMap.put(project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion(),
project);
}
for (MavenProject project : session.getProjects()) {
for (Plugin plugin : project.getBuild().getPlugins()) {
if (plugin.getArtifactId().equals(PLUGIN_ID)) {
BundleListDependencyAdder performer = new BundleListDependencyAdder(session, project, plugin);
performer.addDependencies();
}
}
}
} catch (Exception e) {
throw new MavenExecutionException("Unable to determine launchpad plugin-based dependencies", e);
}
super.afterProjectsRead(session);
}
private class BundleListDependencyAdder {
private final MavenSession session;
private final MavenProject project;
private final Plugin plugin;
private final List<ArtifactDefinition> additionalBundles;
private ArtifactDefinition defaultBundleList;
private boolean includeDefaultBundles;
private ArtifactDefinition jarWebSupport;
private File bundleListFile;
public BundleListDependencyAdder(MavenSession session, MavenProject project, Plugin plugin) {
this.session = session;
this.project = project;
this.plugin = plugin;
this.additionalBundles = new ArrayList<ArtifactDefinition>();
}
void addDependencies() throws Exception {
readConfiguration();
addBundleListDependencies();
if (hasPreparePackageExecution()) {
if (includeDefaultBundles && !isCurrentArtifact(project, defaultBundleList)) {
log.debug(String.format("adding default bundle list (%s) to dependencies of project %s", defaultBundleList, project));
project.getDependencies().addAll(defaultBundleList.toDependencyList(PROVIDED));
}
if (hasJarPackagingExecution()) {
log.debug(String.format("adding jar web support (%s) to dependencies of project %s", jarWebSupport, project));
project.getDependencies().addAll(jarWebSupport.toDependencyList(PROVIDED));
}
}
}
private void addBundleListDependencies() throws IOException, XmlPullParserException, MojoExecutionException {
BundleList bundleList;
if (bundleListFile.exists()) {
bundleList = readBundleList(bundleListFile);
} else {
bundleList = new BundleList();
}
if (additionalBundles != null) {
for (ArtifactDefinition def : additionalBundles) {
bundleList.add(def.toBundleList());
}
}
interpolateProperties(bundleList, project, session);
for (StartLevel startLevel : bundleList.getStartLevels()) {
for (Bundle bundle : startLevel.getBundles()) {
log.debug(String.format("adding bundle (%s) from bundle list to dependencies of project %s", bundle, project));
project.getDependencies().addAll(ArtifactDefinition.toDependencyList(bundle, PROVIDED));
}
}
}
private void readConfiguration() throws IOException {
Xpp3Dom configuration = (Xpp3Dom) plugin.getConfiguration();
defaultBundleList = null;
jarWebSupport = null;
includeDefaultBundles = true;
bundleListFile = new File(project.getBasedir(), "src/main/bundles/list.xml");
if (configuration != null) {
includeDefaultBundles = nodeValue(configuration, "includeDefaultBundles", true);
Xpp3Dom defaultBundleListConfig = configuration.getChild("defaultBundleList");
if (defaultBundleListConfig != null) {
defaultBundleList = new ArtifactDefinition(defaultBundleListConfig);
}
Xpp3Dom jarWebSupportConfig = configuration.getChild("jarWebSupport");
if (jarWebSupportConfig != null) {
jarWebSupport = new ArtifactDefinition(jarWebSupportConfig);
}
Xpp3Dom bundleListFileConfig = configuration.getChild("bundleListFile");
if (bundleListFileConfig != null) {
bundleListFile = new File(project.getBasedir(), bundleListFileConfig.getValue());
}
configureAdditionalBundles(configuration);
}
for (PluginExecution execution : plugin.getExecutions()) {
Xpp3Dom executionConfiguration = (Xpp3Dom) execution.getConfiguration();
if (executionConfiguration != null) {
configureAdditionalBundles(executionConfiguration);
}
}
initArtifactDefinitions(getClass().getClassLoader(), new ArtifactDefinitionsCallback() {
public void initArtifactDefinitions(Properties dependencies) {
if (defaultBundleList == null) {
defaultBundleList = new ArtifactDefinition();
}
defaultBundleList.initDefaults(dependencies.getProperty("defaultBundleList"));
if (jarWebSupport == null) {
jarWebSupport = new ArtifactDefinition();
}
jarWebSupport.initDefaults(dependencies.getProperty("jarWebSupport"));
}
});
}
private void configureAdditionalBundles(Xpp3Dom configuration) {
Xpp3Dom additionalBundlesConfig = configuration.getChild("additionalBundles");
if (additionalBundlesConfig != null) {
Xpp3Dom[] bundleConfigs = additionalBundlesConfig.getChildren("bundle");
if (bundleConfigs != null) {
for (Xpp3Dom bundleConfig : bundleConfigs) {
additionalBundles.add(new ArtifactDefinition(bundleConfig));
}
}
}
}
private boolean hasJarPackagingExecution() {
if (AbstractUsingBundleListMojo.JAR.equals(project.getPackaging())) {
return true;
} else {
for (PluginExecution execution : plugin.getExecutions()) {
if (execution.getGoals().contains("prepare-package")) {
Xpp3Dom executionConfig = (Xpp3Dom) execution.getConfiguration();
if (executionConfig != null) {
Xpp3Dom packagingConfig = executionConfig.getChild("packaging");
if (packagingConfig != null
&& AbstractUsingBundleListMojo.JAR.equals(packagingConfig.getValue())) {
return true;
}
}
}
}
return false;
}
}
private boolean hasPreparePackageExecution() {
for (PluginExecution execution : plugin.getExecutions()) {
if (execution.getGoals().contains("prepare-package")) {
return true;
}
}
return false;
}
}
}