001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2009 SonarSource SA
004     * mailto:contact AT sonarsource DOT com
005     *
006     * Sonar 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     * Sonar 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
017     * License along with Sonar; if not, write to the Free Software
018     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
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 java.util.ArrayList;
029    import java.util.List;
030    
031    import javax.persistence.*;
032    
033    /**
034     * A class to map an ActiveRule to the hibernate model
035     */
036    @Entity
037    @Table(name = "active_rules")
038    public class ActiveRule implements Cloneable {
039    
040      public static final String INHERITED = "INHERITED";
041      public static final String OVERRIDES = "OVERRIDES";
042    
043      @Id
044      @Column(name = "id")
045      @GeneratedValue
046      private Integer id;
047    
048      @ManyToOne(fetch = FetchType.EAGER)
049      @JoinColumn(name = "rule_id", updatable = true, nullable = false)
050      private Rule rule;
051    
052      @Column(name = "failure_level", updatable = true, nullable = false)
053      @Enumerated(EnumType.ORDINAL)
054      private RulePriority severity;
055    
056      @ManyToOne(fetch = FetchType.EAGER)
057      @JoinColumn(name = "profile_id", updatable = true, nullable = false)
058      private RulesProfile rulesProfile;
059    
060      @OneToMany(mappedBy = "activeRule", fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE })
061      private List<ActiveRuleParam> activeRuleParams = new ArrayList<ActiveRuleParam>();
062    
063      @Column(name = "inheritance", updatable = true, nullable = true)
064      private String inheritance;
065    
066      /**
067       * @deprecated visibility should be reduced to protected or package
068       */
069      @Deprecated
070      public ActiveRule() {
071      }
072    
073      /**
074       * @deprecated visibility should be reduced to protected or package
075       */
076      @Deprecated
077      public ActiveRule(RulesProfile profile, Rule rule, RulePriority severity) {
078        this.rule = rule;
079        if (severity == null && rule != null) {
080          this.severity = rule.getSeverity();
081        } else {
082          this.severity = severity;
083        }
084    
085        this.rulesProfile = profile;
086      }
087    
088      public Integer getId() {
089        return id;
090      }
091    
092      /**
093       * For internal use only.
094       * 
095       * @since 2.5
096       */
097      public String getInheritance() {
098        return inheritance;
099      }
100    
101      /**
102       * For internal use only.
103       * 
104       * @since 2.5
105       */
106      public void setInheritance(String s) {
107        this.inheritance = s;
108      }
109    
110      public boolean isInherited() {
111        return StringUtils.equals(INHERITED, inheritance);
112      }
113    
114      public boolean doesOverride() {
115        return StringUtils.equals(OVERRIDES, inheritance);
116      }
117    
118      /**
119       * @deprecated visibility should be decreased to protected or package
120       */
121      @Deprecated
122      public void setId(Integer id) {
123        this.id = id;
124      }
125    
126      public Rule getRule() {
127        return rule;
128      }
129    
130      /**
131       * @deprecated visibility should be reduced to protected or package
132       */
133      @Deprecated
134      public void setRule(Rule rule) {
135        this.rule = rule;
136      }
137    
138      /**
139       * @since 2.5
140       */
141      public RulePriority getSeverity() {
142        return severity;
143      }
144    
145      /**
146       * @since 2.5
147       */
148      public void setSeverity(RulePriority severity) {
149        this.severity = severity;
150      }
151    
152      /**
153       * @deprecated since 2.5 use {@link #getSeverity()} instead. See http://jira.codehaus.org/browse/SONAR-1829
154       */
155      public RulePriority getPriority() {
156        return severity;
157      }
158    
159      /**
160       * @deprecated since 2.5 use {@link #setSeverity(RulePriority)} instead. See http://jira.codehaus.org/browse/SONAR-1829
161       */
162      public void setPriority(RulePriority priority) {
163        this.severity = priority;
164      }
165    
166      public RulesProfile getRulesProfile() {
167        return rulesProfile;
168      }
169    
170      /**
171       * @deprecated visibility should be reduced to protected or package
172       */
173      @Deprecated
174      public void setRulesProfile(RulesProfile rulesProfile) {
175        this.rulesProfile = rulesProfile;
176      }
177    
178      public List<ActiveRuleParam> getActiveRuleParams() {
179        return activeRuleParams;
180      }
181    
182      /**
183       * @deprecated use setParameter()
184       */
185      @Deprecated
186      public void setActiveRuleParams(List<ActiveRuleParam> params) {
187        this.activeRuleParams = params;
188      }
189    
190      public ActiveRule setParameter(String key, String value) {
191        RuleParam ruleParameter = rule.getParam(key);
192        if (ruleParameter != null) {
193          activeRuleParams.add(new ActiveRuleParam(this, ruleParameter, value));
194        }
195        return this;
196      }
197    
198      public String getParameter(String key) {
199        if (activeRuleParams != null) {
200          for (ActiveRuleParam param : activeRuleParams) {
201            if (StringUtils.equals(key, param.getKey())) {
202              return param.getValue();
203            }
204          }
205        }
206        return null;
207      }
208    
209      /**
210       * @deprecated since 2.3 use {@link #getRepositoryKey()} instead
211       */
212      @Deprecated
213      public String getPluginName() {
214        return rule.getRepositoryKey();
215      }
216    
217      public String getRepositoryKey() {
218        return rule.getRepositoryKey();
219      }
220    
221      /**
222       * @return the config key the active rule belongs to
223       */
224      public String getConfigKey() {
225        return rule.getConfigKey();
226      }
227    
228      /**
229       * @return the key of the active rule
230       */
231      public String getRuleKey() {
232        return rule.getKey();
233      }
234    
235      @Override
236      public boolean equals(Object o) {
237        if (this == o) {
238          return true;
239        }
240        if (o == null || getClass() != o.getClass()) {
241          return false;
242        }
243    
244        ActiveRule that = (ActiveRule) o;
245    
246        if (!rule.equals(that.rule)) {
247          return false;
248        }
249        if (rulesProfile != null ? !rulesProfile.equals(that.rulesProfile) : that.rulesProfile != null) {
250          return false;
251        }
252    
253        return true;
254      }
255    
256      @Override
257      public int hashCode() {
258        int result = rule.hashCode();
259        result = 31 * result + (rulesProfile != null ? rulesProfile.hashCode() : 0);
260        return result;
261      }
262    
263      @Override
264      public String toString() {
265        return new ToStringBuilder(this).append("id", getId()).append("rule", rule).append("priority", severity)
266            .append("params", activeRuleParams).toString();
267      }
268    
269      @Override
270      public Object clone() {
271        final ActiveRule clone = new ActiveRule(getRulesProfile(), getRule(), getSeverity());
272        clone.setInheritance(getInheritance());
273        if (CollectionUtils.isNotEmpty(getActiveRuleParams())) {
274          clone.setActiveRuleParams(new ArrayList<ActiveRuleParam>(CollectionUtils.collect(getActiveRuleParams(), new Transformer() {
275            public Object transform(Object input) {
276              ActiveRuleParam activeRuleParamClone = (ActiveRuleParam) ((ActiveRuleParam) input).clone();
277              activeRuleParamClone.setActiveRule(clone);
278              return activeRuleParamClone;
279            }
280          })));
281        }
282        return clone;
283      }
284    
285    }