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.rules;
021    
022    import org.apache.commons.collections.CollectionUtils;
023    import org.apache.commons.collections.Transformer;
024    import org.apache.commons.lang.StringUtils;
025    import org.apache.commons.lang.builder.ToStringBuilder;
026    import org.sonar.api.profiles.RulesProfile;
027    
028    import javax.annotation.CheckForNull;
029    import java.util.ArrayList;
030    import java.util.Date;
031    import java.util.List;
032    
033    public class ActiveRule implements Cloneable {
034    
035      public static final String INHERITED = "INHERITED";
036      public static final String OVERRIDES = "OVERRIDES";
037    
038      private Integer id;
039      private Rule rule;
040      private RulePriority severity;
041      private RulesProfile rulesProfile;
042      private List<ActiveRuleParam> activeRuleParams = new ArrayList<ActiveRuleParam>();
043      private String inheritance;
044    
045      /**
046       * @deprecated visibility should be reduced to protected or package
047       */
048      @Deprecated
049      public ActiveRule() {
050      }
051    
052      /**
053       * @deprecated visibility should be reduced to protected or package
054       */
055      @Deprecated
056      public ActiveRule(RulesProfile profile, Rule rule, RulePriority severity) {
057        this.rule = rule;
058        if (severity == null && rule != null) {
059          this.severity = rule.getSeverity();
060        } else {
061          this.severity = severity;
062        }
063    
064        this.rulesProfile = profile;
065      }
066    
067      public Integer getId() {
068        return id;
069      }
070    
071      /**
072       * For internal use only.
073       *
074       * @since 2.5
075       */
076      public String getInheritance() {
077        return inheritance;
078      }
079    
080      /**
081       * For internal use only.
082       *
083       * @since 2.5
084       */
085      public void setInheritance(String s) {
086        this.inheritance = s;
087      }
088    
089      public boolean isInherited() {
090        return StringUtils.equals(INHERITED, inheritance);
091      }
092    
093      public boolean doesOverride() {
094        return StringUtils.equals(OVERRIDES, inheritance);
095      }
096    
097      /**
098       * @deprecated visibility should be decreased to protected or package
099       */
100      @Deprecated
101      public void setId(Integer id) {
102        this.id = id;
103      }
104    
105      public Rule getRule() {
106        return rule;
107      }
108    
109      /**
110       * @deprecated visibility should be reduced to protected or package
111       */
112      @Deprecated
113      public void setRule(Rule rule) {
114        this.rule = rule;
115      }
116    
117      /**
118       * @since 2.5
119       */
120      public RulePriority getSeverity() {
121        return severity;
122      }
123    
124      /**
125       * @since 2.5
126       */
127      public void setSeverity(RulePriority severity) {
128        this.severity = severity;
129      }
130    
131      /**
132       * @deprecated since 2.5 use {@link #getSeverity()} instead. See http://jira.codehaus.org/browse/SONAR-1829
133       */
134      @Deprecated
135      public RulePriority getPriority() {
136        return severity;
137      }
138    
139      /**
140       * @deprecated since 2.5 use {@link #setSeverity(RulePriority)} instead. See http://jira.codehaus.org/browse/SONAR-1829
141       */
142      @Deprecated
143      public void setPriority(RulePriority priority) {
144        this.severity = priority;
145      }
146    
147      public RulesProfile getRulesProfile() {
148        return rulesProfile;
149      }
150    
151      /**
152       * @deprecated visibility should be reduced to protected or package
153       */
154      @Deprecated
155      public void setRulesProfile(RulesProfile rulesProfile) {
156        this.rulesProfile = rulesProfile;
157      }
158    
159      public List<ActiveRuleParam> getActiveRuleParams() {
160        return activeRuleParams;
161      }
162    
163      /**
164       * @deprecated use setParameter()
165       */
166      @Deprecated
167      public void setActiveRuleParams(List<ActiveRuleParam> params) {
168        this.activeRuleParams = params;
169      }
170    
171      public ActiveRule setParameter(String key, String value) {
172        RuleParam ruleParameter = rule.getParam(key);
173        if (ruleParameter != null) {
174          activeRuleParams.add(new ActiveRuleParam(this, ruleParameter, value));
175        }
176        return this;
177      }
178    
179      public String getParameter(String key) {
180        if (activeRuleParams != null) {
181          for (ActiveRuleParam param : activeRuleParams) {
182            if (StringUtils.equals(key, param.getKey())) {
183              return param.getValue();
184            }
185          }
186        }
187        return null;
188      }
189    
190      /**
191       * @deprecated since 2.3 use {@link #getRepositoryKey()} instead
192       */
193      @Deprecated
194      public String getPluginName() {
195        return rule.getRepositoryKey();
196      }
197    
198      public String getRepositoryKey() {
199        return rule.getRepositoryKey();
200      }
201    
202      /**
203       * @return the config key the active rule belongs to
204       */
205      public String getConfigKey() {
206        return rule.getConfigKey();
207      }
208    
209      /**
210       * @return the key of the active rule
211       */
212      public String getRuleKey() {
213        return rule.getKey();
214      }
215    
216      /**
217       * @since 4.2
218       * @deprecated in 4.4. Feature dropped.
219       */
220      @CheckForNull
221      @Deprecated
222      public String getNoteData() {
223        return null;
224      }
225    
226      /**
227       * @since 4.2
228       * @deprecated in 4.4. Feature dropped.
229       */
230      @CheckForNull
231      @Deprecated
232      public String getNoteUserLogin() {
233        return null;
234      }
235    
236      /**
237       * @since 4.2
238       * @deprecated in 4.4. Feature dropped.
239       */
240      @CheckForNull
241      @Deprecated
242      public Date getNoteCreatedAt() {
243        return null;
244      }
245    
246      /**
247       * @since 4.2
248       * @deprecated in 4.4. Feature dropped.
249       */
250      @CheckForNull
251      @Deprecated
252      public Date getNoteUpdatedAt() {
253        return null;
254      }
255    
256      @Override
257      public boolean equals(Object o) {
258        if (this == o) {
259          return true;
260        }
261        if (o == null || getClass() != o.getClass()) {
262          return false;
263        }
264    
265        ActiveRule that = (ActiveRule) o;
266    
267        if (!rule.equals(that.rule)) {
268          return false;
269        }
270        if (rulesProfile != null ? !rulesProfile.equals(that.rulesProfile) : that.rulesProfile != null) {
271          return false;
272        }
273    
274        return true;
275      }
276    
277      @Override
278      public int hashCode() {
279        int result = rule.hashCode();
280        result = 31 * result + (rulesProfile != null ? rulesProfile.hashCode() : 0);
281        return result;
282      }
283    
284      @Override
285      public String toString() {
286        return new ToStringBuilder(this).append("id", getId()).append("rule", rule).append("priority", severity)
287          .append("params", activeRuleParams).toString();
288      }
289    
290      @Override
291      public Object clone() {
292        final ActiveRule clone = new ActiveRule(getRulesProfile(), getRule(), getSeverity());
293        clone.setInheritance(getInheritance());
294        if (CollectionUtils.isNotEmpty(getActiveRuleParams())) {
295          clone.setActiveRuleParams(new ArrayList<ActiveRuleParam>(CollectionUtils.collect(getActiveRuleParams(), new Transformer() {
296            public Object transform(Object input) {
297              ActiveRuleParam activeRuleParamClone = (ActiveRuleParam) ((ActiveRuleParam) input).clone();
298              activeRuleParamClone.setActiveRule(clone);
299              return activeRuleParamClone;
300            }
301          })));
302        }
303        return clone;
304      }
305    
306      /**
307       * @since 2.6
308       */
309      public boolean isEnabled() {
310        return getRule() != null && getRule().isEnabled();
311      }
312    }