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