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