summaryrefslogtreecommitdiffstats
path: root/sonar-core
diff options
context:
space:
mode:
authorTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2014-12-03 18:42:09 +0100
committerTeryk Bellahsene <teryk.bellahsene@sonarsource.com>2014-12-03 18:51:45 +0100
commitcae9b3a92fe86d9a1e9a243570229d9e40ebd341 (patch)
treef21054aa32feaa6b8ab07f26d723657609b51788 /sonar-core
parent1c6c5ac69aed0f7dd35f5007105ed9ac6f1f568d (diff)
downloadsonarqube-cae9b3a92fe86d9a1e9a243570229d9e40ebd341.tar.gz
sonarqube-cae9b3a92fe86d9a1e9a243570229d9e40ebd341.zip
SONAR-5804 fix source lines purge of multi module projects
Diffstat (limited to 'sonar-core')
-rw-r--r--sonar-core/src/main/java/org/sonar/core/purge/PurgeDao.java11
-rw-r--r--sonar-core/src/main/java/org/sonar/core/purge/PurgeListener.java33
-rw-r--r--sonar-core/src/main/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTask.java9
-rw-r--r--sonar-core/src/test/java/org/sonar/core/purge/PurgeDaoTest.java14
-rw-r--r--sonar-core/src/test/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTaskTest.java15
5 files changed, 55 insertions, 27 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/purge/PurgeDao.java b/sonar-core/src/main/java/org/sonar/core/purge/PurgeDao.java
index 9eb298082ab..71dc5863e15 100644
--- a/sonar-core/src/main/java/org/sonar/core/purge/PurgeDao.java
+++ b/sonar-core/src/main/java/org/sonar/core/purge/PurgeDao.java
@@ -54,10 +54,10 @@ public class PurgeDao {
this.system2 = system2;
}
- public PurgeDao purge(PurgeConfiguration conf) {
+ public PurgeDao purge(PurgeConfiguration conf, PurgeListener purgeListener) {
DbSession session = mybatis.openSession(true);
try {
- purge(session, conf);
+ purge(session, conf, purgeListener);
session.commit();
} finally {
MyBatis.closeQuietly(session);
@@ -65,7 +65,7 @@ public class PurgeDao {
return this;
}
- public void purge(DbSession session, PurgeConfiguration conf) {
+ public void purge(DbSession session, PurgeConfiguration conf, PurgeListener purgeListener) {
PurgeMapper mapper = session.getMapper(PurgeMapper.class);
PurgeCommands commands = new PurgeCommands(session, mapper, profiler);
List<ResourceDto> projects = getProjects(conf.rootProjectId(), session);
@@ -75,7 +75,7 @@ public class PurgeDao {
purge(project, conf.scopesWithoutHistoricalData(), commands);
}
for (ResourceDto project : projects) {
- disableOrphanResources(project, session, mapper);
+ disableOrphanResources(project, session, mapper, purgeListener);
}
deleteOldClosedIssues(conf, mapper);
}
@@ -130,13 +130,14 @@ public class PurgeDao {
}
}
- private void disableOrphanResources(final ResourceDto project, final SqlSession session, final PurgeMapper purgeMapper) {
+ private void disableOrphanResources(final ResourceDto project, final SqlSession session, final PurgeMapper purgeMapper, final PurgeListener purgeListener) {
session.select("org.sonar.core.purge.PurgeMapper.selectResourceIdsToDisable", project.getId(), new ResultHandler() {
@Override
public void handleResult(ResultContext resultContext) {
IdUuidPair resourceIdUuid = (IdUuidPair) resultContext.getResultObject();
if (resourceIdUuid.getId() != null) {
disableResource(resourceIdUuid, purgeMapper);
+ purgeListener.onComponentDisabling(resourceIdUuid.getUuid());
}
}
});
diff --git a/sonar-core/src/main/java/org/sonar/core/purge/PurgeListener.java b/sonar-core/src/main/java/org/sonar/core/purge/PurgeListener.java
new file mode 100644
index 00000000000..055b259a221
--- /dev/null
+++ b/sonar-core/src/main/java/org/sonar/core/purge/PurgeListener.java
@@ -0,0 +1,33 @@
+/*
+ * 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.core.purge;
+
+public interface PurgeListener {
+
+ PurgeListener EMPTY = new PurgeListener() {
+ @Override
+ public void onComponentDisabling(String uuid) {
+ // do nothing
+ }
+ };
+
+ void onComponentDisabling(String uuid);
+}
diff --git a/sonar-core/src/main/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTask.java b/sonar-core/src/main/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTask.java
index 188164e55fc..df991fe48a9 100644
--- a/sonar-core/src/main/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTask.java
+++ b/sonar-core/src/main/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTask.java
@@ -27,14 +27,11 @@ import org.sonar.api.CoreProperties;
import org.sonar.api.config.Settings;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.utils.TimeUtils;
-import org.sonar.server.computation.dbcleaner.period.DefaultPeriodCleaner;
-import org.sonar.core.purge.IdUuidPair;
-import org.sonar.core.purge.PurgeConfiguration;
-import org.sonar.core.purge.PurgeDao;
-import org.sonar.core.purge.PurgeProfiler;
+import org.sonar.core.purge.*;
import org.sonar.core.resource.ResourceDao;
import org.sonar.core.resource.ResourceDto;
import org.sonar.plugins.dbcleaner.api.PurgeTask;
+import org.sonar.server.computation.dbcleaner.period.DefaultPeriodCleaner;
import static org.sonar.core.purge.PurgeConfiguration.newDefaultPurgeConfiguration;
@@ -98,7 +95,7 @@ public class DefaultPurgeTask implements PurgeTask {
private void doPurge(long resourceId) {
try {
- purgeDao.purge(newPurgeConfigurationOnResource(resourceId));
+ purgeDao.purge(newPurgeConfigurationOnResource(resourceId), PurgeListener.EMPTY);
} catch (Exception e) {
// purge errors must no fail the report analysis
LOG.error("Fail to purge data [id=" + resourceId + "]", e);
diff --git a/sonar-core/src/test/java/org/sonar/core/purge/PurgeDaoTest.java b/sonar-core/src/test/java/org/sonar/core/purge/PurgeDaoTest.java
index 8487e4076aa..3c1e080a25c 100644
--- a/sonar-core/src/test/java/org/sonar/core/purge/PurgeDaoTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/purge/PurgeDaoTest.java
@@ -68,35 +68,35 @@ public class PurgeDaoTest extends AbstractDaoTestCase {
@Test
public void shouldDeleteAbortedBuilds() {
setupData("shouldDeleteAbortedBuilds");
- sut.purge(new PurgeConfiguration(1L, new String[0], 30));
+ sut.purge(new PurgeConfiguration(1L, new String[0], 30), PurgeListener.EMPTY);
checkTables("shouldDeleteAbortedBuilds", "snapshots");
}
@Test
public void should_purge_project() {
setupData("shouldPurgeProject");
- sut.purge(new PurgeConfiguration(1L, new String[0], 30));
+ sut.purge(new PurgeConfiguration(1L, new String[0], 30), PurgeListener.EMPTY);
checkTables("shouldPurgeProject", "projects", "snapshots");
}
@Test
public void delete_file_sources_of_disabled_resources() {
setupData("delete_file_sources_of_disabled_resources");
- sut.purge(new PurgeConfiguration(1L, new String[0], 30, system2));
+ sut.purge(new PurgeConfiguration(1L, new String[0], 30, system2), PurgeListener.EMPTY);
checkTables("delete_file_sources_of_disabled_resources", "file_sources");
}
@Test
public void shouldDeleteHistoricalDataOfDirectoriesAndFiles() {
setupData("shouldDeleteHistoricalDataOfDirectoriesAndFiles");
- sut.purge(new PurgeConfiguration(1L, new String[] {Scopes.DIRECTORY, Scopes.FILE}, 30));
+ sut.purge(new PurgeConfiguration(1L, new String[] {Scopes.DIRECTORY, Scopes.FILE}, 30), PurgeListener.EMPTY);
checkTables("shouldDeleteHistoricalDataOfDirectoriesAndFiles", "projects", "snapshots");
}
@Test
public void disable_resources_without_last_snapshot() {
setupData("disable_resources_without_last_snapshot");
- sut.purge(new PurgeConfiguration(1L, new String[0], 30, system2));
+ sut.purge(new PurgeConfiguration(1L, new String[0], 30, system2), PurgeListener.EMPTY);
checkTables("disable_resources_without_last_snapshot", "projects", "snapshots", "issues");
}
@@ -131,14 +131,14 @@ public class PurgeDaoTest extends AbstractDaoTestCase {
@Test
public void should_delete_old_closed_issues() {
setupData("should_delete_old_closed_issues");
- sut.purge(new PurgeConfiguration(1L, new String[0], 30));
+ sut.purge(new PurgeConfiguration(1L, new String[0], 30), PurgeListener.EMPTY);
checkTables("should_delete_old_closed_issues", "issues", "issue_changes");
}
@Test
public void should_delete_all_closed_issues() {
setupData("should_delete_all_closed_issues");
- sut.purge(new PurgeConfiguration(1L, new String[0], 0));
+ sut.purge(new PurgeConfiguration(1L, new String[0], 0), PurgeListener.EMPTY);
checkTables("should_delete_all_closed_issues", "issues", "issue_changes");
}
diff --git a/sonar-core/src/test/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTaskTest.java b/sonar-core/src/test/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTaskTest.java
index 1ca4ffef571..11060eebf10 100644
--- a/sonar-core/src/test/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTaskTest.java
+++ b/sonar-core/src/test/java/org/sonar/server/computation/dbcleaner/DefaultPurgeTaskTest.java
@@ -29,11 +29,8 @@ import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.Settings;
import org.sonar.api.resources.Qualifiers;
import org.sonar.api.resources.Scopes;
+import org.sonar.core.purge.*;
import org.sonar.server.computation.dbcleaner.period.DefaultPeriodCleaner;
-import org.sonar.core.purge.IdUuidPair;
-import org.sonar.core.purge.PurgeConfiguration;
-import org.sonar.core.purge.PurgeDao;
-import org.sonar.core.purge.PurgeProfiler;
import org.sonar.core.resource.ResourceDao;
import org.sonar.core.resource.ResourceDto;
@@ -80,7 +77,7 @@ public class DefaultPurgeTaskTest {
PurgeConfiguration conf = (PurgeConfiguration) o;
return conf.rootProjectId() == 1L && conf.scopesWithoutHistoricalData().length == 1 && conf.scopesWithoutHistoricalData()[0].equals(Scopes.FILE);
}
- }));
+ }), any(PurgeListener.class));
}
@Test
@@ -100,25 +97,25 @@ public class DefaultPurgeTaskTest {
conf.scopesWithoutHistoricalData()[0].equals(Scopes.DIRECTORY) &&
conf.scopesWithoutHistoricalData()[1].equals(Scopes.FILE);
}
- }));
+ }), any(PurgeListener.class));
}
@Test
public void shouldNotFailOnErrors() {
PurgeDao purgeDao = mock(PurgeDao.class);
- when(purgeDao.purge(any(PurgeConfiguration.class))).thenThrow(new RuntimeException());
+ when(purgeDao.purge(any(PurgeConfiguration.class),any(PurgeListener.class))).thenThrow(new RuntimeException());
DefaultPurgeTask task = new DefaultPurgeTask(purgeDao, resourceDao, new Settings(), mock(DefaultPeriodCleaner.class), mock(PurgeProfiler.class));
task.purge(1L);
- verify(purgeDao, times(1)).purge(any(PurgeConfiguration.class));
+ verify(purgeDao, times(1)).purge(any(PurgeConfiguration.class), any(PurgeListener.class));
}
@Test
public void shouldDumpProfiling() {
PurgeConfiguration conf = new PurgeConfiguration(1L, new String[0], 30);
PurgeDao purgeDao = mock(PurgeDao.class);
- when(purgeDao.purge(conf)).thenThrow(new RuntimeException());
+ when(purgeDao.purge(conf, PurgeListener.EMPTY)).thenThrow(new RuntimeException());
Settings settings = new Settings(new PropertyDefinitions(DataCleanerProperties.all()));
settings.setProperty(CoreProperties.PROFILING_LOG_PROPERTY, true);
PurgeProfiler profiler = mock(PurgeProfiler.class);