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.profiles; 021 022 import org.apache.commons.collections.CollectionUtils; 023 import org.apache.commons.collections.Transformer; 024 import org.apache.commons.lang.builder.EqualsBuilder; 025 import org.apache.commons.lang.builder.HashCodeBuilder; 026 import org.sonar.api.database.BaseIdentifiable; 027 import org.sonar.api.database.model.ResourceModel; 028 import org.sonar.api.rules.ActiveRule; 029 import org.sonar.api.rules.Rule; 030 import org.sonar.api.rules.RulePriority; 031 032 import java.util.ArrayList; 033 import java.util.List; 034 import javax.persistence.*; 035 036 /** 037 * Class to map rules profile with hibernate model 038 */ 039 @Entity 040 @Table(name = "rules_profiles") 041 public class RulesProfile extends BaseIdentifiable implements Cloneable { 042 043 /** 044 * The profile key for the embedded profile Sonar Way 045 */ 046 public static final String SONAR_WAY_NAME = "Sonar way"; 047 048 /** 049 * The profile key for the embedded profile Sonar Way with Findbugs 050 */ 051 public static final String SONAR_WAY_FINDBUGS_NAME = "Sonar way with Findbugs"; 052 053 /** 054 * The profile key for the embedded profile Sun checks 055 */ 056 public static final String SUN_CONVENTIONS_NAME = "Sun checks"; 057 058 @Column(name = "name", updatable = true, nullable = false) 059 private String name; 060 061 @Column(name = "default_profile", updatable = true, nullable = false) 062 private Boolean defaultProfile = Boolean.FALSE; 063 064 @Column(name = "provided", updatable = true, nullable = false) 065 private Boolean provided = Boolean.FALSE; 066 067 @Column(name = "language", updatable = true, nullable = false) 068 private String language; 069 070 @OneToMany(mappedBy = "rulesProfile", fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}) 071 private List<ActiveRule> activeRules; 072 073 @OneToMany(mappedBy = "rulesProfile", fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}) 074 private List<Alert> alerts; 075 076 @OneToMany(mappedBy = "rulesProfile", fetch = FetchType.LAZY) 077 private List<ResourceModel> projects; 078 079 /** 080 * Default constructor 081 */ 082 public RulesProfile() { 083 } 084 085 /** 086 * <p>Creates a profile of rules with empty active rules, empty alerts and empty project lists.</p> 087 * 088 * @param name the name to be used to access the profile, will be used as a key and display name 089 * @param language the language to which this profile applies 090 */ 091 public RulesProfile(String name, String language) { 092 this.name = name; 093 this.language = language; 094 this.activeRules = new ArrayList<ActiveRule>(); 095 this.alerts = new ArrayList<Alert>(); 096 this.projects = new ArrayList<ResourceModel>(); 097 } 098 099 /** 100 * <p>Creates a profile of rules with empty active rules, empty alerts and empty project lists.</p> 101 * 102 * @param name the name to be used to access the profile, will be used as a key and display name 103 * @param language the language to which this profile applies 104 * @param defaultProfile whether this is the default profile for the language 105 * @param provided whether the profile is embarked in core Sonar 106 */ 107 public RulesProfile(String name, String language, boolean defaultProfile, boolean provided) { 108 this(name, language); 109 this.defaultProfile = defaultProfile; 110 this.provided = provided; 111 } 112 113 /** 114 * @return the name of the profile 115 */ 116 public String getName() { 117 return name; 118 } 119 120 /** 121 * Sets the name of the profile 122 */ 123 public void setName(String name) { 124 this.name = name; 125 } 126 127 /** 128 * @return the list of active rules 129 */ 130 public List<ActiveRule> getActiveRules() { 131 return activeRules; 132 } 133 134 /** 135 * Sets the list of active rules 136 */ 137 public void setActiveRules(List<ActiveRule> activeRules) { 138 this.activeRules = activeRules; 139 } 140 141 /** 142 * @return whether this is the default profile for the language 143 */ 144 public Boolean getDefaultProfile() { 145 return defaultProfile; 146 } 147 148 /** 149 * Sets whether this is the default profile for the language 150 */ 151 public void setDefaultProfile(Boolean defaultProfile) { 152 this.defaultProfile = defaultProfile; 153 } 154 155 /** 156 * @return whether the profile ships with Sonar core 157 */ 158 public Boolean getProvided() { 159 return provided; 160 } 161 162 /** 163 * Sets wether the profile ships with Sonar core 164 */ 165 public void setProvided(Boolean provided) { 166 this.provided = provided; 167 } 168 169 /** 170 * @return the language of the profile 171 */ 172 public String getLanguage() { 173 return language; 174 } 175 176 /** 177 * Sets the language for the profile 178 */ 179 public void setLanguage(String language) { 180 this.language = language; 181 } 182 183 /** 184 * @return the list of alerts defined in the profile 185 */ 186 public List<Alert> getAlerts() { 187 return alerts; 188 } 189 190 /** 191 * Sets the list of alerts for the profile 192 */ 193 public void setAlerts(List<Alert> alerts) { 194 this.alerts = alerts; 195 } 196 197 /** 198 * @return the list of projects attached to the profile 199 */ 200 public List<ResourceModel> getProjects() { 201 return projects; 202 } 203 204 /** 205 * Sets the list of projects attached to the profile 206 */ 207 public void setProjects(List<ResourceModel> projects) { 208 this.projects = projects; 209 } 210 211 /** 212 * @return the list of active rules for a given priority 213 */ 214 public List<ActiveRule> getActiveRules(RulePriority priority) { 215 List<ActiveRule> result = new ArrayList<ActiveRule>(); 216 for (ActiveRule activeRule : getActiveRules()) { 217 if (activeRule.getPriority().equals(priority)) { 218 result.add(activeRule); 219 } 220 } 221 return result; 222 } 223 224 /** 225 * @return the list of active rules for a given plugin 226 */ 227 public List<ActiveRule> getActiveRulesByPlugin(String pluginKey) { 228 List<ActiveRule> result = new ArrayList<ActiveRule>(); 229 for (ActiveRule activeRule : getActiveRules()) { 230 if (pluginKey.equals(activeRule.getPluginName())) { 231 result.add(activeRule); 232 } 233 } 234 return result; 235 } 236 237 /** 238 * @return an active rule from a plugin key and a rule key if the rule is activated, null otherwise 239 */ 240 public ActiveRule getActiveRule(String pluginKey, String ruleKey) { 241 for (ActiveRule activeRule : getActiveRules()) { 242 if (activeRule != null && activeRule.getRuleKey().equals(ruleKey) && activeRule.getPluginName().equals(pluginKey)) { 243 return activeRule; 244 } 245 } 246 return null; 247 } 248 249 /** 250 * THIS METHOD SHOULD NOT BE USED AS CURRENTLY THE PLUGIN KEY CAN NOT BE DETERMINED 251 * 252 * @return an active rule from a rule key if the rule is activated, null otherwise 253 */ 254 public ActiveRule getActiveRule(Rule rule) { 255 return getActiveRule(rule.getPluginName(), rule.getKey()); 256 } 257 258 @Override 259 public boolean equals(Object obj) { 260 if (!(obj instanceof RulesProfile)) { 261 return false; 262 } 263 if (this == obj) { 264 return true; 265 } 266 RulesProfile other = (RulesProfile) obj; 267 return new EqualsBuilder().append(language, other.getLanguage()).append(name, other.getName()).isEquals(); 268 } 269 270 @Override 271 public int hashCode() { 272 return new HashCodeBuilder(17, 37).append(language).append(name).toHashCode(); 273 } 274 275 @Override 276 public Object clone() { 277 RulesProfile clone = new RulesProfile(getName(), getLanguage(), getDefaultProfile(), getProvided()); 278 if (CollectionUtils.isNotEmpty(getActiveRules())) { 279 clone.setActiveRules(new ArrayList<ActiveRule>(CollectionUtils.collect(getActiveRules(), new Transformer() { 280 public Object transform(Object input) { 281 return ((ActiveRule) input).clone(); 282 } 283 }))); 284 } 285 if (CollectionUtils.isNotEmpty(getAlerts())) { 286 clone.setAlerts(new ArrayList<Alert>(CollectionUtils.collect(getAlerts(), new Transformer() { 287 public Object transform(Object input) { 288 return ((Alert) input).clone(); 289 } 290 }))); 291 } 292 if (CollectionUtils.isNotEmpty(getProjects())) { 293 clone.setProjects(new ArrayList<ResourceModel>(CollectionUtils.collect(getProjects(), new Transformer() { 294 public Object transform(Object input) { 295 return ((ResourceModel) input).clone(); 296 } 297 }))); 298 } 299 return clone; 300 } 301 302 @Override 303 public String toString() { 304 return new StringBuilder().append(name).append(", language=").append(language).toString(); 305 } 306 }