org.sonar.api.batch.maven.MavenPlugin.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.api.batch.maven.MavenPlugin.java

Source

/*
 * Sonar, open source software quality management tool.
 * Copyright (C) 2008-2012 SonarSource
 * mailto:contact AT sonarsource DOT com
 *
 * Sonar 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.
 *
 * Sonar 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 Sonar; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
 */
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
 */
public class MavenPlugin {

    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");
            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");
        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");
        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);
        }
        if (pom.getBuildPlugins() != null && pom.getBuildPlugins() != null) {
            unregisterPlugin(pom.getBuildPlugins(), groupId, artifactId);
        }
        if (pom.getReportPlugins() != null) {
            unregisterReportPlugin(pom.getReportPlugins(), 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();
    }
}