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.resources; 021 022 import org.apache.commons.configuration.Configuration; 023 import org.apache.commons.lang.StringUtils; 024 import org.apache.commons.lang.builder.ToStringBuilder; 025 import org.apache.maven.project.MavenProject; 026 import org.sonar.api.CoreProperties; 027 028 import java.util.ArrayList; 029 import java.util.Date; 030 import java.util.List; 031 032 /** 033 * A class that manipulates Projects in the Sonar way, i.e. mixing MavenProjects with the way it should be analyzed 034 * 035 * @since 1.10 036 */ 037 public class Project extends Resource { 038 039 /** 040 * @deprecated since version 1.11. Constant moved to CoreProperties 041 */ 042 @Deprecated 043 public static final String PARAM_VERSION = "sonar.projectVersion"; 044 045 /** 046 * @deprecated since version 1.11. Constant moved to CoreProperties 047 */ 048 @Deprecated 049 public static final String PARAM_DATE = "sonar.projectDate"; 050 051 /** 052 * @deprecated since version 1.11. Constant moved to CoreProperties 053 */ 054 @Deprecated 055 public static final String PARAM_LANGUAGE = "sonar.language"; 056 057 /** 058 * @deprecated since version 1.11. Constant moved to CoreProperties 059 */ 060 @Deprecated 061 public static final String PARAM_DYNAMIC_ANALYSIS = "sonar.dynamicAnalysis"; 062 063 /** 064 * @deprecated since version 1.11. Constant moved to CoreProperties 065 */ 066 @Deprecated 067 public static final String PARAM_EXCLUSIONS = "sonar.exclusions"; 068 069 /** 070 * @deprecated since version 1.11. Constant moved to CoreProperties 071 */ 072 @Deprecated 073 public static final String PARAM_REUSE_RULES_CONFIG = "sonar.reuseExistingRulesConfiguration"; 074 075 076 /** 077 * Enumerates the type of possible analysis 078 */ 079 public enum AnalysisType { 080 STATIC, DYNAMIC, REUSE_REPORTS; 081 082 /** 083 * @param includeReuseReportMode whether to count report reuse as dynamic or not 084 * @return whether this a dynamic analysis 085 */ 086 public boolean isDynamic(boolean includeReuseReportMode) { 087 return equals(Project.AnalysisType.DYNAMIC) || 088 (equals(Project.AnalysisType.REUSE_REPORTS) && includeReuseReportMode); 089 } 090 } 091 092 private MavenProject pom; 093 private String branch; 094 private ProjectFileSystem fileSystem; 095 private Configuration configuration; 096 private String name; 097 private String description; 098 private String packaging; 099 private Language language; 100 private String languageKey; 101 private Date analysisDate; 102 private AnalysisType analysisType; 103 private String[] exclusionPatterns; 104 private String analysisVersion; 105 private boolean latestAnalysis; 106 107 // modules tree 108 private Project parent; 109 private List<Project> modules = new ArrayList<Project>(); 110 111 public Project(String key) { 112 setKey(key); 113 } 114 115 public Project(String key, String branch, String name) { 116 if (StringUtils.isNotBlank(branch)) { 117 setKey(String.format("%s:%s", key, branch)); 118 this.name = String.format("%s %s", name, branch); 119 } else { 120 setKey(key); 121 this.name = name; 122 } 123 this.branch = branch; 124 } 125 126 public String getBranch() { 127 return branch; 128 } 129 130 public Project setBranch(String branch) { 131 this.branch = branch; 132 return this; 133 } 134 135 public final Project setPom(MavenProject pom) { 136 this.pom = pom; 137 return this; 138 } 139 140 /** 141 * @return the project's packaging 142 */ 143 public String getPackaging() { 144 return packaging; 145 } 146 147 public String getName() { 148 return name; 149 } 150 151 public String getLongName() { 152 return null; 153 } 154 155 public String getDescription() { 156 return description; 157 } 158 159 public Project setName(String name) { 160 this.name = name; 161 return this; 162 } 163 164 public Project setDescription(String description) { 165 this.description = description; 166 return this; 167 } 168 169 public Project setPackaging(String packaging) { 170 this.packaging = packaging; 171 return this; 172 } 173 174 /** 175 * @return whether the current project is root project 176 */ 177 public boolean isRoot() { 178 return getParent() == null; 179 } 180 181 public Project getRoot() { 182 return (parent == null ? this : parent.getRoot()); 183 } 184 185 /** 186 * @return whether the current project is a module 187 */ 188 public boolean isModule() { 189 return !isRoot(); 190 } 191 192 /** 193 * @return the type of analysis of the project 194 */ 195 public AnalysisType getAnalysisType() { 196 return analysisType; 197 } 198 199 public Project setAnalysisType(AnalysisType at) { 200 this.analysisType = at; 201 return this; 202 } 203 204 /** 205 * whether it's the latest analysis done on this project (displayed in sonar dashboard) or an analysis on a past revision. 206 * @since 2.0 207 */ 208 public boolean isLatestAnalysis() { 209 return latestAnalysis; 210 } 211 212 /** 213 * For internal use only. 214 */ 215 public Project setLatestAnalysis(boolean b) { 216 this.latestAnalysis = b; 217 return this; 218 } 219 220 /** 221 * Used for Maven projects 222 */ 223 public String getGroupId() { 224 return pom.getGroupId(); 225 } 226 227 /** 228 * Used for Maven projects 229 */ 230 public String getArtifactId() { 231 return pom.getArtifactId(); 232 } 233 234 /** 235 * @return the project language 236 */ 237 public Language getLanguage() { 238 return language; 239 } 240 241 public Project setLanguage(Language language) { 242 this.language = language; 243 return this; 244 } 245 246 /** 247 * @return the language key 248 */ 249 public String getLanguageKey() { 250 return languageKey; 251 } 252 253 /** 254 * For internal use only. 255 */ 256 public Project setLanguageKey(String languageKey) { 257 this.languageKey = languageKey; 258 return this; 259 } 260 261 /** 262 * For internal use only. 263 */ 264 public Project setAnalysisDate(Date analysisDate) { 265 this.analysisDate = analysisDate; 266 return this; 267 } 268 269 /** 270 * For internal use only. 271 */ 272 public Project setAnalysisVersion(String analysisVersion) { 273 this.analysisVersion = analysisVersion; 274 return this; 275 } 276 277 /** 278 * @return the scope of the current object 279 */ 280 public String getScope() { 281 return SCOPE_SET; 282 } 283 284 /** 285 * @return the qualifier of the current object 286 */ 287 public String getQualifier() { 288 return isRoot() ? QUALIFIER_PROJECT : QUALIFIER_MODULE; 289 } 290 291 @Override 292 public boolean matchFilePattern(String antPattern) { 293 return false; 294 } 295 296 public Project getParent() { 297 return parent; 298 } 299 300 /** 301 * For internal use only. 302 */ 303 public Project setParent(Project parent) { 304 this.parent = parent; 305 if (parent != null) { 306 parent.modules.add(this); 307 } 308 return this; 309 } 310 311 /** 312 * For internal use only. 313 */ 314 public void removeFromParent() { 315 if (parent!=null) { 316 parent.modules.remove(this); 317 } 318 } 319 320 /** 321 * @return the list of modules 322 */ 323 public List<Project> getModules() { 324 return modules; 325 } 326 327 /** 328 * @return whether to use external source for rules configuration 329 */ 330 public boolean getReuseExistingRulesConfig() { 331 return (configuration != null && configuration.getBoolean(CoreProperties.REUSE_RULES_CONFIGURATION_PROPERTY, false)); 332 } 333 334 /** 335 * @return the current version of the project 336 */ 337 public String getAnalysisVersion() { 338 return analysisVersion; 339 } 340 341 /** 342 * @return the analysis date, i.e. the date that will be used to store the snapshot 343 */ 344 public Date getAnalysisDate() { 345 return analysisDate; 346 } 347 348 /** 349 * Patterns of resource exclusion as defined in project settings page. 350 */ 351 public String[] getExclusionPatterns() { 352 return exclusionPatterns; 353 } 354 355 /** 356 * Set exclusion patterns. Configuration is not saved, so this method must be used ONLY IN UNIT TESTS. 357 */ 358 public Project setExclusionPatterns(String[] s) { 359 this.exclusionPatterns = s; 360 return this; 361 } 362 363 public ProjectFileSystem getFileSystem() { 364 return fileSystem; 365 } 366 367 public Project setFileSystem(ProjectFileSystem fs) { 368 this.fileSystem = fs; 369 return this; 370 } 371 372 /** 373 * @return the underlying maven project 374 */ 375 public MavenProject getPom() { 376 return pom; 377 } 378 379 /** 380 * @return the project configuration 381 */ 382 public Configuration getConfiguration() { 383 return configuration; 384 } 385 386 /** 387 * Sets the configuration 388 * 389 * @return the current object 390 */ 391 public final Project setConfiguration(Configuration configuration) { 392 this.configuration = configuration; 393 return this; 394 } 395 396 public Object getProperty(String key) { 397 return configuration != null ? configuration.getProperty(key) : null; 398 } 399 400 public static Project createFromMavenIds(String groupId, String artifactId) { 401 return new Project(String.format("%s:%s", groupId, artifactId)); 402 } 403 404 @Override 405 public String toString() { 406 return new ToStringBuilder(this) 407 .append("id", getId()) 408 .append("key", getKey()) 409 .append("qualifier", getQualifier()) 410 .toString(); 411 } 412 }