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 @Entity 037 @Table(name = "rules_profiles") 038 public class RulesProfile extends BaseIdentifiable implements Cloneable { 039 040 public static final String SONAR_WAY_NAME = "Sonar way"; 041 public static final String SONAR_WAY_FINDBUGS_NAME = "Sonar way with Findbugs"; 042 public static final String SUN_CONVENTIONS_NAME = "Sun checks"; 043 044 @Column(name = "name", updatable = true, nullable = false) 045 private String name; 046 047 @Column(name = "default_profile", updatable = true, nullable = false) 048 private Boolean defaultProfile = Boolean.FALSE; 049 050 @Column(name = "provided", updatable = true, nullable = false) 051 private Boolean provided = Boolean.FALSE; 052 053 @Column(name = "language", updatable = true, nullable = false) 054 private String language; 055 056 @OneToMany(mappedBy = "rulesProfile", fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}) 057 private List<ActiveRule> activeRules; 058 059 @OneToMany(mappedBy = "rulesProfile", fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE}) 060 private List<Alert> alerts; 061 062 @OneToMany(mappedBy = "rulesProfile", fetch = FetchType.LAZY) 063 private List<ResourceModel> projects; 064 065 public RulesProfile() { 066 } 067 068 public RulesProfile(String name, String language) { 069 this.name = name; 070 this.language = language; 071 this.activeRules = new ArrayList<ActiveRule>(); 072 this.alerts = new ArrayList<Alert>(); 073 this.projects = new ArrayList<ResourceModel>(); 074 } 075 076 public RulesProfile(String name, String language, boolean defaultProfile, boolean provided) { 077 this(name, language); 078 this.defaultProfile = defaultProfile; 079 this.provided = provided; 080 } 081 082 public String getName() { 083 return name; 084 } 085 086 public void setName(String name) { 087 this.name = name; 088 } 089 090 public List<ActiveRule> getActiveRules() { 091 return activeRules; 092 } 093 094 public void setActiveRules(List<ActiveRule> activeRules) { 095 this.activeRules = activeRules; 096 } 097 098 public Boolean getDefaultProfile() { 099 return defaultProfile; 100 } 101 102 public void setDefaultProfile(Boolean defaultProfile) { 103 this.defaultProfile = defaultProfile; 104 } 105 106 public Boolean getProvided() { 107 return provided; 108 } 109 110 public void setProvided(Boolean provided) { 111 this.provided = provided; 112 } 113 114 public String getLanguage() { 115 return language; 116 } 117 118 public void setLanguage(String language) { 119 this.language = language; 120 } 121 122 public List<Alert> getAlerts() { 123 return alerts; 124 } 125 126 public void setAlerts(List<Alert> alerts) { 127 this.alerts = alerts; 128 } 129 130 public List<ResourceModel> getProjects() { 131 return projects; 132 } 133 134 public void setProjects(List<ResourceModel> projects) { 135 this.projects = projects; 136 } 137 138 public List<ActiveRule> getActiveRules(RulePriority priority) { 139 List<ActiveRule> result = new ArrayList<ActiveRule>(); 140 for (ActiveRule activeRule : getActiveRules()) { 141 if (activeRule.getPriority().equals(priority)) { 142 result.add(activeRule); 143 } 144 } 145 return result; 146 } 147 148 public List<ActiveRule> getActiveRulesByPlugin(String pluginKey) { 149 List<ActiveRule> result = new ArrayList<ActiveRule>(); 150 for (ActiveRule activeRule : getActiveRules()) { 151 if (pluginKey.equals(activeRule.getPluginName())) { 152 result.add(activeRule); 153 } 154 } 155 return result; 156 } 157 158 public ActiveRule getActiveRule(String pluginKey, String ruleKey) { 159 for (ActiveRule activeRule : getActiveRules()) { 160 if (activeRule != null && activeRule.getRuleKey().equals(ruleKey) && activeRule.getPluginName().equals(pluginKey)) { 161 return activeRule; 162 } 163 } 164 return null; 165 } 166 167 public ActiveRule getActiveRule(Rule rule) { 168 return getActiveRule(rule.getPluginName(), rule.getKey()); 169 } 170 171 @Override 172 public boolean equals(Object obj) { 173 if (!(obj instanceof RulesProfile)) { 174 return false; 175 } 176 if (this == obj) { 177 return true; 178 } 179 RulesProfile other = (RulesProfile) obj; 180 return new EqualsBuilder().append(language, other.getLanguage()).append(name, other.getName()).isEquals(); 181 } 182 183 @Override 184 public int hashCode() { 185 return new HashCodeBuilder(17, 37).append(language).append(name).toHashCode(); 186 } 187 188 @Override 189 public Object clone() { 190 RulesProfile clone = new RulesProfile(getName(), getLanguage(), getDefaultProfile(), getProvided()); 191 if (CollectionUtils.isNotEmpty(getActiveRules())) { 192 clone.setActiveRules(new ArrayList<ActiveRule>(CollectionUtils.collect(getActiveRules(), new Transformer() { 193 public Object transform(Object input) { 194 return ((ActiveRule) input).clone(); 195 } 196 }))); 197 } 198 if (CollectionUtils.isNotEmpty(getAlerts())) { 199 clone.setAlerts(new ArrayList<Alert>(CollectionUtils.collect(getAlerts(), new Transformer() { 200 public Object transform(Object input) { 201 return ((Alert) input).clone(); 202 } 203 }))); 204 } 205 if (CollectionUtils.isNotEmpty(getProjects())) { 206 clone.setProjects(new ArrayList<ResourceModel>(CollectionUtils.collect(getProjects(), new Transformer() { 207 public Object transform(Object input) { 208 return ((ResourceModel) input).clone(); 209 } 210 }))); 211 } 212 return clone; 213 } 214 215 @Override 216 public String toString() { 217 return new StringBuilder().append(name).append(", language=").append(language).toString(); 218 } 219 }