001    /*
002     * SonarQube, open source software quality management tool.
003     * Copyright (C) 2008-2014 SonarSource
004     * mailto:contact AT sonarsource DOT com
005     *
006     * SonarQube is free software; you can redistribute it and/or
007     * modify it under the terms of the GNU Lesser General Public
008     * License as published by the Free Software Foundation; either
009     * version 3 of the License, or (at your option) any later version.
010     *
011     * SonarQube is distributed in the hope that it will be useful,
012     * but WITHOUT ANY WARRANTY; without even the implied warranty of
013     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014     * Lesser General Public License for more details.
015     *
016     * You should have received a copy of the GNU Lesser General Public License
017     * along with this program; if not, write to the Free Software Foundation,
018     * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
019     */
020    package org.sonar.api.measures;
021    
022    import org.apache.commons.lang.builder.EqualsBuilder;
023    import org.apache.commons.lang.builder.HashCodeBuilder;
024    import org.apache.commons.lang.builder.ToStringBuilder;
025    import org.sonar.api.rule.RuleKey;
026    import org.sonar.api.rules.Rule;
027    import org.sonar.api.rules.RulePriority;
028    
029    import javax.annotation.Nullable;
030    
031    /**
032     * @since 1.10
033     */
034    public class RuleMeasure extends Measure {
035    
036      private RuleKey ruleKey;
037      private RulePriority rulePriority;
038    
039      /**
040       * This constructor is for internal use only. Please use static methods createForXXX().
041       * @deprecated since 4.4 use {@link #RuleMeasure(Metric, RuleKey, RulePriority, Integer)}
042       */
043      @Deprecated
044      public RuleMeasure(Metric metric, @Nullable Rule rule, @Nullable RulePriority rulePriority, @Nullable Integer ruleCategory) {
045        this(metric, rule != null ? rule.ruleKey() : null, rulePriority, ruleCategory);
046      }
047    
048      /**
049       * This constructor is for internal use only. Please use static methods createForXXX().
050       */
051      public RuleMeasure(Metric metric, @Nullable RuleKey ruleKey, @Nullable RulePriority rulePriority, @Nullable Integer ruleCategory) {
052        super(metric);
053        this.ruleKey = ruleKey;
054        this.rulePriority = rulePriority;
055      }
056    
057      public RuleKey ruleKey() {
058        return ruleKey;
059      }
060    
061      public RuleMeasure setRuleKey(RuleKey ruleKey) {
062        this.ruleKey = ruleKey;
063        return this;
064      }
065    
066      /**
067       * @deprecated since 4.4 use {@link #ruleKey()}
068       */
069      @Deprecated
070      public Rule getRule() {
071        return Rule.create(ruleKey.repository(), ruleKey.rule());
072      }
073    
074      /**
075       * @deprecated since 4.4 use {@link #setRuleKey()}
076       */
077      @Deprecated
078      public RuleMeasure setRule(Rule rule) {
079        this.ruleKey = rule.ruleKey();
080        return this;
081      }
082    
083      /**
084       * @deprecated since 2.14 use {@link #getSeverity()} instead. See SONAR-1829.
085       */
086      @Deprecated
087      public RulePriority getRulePriority() {
088        return rulePriority;
089      }
090    
091      /**
092       * @since 2.14
093       */
094      public RulePriority getSeverity() {
095        return rulePriority;
096      }
097    
098      /**
099       * @deprecated since 2.14 use {@link #setSeverity(org.sonar.api.rules.RulePriority)} instead. See SONAR-1829.
100       */
101      @Deprecated
102      public RuleMeasure setRulePriority(RulePriority rulePriority) {
103        this.rulePriority = rulePriority;
104        return this;
105      }
106    
107      /**
108       * @since 2.14
109       */
110      public RuleMeasure setSeverity(RulePriority severity) {
111        this.rulePriority = severity;
112        return this;
113      }
114    
115      /**
116       * @deprecated since 2.5. See SONAR-2007.
117       */
118      @Deprecated
119      public Integer getRuleCategory() {
120        return null;
121      }
122    
123      /**
124       * @deprecated since 2.5. See SONAR-2007.
125       */
126      @Deprecated
127      public void setRuleCategory(Integer ruleCategory) {
128        // nothing
129      }
130    
131      @Override
132      public boolean equals(Object obj) {
133        if (obj == null) {
134          return false;
135        }
136        if (!(obj.getClass().equals(RuleMeasure.class))) {// NOSONAR should be refactored but kept in the current state
137          // for the moment.
138          return false;
139        }
140        if (this == obj) {
141          return true;
142        }
143        RuleMeasure other = (RuleMeasure) obj;
144        return new EqualsBuilder()
145          .append(getMetric(), other.getMetric())
146          .append(personId, other.personId)
147          .append(ruleKey, other.ruleKey)
148          .isEquals();
149      }
150    
151      @Override
152      public RuleMeasure setValue(@Nullable Double v) {
153        return (RuleMeasure) super.setValue(v);
154      }
155    
156      @Override
157      public int hashCode() {
158        return new HashCodeBuilder(17, 37)
159          .append(getMetric())
160          .append(personId)
161          .append(ruleKey)
162          .toHashCode();
163      }
164    
165      @Override
166      public String toString() {
167        return new ToStringBuilder(this)
168          .append("metric", metric)
169          .append("personId", personId)
170          .append("ruleKey", ruleKey)
171          .append("value", value)
172          .append("data", data)
173          .append("description", description)
174          .append("alertStatus", alertStatus)
175          .append("alertText", alertText)
176          .append("tendency", tendency)
177          .append("severity", rulePriority)
178          .toString();
179      }
180    
181      /**
182       * @deprecated since 4.4 use {@link #createForRule(Metric, RuleKey, Double)}
183       */
184      @Deprecated
185      public static RuleMeasure createForRule(Metric metric, Rule rule, @Nullable Double value) {
186        return new RuleMeasure(metric, rule, null, null).setValue(value);
187      }
188    
189      public static RuleMeasure createForRule(Metric metric, RuleKey ruleKey, @Nullable Double value) {
190        return new RuleMeasure(metric, ruleKey, null, null).setValue(value);
191      }
192    
193      public static RuleMeasure createForPriority(Metric metric, RulePriority priority, @Nullable Double value) {
194        return new RuleMeasure(metric, (RuleKey) null, priority, null).setValue(value);
195      }
196    
197      /**
198       * @deprecated since 2.5. See SONAR-2007.
199       */
200      @Deprecated
201      public static RuleMeasure createForCategory(Metric metric, Integer category, @Nullable Double value) {
202        return new RuleMeasure(metric, (RuleKey) null, null, category).setValue(value);
203      }
204    }