001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 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.batch;
021
022 import java.util.Date;
023
024 import org.apache.commons.configuration.PropertiesConfiguration;
025 import org.apache.commons.lang.StringUtils;
026 import org.apache.maven.project.MavenProject;
027 import org.sonar.api.BatchComponent;
028 import org.sonar.api.CoreProperties;
029 import org.sonar.api.batch.bootstrap.ProjectDefinition;
030 import org.sonar.api.config.Settings;
031 import org.sonar.api.database.DatabaseSession;
032 import org.sonar.api.database.model.ResourceModel;
033 import org.sonar.api.database.model.Snapshot;
034 import org.sonar.api.resources.Java;
035 import org.sonar.api.resources.Project;
036 import org.sonar.api.utils.SonarException;
037
038 public class ProjectConfigurator implements BatchComponent {
039
040 private DatabaseSession databaseSession;
041 private Settings settings;
042
043 public ProjectConfigurator(DatabaseSession databaseSession, Settings settings) {
044 this.databaseSession = databaseSession;
045 this.settings = settings;
046 }
047
048 public Project create(ProjectDefinition definition) {
049 Project project = new Project(definition.getKey(), loadProjectBranch(), definition.getName());
050
051 // For backward compatibility we must set POM and actual packaging
052 project.setDescription(StringUtils.defaultString(definition.getDescription()));
053 project.setPackaging("jar");
054
055 for (Object component : definition.getContainerExtensions()) {
056 if (component instanceof MavenProject) {
057 MavenProject pom = (MavenProject) component;
058 project.setPom(pom);
059 project.setPackaging(pom.getPackaging());
060 }
061 }
062 return project;
063 }
064
065 String loadProjectBranch() {
066 return settings.getString(CoreProperties.PROJECT_BRANCH_PROPERTY);
067 }
068
069 public ProjectConfigurator configure(Project project) {
070 Date analysisDate = loadAnalysisDate();
071 project
072 .setConfiguration(new PropertiesConfiguration()) // will be populated by ProjectSettings
073 .setAnalysisDate(analysisDate)
074 .setLatestAnalysis(isLatestAnalysis(project.getKey(), analysisDate))
075 .setAnalysisVersion(loadAnalysisVersion())
076 .setAnalysisType(loadAnalysisType())
077 .setLanguageKey(loadLanguageKey());
078 return this;
079 }
080
081 boolean isLatestAnalysis(String projectKey, Date analysisDate) {
082 ResourceModel persistedProject = databaseSession.getSingleResult(ResourceModel.class, "key", projectKey, "enabled", true);
083 if (persistedProject != null) {
084 Snapshot lastSnapshot = databaseSession.getSingleResult(Snapshot.class, "resourceId", persistedProject.getId(), "last", true);
085 return lastSnapshot == null || lastSnapshot.getCreatedAt().before(analysisDate);
086 }
087 return true;
088 }
089
090 Date loadAnalysisDate() {
091 Date date = null;
092 try {
093 // sonar.projectDate may have been specified as a time
094 date = settings.getDateTime(CoreProperties.PROJECT_DATE_PROPERTY);
095 } catch (SonarException e) {
096 // this is probably just a date
097 date = settings.getDate(CoreProperties.PROJECT_DATE_PROPERTY);
098 }
099 if (date == null) {
100 date = new Date();
101 }
102 return date;
103 }
104
105 Project.AnalysisType loadAnalysisType() {
106 String value = settings.getString(CoreProperties.DYNAMIC_ANALYSIS_PROPERTY);
107 if (value == null) {
108 return ("true".equals(settings.getString("sonar.light")) ? Project.AnalysisType.STATIC : Project.AnalysisType.DYNAMIC);
109 }
110 if ("true".equals(value)) {
111 return Project.AnalysisType.DYNAMIC;
112 }
113 if ("reuseReports".equals(value)) {
114 return Project.AnalysisType.REUSE_REPORTS;
115 }
116 return Project.AnalysisType.STATIC;
117 }
118
119 String loadAnalysisVersion() {
120 return settings.getString(CoreProperties.PROJECT_VERSION_PROPERTY);
121 }
122
123 String loadLanguageKey() {
124 return StringUtils.defaultIfBlank(settings.getString(CoreProperties.PROJECT_LANGUAGE_PROPERTY), Java.KEY);
125 }
126 }