123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432 |
- /*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube 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 3 of the License, or (at your option) any later version.
- *
- * SonarQube 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
- package org.sonar.api.batch.maven;
-
- import org.apache.commons.lang.StringUtils;
- import org.apache.commons.lang.builder.ToStringBuilder;
- import org.apache.maven.model.Plugin;
- import org.apache.maven.model.ReportPlugin;
- import org.apache.maven.project.MavenProject;
- import org.codehaus.plexus.util.xml.Xpp3Dom;
-
- import java.util.Collection;
- import java.util.Iterator;
- import java.util.List;
-
- /**
- * A class to handle maven plugins
- *
- * @since 1.10
- * @deprecated since 4.5 we don't want any dependency on Maven anymore
- */
- @Deprecated
- public class MavenPlugin {
-
- private static final String CONFIGURATION_ELEMENT = "configuration";
- private Plugin plugin;
- private Xpp3Dom configuration;
-
- /**
- * Creates a MavenPlugin based on a Plugin
- *
- * @param plugin the plugin
- */
- public MavenPlugin(Plugin plugin) {
- this.plugin = plugin;
- this.configuration = (Xpp3Dom) plugin.getConfiguration();
- if (this.configuration == null) {
- configuration = new Xpp3Dom(CONFIGURATION_ELEMENT);
- plugin.setConfiguration(this.configuration);
- }
- }
-
- /**
- * Creates a Maven plugin based on artifact + group + version
- *
- * @param groupId the group id
- * @param artifactId the artifact id
- * @param version the version
- */
- public MavenPlugin(String groupId, String artifactId, String version) {
- this.plugin = new Plugin();
- plugin.setGroupId(groupId);
- plugin.setArtifactId(artifactId);
- plugin.setVersion(version);
- configuration = new Xpp3Dom(CONFIGURATION_ELEMENT);
- plugin.setConfiguration(this.configuration);
- }
-
- /**
- * @since 3.5 - see SONAR-4070
- * @return the XML node <configuration> of pom
- */
- public Xpp3Dom getConfigurationXmlNode() {
- return configuration;
- }
-
- /**
- * Sets the maven plugin version
- *
- * @param version the version
- * @return this
- */
- public MavenPlugin setVersion(String version) {
- this.plugin.setVersion(version);
- return this;
- }
-
- /**
- * @return the underlying plugin
- */
- public Plugin getPlugin() {
- return plugin;
- }
-
- /**
- * Gets a parameter of the plugin based on its key
- *
- * @param key the param key
- * @return the parameter if exist, null otherwise
- */
- public String getParameter(String key) {
- Xpp3Dom node = findNodeWith(key);
- return node == null ? null : node.getValue();
- }
-
- /**
- * Gets a list of parameters of the plugin from a param key
- *
- * @param key param key with option-index snippet: e.g. item[0], item[1]. If no index snippet is passed, then
- * 0 is default (index <=> index[0])
- * @return an array of parameters if any, an empty array otherwise
- */
- public String[] getParameters(String key) {
- String[] keyParts = StringUtils.split(key, "/");
- Xpp3Dom node = configuration;
- for (int i = 0; i < keyParts.length - 1; i++) {
- node = getOrCreateChild(node, keyParts[i]);
- }
- Xpp3Dom[] children = node.getChildren(keyParts[keyParts.length - 1]);
- String[] result = new String[children.length];
- for (int i = 0; i < children.length; i++) {
- result[i] = children[i].getValue();
- }
- return result;
- }
-
- /**
- * Sets a parameter for the maven plugin. This will overrides an existing parameter.
- *
- * @param key the param key
- * @param value the param value
- * @return this
- */
- public MavenPlugin setParameter(String key, String value) {
- checkKeyArgument(key);
- String[] keyParts = StringUtils.split(key, "/");
- Xpp3Dom node = configuration;
- for (String keyPart : keyParts) {
- node = getOrCreateChild(node, keyPart);
- }
- node.setValue(value);
- return this;
- }
-
- /**
- * Sets a parameter to the maven plugin. Overrides existing parameter only id specified.
- *
- * @param key the param key
- * @param value the param value
- * @param override whether to override existing parameter
- */
- public void setParameter(String key, String value, boolean override) {
- if (getParameter(key) == null || override) {
- setParameter(key, value);
- }
- }
-
- /**
- * Removes all parameters from the maven plugin
- */
- public void removeParameters() {
- configuration = new Xpp3Dom(CONFIGURATION_ELEMENT);
- plugin.setConfiguration(this.configuration);
- }
-
- /**
- * Adds a parameter to the maven plugin
- *
- * @param key the param key with option-index snippet: e.g. item[0], item[1]. If no index snippet is passed, then
- * 0 is default (index <=> index[0])
- * @param value the param value
- * @return this
- */
- public MavenPlugin addParameter(String key, String value) {
- String[] keyParts = StringUtils.split(key, "/");
- Xpp3Dom node = configuration;
- for (int i = 0; i < keyParts.length - 1; i++) {
- node = getOrCreateChild(node, keyParts[i]);
- }
- Xpp3Dom leaf = new Xpp3Dom(keyParts[keyParts.length - 1]);
- leaf.setValue(value);
- node.addChild(leaf);
- return this;
- }
-
- private static Xpp3Dom getOrCreateChild(Xpp3Dom node, String key) {
- int childIndex = getIndex(key);
-
- if (node.getChildren(removeIndexSnippet(key)).length <= childIndex) {
- Xpp3Dom child = new Xpp3Dom(removeIndexSnippet(key));
- node.addChild(child);
- return child;
- }
- return node.getChildren(removeIndexSnippet(key))[childIndex];
-
- }
-
- private static int getIndex(String key) {
- // parsing index-syntax (e.g. item[1])
- if (key.matches(".*?\\[\\d+\\]")) {
- return Integer.parseInt(StringUtils.substringBetween(key, "[", "]"));
- }
- // for down-compatibility of api we fallback to default 0
- return 0;
- }
-
- private static String removeIndexSnippet(String key) {
- return StringUtils.substringBefore(key, "[");
- }
-
- /**
- * Remove a parameter from the maven plugin based on its key
- *
- * @param key param key with option-index snippet: e.g. item[0], item[1]. If no index snippet is passed, then
- * 0 is default (index <=> index[0])
- */
- public void removeParameter(String key) {
- Xpp3Dom node = findNodeWith(key);
- if (node != null) {
- remove(node);
- }
- }
-
- private Xpp3Dom findNodeWith(String key) {
- checkKeyArgument(key);
- String[] keyParts = key.split("/");
- Xpp3Dom node = configuration;
- for (String keyPart : keyParts) {
-
- if (node.getChildren(removeIndexSnippet(keyPart)).length <= getIndex(keyPart)) {
- return null;
- }
-
- node = node.getChildren(removeIndexSnippet(keyPart))[getIndex(keyPart)];
- if (node == null) {
- return null;
- }
- }
- return node;
- }
-
- private static void remove(Xpp3Dom node) {
- Xpp3Dom parent = node.getParent();
- for (int i = 0; i < parent.getChildCount(); i++) {
- Xpp3Dom child = parent.getChild(i);
- if (child.equals(node)) {
- parent.removeChild(i);
- break;
- }
- }
- }
-
- /**
- * @return whether the maven plugin has got configuration
- */
- public boolean hasConfiguration() {
- return configuration.getChildCount() > 0;
- }
-
- private static void checkKeyArgument(String key) {
- if (key == null) {
- throw new IllegalArgumentException("Parameter 'key' should not be null.");
- }
- }
-
- /**
- * Registers a plugin in a project pom
- * <p/>
- * <p>Adds the plugin if it does not exist or amend its version if it does exist and specified</p>
- *
- * @param pom the project pom
- * @param groupId the plugin group id
- * @param artifactId the plugin artifact id
- * @param version the plugin version
- * @param overrideVersion whether to override the version if the plugin is already registered
- * @return the registered plugin
- */
- public static MavenPlugin registerPlugin(MavenProject pom, String groupId, String artifactId, String version, boolean overrideVersion) {
- MavenPlugin plugin = getPlugin(pom, groupId, artifactId);
- if (plugin == null) {
- plugin = new MavenPlugin(groupId, artifactId, version);
-
- } else if (overrideVersion) {
- plugin.setVersion(version);
- }
-
- // remove from pom
- unregisterPlugin(pom, groupId, artifactId);
-
- // register
- pom.getBuild().addPlugin(plugin.getPlugin());
-
- return plugin;
- }
-
- /**
- * Returns a plugin from a pom based on its group id and artifact id
- * <p/>
- * <p>It searches in the build section, then the reporting section and finally the pluginManagement section</p>
- *
- * @param pom the project pom
- * @param groupId the plugin group id
- * @param artifactId the plugin artifact id
- * @return the plugin if it exists, null otherwise
- */
- public static MavenPlugin getPlugin(MavenProject pom, String groupId, String artifactId) {
- if (pom == null) {
- return null;
- }
- // look for plugin in <build> section
- Plugin plugin = null;
- if (pom.getBuildPlugins() != null) {
- plugin = getPlugin(pom.getBuildPlugins(), groupId, artifactId);
- }
-
- // look for plugin in <report> section
- if (plugin == null && pom.getReportPlugins() != null) {
- plugin = getReportPlugin(pom.getReportPlugins(), groupId, artifactId);
- }
-
- // look for plugin in <pluginManagement> section
- if (pom.getPluginManagement() != null) {
- Plugin pluginManagement = getPlugin(pom.getPluginManagement().getPlugins(), groupId, artifactId);
- if (plugin == null) {
- plugin = pluginManagement;
-
- } else if (pluginManagement != null) {
- if (pluginManagement.getConfiguration() != null) {
- if (plugin.getConfiguration() == null) {
- plugin.setConfiguration(pluginManagement.getConfiguration());
- } else {
- Xpp3Dom.mergeXpp3Dom((Xpp3Dom) plugin.getConfiguration(), (Xpp3Dom) pluginManagement.getConfiguration());
- }
- }
- if (plugin.getDependencies() == null && pluginManagement.getDependencies() != null) {
- plugin.setDependencies(pluginManagement.getDependencies());
- }
- if (plugin.getVersion() == null) {
- plugin.setVersion(pluginManagement.getVersion());
- }
- }
- }
-
- if (plugin != null) {
- return new MavenPlugin(plugin);
- }
- return null;
- }
-
- private static Plugin getPlugin(Collection<Plugin> plugins, String groupId, String artifactId) {
- if (plugins == null) {
- return null;
- }
-
- for (Plugin plugin : plugins) {
- if (MavenUtils.equals(plugin, groupId, artifactId)) {
- return plugin;
- }
- }
- return null;
- }
-
- private static Plugin getReportPlugin(Collection<ReportPlugin> plugins, String groupId, String artifactId) {
- if (plugins == null) {
- return null;
- }
-
- for (ReportPlugin plugin : plugins) {
- if (MavenUtils.equals(plugin, groupId, artifactId)) {
- return cloneReportPluginToPlugin(plugin);
- }
- }
- return null;
- }
-
- private static Plugin cloneReportPluginToPlugin(ReportPlugin reportPlugin) {
- Plugin plugin = new Plugin();
- plugin.setGroupId(reportPlugin.getGroupId());
- plugin.setArtifactId(reportPlugin.getArtifactId());
- plugin.setVersion(reportPlugin.getVersion());
- plugin.setConfiguration(reportPlugin.getConfiguration());
- return plugin;
- }
-
- private static void unregisterPlugin(MavenProject pom, String groupId, String artifactId) {
- if (pom.getPluginManagement() != null && pom.getPluginManagement().getPlugins() != null) {
- unregisterPlugin(pom.getPluginManagement().getPlugins(), groupId, artifactId);
- }
- List plugins = pom.getBuildPlugins();
- if (plugins != null) {
- unregisterPlugin(plugins, groupId, artifactId);
- }
- plugins = pom.getReportPlugins();
- if (plugins != null) {
- unregisterReportPlugin(plugins, groupId, artifactId);
- }
- }
-
- private static void unregisterPlugin(List<Plugin> plugins, String groupId, String artifactId) {
- for (Iterator<Plugin> iterator = plugins.iterator(); iterator.hasNext();) {
- Plugin p = iterator.next();
- if (MavenUtils.equals(p, groupId, artifactId)) {
- iterator.remove();
- }
- }
- }
-
- private static void unregisterReportPlugin(List<ReportPlugin> plugins, String groupId, String artifactId) {
- for (Iterator<ReportPlugin> iterator = plugins.iterator(); iterator.hasNext();) {
- ReportPlugin p = iterator.next();
- if (MavenUtils.equals(p, groupId, artifactId)) {
- iterator.remove();
- }
- }
- }
-
- @Override
- public String toString() {
- return new ToStringBuilder(this)
- .append("groupId", plugin.getGroupId())
- .append("artifactId", plugin.getArtifactId())
- .append("version", plugin.getVersion())
- .toString();
- }
- }
|