org.sonar.api.rules.Rule.java Source code

Java tutorial

Introduction

Here is the source code for org.sonar.api.rules.Rule.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.rules;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.sonar.api.database.DatabaseProperties;
import org.sonar.check.Cardinality;

import javax.persistence.*;

import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "rules")
public final class Rule {

    @Id
    @Column(name = "id")
    @GeneratedValue
    private Integer id;

    /**
     * The default priority given to a rule if not explicitly set
     */
    public static final RulePriority DEFAULT_PRIORITY = RulePriority.MAJOR;

    @Column(name = "name", updatable = true, nullable = true, length = 200)
    private String name;

    @Column(name = "plugin_rule_key", updatable = false, nullable = true, length = 200)
    private String key;

    @Column(name = "enabled", updatable = true, nullable = true)
    private Boolean enabled = Boolean.TRUE;

    @Column(name = "plugin_config_key", updatable = true, nullable = true, length = 500)
    private String configKey;

    // Godin: This field should be named priority, otherwise StandardRulesXmlParserTest fails
    @Column(name = "priority", updatable = true, nullable = true)
    @Enumerated(EnumType.ORDINAL)
    private RulePriority priority = DEFAULT_PRIORITY;

    @Column(name = "description", updatable = true, nullable = true, length = DatabaseProperties.MAX_TEXT_SIZE)
    private String description;

    @Column(name = "plugin_name", updatable = true, nullable = false)
    private String pluginName;

