aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-batch/src/main/java/org/sonar/batch/components
diff options
context:
space:
mode:
authorJulien Lancelot <julien.lancelot@sonarsource.com>2013-11-05 17:02:58 +0100
committerJulien Lancelot <julien.lancelot@sonarsource.com>2013-11-05 17:02:58 +0100
commitab0c1f192ba9619561f9b4a829c581a01575aecd (patch)
tree80980b08d7fb4ec9c036cd4587bf4443fa45268e /sonar-batch/src/main/java/org/sonar/batch/components
parent903a49973b6a2d207f7535bcbc109ba8e04d6e20 (diff)
downloadsonarqube-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')
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshot.java6
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/components/PastSnapshotFinderByDate.java15
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/components/Period.java48
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/components/PeriodsDefinition.java97
-rw-r--r--sonar-batch/src/main/java/org/sonar/batch/components/TimeMachineConfiguration.java88
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;
}
}