diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2013-11-05 17:02:58 +0100 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2013-11-05 17:02:58 +0100 |
commit | ab0c1f192ba9619561f9b4a829c581a01575aecd (patch) | |
tree | 80980b08d7fb4ec9c036cd4587bf4443fa45268e /sonar-batch/src/main/java/org/sonar/batch/components | |
parent | 903a49973b6a2d207f7535bcbc109ba8e04d6e20 (diff) | |
download | sonarqube-ab0c1f192ba9619561f9b4a829c581a01575aecd.tar.gz sonarqube-ab0c1f192ba9619561f9b4a829c581a01575aecd.zip |
SONAR-4700 Refactor the way to get differential periods by loading them only at project levels
Diffstat (limited to 'sonar-batch/src/main/java/org/sonar/batch/components')
5 files changed, 191 insertions, 63 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshot.java b/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshot.java index 24c0ae618c8..eb70abbbc0e 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshot.java +++ b/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshot.java @@ -26,6 +26,7 @@ import org.sonar.api.database.model.Snapshot; import org.sonar.api.utils.DateUtils; import javax.annotation.Nullable; + import java.util.Calendar; import java.util.Date; @@ -76,6 +77,11 @@ public class PastSnapshot { return projectSnapshot != null ? projectSnapshot.getCreatedAt() : null; } + public PastSnapshot setMode(String mode) { + this.mode = mode; + return this; + } + public String getMode() { return mode; } diff --git a/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinderByDate.java b/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinderByDate.java index 0af30a75648..dae7a48cff4 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinderByDate.java +++ b/sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinderByDate.java @@ -43,18 +43,27 @@ public class PastSnapshotFinderByDate implements BatchExtension { PastSnapshot findByDate(Snapshot projectSnapshot, Date date) { Snapshot snapshot = null; if (projectSnapshot != null) { - snapshot = findSnapshot(projectSnapshot, date); + snapshot = findSnapshot(projectSnapshot.getResourceId(), date); + } + SimpleDateFormat format = new SimpleDateFormat(DateUtils.DATE_FORMAT); + return new PastSnapshot(CoreProperties.TIMEMACHINE_MODE_DATE, date, snapshot).setModeParameter(format.format(date)); + } + + PastSnapshot findByDate(Integer projectId, Date date) { + Snapshot snapshot = null; + if (projectId != null) { + snapshot = findSnapshot(projectId, date); } SimpleDateFormat format = new SimpleDateFormat(DateUtils.DATE_FORMAT); return new PastSnapshot(CoreProperties.TIMEMACHINE_MODE_DATE, date, snapshot).setModeParameter(format.format(date)); } @Nullable - private Snapshot findSnapshot(Snapshot projectSnapshot, Date date) { + private Snapshot findSnapshot(Integer projectId, Date date) { String hql = "from " + Snapshot.class.getSimpleName() + " where createdAt>=:date AND resourceId=:resourceId AND status=:status AND qualifier<>:lib order by createdAt asc"; List<Snapshot> snapshots = session.createQuery(hql) .setParameter("date", date) - .setParameter("resourceId", projectSnapshot.getResourceId()) + .setParameter("resourceId", projectId) .setParameter("status", Snapshot.STATUS_PROCESSED) .setParameter("lib", Qualifiers.LIBRARY) .setMaxResults(1) diff --git a/sonar-batch/src/main/java/org/sonar/batch/components/Period.java b/sonar-batch/src/main/java/org/sonar/batch/components/Period.java new file mode 100644 index 00000000000..04bdc89418f --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/components/Period.java @@ -0,0 +1,48 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.batch.components; + +import java.util.Date; + +public class Period { + + private int index; + private Date targetDate; + private Date date; + + public Period(int index, Date targetDate, Date date) { + this.index = index; + this.targetDate = targetDate; + this.date = date; + } + + public int getIndex() { + return index; + } + + public Date getTargetDate() { + return targetDate; + } + + public Date getDate() { + return date; + } +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/components/PeriodsDefinition.java b/sonar-batch/src/main/java/org/sonar/batch/components/PeriodsDefinition.java new file mode 100644 index 00000000000..cbbc943e728 --- /dev/null +++ b/sonar-batch/src/main/java/org/sonar/batch/components/PeriodsDefinition.java @@ -0,0 +1,97 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.batch.components; + +import org.sonar.api.BatchComponent; +import org.sonar.api.config.Settings; +import org.sonar.api.database.DatabaseSession; +import org.sonar.api.database.model.Snapshot; +import org.sonar.api.resources.Qualifiers; +import org.sonar.batch.ProjectTree; + +import javax.persistence.Query; + +import java.util.Date; +import java.util.List; + +import static com.google.common.collect.Lists.newLinkedList; + +public class PeriodsDefinition implements BatchComponent { + + public static final int CORE_TENDENCY_DEPTH_DEFAULT_VALUE = 30; + private static final int NUMBER_OF_VARIATION_SNAPSHOTS = 5; + + private DatabaseSession session; + + private ProjectTree projectTree; + private final Settings settings; + + private List<PastSnapshot> projectPastSnapshots; + + public PeriodsDefinition(DatabaseSession session, ProjectTree projectTree, Settings settings, + PastSnapshotFinder pastSnapshotFinder) { + this.session = session; + this.projectTree = projectTree; + this.settings = settings; + initPastSnapshots(pastSnapshotFinder, projectTree.getRootProject().getQualifier()); + } + + private void initPastSnapshots(PastSnapshotFinder pastSnapshotFinder, String rootQualifier) { + Snapshot projectSnapshot = buildProjectSnapshot(); + projectPastSnapshots = newLinkedList(); + if (projectSnapshot != null) { + for (int index = 1; index <= NUMBER_OF_VARIATION_SNAPSHOTS; index++) { + PastSnapshot pastSnapshot = pastSnapshotFinder.find(projectSnapshot, rootQualifier, settings, index); + // SONAR-4700 Add a past snapshot only if it exists + if (pastSnapshot != null && pastSnapshot.getProjectSnapshot() != null) { + projectPastSnapshots.add(pastSnapshot); + } + } + } + } + + private Snapshot buildProjectSnapshot() { + Query query = session + .createNativeQuery("select p.id from projects p where p.kee=:resourceKey and p.qualifier<>:lib and p.enabled=:enabled"); + query.setParameter("resourceKey", projectTree.getRootProject().getKey()); + query.setParameter("lib", Qualifiers.LIBRARY); + query.setParameter("enabled", Boolean.TRUE); + + Snapshot snapshot = null; + Number projectId = session.getSingleResult(query, null); + if (projectId != null) { + snapshot = new Snapshot(); + snapshot.setResourceId(projectId.intValue()); + snapshot.setCreatedAt(projectTree.getRootProject().getAnalysisDate()); + snapshot.setBuildDate(new Date()); + snapshot.setVersion(projectTree.getRootProject().getAnalysisVersion()); + } + return snapshot; + } + + /** + * @return past snapshots of root project + */ + public List<PastSnapshot> projectPastSnapshots() { + return projectPastSnapshots; + } + +} diff --git a/sonar-batch/src/main/java/org/sonar/batch/components/TimeMachineConfiguration.java b/sonar-batch/src/main/java/org/sonar/batch/components/TimeMachineConfiguration.java index 89d83f939ea..8ef7570ff6a 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/components/TimeMachineConfiguration.java +++ b/sonar-batch/src/main/java/org/sonar/batch/components/TimeMachineConfiguration.java @@ -19,84 +19,49 @@ */ package org.sonar.batch.components; -import com.google.common.collect.Lists; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.api.BatchExtension; -import org.sonar.api.config.Settings; -import org.sonar.api.database.DatabaseSession; -import org.sonar.api.database.model.Snapshot; import org.sonar.api.resources.Project; import org.sonar.api.resources.Qualifiers; -import javax.persistence.Query; - -import java.util.Date; import java.util.List; +import static com.google.common.collect.Lists.newLinkedList; + public class TimeMachineConfiguration implements BatchExtension { private static final Logger LOG = LoggerFactory.getLogger(TimeMachineConfiguration.class); - private static final int NUMBER_OF_VARIATION_SNAPSHOTS = 5; - private static final int CORE_TENDENCY_DEPTH_DEFAULT_VALUE = 30; - private Project project; - private final Settings settings; - private List<PastSnapshot> projectPastSnapshots; - private DatabaseSession session; + private final PeriodsDefinition periodsDefinition; - public TimeMachineConfiguration(DatabaseSession session, Project project, Settings settings, - PastSnapshotFinder pastSnapshotFinder) { - this.session = session; - this.project = project; - this.settings = settings; - initPastSnapshots(pastSnapshotFinder, getRootProject(project).getQualifier()); - } + private List<Period> periods; + private List<PastSnapshot> modulePastSnapshots; - private Project getRootProject(Project project) { - if (!project.isRoot()) { - return getRootProject(project.getRoot()); - } - return project; + public TimeMachineConfiguration(Project project, PeriodsDefinition periodsDefinition, PastSnapshotFinderByDate pastSnapshotFinderByDate) { + this.project = project; + this.periodsDefinition = periodsDefinition; + initModulePastSnapshots(pastSnapshotFinderByDate); } - private void initPastSnapshots(PastSnapshotFinder pastSnapshotFinder, String rootQualifier) { - Snapshot projectSnapshot = buildProjectSnapshot(); - - projectPastSnapshots = Lists.newLinkedList(); - if (projectSnapshot != null) { - for (int index = 1; index <= NUMBER_OF_VARIATION_SNAPSHOTS; index++) { - PastSnapshot pastSnapshot = pastSnapshotFinder.find(projectSnapshot, rootQualifier, settings, index); - // SONAR-4700 Add a past snapshot only if it exists - if (pastSnapshot != null && pastSnapshot.getProjectSnapshot() != null) { - log(pastSnapshot); - projectPastSnapshots.add(pastSnapshot); - } + private void initModulePastSnapshots(PastSnapshotFinderByDate pastSnapshotFinderByDate) { + periods = newLinkedList(); + modulePastSnapshots = newLinkedList(); + for (PastSnapshot projectPastSnapshot : periodsDefinition.projectPastSnapshots()) { + PastSnapshot pastSnapshot = pastSnapshotFinderByDate.findByDate(project.getId(), projectPastSnapshot.getTargetDate()); + if (pastSnapshot != null) { + pastSnapshot.setIndex(projectPastSnapshot.getIndex()); + pastSnapshot.setMode(projectPastSnapshot.getMode()); + pastSnapshot.setModeParameter(projectPastSnapshot.getModeParameter()); + modulePastSnapshots.add(pastSnapshot); + periods.add(new Period(projectPastSnapshot.getIndex(), pastSnapshot.getTargetDate(), pastSnapshot.getDate())); + log(pastSnapshot); } } } - private Snapshot buildProjectSnapshot() { - Query query = session - .createNativeQuery("select p.id from projects p where p.kee=:resourceKey and p.qualifier<>:lib and p.enabled=:enabled"); - query.setParameter("resourceKey", project.getKey()); - query.setParameter("lib", Qualifiers.LIBRARY); - query.setParameter("enabled", Boolean.TRUE); - - Snapshot snapshot = null; - Number projectId = session.getSingleResult(query, null); - if (projectId != null) { - snapshot = new Snapshot(); - snapshot.setResourceId(projectId.intValue()); - snapshot.setCreatedAt(project.getAnalysisDate()); - snapshot.setBuildDate(new Date()); - snapshot.setVersion(project.getAnalysisVersion()); - } - return snapshot; - } - private void log(PastSnapshot pastSnapshot) { String qualifier = pastSnapshot.getQualifier(); // hack to avoid too many logs when the views plugin is installed @@ -107,11 +72,14 @@ public class TimeMachineConfiguration implements BatchExtension { } } - public int getTendencyPeriodInDays() { - return CORE_TENDENCY_DEPTH_DEFAULT_VALUE; + public List<Period> periods() { + return periods; } - public List<PastSnapshot> getProjectPastSnapshots() { - return projectPastSnapshots; + /** + * Only used by VariationDecorator + */ + public List<PastSnapshot> modulePastSnapshots() { + return modulePastSnapshots; } } |