aboutsummaryrefslogtreecommitdiffstats
path: root/server
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2014-10-17 18:01:28 +0200
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2014-10-21 15:26:22 +0200
commit07e7caec293ab173dd7659289b60fee216eae941 (patch)
tree13a3372151815c8b9c4699405d0b8423e77a0498 /server
parent3e0fcb4f76bc349293a8c6128dd1b2b77bfc1beb (diff)
downloadsonarqube-07e7caec293ab173dd7659289b60fee216eae941.tar.gz
sonarqube-07e7caec293ab173dd7659289b60fee216eae941.zip
SONAR-5696: Snapshot switch moved from batch to server side
Diffstat (limited to 'server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java10
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/component/db/SnapshotDao.java33
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportStep.java29
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java44
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/IndexProjectIssuesStep.java51
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/SwitchSnapshotStep.java65
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java50
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java14
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java2
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java6
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/SnapshotTesting.java32
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/component/db/SnapshotDaoTest.java131
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java19
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java70
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/IndexProjectIssuesStepTest.java (renamed from server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceMediumTest.java)35
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/SwitchSnapshotStepTest.java70
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/SynchronizeProjectPermissionsStepMediumTest.java108
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java54
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java8
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/component/db/SnapshotDaoTest/snapshots.xml65
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/SwitchSnapshotStepTest/snapshots-result.xml149
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/SwitchSnapshotStepTest/snapshots.xml149
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml3
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/book_available_report_analysis_while_having_one_working_on_another_project.xml2
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml2
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml1
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis.xml2
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis_but_another_busy_on_same_project.xml2
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_busy_report_analysis.xml1
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select-with-no-available-report.xml3
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml3
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report.xml3
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report_with_working_reports_older.xml3
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/three_analysis_reports.xml3
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml23
-rw-r--r--server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml3
-rw-r--r--server/sonar-web/src/main/webapp/WEB-INF/db/migrate/706_add_snapshot_id_to_analysis_reports.rb30
38 files changed, 1120 insertions, 162 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java b/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java
index bf3249ddc83..204fee1efa2 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/batch/UploadReportAction.java
@@ -34,6 +34,7 @@ public class UploadReportAction implements RequestHandler {
public static final String UPLOAD_REPORT_ACTION = "upload_report";
static final String PARAM_PROJECT_KEY = "project";
+ static final String PARAM_SNAPSHOT = "snapshot";
private final AnalysisReportQueue analysisReportQueue;
private final ComputationService computationService;
@@ -58,13 +59,20 @@ public class UploadReportAction implements RequestHandler {
.setRequired(true)
.setDescription("Project key")
.setExampleValue("org.codehaus.sonar:sonar");
+
+ action
+ .createParam(PARAM_SNAPSHOT)
+ .setRequired(true)
+ .setDescription("Snapshot id")
+ .setExampleValue("123");
}
@Override
public void handle(Request request, Response response) throws Exception {
String projectKey = request.mandatoryParam(PARAM_PROJECT_KEY);
+ String snapshotId = request.mandatoryParam(PARAM_SNAPSHOT);
- analysisReportQueue.add(projectKey);
+ analysisReportQueue.add(projectKey, Long.valueOf(snapshotId));
// TODO remove synchronization as soon as it won't break ITs !
(new AnalysisReportTask(analysisReportQueue, computationService)).run();
diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/db/SnapshotDao.java b/server/sonar-server/src/main/java/org/sonar/server/component/db/SnapshotDao.java
index f6ec2f20591..1bc35c43525 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/component/db/SnapshotDao.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/component/db/SnapshotDao.java
@@ -21,6 +21,7 @@
package org.sonar.server.component.db;
import org.sonar.api.ServerComponent;
+import org.sonar.api.resources.Scopes;
import org.sonar.api.utils.System2;
import org.sonar.core.component.SnapshotDto;
import org.sonar.core.component.db.SnapshotMapper;
@@ -30,6 +31,8 @@ import org.sonar.server.db.BaseDao;
import javax.annotation.CheckForNull;
+import java.util.List;
+
public class SnapshotDao extends BaseDao<SnapshotMapper, SnapshotDto, Long> implements ServerComponent, DaoComponent {
public SnapshotDao(System2 system) {
@@ -47,4 +50,34 @@ public class SnapshotDao extends BaseDao<SnapshotMapper, SnapshotDto, Long> impl
mapper(session).insert(item);
return item;
}
+
+ @CheckForNull
+ public SnapshotDto getLastSnapshot(DbSession session, SnapshotDto snapshot) {
+ return mapper(session).selectLastSnapshot(snapshot.getResourceId());
+ }
+
+ @CheckForNull
+ public SnapshotDto getLastSnapshotOlderThan(DbSession session, SnapshotDto snapshot) {
+ return mapper(session).selectLastSnapshotOlderThan(snapshot.getResourceId(), snapshot.getCreatedAt());
+ }
+
+ public List<SnapshotDto> findSnapshotAndChildrenOfProjectScope(DbSession session, SnapshotDto snapshot) {
+ return mapper(session).selectSnapshotAndChildrenOfScope(snapshot.getId(), Scopes.PROJECT);
+ }
+
+ public int updateSnapshotAndChildrenLastFlagAndStatus(DbSession session, SnapshotDto snapshot, boolean isLast, String status) {
+ Long rootId = snapshot.getId();
+ String path = snapshot.getPath() + snapshot.getId() + ".%";
+ Long pathRootId = snapshot.getRootId() == null ? snapshot.getId() : snapshot.getRootId();
+
+ return mapper(session).updateSnapshotAndChildrenLastFlagAndStatus(rootId, pathRootId, path, isLast, status);
+ }
+
+ public int updateSnapshotAndChildrenLastFlag(DbSession session, SnapshotDto snapshot, boolean isLast) {
+ Long rootId = snapshot.getId();
+ String path = snapshot.getPath() + snapshot.getId() + ".%";
+ Long pathRootId = snapshot.getRootId() == null ? snapshot.getId() : snapshot.getRootId();
+
+ return mapper(session).updateSnapshotAndChildrenLastFlag(rootId, pathRootId, path, isLast);
+ }
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java
index f9cc23c91bb..64c2c2c146c 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportQueue.java
@@ -49,10 +49,10 @@ public class AnalysisReportQueue implements ServerComponent {
this.dao = dbClient.analysisReportDao();
}
- public AnalysisReportDto add(String projectKey) {
+ public AnalysisReportDto add(String projectKey, Long snapshotId) {
UserSession.get().checkGlobalPermission(GlobalPermissions.SCAN_EXECUTION);
- AnalysisReportDto report = newPendingAnalysisReport(projectKey);
+ AnalysisReportDto report = newPendingAnalysisReport(projectKey).setSnapshotId(snapshotId);
DbSession session = dbClient.openSession(false);
try {
checkThatProjectExistsInDatabase(projectKey, session);
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportStep.java
new file mode 100644
index 00000000000..2408bf3b402
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportStep.java
@@ -0,0 +1,29 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.server.computation;
+
+import org.sonar.api.ServerComponent;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+
+public interface AnalysisReportStep extends ServerComponent {
+ void execute(DbSession session, AnalysisReportDto analysisReportDto);
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
index 9fd68840e95..e0dc2742290 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationService.java
@@ -20,61 +20,39 @@
package org.sonar.server.computation;
-import com.google.common.collect.ImmutableMap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.sonar.api.ServerComponent;
import org.sonar.core.computation.db.AnalysisReportDto;
import org.sonar.core.persistence.DbSession;
import org.sonar.core.persistence.MyBatis;
import org.sonar.server.db.DbClient;
-import org.sonar.server.issue.index.IssueAuthorizationIndex;
-import org.sonar.server.issue.index.IssueIndex;
-import org.sonar.server.permission.InternalPermissionService;
-import org.sonar.server.search.IndexClient;
/**
* since 5.0
*/
public class ComputationService implements ServerComponent {
- private static final Logger LOG = LoggerFactory.getLogger(ComputationService.class);
-
private final DbClient dbClient;
- private final IndexClient index;
- private final InternalPermissionService permissionService;
+ private final SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep;
+ private final IndexProjectIssuesStep indexProjectIssuesStep;
+ private final SwitchSnapshotStep switchSnapshotStep;
- public ComputationService(DbClient dbClient, IndexClient index, InternalPermissionService permissionService) {
+ public ComputationService(DbClient dbClient, SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep,
+ IndexProjectIssuesStep indexProjectIssuesStep, SwitchSnapshotStep switchSnapshotStep) {
this.dbClient = dbClient;
- this.index = index;
- this.permissionService = permissionService;
+ this.synchronizeProjectPermissionsStep = synchronizeProjectPermissionsStep;
+ this.indexProjectIssuesStep = indexProjectIssuesStep;
+ this.switchSnapshotStep = switchSnapshotStep;
}
public void analyzeReport(AnalysisReportDto report) {
// Synchronization of lot of data can only be done with a batch session for the moment
DbSession session = dbClient.openSession(true);
- String projectKey = report.getProjectKey();
try {
- synchronizeProjectPermissionsIfNotFound(session, projectKey);
- indexProjectIssues(session, projectKey);
+ synchronizeProjectPermissionsStep.execute(session, report);
+ indexProjectIssuesStep.execute(session, report);
+ switchSnapshotStep.execute(session, report);
} finally {
MyBatis.closeQuietly(session);
}
-
- LOG.info(String.format("Analysis of %s successfully finished.", report));
- }
-
- private void indexProjectIssues(DbSession session, String projectKey) {
- dbClient.issueDao().synchronizeAfter(session,
- index.get(IssueIndex.class).getLastSynchronization(),
- ImmutableMap.of("project", projectKey));
- session.commit();
- }
-
- private void synchronizeProjectPermissionsIfNotFound(DbSession session, String projectKey) {
- if (index.get(IssueAuthorizationIndex.class).getNullableByKey(projectKey) == null) {
- permissionService.synchronizePermissions(session, projectKey);
- session.commit();
- }
}
}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/IndexProjectIssuesStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/IndexProjectIssuesStep.java
new file mode 100644
index 00000000000..f49ad6c3fea
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/IndexProjectIssuesStep.java
@@ -0,0 +1,51 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.server.computation;
+
+import com.google.common.collect.ImmutableMap;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.issue.index.IssueIndex;
+import org.sonar.server.search.IndexClient;
+
+public class IndexProjectIssuesStep implements AnalysisReportStep {
+
+ private final DbClient dbClient;
+ private final IndexClient index;
+
+ public IndexProjectIssuesStep(DbClient dbClient, IndexClient index) {
+ this.dbClient = dbClient;
+ this.index = index;
+ }
+
+ @Override
+ public void execute(DbSession session, AnalysisReportDto report) {
+ indexProjectIssues(session, report.getProjectKey());
+ }
+
+ private void indexProjectIssues(DbSession session, String projectKey) {
+ dbClient.issueDao().synchronizeAfter(session,
+ index.get(IssueIndex.class).getLastSynchronization(),
+ ImmutableMap.of("project", projectKey));
+ session.commit();
+ }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/SwitchSnapshotStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/SwitchSnapshotStep.java
new file mode 100644
index 00000000000..7e0f0a6e955
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/SwitchSnapshotStep.java
@@ -0,0 +1,65 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.server.computation;
+
+import org.sonar.core.component.SnapshotDto;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.component.db.SnapshotDao;
+
+import java.util.List;
+
+public class SwitchSnapshotStep implements AnalysisReportStep {
+
+ private SnapshotDao dao;
+
+ public SwitchSnapshotStep(SnapshotDao dao) {
+ this.dao = dao;
+ }
+
+ @Override
+ public void execute(DbSession session, AnalysisReportDto report) {
+ disablePreviousSnapshot(session, report);
+ enableCurrentSnapshot(session, report);
+ }
+
+ private void disablePreviousSnapshot(DbSession session, AnalysisReportDto report) {
+ SnapshotDto referenceSnapshot = dao.getByKey(session, report.getSnapshotId());
+
+ List<SnapshotDto> snapshots = dao.findSnapshotAndChildrenOfProjectScope(session, referenceSnapshot);
+ for (SnapshotDto snapshot : snapshots) {
+ SnapshotDto previousLastSnapshot = dao.getLastSnapshot(session, snapshot);
+ if (previousLastSnapshot != null) {
+ dao.updateSnapshotAndChildrenLastFlag(session, previousLastSnapshot, false);
+ session.commit();
+ }
+ }
+ }
+
+ private void enableCurrentSnapshot(DbSession session, AnalysisReportDto report) {
+ SnapshotDto snapshot = dao.getByKey(session, report.getSnapshotId());
+ SnapshotDto previousLastSnapshot = dao.getLastSnapshot(session, snapshot);
+
+ boolean isLast = previousLastSnapshot == null || previousLastSnapshot.getCreatedAt().before(snapshot.getCreatedAt());
+ dao.updateSnapshotAndChildrenLastFlagAndStatus(session, snapshot, isLast, SnapshotDto.STATUS_PROCESSED);
+ session.commit();
+ }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java
new file mode 100644
index 00000000000..559ce11566a
--- /dev/null
+++ b/server/sonar-server/src/main/java/org/sonar/server/computation/SynchronizeProjectPermissionsStep.java
@@ -0,0 +1,50 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.server.computation;
+
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.issue.index.IssueAuthorizationIndex;
+import org.sonar.server.permission.InternalPermissionService;
+import org.sonar.server.search.IndexClient;
+
+public class SynchronizeProjectPermissionsStep implements AnalysisReportStep {
+
+ private final IndexClient index;
+ private final InternalPermissionService permissionService;
+
+ public SynchronizeProjectPermissionsStep(IndexClient index, InternalPermissionService permissionService) {
+ this.index = index;
+ this.permissionService = permissionService;
+ }
+
+ @Override
+ public void execute(DbSession session, AnalysisReportDto report) {
+ synchronizeProjectPermissionsIfNotFound(session, report.getProjectKey());
+ }
+
+ private void synchronizeProjectPermissionsIfNotFound(DbSession session, String projectKey) {
+ if (index.get(IssueAuthorizationIndex.class).getNullableByKey(projectKey) == null) {
+ permissionService.synchronizePermissions(session, projectKey);
+ session.commit();
+ }
+ }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
index 17e57f42b99..87001f174ec 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java
@@ -85,10 +85,7 @@ import org.sonar.server.component.DefaultRubyComponentService;
import org.sonar.server.component.db.ComponentDao;
import org.sonar.server.component.db.SnapshotDao;
import org.sonar.server.component.ws.*;
-import org.sonar.server.computation.AnalysisReportQueue;
-import org.sonar.server.computation.AnalysisReportTaskCleaner;
-import org.sonar.server.computation.AnalysisReportTaskLauncher;
-import org.sonar.server.computation.ComputationService;
+import org.sonar.server.computation.*;
import org.sonar.server.computation.db.AnalysisReportDao;
import org.sonar.server.computation.ws.ActiveAnalysisReportsAction;
import org.sonar.server.computation.ws.AnalysisReportHistorySearchAction;
@@ -274,7 +271,7 @@ class ServerComponents {
ActivityNormalizer.class,
ActivityIndex.class,
ActivityDao.class
- ));
+ ));
components.addAll(CorePropertyDefinitions.all());
components.addAll(DatabaseMigrations.CLASSES);
components.addAll(DaoUtils.getDaoClasses());
@@ -307,7 +304,7 @@ class ServerComponents {
// ws
RestartHandler.class,
SystemWs.class
- );
+ );
}
/**
@@ -324,7 +321,7 @@ class ServerComponents {
HttpDownloader.class,
UriReader.class,
ServerIdGenerator.class
- );
+ );
}
void startLevel4Components(ComponentContainer pico) {
@@ -593,6 +590,9 @@ class ServerComponents {
// Compute engine
pico.addSingleton(ComputationService.class);
+ pico.addSingleton(SwitchSnapshotStep.class);
+ pico.addSingleton(SynchronizeProjectPermissionsStep.class);
+ pico.addSingleton(IndexProjectIssuesStep.class);
pico.add(AnalysisReportQueue.class);
pico.addSingleton(AnalysisReportTaskLauncher.class);
pico.addSingleton(AnalysisReportWebService.class);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
index aad5183a402..596c076891c 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionMediumTest.java
@@ -65,6 +65,6 @@ public class UploadReportActionMediumTest {
WebService.Action restoreProfiles = controller.action(UploadReportAction.UPLOAD_REPORT_ACTION);
assertThat(restoreProfiles).isNotNull();
- assertThat(restoreProfiles.params()).hasSize(1);
+ assertThat(restoreProfiles.params()).hasSize(2);
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java
index 05171c67759..cd56bdf181e 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/batch/UploadReportActionTest.java
@@ -28,7 +28,6 @@ import org.sonar.server.computation.AnalysisReportQueue;
import org.sonar.server.computation.AnalysisReportTaskLauncher;
import org.sonar.server.computation.ComputationService;
-import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
public class UploadReportActionTest {
@@ -53,11 +52,12 @@ public class UploadReportActionTest {
public void verify_that_computation_service_is_called() throws Exception {
Response response = mock(Response.class);
Request request = mock(Request.class);
- when(request.mandatoryParam(anyString())).thenReturn(DEFAULT_PROJECT_KEY);
+ when(request.mandatoryParam(UploadReportAction.PARAM_PROJECT_KEY)).thenReturn(DEFAULT_PROJECT_KEY);
+ when(request.mandatoryParam(UploadReportAction.PARAM_SNAPSHOT)).thenReturn("123");
sut.handle(request, response);
- verify(queue).add(DEFAULT_PROJECT_KEY);
+ verify(queue).add(DEFAULT_PROJECT_KEY, 123L);
verify(analysisTaskLauncher).startAnalysisTaskNow();
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/SnapshotTesting.java b/server/sonar-server/src/test/java/org/sonar/server/component/SnapshotTesting.java
index 845728744e5..ee5ac9102a1 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/component/SnapshotTesting.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/component/SnapshotTesting.java
@@ -20,6 +20,7 @@
package org.sonar.server.component;
+import org.sonar.api.utils.DateUtils;
import org.sonar.core.component.ComponentDto;
import org.sonar.core.component.SnapshotDto;
@@ -42,4 +43,35 @@ public class SnapshotTesting {
.setLast(true);
}
+ public static SnapshotDto defaultSnapshot() {
+ return new SnapshotDto()
+ .setResourceId(3L)
+ .setRootProjectId(1L)
+ .setParentId(2L)
+ .setRootId(1L)
+ .setStatus("P")
+ .setLast(true)
+ .setPurgeStatus(1)
+ .setDepth(1)
+ .setScope("DIR")
+ .setQualifier("PAC")
+ .setVersion("2.1-SNAPSHOT")
+ .setPath("1.2.")
+ .setPeriodMode(1, "days1")
+ .setPeriodMode(2, "days2")
+ .setPeriodMode(3, "days3")
+ .setPeriodMode(4, "days4")
+ .setPeriodMode(5, "days5")
+ .setPeriodParam(1, "30")
+ .setPeriodParam(2, "31")
+ .setPeriodParam(3, "32")
+ .setPeriodParam(4, "33")
+ .setPeriodParam(5, "34")
+ .setPeriodDate(1, DateUtils.parseDate("2011-09-24"))
+ .setPeriodDate(2, DateUtils.parseDate("2011-09-25"))
+ .setPeriodDate(3, DateUtils.parseDate("2011-09-26"))
+ .setPeriodDate(4, DateUtils.parseDate("2011-09-27"))
+ .setPeriodDate(5, DateUtils.parseDate("2011-09-28"))
+ .setBuildDate(DateUtils.parseDate("2011-09-29"));
+ }
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/db/SnapshotDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/db/SnapshotDaoTest.java
index 0499b0f5389..bd7f44380f5 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/component/db/SnapshotDaoTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/component/db/SnapshotDaoTest.java
@@ -29,9 +29,12 @@ import org.sonar.core.component.SnapshotDto;
import org.sonar.core.persistence.AbstractDaoTestCase;
import org.sonar.core.persistence.DbSession;
+import java.util.List;
+
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static org.sonar.server.component.SnapshotTesting.defaultSnapshot;
public class SnapshotDaoTest extends AbstractDaoTestCase {
@@ -101,35 +104,7 @@ public class SnapshotDaoTest extends AbstractDaoTestCase {
when(system2.now()).thenReturn(DateUtils.parseDate("2014-06-18").getTime());
- SnapshotDto dto = new SnapshotDto()
- .setResourceId(3L)
- .setRootProjectId(1L)
- .setParentId(2L)
- .setRootId(1L)
- .setStatus("P")
- .setLast(true)
- .setPurgeStatus(1)
- .setDepth(1)
- .setScope("DIR")
- .setQualifier("PAC")
- .setVersion("2.1-SNAPSHOT")
- .setPath("1.2.")
- .setPeriodMode(1, "days1")
- .setPeriodMode(2, "days2")
- .setPeriodMode(3, "days3")
- .setPeriodMode(4, "days4")
- .setPeriodMode(5, "days5")
- .setPeriodParam(1, "30")
- .setPeriodParam(2, "31")
- .setPeriodParam(3, "32")
- .setPeriodParam(4, "33")
- .setPeriodParam(5, "34")
- .setPeriodDate(1, DateUtils.parseDate("2011-09-24"))
- .setPeriodDate(2, DateUtils.parseDate("2011-09-25"))
- .setPeriodDate(3, DateUtils.parseDate("2011-09-26"))
- .setPeriodDate(4, DateUtils.parseDate("2011-09-27"))
- .setPeriodDate(5, DateUtils.parseDate("2011-09-28"))
- .setBuildDate(DateUtils.parseDate("2011-09-29"));
+ SnapshotDto dto = defaultSnapshot();
dao.insert(session, dto);
session.commit();
@@ -138,4 +113,102 @@ public class SnapshotDaoTest extends AbstractDaoTestCase {
checkTables("insert", "snapshots");
}
+ @Test
+ public void lastSnapshot_returns_null_when_no_last_snapshot() {
+ setupData("empty");
+
+ SnapshotDto snapshot = dao.getLastSnapshot(session, defaultSnapshot());
+
+ assertThat(snapshot).isNull();
+ }
+
+ @Test
+ public void lastSnapshot_from_one_resource() {
+ setupData("snapshots");
+
+ SnapshotDto snapshot = dao.getLastSnapshot(session, defaultSnapshot().setResourceId(2L));
+
+ assertThat(snapshot).isNotNull();
+ assertThat(snapshot.getId()).isEqualTo(4L);
+ }
+
+ @Test
+ public void lastSnapshot_from_one_resource_without_last_is_null() {
+ setupData("snapshots");
+
+ SnapshotDto snapshot = dao.getLastSnapshot(session, defaultSnapshot().setResourceId(5L));
+
+ assertThat(snapshot).isNull();
+ }
+
+ @Test
+ public void no_last_snapshot_older_than_another_one_in_a_empty_table() {
+ setupData("empty");
+
+ SnapshotDto snapshot = dao.getLastSnapshotOlderThan(session, defaultSnapshot());
+
+ assertThat(snapshot).isNull();
+ }
+
+ @Test
+ public void last_snapshot_older__than_a_reference() {
+ setupData("snapshots");
+
+ SnapshotDto referenceSnapshot = defaultSnapshot().setResourceId(1L);
+ referenceSnapshot.setCreatedAt(DateUtils.parseDate("2008-12-03"));
+ SnapshotDto snapshot = dao.getLastSnapshotOlderThan(session, referenceSnapshot);
+
+ assertThat(snapshot).isNotNull();
+ assertThat(snapshot.getId()).isEqualTo(1L);
+ }
+
+ @Test
+ public void last_snapshot_earlier__than_a_reference() {
+ setupData("snapshots");
+
+ SnapshotDto referenceSnapshot = defaultSnapshot().setResourceId(1L);
+ referenceSnapshot.setCreatedAt(DateUtils.parseDate("2008-12-01"));
+ SnapshotDto snapshot = dao.getLastSnapshotOlderThan(session, referenceSnapshot);
+
+ assertThat(snapshot).isNull();
+ }
+
+ @Test
+ public void snapshot_and_child_retrieved() {
+ setupData("snapshots");
+
+ List<SnapshotDto> snapshots = dao.findSnapshotAndChildrenOfProjectScope(session, defaultSnapshot().setId(1L));
+
+ assertThat(snapshots).isNotEmpty();
+ assertThat(snapshots).onProperty("id").containsOnly(1L, 6L);
+ }
+
+ @Test
+ public void set_snapshot_and_children_to_false_and_status_processed() {
+ setupData("snapshots");
+ SnapshotDto snapshot = defaultSnapshot().setId(1L);
+
+ dao.updateSnapshotAndChildrenLastFlagAndStatus(session, snapshot, false, SnapshotDto.STATUS_PROCESSED);
+ session.commit();
+
+ List<SnapshotDto> snapshots = dao.findSnapshotAndChildrenOfProjectScope(session, snapshot);
+ assertThat(snapshots).hasSize(2);
+ assertThat(snapshots).onProperty("id").containsOnly(1L, 6L);
+ assertThat(snapshots).onProperty("last").containsOnly(false);
+ assertThat(snapshots).onProperty("status").containsOnly(SnapshotDto.STATUS_PROCESSED);
+ }
+
+ @Test
+ public void set_snapshot_and_children_isLast_flag_to_false() {
+ setupData("snapshots");
+ SnapshotDto snapshot = defaultSnapshot().setId(1L);
+
+ dao.updateSnapshotAndChildrenLastFlag(session, snapshot, false);
+ session.commit();
+
+ List<SnapshotDto> snapshots = dao.findSnapshotAndChildrenOfProjectScope(session, snapshot);
+ assertThat(snapshots).hasSize(2);
+ assertThat(snapshots).onProperty("id").containsOnly(1L, 6L);
+ assertThat(snapshots).onProperty("last").containsOnly(false);
+ }
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java
index 416bc54d3c8..84a1392e57e 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportQueueMediumTest.java
@@ -84,13 +84,14 @@ public class AnalysisReportQueueMediumTest {
@Test
public void create_analysis_report_and_retrieve_it() {
insertPermissionsForProject(DEFAULT_PROJECT_KEY);
- sut.add(DEFAULT_PROJECT_KEY);
+ sut.add(DEFAULT_PROJECT_KEY, 123L);
List<AnalysisReportDto> reports = sut.findByProjectKey(DEFAULT_PROJECT_KEY);
AnalysisReportDto report = reports.get(0);
assertThat(reports).hasSize(1);
assertThat(report.getProjectKey()).isEqualTo(DEFAULT_PROJECT_KEY);
+ assertThat(report.getSnapshotId()).isEqualTo(123L);
}
private ComponentDto insertPermissionsForProject(String projectKey) {
@@ -111,9 +112,9 @@ public class AnalysisReportQueueMediumTest {
insertPermissionsForProject("2");
insertPermissionsForProject("3");
- sut.add(DEFAULT_PROJECT_KEY);
- sut.add("2");
- sut.add("3");
+ sut.add(DEFAULT_PROJECT_KEY, 123L);
+ sut.add("2", 123L);
+ sut.add("3", 123L);
AnalysisReportDto firstBookedReport = sut.bookNextAvailable();
AnalysisReportDto secondBookedReport = sut.bookNextAvailable();
@@ -136,9 +137,9 @@ public class AnalysisReportQueueMediumTest {
public void all() {
insertPermissionsForProject(DEFAULT_PROJECT_KEY);
- sut.add(DEFAULT_PROJECT_KEY);
- sut.add(DEFAULT_PROJECT_KEY);
- sut.add(DEFAULT_PROJECT_KEY);
+ sut.add(DEFAULT_PROJECT_KEY, 123L);
+ sut.add(DEFAULT_PROJECT_KEY, 123L);
+ sut.add(DEFAULT_PROJECT_KEY, 123L);
List<AnalysisReportDto> reports = sut.all();
@@ -148,7 +149,7 @@ public class AnalysisReportQueueMediumTest {
@Test
public void remove_remove_from_queue_and_log_a_new_activity() {
insertPermissionsForProject(DEFAULT_PROJECT_KEY);
- sut.add(DEFAULT_PROJECT_KEY);
+ sut.add(DEFAULT_PROJECT_KEY, 123L);
AnalysisReportDto report = sut.bookNextAvailable();
report.setStatus(SUCCESS);
@@ -167,7 +168,7 @@ public class AnalysisReportQueueMediumTest {
MockUserSession.set().setLogin("gandalf").addProjectPermissions(UserRole.USER, project.key());
- sut.add(project.getKey());
+ sut.add(project.getKey(), 123L);
}
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java
new file mode 100644
index 00000000000..2910df14971
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceTest.java
@@ -0,0 +1,70 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.server.computation;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InOrder;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.server.db.DbClient;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
+
+public class ComputationServiceTest {
+
+ private ComputationService sut;
+
+ private DbClient dbClient;
+ private IndexProjectIssuesStep indexProjectIssuesStep;
+ private SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep;
+ private SwitchSnapshotStep switchSnapshotStep;
+
+ @Before
+ public void before() {
+ this.dbClient = mock(DbClient.class);
+
+ this.indexProjectIssuesStep = mock(IndexProjectIssuesStep.class);
+ this.synchronizeProjectPermissionsStep = mock(SynchronizeProjectPermissionsStep.class);
+ this.switchSnapshotStep = mock(SwitchSnapshotStep.class);
+
+ this.sut = new ComputationService(dbClient, synchronizeProjectPermissionsStep, indexProjectIssuesStep, switchSnapshotStep);
+ }
+
+ @Test
+ public void all_my_steps_are_called_in_the_right_order() {
+ sut.analyzeReport(AnalysisReportDto.newForTests(1L));
+
+ InOrder inOrder = inOrder(indexProjectIssuesStep, synchronizeProjectPermissionsStep, switchSnapshotStep);
+
+ inOrder.verify(synchronizeProjectPermissionsStep).execute(any(DbSession.class), any(AnalysisReportDto.class));
+ inOrder.verify(indexProjectIssuesStep).execute(any(DbSession.class), any(AnalysisReportDto.class));
+ inOrder.verify(switchSnapshotStep).execute(any(DbSession.class), any(AnalysisReportDto.class));
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void computation_service_rethrows_exceptions() {
+ doThrow(IllegalStateException.class).when(switchSnapshotStep).execute(any(DbSession.class), any(AnalysisReportDto.class));
+
+ sut.analyzeReport(AnalysisReportDto.newForTests(1L));
+ }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/IndexProjectIssuesStepTest.java
index 69e9dbba298..608f7020e3b 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationServiceMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/IndexProjectIssuesStepTest.java
@@ -42,8 +42,6 @@ import org.sonar.server.db.DbClient;
import org.sonar.server.issue.IssueQuery;
import org.sonar.server.issue.IssueTesting;
import org.sonar.server.issue.db.IssueDao;
-import org.sonar.server.issue.index.IssueAuthorizationDoc;
-import org.sonar.server.issue.index.IssueAuthorizationIndex;
import org.sonar.server.issue.index.IssueIndex;
import org.sonar.server.platform.BackendCleanup;
import org.sonar.server.rule.RuleTesting;
@@ -60,13 +58,14 @@ import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static org.fest.assertions.Assertions.assertThat;
-public class ComputationServiceMediumTest {
+public class IndexProjectIssuesStepTest {
+
private static final String DEFAULT_PROJECT_KEY = "123456789-987654321";
@ClassRule
public static ServerTester tester = new ServerTester();
- private ComputationService sut;
+ private IndexProjectIssuesStep sut;
private AnalysisReportQueue queue;
private DbClient db;
@@ -80,7 +79,7 @@ public class ComputationServiceMediumTest {
session = db.openSession(false);
queue = tester.get(AnalysisReportQueue.class);
- sut = tester.get(ComputationService.class);
+ sut = tester.get(IndexProjectIssuesStep.class);
UserDto connectedUser = new UserDto().setLogin("gandalf").setName("Gandalf");
db.userDao().insert(session, connectedUser);
@@ -118,10 +117,10 @@ public class ComputationServiceMediumTest {
clearIssueIndexToSimulateBatchInsertWithoutIndexing();
- queue.add(DEFAULT_PROJECT_KEY);
+ queue.add(DEFAULT_PROJECT_KEY, 123L);
AnalysisReportDto report = queue.bookNextAvailable();
- sut.analyzeReport(report);
+ sut.execute(session, report);
// Check that the issue has well be indexed in E/S
assertThat(tester.get(IssueIndex.class).getNullableByKey(issue.getKey())).isNotNull();
@@ -144,19 +143,6 @@ public class ComputationServiceMediumTest {
}
@Test
- public void add_project_issue_permission_in_index() throws Exception {
- ComponentDto project = insertPermissionsForProject(DEFAULT_PROJECT_KEY);
-
- queue.add(DEFAULT_PROJECT_KEY);
- List<AnalysisReportDto> reports = queue.findByProjectKey(DEFAULT_PROJECT_KEY);
-
- sut.analyzeReport(reports.get(0));
-
- IssueAuthorizationDoc issueAuthorizationIndex = tester.get(IssueAuthorizationIndex.class).getNullableByKey(project.getKey());
- assertThat(issueAuthorizationIndex).isNotNull();
- }
-
- @Test
public void index_a_lot_of_issues() throws Exception {
ComponentDto project = insertPermissionsForProject(DEFAULT_PROJECT_KEY);
db.issueAuthorizationDao().synchronizeAfter(session, new Date(0));
@@ -179,10 +165,10 @@ public class ComputationServiceMediumTest {
clearIssueIndexToSimulateBatchInsertWithoutIndexing();
- queue.add(DEFAULT_PROJECT_KEY);
+ queue.add(DEFAULT_PROJECT_KEY, 123L);
List<AnalysisReportDto> reports = queue.findByProjectKey(DEFAULT_PROJECT_KEY);
- sut.analyzeReport(reports.get(0));
+ sut.execute(session, reports.get(0));
session.commit();
session.clearCache();
@@ -190,9 +176,4 @@ public class ComputationServiceMediumTest {
Result<Issue> issueIndex = tester.get(IssueIndex.class).search(IssueQuery.builder().build(), new QueryContext());
assertThat(issueIndex.getTotal()).isEqualTo(2001);
}
-
- @Test(expected = IllegalStateException.class)
- public void exceptions_thrown_are_transmitted() {
- sut.analyzeReport(new AnalysisReportDto());
- }
}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/SwitchSnapshotStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/SwitchSnapshotStepTest.java
new file mode 100644
index 00000000000..d4cbf8ac4b6
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/SwitchSnapshotStepTest.java
@@ -0,0 +1,70 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.server.computation;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.sonar.api.utils.DateUtils;
+import org.sonar.api.utils.System2;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.persistence.TestDatabase;
+import org.sonar.server.component.db.SnapshotDao;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class SwitchSnapshotStepTest {
+ @Rule
+ public TestDatabase db = new TestDatabase();
+
+ private DbSession session;
+ private SwitchSnapshotStep sut;
+ private SnapshotDao dao;
+
+ @Before
+ public void before() {
+ this.session = db.myBatis().openSession(false);
+
+ System2 system2 = mock(System2.class);
+ when(system2.now()).thenReturn(DateUtils.parseDate("2011-09-29").getTime());
+ this.sut = new SwitchSnapshotStep(new SnapshotDao(system2));
+ this.dao = new SnapshotDao(system2);
+ }
+
+ @After
+ public void after() {
+ MyBatis.closeQuietly(session);
+ }
+
+ @Test
+ public void one_switch_with_a_snapshot_and_his_children() {
+ db.prepareDbUnit(getClass(), "snapshots.xml");
+
+ sut.execute(session, AnalysisReportDto.newForTests(1L).setSnapshotId(1L));
+ session.commit();
+
+ db.assertDbUnit(getClass(), "snapshots-result.xml", "snapshots");
+ }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/SynchronizeProjectPermissionsStepMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/SynchronizeProjectPermissionsStepMediumTest.java
new file mode 100644
index 00000000000..0a40266086f
--- /dev/null
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/SynchronizeProjectPermissionsStepMediumTest.java
@@ -0,0 +1,108 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 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.server.computation;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.sonar.api.security.DefaultGroups;
+import org.sonar.api.web.UserRole;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.computation.db.AnalysisReportDto;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.permission.PermissionFacade;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
+import org.sonar.core.user.UserDto;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.issue.index.IssueAuthorizationDoc;
+import org.sonar.server.issue.index.IssueAuthorizationIndex;
+import org.sonar.server.tester.ServerTester;
+import org.sonar.server.user.MockUserSession;
+
+import java.util.List;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class SynchronizeProjectPermissionsStepMediumTest {
+ private static final String DEFAULT_PROJECT_KEY = "123456789-987654321";
+
+ @ClassRule
+ public static ServerTester tester = new ServerTester();
+
+ private SynchronizeProjectPermissionsStep sut;
+
+ private AnalysisReportQueue queue;
+ private DbClient db;
+ private DbSession session;
+ private MockUserSession userSession;
+
+ @Before
+ public void setUp() throws Exception {
+ tester.clearDbAndIndexes();
+ db = tester.get(DbClient.class);
+ session = db.openSession(false);
+ queue = tester.get(AnalysisReportQueue.class);
+
+ sut = tester.get(SynchronizeProjectPermissionsStep.class);
+
+ UserDto connectedUser = new UserDto().setLogin("gandalf").setName("Gandalf");
+ db.userDao().insert(session, connectedUser);
+
+ userSession = MockUserSession.set()
+ .setLogin(connectedUser.getLogin())
+ .setUserId(connectedUser.getId().intValue())
+ .setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);
+
+ session.commit();
+ }
+
+ @After
+ public void after() {
+ MyBatis.closeQuietly(session);
+ }
+
+ private ComponentDto insertPermissionsForProject(String projectKey) {
+ ComponentDto project = new ComponentDto().setKey(projectKey);
+ db.componentDao().insert(session, project);
+
+ tester.get(PermissionFacade.class).insertGroupPermission(project.getId(), DefaultGroups.ANYONE, UserRole.USER, session);
+ userSession.addProjectPermissions(UserRole.USER, project.key());
+
+ session.commit();
+
+ return project;
+ }
+
+ @Test
+ public void add_project_issue_permission_in_index() throws Exception {
+ ComponentDto project = insertPermissionsForProject(DEFAULT_PROJECT_KEY);
+
+ queue.add(DEFAULT_PROJECT_KEY, 123L);
+ List<AnalysisReportDto> reports = queue.findByProjectKey(DEFAULT_PROJECT_KEY);
+
+ sut.execute(session, reports.get(0));
+
+ IssueAuthorizationDoc issueAuthorizationIndex = tester.get(IssueAuthorizationIndex.class).getNullableByKey(project.getKey());
+ assertThat(issueAuthorizationIndex).isNotNull();
+ }
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java
index 3228a0dfc12..6fd0a31bd02 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/db/AnalysisReportDaoTest.java
@@ -44,10 +44,11 @@ import static org.sonar.core.computation.db.AnalysisReportDto.Status.WORKING;
public class AnalysisReportDaoTest {
private static final String DEFAULT_PROJECT_KEY = "123456789-987654321";
private static final String DEFAULT_PROJECT_NAME = "default project name";
+ private static final long DEFAULT_SNAPSHOT_ID = 123L;
@Rule
public TestDatabase db = new TestDatabase();
- private AnalysisReportDao dao;
+ private AnalysisReportDao sut;
private DbSession session;
private System2 system2;
@@ -55,7 +56,7 @@ public class AnalysisReportDaoTest {
public void before() {
this.session = db.myBatis().openSession(false);
this.system2 = mock(System2.class);
- this.dao = new AnalysisReportDao(system2);
+ this.sut = new AnalysisReportDao(system2);
when(system2.now()).thenReturn(DateUtils.parseDate("2014-09-26").getTime());
@@ -72,13 +73,14 @@ public class AnalysisReportDaoTest {
AnalysisReportDto report = new AnalysisReportDto()
.setProjectKey(DEFAULT_PROJECT_KEY)
.setProjectName(DEFAULT_PROJECT_NAME)
+ .setSnapshotId(DEFAULT_SNAPSHOT_ID)
.setData("data-project")
.setStatus(PENDING);
report.setCreatedAt(DateUtils.parseDate("2014-09-24"))
.setUpdatedAt(DateUtils.parseDate("2014-09-25"));
- dao.insert(session, report);
- dao.insert(session, report);
+ sut.insert(session, report);
+ sut.insert(session, report);
session.commit();
db.assertDbUnit(getClass(), "insert-result.xml", "analysis_reports");
@@ -88,7 +90,7 @@ public class AnalysisReportDaoTest {
public void update_all_to_status() {
db.prepareDbUnit(getClass(), "update-all-to-status-pending.xml");
- dao.cleanWithUpdateAllToPendingStatus(session);
+ sut.cleanWithUpdateAllToPendingStatus(session);
session.commit();
db.assertDbUnit(getClass(), "update-all-to-status-pending-result.xml", "analysis_reports");
@@ -98,7 +100,7 @@ public class AnalysisReportDaoTest {
public void truncate() {
db.prepareDbUnit(getClass(), "any-analysis-reports.xml");
- dao.cleanWithTruncate(session);
+ sut.cleanWithTruncate(session);
session.commit();
db.assertDbUnit(getClass(), "truncate-result.xml", "analysis_reports");
@@ -109,7 +111,7 @@ public class AnalysisReportDaoTest {
db.prepareDbUnit(getClass(), "select.xml");
final String projectKey = "123456789-987654321";
- List<AnalysisReportDto> reports = dao.findByProjectKey(session, projectKey);
+ List<AnalysisReportDto> reports = sut.findByProjectKey(session, projectKey);
AnalysisReportDto report = reports.get(0);
assertThat(reports).hasSize(1);
@@ -122,7 +124,7 @@ public class AnalysisReportDaoTest {
db.prepareDbUnit(getClass(), "select.xml");
final String projectKey = "987654321-123456789";
- List<AnalysisReportDto> reports = dao.findByProjectKey(session, projectKey);
+ List<AnalysisReportDto> reports = sut.findByProjectKey(session, projectKey);
assertThat(reports).hasSize(2);
}
@@ -132,7 +134,7 @@ public class AnalysisReportDaoTest {
db.prepareDbUnit(getClass(), "select_oldest_available_report.xml");
final String projectKey = "123456789-987654321";
- AnalysisReportDto nextAvailableReport = dao.getNextAvailableReport(session);
+ AnalysisReportDto nextAvailableReport = sut.getNextAvailableReport(session);
assertThat(nextAvailableReport.getId()).isEqualTo(2);
assertThat(nextAvailableReport.getProjectKey()).isEqualTo(projectKey);
@@ -143,7 +145,7 @@ public class AnalysisReportDaoTest {
db.prepareDbUnit(getClass(), "select_oldest_available_report_with_working_reports_older.xml");
final String projectKey = "123456789-987654321";
- AnalysisReportDto nextAvailableReport = dao.getNextAvailableReport(session);
+ AnalysisReportDto nextAvailableReport = sut.getNextAvailableReport(session);
assertThat(nextAvailableReport.getId()).isEqualTo(2);
assertThat(nextAvailableReport.getProjectKey()).isEqualTo(projectKey);
@@ -153,7 +155,7 @@ public class AnalysisReportDaoTest {
public void null_when_no_available_pending_report_because_working_report_on_the_same_project() {
db.prepareDbUnit(getClass(), "select-with-no-available-report.xml");
- AnalysisReportDto nextAvailableReport = dao.getNextAvailableReport(session);
+ AnalysisReportDto nextAvailableReport = sut.getNextAvailableReport(session);
assertThat(nextAvailableReport).isNull();
}
@@ -162,7 +164,7 @@ public class AnalysisReportDaoTest {
public void getById_maps_all_the_fields_except_report_data() {
db.prepareDbUnit(getClass(), "select.xml");
- AnalysisReportDto report = dao.getById(session, 1L);
+ AnalysisReportDto report = sut.getById(session, 1L);
assertThat(report.getId()).isEqualTo(1L);
assertThat(report.getStatus()).isEqualTo(WORKING);
assertThat(report.getProjectKey()).isEqualTo("123456789-987654321");
@@ -175,14 +177,14 @@ public class AnalysisReportDaoTest {
public void getById_returns_null_when_id_not_found() {
db.prepareDbUnit(getClass(), "select.xml");
- AnalysisReportDto report = dao.getById(session, 4L);
+ AnalysisReportDto report = sut.getById(session, 4L);
assertThat(report).isNull();
}
@Test(expected = NullPointerException.class)
public void nullPointerExc_when_trying_to_book_a_report_without_id() {
- dao.bookAnalysisReport(session, new AnalysisReportDto());
+ sut.bookAnalysisReport(session, new AnalysisReportDto());
}
@Test
@@ -190,7 +192,7 @@ public class AnalysisReportDaoTest {
db.prepareDbUnit(getClass(), "one_busy_report_analysis.xml");
AnalysisReportDto report = newDefaultReport();
- AnalysisReportDto reportBooked = dao.bookAnalysisReport(session, report);
+ AnalysisReportDto reportBooked = sut.bookAnalysisReport(session, report);
assertThat(reportBooked).isNull();
}
@@ -202,7 +204,7 @@ public class AnalysisReportDaoTest {
db.prepareDbUnit(getClass(), "one_available_analysis.xml");
AnalysisReportDto report = newDefaultReport();
- AnalysisReportDto reportBooked = dao.bookAnalysisReport(session, report);
+ AnalysisReportDto reportBooked = sut.bookAnalysisReport(session, report);
assertThat(reportBooked.getId()).isEqualTo(1L);
assertThat(reportBooked.getStatus()).isEqualTo(WORKING);
@@ -214,7 +216,7 @@ public class AnalysisReportDaoTest {
db.prepareDbUnit(getClass(), "one_available_analysis_but_another_busy_on_same_project.xml");
AnalysisReportDto report = newDefaultReport();
- AnalysisReportDto reportBooked = dao.bookAnalysisReport(session, report);
+ AnalysisReportDto reportBooked = sut.bookAnalysisReport(session, report);
assertThat(reportBooked).isNotNull();
}
@@ -224,7 +226,7 @@ public class AnalysisReportDaoTest {
db.prepareDbUnit(getClass(), "book_available_report_analysis_while_having_one_working_on_another_project.xml");
AnalysisReportDto report = newDefaultReport();
- AnalysisReportDto reportBooked = dao.bookAnalysisReport(session, report);
+ AnalysisReportDto reportBooked = sut.bookAnalysisReport(session, report);
assertThat(reportBooked.getId()).isEqualTo(1L);
}
@@ -233,7 +235,7 @@ public class AnalysisReportDaoTest {
public void delete_one_analysis_report() {
db.prepareDbUnit(getClass(), "one_analysis_report.xml");
- dao.delete(session, newDefaultReport());
+ sut.delete(session, newDefaultReport());
session.commit();
db.assertDbUnit(getClass(), "truncate-result.xml", "analysis_reports");
@@ -243,7 +245,7 @@ public class AnalysisReportDaoTest {
public void getById_maps_all_the_fields_except_the_data() {
db.prepareDbUnit(getClass(), "one_analysis_report.xml");
- AnalysisReportDto report = dao.getById(session, 1L);
+ AnalysisReportDto report = sut.getById(session, 1L);
assertThat(report.getProjectKey()).isEqualTo(DEFAULT_PROJECT_KEY);
assertThat(report.getProjectName()).isEqualTo(DEFAULT_PROJECT_NAME);
@@ -258,7 +260,7 @@ public class AnalysisReportDaoTest {
public void findAll_one_analysis_report() {
db.prepareDbUnit(getClass(), "one_analysis_report.xml");
- List<AnalysisReportDto> reports = dao.findAll(session);
+ List<AnalysisReportDto> reports = sut.findAll(session);
assertThat(reports).hasSize(1);
}
@@ -267,7 +269,7 @@ public class AnalysisReportDaoTest {
public void findAll_empty_table() {
db.prepareDbUnit(getClass(), "empty.xml");
- List<AnalysisReportDto> reports = dao.findAll(session);
+ List<AnalysisReportDto> reports = sut.findAll(session);
assertThat(reports).isEmpty();
}
@@ -276,24 +278,24 @@ public class AnalysisReportDaoTest {
public void findAll_three_analysis_reports() {
db.prepareDbUnit(getClass(), "three_analysis_reports.xml");
- List<AnalysisReportDto> reports = dao.findAll(session);
+ List<AnalysisReportDto> reports = sut.findAll(session);
assertThat(reports).hasSize(3);
}
@Test(expected = UnsupportedOperationException.class)
public void doGetNullableByKey_is_not_implemented_yet() {
- dao.doGetNullableByKey(session, "ANY_STRING");
+ sut.doGetNullableByKey(session, "ANY_STRING");
}
@Test(expected = UnsupportedOperationException.class)
public void getSynchronizationParams_is_not_implemented_yet() {
- dao.getSynchronizationParams(new Date(), new HashMap<String, String>());
+ sut.getSynchronizationParams(new Date(), new HashMap<String, String>());
}
@Test(expected = UnsupportedOperationException.class)
public void doUpdate_is_not_implemented_yet() {
- dao.doUpdate(session, new AnalysisReportDto());
+ sut.doUpdate(session, new AnalysisReportDto());
}
private AnalysisReportDto newDefaultReport() {
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java
index cde60a2d6f8..fe9231efe01 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/AnalysisReportHistorySearchActionMediumTest.java
@@ -80,9 +80,9 @@ public class AnalysisReportHistorySearchActionMediumTest {
@Test
public void add_and_try_to_retrieve_activities() throws Exception {
insertPermissionsForProject(DEFAULT_PROJECT_KEY);
- queue.add(DEFAULT_PROJECT_KEY);
- queue.add(DEFAULT_PROJECT_KEY);
- queue.add(DEFAULT_PROJECT_KEY);
+ queue.add(DEFAULT_PROJECT_KEY, 123L);
+ queue.add(DEFAULT_PROJECT_KEY, 123L);
+ queue.add(DEFAULT_PROJECT_KEY, 123L);
List<AnalysisReportDto> reports = queue.all();
for (AnalysisReportDto report : reports) {
@@ -116,7 +116,7 @@ public class AnalysisReportHistorySearchActionMediumTest {
@Test(expected = ForbiddenException.class)
public void user_rights_is_not_enough_throw_ForbiddenException() throws Exception {
insertPermissionsForProject(DEFAULT_PROJECT_KEY);
- queue.add(DEFAULT_PROJECT_KEY);
+ queue.add(DEFAULT_PROJECT_KEY, 123L);
AnalysisReportDto report = queue.all().get(0);
report.succeed();
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/db/SnapshotDaoTest/snapshots.xml b/server/sonar-server/src/test/resources/org/sonar/server/component/db/SnapshotDaoTest/snapshots.xml
new file mode 100644
index 00000000000..9781e1280fc
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/component/db/SnapshotDaoTest/snapshots.xml
@@ -0,0 +1,65 @@
+<dataset>
+
+ <!-- PROJECT_ID = 1 -->
+ <snapshots id="1" project_id="1" parent_snapshot_id="2" root_project_id="1" root_snapshot_id="1"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="2" project_id="1" parent_snapshot_id="2" root_project_id="1" root_snapshot_id="3"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="3" project_id="1" parent_snapshot_id="2" root_project_id="1" root_snapshot_id="3"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+
+
+ <!-- PROJECT_ID = 2 -->
+ <snapshots id="4" project_id="2" parent_snapshot_id="2" root_project_id="1" root_snapshot_id="3"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+
+ <!-- PROJECT_ID = 3 – no last snapshot -->
+ <snapshots id="5" project_id="3" parent_snapshot_id="2" root_project_id="1" root_snapshot_id="3"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+
+ <!-- Child of snapshot id=1 -->
+ <snapshots id="6" project_id="55" parent_snapshot_id="2" root_project_id="1" root_snapshot_id="1"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+</dataset>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/SwitchSnapshotStepTest/snapshots-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/SwitchSnapshotStepTest/snapshots-result.xml
new file mode 100644
index 00000000000..c4b90750ee0
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/SwitchSnapshotStepTest/snapshots-result.xml
@@ -0,0 +1,149 @@
+<dataset>
+
+ <!-- NEW SNAPSHOT -->
+ <snapshots id="1" project_id="123" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="2" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="3" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- PROJECT_ID = 3 – no last snapshot -->
+ <snapshots id="4" project_id="3" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- Child of snapshot id=1 -->
+ <snapshots id="5" project_id="55" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+
+ <!-- LAST FLAGGED SNAPSHOT -->
+ <snapshots id="21" project_id="123" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="22" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="23" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- PROJECT_ID = 3 – no last snapshot -->
+ <snapshots id="24" project_id="3" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- Child of snapshot id=1 -->
+ <snapshots id="25" project_id="55" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+
+ <!-- OLD SNAPSHOT -->
+ <snapshots id="46" project_id="123" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="47" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="48" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- PROJECT_ID = 3 – no last snapshot -->
+ <snapshots id="49" project_id="3" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- Child of snapshot id=1 -->
+ <snapshots id="50" project_id="55" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+</dataset>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/SwitchSnapshotStepTest/snapshots.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/SwitchSnapshotStepTest/snapshots.xml
new file mode 100644
index 00000000000..642ac79c026
--- /dev/null
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/SwitchSnapshotStepTest/snapshots.xml
@@ -0,0 +1,149 @@
+<dataset>
+
+ <!-- NEW SNAPSHOT -->
+ <snapshots id="1" project_id="123" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="U" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="2" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="U" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="3" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="U" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- PROJECT_ID = 3 – no last snapshot -->
+ <snapshots id="4" project_id="3" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="U" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- Child of snapshot id=1 -->
+ <snapshots id="5" project_id="55" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="1"
+ status="U" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-03" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+
+ <!-- LAST FLAGGED SNAPSHOT -->
+ <snapshots id="21" project_id="123" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="22" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="23" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- PROJECT_ID = 3 – no last snapshot -->
+ <snapshots id="24" project_id="3" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- Child of snapshot id=1 -->
+ <snapshots id="25" project_id="55" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="21"
+ status="P" islast="[true]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-02" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+
+ <!-- OLD SNAPSHOT -->
+ <snapshots id="46" project_id="123" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="47" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <snapshots id="48" project_id="1" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- PROJECT_ID = 3 – no last snapshot -->
+ <snapshots id="49" project_id="3" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="DIR" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+ <!-- Child of snapshot id=1 -->
+ <snapshots id="50" project_id="55" parent_snapshot_id="2" root_project_id="123" root_snapshot_id="46"
+ status="P" islast="[false]" purge_status="1"
+ period1_mode="days1" period1_param="30" period1_date="2011-09-24"
+ period2_mode="days2" period2_param="31" period2_date="2011-09-25"
+ period3_mode="days3" period3_param="32" period3_date="2011-09-26"
+ period4_mode="days4" period4_param="33" period4_date="2011-09-27"
+ period5_mode="days5" period5_param="34" period5_date="2011-09-28"
+ depth="1" scope="PRJ" qualifier="PAC" created_at="2008-12-01" build_date="2011-09-29"
+ version="2.1-SNAPSHOT" path="1.2."/>
+</dataset>
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml
index aee179291e8..cb5e9a70c3f 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/any-analysis-reports.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-24"
@@ -12,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-25"
@@ -21,6 +23,7 @@
id="3"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-26"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/book_available_report_analysis_while_having_one_working_on_another_project.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/book_available_report_analysis_while_having_one_working_on_another_project.xml
index 9e385b61b43..001dfb1cd18 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/book_available_report_analysis_while_having_one_working_on_another_project.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/book_available_report_analysis_while_having_one_working_on_another_project.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
@@ -12,6 +13,7 @@
id="2"
project_key="987654321-123456789"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-23"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml
index 7b8a4ffafb4..816774bdb21 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/insert-result.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
@@ -12,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml
index d4ba0f3aa38..7a384fef8bf 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_analysis_report.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-24"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis.xml
index a383f62333b..8dfd1864cd9 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
@@ -12,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis_but_another_busy_on_same_project.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis_but_another_busy_on_same_project.xml
index 96fec9d6891..122cffa4607 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis_but_another_busy_on_same_project.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_available_analysis_but_another_busy_on_same_project.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
@@ -12,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-23"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_busy_report_analysis.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_busy_report_analysis.xml
index ff70f9cd9e9..423acd8cd6f 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_busy_report_analysis.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/one_busy_report_analysis.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-24"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select-with-no-available-report.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select-with-no-available-report.xml
index ea8b0295a36..9e7dfcc8966 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select-with-no-available-report.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select-with-no-available-report.xml
@@ -3,6 +3,7 @@
id="1"
project_key="111111111-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-25"
@@ -12,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-24"
@@ -22,6 +24,7 @@
id="3"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-25"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml
index 106fd9d1a81..eb3156a8d6e 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-24"
@@ -12,6 +13,7 @@
id="2"
project_key="987654321-123456789"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-25"
@@ -21,6 +23,7 @@
id="3"
project_key="987654321-123456789"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-26"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report.xml
index 723b1a310e7..c5ebf921ae6 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report.xml
@@ -3,6 +3,7 @@
id="1"
project_key="111111111-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-25"
@@ -12,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
@@ -21,6 +23,7 @@
id="3"
project_key="333333333-123456789"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-25"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report_with_working_reports_older.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report_with_working_reports_older.xml
index baab9454bbc..a5f42f4fbc3 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report_with_working_reports_older.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/select_oldest_available_report_with_working_reports_older.xml
@@ -3,6 +3,7 @@
id="1"
project_key="111111111-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-23"
@@ -12,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
@@ -21,6 +23,7 @@
id="3"
project_key="333333333-123456789"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-25"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/three_analysis_reports.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/three_analysis_reports.xml
index 106fd9d1a81..eb3156a8d6e 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/three_analysis_reports.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/three_analysis_reports.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-24"
@@ -12,6 +13,7 @@
id="2"
project_key="987654321-123456789"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-25"
@@ -21,6 +23,7 @@
id="3"
project_key="987654321-123456789"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-26"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml
index edc1eabb95b..ee97b8c8c3b 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending-result.xml
@@ -1,28 +1,9 @@
-<!--
- ~ SonarQube, open source software quality management tool.
- ~ Copyright (C) 2008-2014 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.
- -->
-
<dataset>
<analysis_reports
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-24"
@@ -32,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-25"
@@ -41,6 +23,7 @@
id="3"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-26"
diff --git a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml
index aee179291e8..cb5e9a70c3f 100644
--- a/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml
+++ b/server/sonar-server/src/test/resources/org/sonar/server/computation/db/AnalysisReportDaoTest/update-all-to-status-pending.xml
@@ -3,6 +3,7 @@
id="1"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-24"
@@ -12,6 +13,7 @@
id="2"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="WORKING"
created_at="2014-09-25"
@@ -21,6 +23,7 @@
id="3"
project_key="123456789-987654321"
project_name="default project name"
+ snapshot_id="123"
report_data="data-project"
report_status="PENDING"
created_at="2014-09-26"
diff --git a/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/706_add_snapshot_id_to_analysis_reports.rb b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/706_add_snapshot_id_to_analysis_reports.rb
new file mode 100644
index 00000000000..4b571f83112
--- /dev/null
+++ b/server/sonar-web/src/main/webapp/WEB-INF/db/migrate/706_add_snapshot_id_to_analysis_reports.rb
@@ -0,0 +1,30 @@
+#
+# SonarQube, open source software quality management tool.
+# Copyright (C) 2008-2014 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.
+#
+
+#
+# SonarQube 5.0
+# SONAR-5696
+#
+class AddSnapshotIdToAnalysisReports < ActiveRecord::Migration
+ def self.up
+ add_column 'analysis_reports', :snapshot_id, :integer, :null => false
+ end
+end
+