/* * 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; } } }