    @Enumerated(EnumType.STRING)
    @Column(name = "cardinality", updatable = true, nullable = false)
    private Cardinality cardinality = Cardinality.SINGLE;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "parent_id", updatable = true, nullable = true)
    private Rule parent = null;

    @org.hibernate.annotations.Cascade({ org.hibernate.annotations.CascadeType.ALL,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
    @OneToMany(mappedBy = "rule")
    private List<RuleParam> params = new ArrayList<RuleParam>();

    /**
     * @deprecated since 2.3. Use the factory method {@link #create()}
     */
    @Deprecated
    public Rule() {
        // TODO reduce visibility to package
    }

    /**
     * Creates rule with minimum set of info
     *
     * @param pluginName the plugin name indicates which plugin the rule belongs to
     * @param key        the key should be unique within a plugin, but it is even more careful for the time being that it is unique across the
     *                   application
     * @deprecated since 2.3. Use the factory method {@link #create()}
     */
    @Deprecated
    public Rule(String pluginName, String key) {
        this.pluginName = pluginName;
        this.key = key;
        this.configKey = key;
    }

    /**
     * Creates a fully qualified rule
     *
     * @param pluginKey     the plugin the rule belongs to
     * @param key           the key should be unique within a plugin, but it is even more careful for the time being that it is unique across the
     *                      application
     * @param name          the name displayed in the UI
     * @param rulesCategory the ISO category the rule belongs to
     * @param severity      this is the severity associated to the rule
     * @deprecated since 2.3. Use the factory method {@link #create()}
     */
    @Deprecated
    public Rule(String pluginKey, String key, String name, RulesCategory rulesCategory, RulePriority severity) {
        setName(name);
        this.key = key;
        this.configKey = key;
        this.priority = severity;
        this.pluginName = pluginKey;
    }

    /**
     * @deprecated since 2.3. Use the factory method {@link #create()}
     */
    @Deprecated
    public Rule(String name, String key, RulesCategory rulesCategory, String pluginName, String description) {
        this();
        setName(name);
        this.key = key;
        this.configKey = key;
        this.pluginName = pluginName;
        this.description = description;
    }

    /**
     * @deprecated since 2.3. Use the factory method {@link #create()}
     */
    @Deprecated
    public Rule(String name, String key, String configKey, RulesCategory rulesCategory, String pluginName,
            String description) {
        this();
        setName(name);
        this.key = key;
        this.configKey = configKey;
        this.pluginName = pluginName;
        this.description = description;
    }

    public Integer getId() {
        return id;
    }

    /**
     * @deprecated since 2.3. visibility should be decreased to protected or package
     */
    @Deprecated
    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    /**
     * Sets the rule name
     */
    public Rule setName(String name) {
        this.name = removeNewLineCharacters(name);
        return this;
    }

    public String getKey() {
        return key;
    }

    /**
     * Sets the rule key
     */
    public Rule setKey(String key) {
        this.key = key;
        return this;
    }

    /**
     * @deprecated since 2.5 use {@link #getRepositoryKey()} instead
     */
    @Deprecated
    public String getPluginName() {
        return pluginName;
    }

    /**
     * @deprecated since 2.5 use {@link #setRepositoryKey(String)} instead
     */
    @Deprecated
    public Rule setPluginName(String pluginName) {
        this.pluginName = pluginName;
        return this;
    }

    public String getConfigKey() {
        return configKey;
    }

    /**
     * Sets the configuration key
     */
    public Rule setConfigKey(String configKey) {
        this.configKey = configKey;
        return this;
    }

    public String getDescription() {
        return description;
    }

    /**
     * Sets the rule description
     */
    public Rule setDescription(String description) {
        this.description = StringUtils.strip(description);
        return this;
    }

    public Boolean isEnabled() {
        return enabled;
    }

    /**
     * Do not call. Used only by sonar.
     */
    public Rule setEnabled(Boolean b) {
        this.enabled = b;
        return this;
    }

    public List<RuleParam> getParams() {
        return params;
    }

    public RuleParam getParam(String key) {
        for (RuleParam param : params) {
            if (StringUtils.equals(key, param.getKey())) {
                return param;
            }
        }
        return null;
    }

    /**
     * Sets the rule parameters
     */
    public Rule setParams(List<RuleParam> params) {
        this.params.clear();
        for (RuleParam param : params) {
            param.setRule(this);
            this.params.add(param);
        }
        return this;
    }

    public RuleParam createParameter() {
        RuleParam parameter = new RuleParam().setRule(this);
        params.add(parameter);
        return parameter;
    }

    public RuleParam createParameter(String key) {
        RuleParam parameter = new RuleParam().setKey(key).setRule(this);
        params.add(parameter);
        return parameter;
    }

    /**
     * @deprecated since 2.5 See http://jira.codehaus.org/browse/SONAR-2007
     */
    @Deprecated
    public Integer getCategoryId() {
        return null;
    }

    /**
     * @since 2.5
     */
    public RulePriority getSeverity() {
        return priority;
    }

    /**
     * @param severity severity to set, if null, uses the default priority.
     * @since 2.5
     */
    public Rule setSeverity(RulePriority severity) {
        if (severity == null) {
            this.priority = DEFAULT_PRIORITY;
        } else {
            this.priority = severity;
        }
        return this;
    }

    /**
     * @deprecated since 2.5 use {@link #getSeverity()} instead. See http://jira.codehaus.org/browse/SONAR-1829
     */
    @Deprecated
    public RulePriority getPriority() {
        return priority;
    }

    /**
     * Sets the rule priority. If null, uses the default priority
     *
     * @deprecated since 2.5 use {@link #setSeverity(RulePriority)} instead. See http://jira.codehaus.org/browse/SONAR-1829
     */
    @Deprecated
    public Rule setPriority(RulePriority priority) {
        return setSeverity(priority);
    }

    public String getRepositoryKey() {
        return pluginName;
    }

    public Rule setRepositoryKey(String s) {
        this.pluginName = s;
        return this;
    }

    public Rule setUniqueKey(String repositoryKey, String key) {
        return setRepositoryKey(repositoryKey).setKey(key).setConfigKey(key);
    }

    public Cardinality getCardinality() {
        return cardinality;
    }

    public Rule setCardinality(Cardinality c) {
        this.cardinality = c;
        return this;
    }

    public Rule getParent() {
        return parent;
    }

    public Rule setParent(Rule parent) {
        this.parent = parent;
        return this;
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Rule)) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        Rule other = (Rule) obj;
        return new EqualsBuilder().append(pluginName, other.getRepositoryKey()).append(key, other.getKey())
                .isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 37).append(pluginName).append(key).toHashCode();
    }

    @Override
    public String toString() {
        // Note that ReflectionToStringBuilder will not work here - see SONAR-3077
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("id", id).append("name", name)
                .append("key", key).append("configKey", configKey).append("plugin", pluginName)
                .append("enabled", enabled).append("severity", priority).append("cardinality", cardinality)
                .toString();
    }

    private String removeNewLineCharacters(String text) {
        String removedCRLF = StringUtils.remove(text, "\n");
        removedCRLF = StringUtils.remove(removedCRLF, "\r");
        removedCRLF = StringUtils.remove(removedCRLF, "\n\r");
        removedCRLF = StringUtils.remove(removedCRLF, "\r\n");
        return removedCRLF;
    }

    public static Rule create() {
        return new Rule();
    }

    /**
     * Create with all required fields
     */
    public static Rule create(String repositoryKey, String key, String name) {
        return new Rule().setUniqueKey(repositoryKey, key).setName(name);
    }

    /**
     * Create with all required fields
     *
     * @since 2.10
     */
    public static Rule create(String repositoryKey, String key) {
        return new Rule().setUniqueKey(repositoryKey, key);
    }
}