diff options
author | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2014-12-03 18:42:09 +0100 |
---|---|---|
committer | Teryk Bellahsene <teryk.bellahsene@sonarsource.com> | 2014-12-03 18:51:45 +0100 |
commit | cae9b3a92fe86d9a1e9a243570229d9e40ebd341 (patch) | |
tree | f21054aa32feaa6b8ab07f26d723657609b51788 /sonar-core | |
parent | 1c6c5ac69aed0f7dd35f5007105ed9ac6f1f568d (diff) | |
download | sonarqube-cae9b3a92fe86d9a1e9a243570229d9e40ebd341.tar.gz sonarqube-cae9b3a92fe86d9a1e9a243570229d9e40ebd341.zip |
SONAR-5804 fix source lines purge of multi module projects
Diffstat (limited to 'sonar-core')
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); |