package io.takari.maven.plugins.configurator; import java.util.Collection; import org.apache.maven.lifecycle.MojoExecutionConfigurator; import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginExecution; import org.apache.maven.plugin.MojoExecution; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.xml.Xpp3Dom; public class TakariMojoExecutionConfigurator implements MojoExecutionConfigurator { @Override public void configure(MavenProject project, MojoExecution mojoExecution, boolean allowPluginLevelConfig) { String groupId = mojoExecution.getGroupId(); String artifactId = mojoExecution.getArtifactId(); Plugin plugin = findPlugin(groupId, artifactId, project.getBuildPlugins()); if (plugin == null && project.getPluginManagement() != null) { plugin = findPlugin(groupId, artifactId, project.getPluginManagement().getPlugins()); } if (plugin != null) { PluginExecution pluginExecution = findPluginExecution(mojoExecution.getExecutionId(), plugin.getExecutions()); Xpp3Dom pomConfiguration = null; if (pluginExecution != null) { pomConfiguration = (Xpp3Dom) pluginExecution.getConfiguration(); } else if (allowPluginLevelConfig) { pomConfiguration = (Xpp3Dom) plugin.getConfiguration(); } Xpp3Dom mojoConfigurationFromPom = (pomConfiguration != null) ? new Xpp3Dom(pomConfiguration) : null; // // If we have a configuration that is scoped the by the goal name then extract it. It needs to be an // element that matches the mojoExecution.getGoal() and the element must have children. // if (mojoConfigurationFromPom != null && mojoConfigurationFromPom.getChild(mojoExecution.getGoal()) != null && mojoConfigurationFromPom.getChild(mojoExecution.getGoal()).getChildCount() > 0) { mojoConfigurationFromPom = mojoConfigurationFromPom.getChild(mojoExecution.getGoal()); } // // There seems to be an issue in Maven where the merging is done with the default configuration from the the plugin.xml as // the dominant part of the merge which seems incorrect. One would assume that the configuration from the POM woul dbe // the dominant part of the merge. // mojoConfigurationFromPom = Xpp3Dom.mergeXpp3Dom(mojoConfigurationFromPom, mojoExecution.getConfiguration()); mojoExecution.setConfiguration(mojoConfigurationFromPom); } } private Plugin findPlugin(String groupId, String artifactId, Collection<Plugin> plugins) { for (Plugin plugin : plugins) { if (artifactId.equals(plugin.getArtifactId()) && groupId.equals(plugin.getGroupId())) { return plugin; } } return null; } private PluginExecution findPluginExecution(String executionId, Collection<PluginExecution> executions) { if (StringUtils.isNotEmpty(executionId)) { for (PluginExecution execution : executions) { if (executionId.equals(execution.getId())) { return execution; } } } return null; } }