001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2008-2011 SonarSource
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.lang.builder.*;
023    import org.sonar.api.database.BaseIdentifiable;
024    import org.sonar.api.profiles.RulesProfile;
025    
026    import java.util.ArrayList;
027    import java.util.Calendar;
028    import java.util.Date;
029    import java.util.List;
030    
031    import javax.persistence.*;
032    
033    /**
034     * A class to map a RuleChange to the hibernate model
035     * 
036     * @since 2.9
037     */
038    @Entity
039    @Table(name = "active_rule_changes")
040    public class ActiveRuleChange extends BaseIdentifiable {
041    
042      @Column(name = "user_name", updatable = false, nullable = false)
043      private String userName;
044    
045      @ManyToOne(fetch = FetchType.EAGER)
046      @JoinColumn(name = "profile_id", updatable = false, nullable = false)
047      private RulesProfile rulesProfile;
048    
049      @Column(name = "profile_version", updatable = false, nullable = false)
050      private int profileVersion;
051    
052      @ManyToOne(fetch = FetchType.EAGER)
053      @JoinColumn(name = "rule_id", updatable = false, nullable = false)
054      private Rule rule;
055    
056      @Column(name = "change_date", updatable = false, nullable = false)
057      private Date date;
058    
059      /**
060       * true means rule was enabled
061       * false means rule was disabled
062       * null means rule stay enabled (another param was changed)
063       */
064      @Column(name = "enabled")
065      private Boolean enabled;
066    
067      @Column(name = "old_severity", updatable = false, nullable = true)
068      @Enumerated(EnumType.ORDINAL)
069      private RulePriority oldSeverity;
070    
071      @Column(name = "new_severity", updatable = false, nullable = true)
072      @Enumerated(EnumType.ORDINAL)
073      private RulePriority newSeverity;
074    
075      @OneToMany(mappedBy = "activeRuleChange", fetch = FetchType.LAZY, cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE })
076      private List<ActiveRuleParamChange> activeRuleParamChanges = new ArrayList<ActiveRuleParamChange>();
077    
078      public ActiveRuleChange(String userName, RulesProfile profile, Rule rule) {
079        this.userName = userName;
080        this.rulesProfile = profile;
081        this.profileVersion = profile.getVersion();
082        this.rule = rule;
083        this.date = Calendar.getInstance().getTime();
084      }
085    
086      public Rule getRule() {
087        return rule;
088      }
089    
090      public RulePriority getOldSeverity() {
091        return oldSeverity;
092      }
093    
094      public void setOldSeverity(RulePriority oldSeverity) {
095        this.oldSeverity = oldSeverity;
096      }
097    
098      public RulePriority getNewSeverity() {
099        return newSeverity;
100      }
101    
102      public void setNewSeverity(RulePriority newSeverity) {
103        this.newSeverity = newSeverity;
104      }
105    
106      public RulesProfile getRulesProfile() {
107        return rulesProfile;
108      }
109    
110      public int getProfileVersion() {
111        return profileVersion;
112      }
113    
114      public String getRepositoryKey() {
115        return rule.getRepositoryKey();
116      }
117    
118      /**
119       * @return the config key the changed rule belongs to
120       */
121      public String getConfigKey() {
122        return rule.getConfigKey();
123      }
124    
125      /**
126       * @return the key of the changed rule
127       */
128      public String getRuleKey() {
129        return rule.getKey();
130      }
131    
132      public Boolean isEnabled() {
133        return enabled;
134      }
135    
136      public void setEnabled(Boolean enabled) {
137        this.enabled = enabled;
138      }
139    
140      public List<ActiveRuleParamChange> getActiveRuleParamChanges() {
141        return activeRuleParamChanges;
142      }
143    
144      public String getUserName() {
145        return userName;
146      }
147    
148      public ActiveRuleChange setParameterChange(String key, String oldValue, String newValue) {
149        RuleParam ruleParameter = rule.getParam(key);
150        if (ruleParameter != null) {
151          activeRuleParamChanges.add(new ActiveRuleParamChange(this, ruleParameter, oldValue, newValue));
152        }
153        return this;
154      }
155    
156      @Override
157      public boolean equals(Object obj) {
158        if (obj == null) {
159          return false;
160        }
161        if (obj == this) {
162          return true;
163        }
164        if (obj.getClass() != getClass()) {
165          return false;
166        }
167        ActiveRuleChange rhs = (ActiveRuleChange) obj;
168        return new EqualsBuilder()
169            .appendSuper(super.equals(obj))
170            .append(userName, rhs.userName)
171            .append(rulesProfile, rhs.rulesProfile)
172            .append(rule, rhs.rule)
173            .append(date, rhs.date)
174            .append(enabled, rhs.enabled)
175            .append(newSeverity, rhs.newSeverity)
176            .isEquals();
177      }
178    
179      @Override
180      public int hashCode() {
181        return new HashCodeBuilder(41, 33)
182            .append(userName)
183            .append(rulesProfile)
184            .append(rule)
185            .append(date)
186            .append(enabled)
187            .append(newSeverity)
188            .toHashCode();
189      }
190    
191      @Override
192      public String toString() {
193        return new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).toString();
194      }
195    
196    }