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.builder.ToStringBuilder;
025    import org.sonar.api.database.BaseIdentifiable;
026    import org.sonar.api.profiles.RulesProfile;
027    
028    import java.util.ArrayList;
029    import java.util.List;
030    import javax.persistence.*;
031    
032    @Entity
033    @Table(name = "active_rules")
034    public class ActiveRule extends BaseIdentifiable implements Cloneable {
035    
036      @ManyToOne(fetch = FetchType.EAGER)
037      @JoinColumn(name = "rule_id", updatable = true, nullable = false)
038      private Rule rule;
039    
040      @Column(name = "failure_level", updatable = true, nullable = false)
041      @Enumerated(EnumType.ORDINAL)
042      private RulePriority priority;
043    
044      @ManyToOne(fetch = FetchType.LAZY)
045      @JoinColumn(name = "profile_id", updatable = true, nullable = false)
046      private RulesProfile rulesProfile;
047    
048      @OneToMany(mappedBy = "activeRule", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
049      private List<ActiveRuleParam> activeRuleParams = new ArrayList<ActiveRuleParam>();
050    
051      public ActiveRule() {
052      }
053    
054      public ActiveRule(RulesProfile profile, Rule rule, RulePriority priority) {
055        this.rule = rule;
056        if (priority == null && rule != null) {
057          this.priority = rule.getPriority();
058        } else {
059          this.priority = priority;
060        }
061    
062        this.rulesProfile = profile;
063      }
064    
065      public Rule getRule() {
066        return rule;
067      }
068    
069      public void setRule(Rule rule) {
070        this.rule = rule;
071      }
072    
073      public RulePriority getPriority() {
074        return priority;
075      }
076    
077      public void setPriority(RulePriority priority) {
078        this.priority = priority;
079      }
080    
081      public RulesProfile getRulesProfile() {
082        return rulesProfile;
083      }
084    
085      public void setRulesProfile(RulesProfile rulesProfile) {
086        this.rulesProfile = rulesProfile;
087      }
088    
089      public List<ActiveRuleParam> getActiveRuleParams() {
090        return activeRuleParams;
091      }
092    
093      public void setActiveRuleParams(List<ActiveRuleParam> params) {
094        this.activeRuleParams = params;
095      }
096    
097      public String getPluginName() {
098        return rule.getPluginName();
099      }
100    
101      public String getConfigKey() {
102        return rule.getConfigKey();
103      }
104    
105      public String getRuleKey() {
106        return rule.getKey();
107      }
108    
109      @Override
110      public boolean equals(Object o) {
111        if (this == o) {
112          return true;
113        }
114        if (o == null || getClass() != o.getClass()) {
115          return false;
116        }
117    
118        ActiveRule that = (ActiveRule) o;
119    
120        if (!rule.equals(that.rule)) {
121          return false;
122        }
123        if (rulesProfile != null ? !rulesProfile.equals(that.rulesProfile) : that.rulesProfile != null) {
124          return false;
125        }
126    
127        return true;
128      }
129    
130      @Override
131      public int hashCode() {
132        int result = rule.hashCode();
133        result = 31 * result + (rulesProfile != null ? rulesProfile.hashCode() : 0);
134        return result;
135      }
136    
137      @Override
138      public String toString() {
139        return new ToStringBuilder(this).append("id", getId()).append("rule", rule).append("priority", priority).append("params", activeRuleParams).toString();
140      }
141    
142      @Override
143      public Object clone() {
144        ActiveRule clone = new ActiveRule(getRulesProfile(), getRule(), getPriority());
145        if (CollectionUtils.isNotEmpty(getActiveRuleParams())) {
146          clone.setActiveRuleParams(new ArrayList<ActiveRuleParam>(CollectionUtils.collect(getActiveRuleParams(), new Transformer() {
147            public Object transform(Object input) {
148              return ((ActiveRuleParam) input).clone();
149            }
150          })));
151        }
152        return clone;
153      }
154    
155    }