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