From 4c64f4f00be61229d4c4c8be8f8bec9b25df2bac Mon Sep 17 00:00:00 2001 From: Teryk Bellahsene Date: Thu, 23 Oct 2014 17:15:00 +0200 Subject: [PATCH] SONAR-5628 - Compute Engine - Move DbCleaner --- .../plugins/dbcleaner/DbCleanerPlugin.java | 89 ++------------- .../dbcleaner/DeprecatedDefaultPurgeTask.java | 52 +++++++++ .../dbcleaner/api/DbCleanerConstants.java | 13 +-- .../plugins/dbcleaner/api/PurgeTask.java | 6 +- .../computation/AnalysisReportQueue.java | 1 - .../AnalysisReportTaskLauncher.java | 18 +-- .../computation/ComputationService.java | 17 +-- ...isReportStep.java => ComputationStep.java} | 2 +- .../computation/ComputationStepRegistry.java | 44 ++++++++ .../server/computation/DbCleanerStep.java | 21 ++-- .../computation/GetAndSetProjectStep.java | 41 +++++++ .../computation/IndexProjectIssuesStep.java | 2 +- .../computation/SwitchSnapshotStep.java | 2 +- .../SynchronizeProjectPermissionsStep.java | 18 +-- .../server/platform/ServerComponents.java | 15 ++- .../AnalysisReportLogMediumTest.java | 5 +- .../AnalysisReportQueueMediumTest.java | 2 + .../computation/ComputationServiceTest.java | 33 +++--- .../ComputationStepRegistryTest.java | 53 +++++++++ .../server/computation/DbCleanStepTest.java | 41 +++++++ .../server/computation/DbCleanerStepTest.java | 56 ++++++++++ .../computation/GetAndSetProjectStepTest.java | 67 +++++++++++ ...onizeProjectPermissionsStepMediumTest.java | 3 + .../computation/db/AnalysisReportDaoTest.java | 6 +- .../ws/ActiveAnalysisReportsActionTest.java | 1 - .../any-analysis-reports.xml | 3 - ..._having_one_working_on_another_project.xml | 2 - .../AnalysisReportDaoTest/insert-result.xml | 4 +- .../one_analysis_report.xml | 1 - .../one_available_analysis.xml | 2 - ...lysis_but_another_busy_on_same_project.xml | 2 - .../one_busy_report_analysis.xml | 1 - .../select-with-no-available-report.xml | 3 - .../db/AnalysisReportDaoTest/select.xml | 3 - .../select_oldest_available_report.xml | 3 - ...able_report_with_working_reports_older.xml | 3 - .../three_analysis_reports.xml | 3 - .../update-all-to-status-pending-result.xml | 6 +- .../update-all-to-status-pending.xml | 3 - .../list_active_reports.json | 2 +- .../computation/db/AnalysisReportDto.java | 25 +++-- .../dbcleaner/DbCleanerConstants.java | 34 ++++++ .../dbcleaner/DbCleanerProperties.java | 105 ++++++++++++++++++ .../dbcleaner/DefaultPurgeTask.java | 15 +-- .../period/DefaultPeriodCleaner.java | 3 +- .../dbcleaner/period/DeleteAllFilter.java | 3 +- .../computation}/dbcleaner/period/Filter.java | 3 +- .../dbcleaner/period/Filters.java | 13 ++- .../dbcleaner/period/Interval.java | 3 +- .../dbcleaner/period/KeepOneFilter.java | 3 +- .../dbcleaner/period/package-info.java | 3 +- .../core/config/CorePropertyDefinitions.java | 4 +- .../computation/db/AnalysisReportMapper.xml | 5 +- .../dbcleaner/DbCleanerPropertiesTest.java | 7 +- .../dbcleaner/DbCleanerTestUtils.java | 3 +- .../dbcleaner/DefaultPurgeTaskTest.java | 19 ++-- .../period/DefaultPeriodCleanerTest.java | 8 +- .../dbcleaner/period/DeleteAllFilterTest.java | 5 +- .../dbcleaner/period/IntervalTest.java | 35 +++--- .../dbcleaner/period/KeepOneFilterTest.java | 23 ++-- 60 files changed, 680 insertions(+), 288 deletions(-) create mode 100644 plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DeprecatedDefaultPurgeTask.java rename server/sonar-server/src/main/java/org/sonar/server/computation/{AnalysisReportStep.java => ComputationStep.java} (94%) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/ComputationStepRegistry.java rename plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/ProjectPurgePostJob.java => server/sonar-server/src/main/java/org/sonar/server/computation/DbCleanerStep.java (64%) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/GetAndSetProjectStep.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/ComputationStepRegistryTest.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/DbCleanStepTest.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/DbCleanerStepTest.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/GetAndSetProjectStepTest.java create mode 100644 sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DbCleanerConstants.java create mode 100644 sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DbCleanerProperties.java rename {plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins => sonar-core/src/main/java/org/sonar/core/computation}/dbcleaner/DefaultPurgeTask.java (89%) rename {plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins => sonar-core/src/main/java/org/sonar/core/computation}/dbcleaner/period/DefaultPeriodCleaner.java (98%) rename {plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins => sonar-core/src/main/java/org/sonar/core/computation}/dbcleaner/period/DeleteAllFilter.java (96%) rename {plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins => sonar-core/src/main/java/org/sonar/core/computation}/dbcleaner/period/Filter.java (95%) rename {plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins => sonar-core/src/main/java/org/sonar/core/computation}/dbcleaner/period/Filters.java (95%) rename {plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins => sonar-core/src/main/java/org/sonar/core/computation}/dbcleaner/period/Interval.java (97%) rename {plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins => sonar-core/src/main/java/org/sonar/core/computation}/dbcleaner/period/KeepOneFilter.java (98%) rename {plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins => sonar-core/src/main/java/org/sonar/core/computation}/dbcleaner/period/package-info.java (94%) rename plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DbCleanerPluginTest.java => sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DbCleanerPropertiesTest.java (87%) rename {plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins => sonar-core/src/test/java/org/sonar/core/computation}/dbcleaner/DbCleanerTestUtils.java (97%) rename {plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins => sonar-core/src/test/java/org/sonar/core/computation}/dbcleaner/DefaultPurgeTaskTest.java (90%) rename {plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins => sonar-core/src/test/java/org/sonar/core/computation}/dbcleaner/period/DefaultPeriodCleanerTest.java (93%) rename {plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins => sonar-core/src/test/java/org/sonar/core/computation}/dbcleaner/period/DeleteAllFilterTest.java (93%) rename {plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins => sonar-core/src/test/java/org/sonar/core/computation}/dbcleaner/period/IntervalTest.java (93%) rename {plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins => sonar-core/src/test/java/org/sonar/core/computation}/dbcleaner/period/KeepOneFilterTest.java (95%) diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DbCleanerPlugin.java b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DbCleanerPlugin.java index 01397e6be89..56cad6f8a84 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DbCleanerPlugin.java +++ b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DbCleanerPlugin.java @@ -17,98 +17,27 @@ * 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.plugins.dbcleaner; import com.google.common.collect.ImmutableList; -import org.sonar.api.CoreProperties; -import org.sonar.api.PropertyType; +import com.google.common.collect.Lists; import org.sonar.api.SonarPlugin; import org.sonar.api.config.PropertyDefinition; -import org.sonar.api.resources.Qualifiers; -import org.sonar.plugins.dbcleaner.api.DbCleanerConstants; -import org.sonar.plugins.dbcleaner.period.DefaultPeriodCleaner; +import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner; -import java.util.Arrays; import java.util.List; +@Deprecated public final class DbCleanerPlugin extends SonarPlugin { + static List propertyDefinitions() { + return Lists.newArrayList(); + } + @Override public List getExtensions() { - return ImmutableList.builder().add(DefaultPeriodCleaner.class, DefaultPurgeTask.class, ProjectPurgePostJob.class) + return ImmutableList.builder().add(DefaultPeriodCleaner.class, DeprecatedDefaultPurgeTask.class) .addAll(propertyDefinitions()).build(); } - - static List propertyDefinitions() { - return Arrays.asList( - PropertyDefinition.builder(DbCleanerConstants.PROPERTY_CLEAN_DIRECTORY) - .defaultValue("true") - .name("Clean directory/package history") - .description("If set to true, no history is kept at directory/package level. Setting this to false can cause database bloat.") - .type(PropertyType.BOOLEAN) - .onQualifiers(Qualifiers.PROJECT) - .category(CoreProperties.CATEGORY_GENERAL) - .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) - .index(1) - .build(), - - PropertyDefinition.builder(DbCleanerConstants.DAYS_BEFORE_DELETING_CLOSED_ISSUES) - .defaultValue("30") - .name("Delete closed issues after") - .description("Issues that have been closed for more than this number of days will be deleted.") - .type(PropertyType.INTEGER) - .onQualifiers(Qualifiers.PROJECT) - .category(CoreProperties.CATEGORY_GENERAL) - .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) - .index(2) - .build(), - - PropertyDefinition.builder(DbCleanerConstants.HOURS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_DAY) - .defaultValue("24") - .name("Keep only one snapshot a day after") - .description("After this number of hours, if there are several snapshots during the same day, " - + "the DbCleaner keeps the most recent one and fully deletes the other ones.") - .type(PropertyType.INTEGER) - .onQualifiers(Qualifiers.PROJECT) - .category(CoreProperties.CATEGORY_GENERAL) - .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) - .index(3) - .build(), - - PropertyDefinition.builder(DbCleanerConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_WEEK) - .defaultValue("4") - .name("Keep only one snapshot a week after") - .description("After this number of weeks, if there are several snapshots during the same week, " - + "the DbCleaner keeps the most recent one and fully deletes the other ones") - .type(PropertyType.INTEGER) - .onQualifiers(Qualifiers.PROJECT) - .category(CoreProperties.CATEGORY_GENERAL) - .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) - .index(4) - .build(), - - PropertyDefinition.builder(DbCleanerConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_MONTH) - .defaultValue("52") - .name("Keep only one snapshot a month after") - .description("After this number of weeks, if there are several snapshots during the same month, " - + "the DbCleaner keeps the most recent one and fully deletes the other ones.") - .type(PropertyType.INTEGER) - .onQualifiers(Qualifiers.PROJECT) - .category(CoreProperties.CATEGORY_GENERAL) - .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) - .index(5) - .build(), - - PropertyDefinition.builder(DbCleanerConstants.WEEKS_BEFORE_DELETING_ALL_SNAPSHOTS) - .defaultValue("260") - .name("Delete all snapshots after") - .description("After this number of weeks, all snapshots are fully deleted.") - .type(PropertyType.INTEGER) - .onQualifiers(Qualifiers.PROJECT) - .category(CoreProperties.CATEGORY_GENERAL) - .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) - .index(6) - .build() - ); - } } diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DeprecatedDefaultPurgeTask.java b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DeprecatedDefaultPurgeTask.java new file mode 100644 index 00000000000..50e340bc1c1 --- /dev/null +++ b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DeprecatedDefaultPurgeTask.java @@ -0,0 +1,52 @@ +/* + * 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.plugins.dbcleaner; + +import org.sonar.api.config.Settings; +import org.sonar.core.computation.dbcleaner.DefaultPurgeTask; +import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner; +import org.sonar.core.purge.PurgeDao; +import org.sonar.core.purge.PurgeProfiler; +import org.sonar.plugins.dbcleaner.api.PurgeTask; + +/** + * @since 2.14 + */ +@Deprecated +public class DeprecatedDefaultPurgeTask implements PurgeTask { + private final DefaultPurgeTask defaultPurgeTask; + + public DeprecatedDefaultPurgeTask(PurgeDao purgeDao, Settings settings, DefaultPeriodCleaner periodCleaner, PurgeProfiler profiler) { + defaultPurgeTask = new DefaultPurgeTask(purgeDao, settings, periodCleaner, profiler); + } + + @Override + public DeprecatedDefaultPurgeTask delete(long resourceId) { + defaultPurgeTask.delete(resourceId); + return this; + } + + @Override + public DeprecatedDefaultPurgeTask purge(long resourceId) { + defaultPurgeTask.purge(resourceId); + return this; + } +} diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/DbCleanerConstants.java b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/DbCleanerConstants.java index 7f77420e2f8..881fca768a3 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/DbCleanerConstants.java +++ b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/DbCleanerConstants.java @@ -19,15 +19,6 @@ */ package org.sonar.plugins.dbcleaner.api; -public interface DbCleanerConstants { - - String PLUGIN_KEY = "dbcleaner"; - String PLUGIN_NAME = "DbCleaner"; - String PROPERTY_CLEAN_DIRECTORY = "sonar.dbcleaner.cleanDirectory"; - - String HOURS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_DAY = "sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay"; - String WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_WEEK = "sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByWeek"; - String WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_MONTH = "sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByMonth"; - String WEEKS_BEFORE_DELETING_ALL_SNAPSHOTS = "sonar.dbcleaner.weeksBeforeDeletingAllSnapshots"; - String DAYS_BEFORE_DELETING_CLOSED_ISSUES = "sonar.dbcleaner.daysBeforeDeletingClosedIssues"; +@Deprecated +public interface DbCleanerConstants extends org.sonar.core.computation.dbcleaner.DbCleanerConstants { } diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/PurgeTask.java b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/PurgeTask.java index eec483cc45e..810608f6069 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/PurgeTask.java +++ b/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/api/PurgeTask.java @@ -19,18 +19,18 @@ */ package org.sonar.plugins.dbcleaner.api; -import org.sonar.api.task.TaskExtension; - import com.google.common.annotations.Beta; +import org.sonar.api.task.TaskExtension; /** * @since 2.14 */ @Beta +@Deprecated public interface PurgeTask extends TaskExtension { /** * Purges the data related to a tree of resources. - * + *

* Exceptions are logged and are not thrown again, so this method fails only on {@link Error}s. * * @param resourceId the root of the tree 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 06a721129db..2f2f78a39ee 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 @@ -69,7 +69,6 @@ public class AnalysisReportQueue implements ServerComponent { private AnalysisReportDto newPendingAnalysisReport(String projectKey) { return new AnalysisReportDto() .setProjectKey(projectKey) - .setProjectName(projectKey) .setStatus(PENDING); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskLauncher.java b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskLauncher.java index 642b5d9adb1..f2cf9c3f584 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskLauncher.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportTaskLauncher.java @@ -50,13 +50,7 @@ public class AnalysisReportTaskLauncher implements Startable, ServerComponent, S public AnalysisReportTaskLauncher(ComputationService service, AnalysisReportQueue queue) { this.service = service; this.queue = queue; - - // all threads are named "ar-xxx", so they can have a dedicated logging output - // (see SwitchLogbackAppender) - ThreadFactory namedThreadFactory = new ThreadFactoryBuilder() - .setNameFormat(ANALYSIS_REPORT_THREAD_NAME_PREFIX + "%d").setPriority(Thread.MIN_PRIORITY).build(); - - this.executorService = Executors.newSingleThreadScheduledExecutor(namedThreadFactory); + this.executorService = Executors.newSingleThreadScheduledExecutor(threadFactoryWithSpecificNameForLogging()); this.delayBetweenTasks = 10; this.delayForFirstStart = 0; @@ -66,7 +60,7 @@ public class AnalysisReportTaskLauncher implements Startable, ServerComponent, S @VisibleForTesting AnalysisReportTaskLauncher(ComputationService service, AnalysisReportQueue queue, long delayForFirstStart, long delayBetweenTasks, TimeUnit timeUnit) { this.queue = queue; - this.executorService = Executors.newSingleThreadScheduledExecutor(); + this.executorService = Executors.newSingleThreadScheduledExecutor(threadFactoryWithSpecificNameForLogging()); this.delayBetweenTasks = delayBetweenTasks; this.delayForFirstStart = delayForFirstStart; @@ -74,6 +68,14 @@ public class AnalysisReportTaskLauncher implements Startable, ServerComponent, S this.service = service; } + /** + * @see org.sonar.server.platform.SwitchLogbackAppender + */ + private ThreadFactory threadFactoryWithSpecificNameForLogging() { + return new ThreadFactoryBuilder() + .setNameFormat(ANALYSIS_REPORT_THREAD_NAME_PREFIX + "%d").setPriority(Thread.MIN_PRIORITY).build(); + } + @Override public void start() { // do nothing because we want to wait for the server to finish startup 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 e0dc2742290..f0cd88be1f0 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 @@ -31,16 +31,11 @@ import org.sonar.server.db.DbClient; */ public class ComputationService implements ServerComponent { private final DbClient dbClient; - private final SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep; - private final IndexProjectIssuesStep indexProjectIssuesStep; - private final SwitchSnapshotStep switchSnapshotStep; + private final ComputationStepRegistry stepRegistry; - public ComputationService(DbClient dbClient, SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep, - IndexProjectIssuesStep indexProjectIssuesStep, SwitchSnapshotStep switchSnapshotStep) { + public ComputationService(DbClient dbClient, ComputationStepRegistry stepRegistry) { this.dbClient = dbClient; - this.synchronizeProjectPermissionsStep = synchronizeProjectPermissionsStep; - this.indexProjectIssuesStep = indexProjectIssuesStep; - this.switchSnapshotStep = switchSnapshotStep; + this.stepRegistry = stepRegistry; } public void analyzeReport(AnalysisReportDto report) { @@ -48,9 +43,9 @@ public class ComputationService implements ServerComponent { DbSession session = dbClient.openSession(true); try { - synchronizeProjectPermissionsStep.execute(session, report); - indexProjectIssuesStep.execute(session, report); - switchSnapshotStep.execute(session, report); + for (ComputationStep step : stepRegistry.steps()) { + step.execute(session, report); + } } finally { MyBatis.closeQuietly(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/ComputationStep.java similarity index 94% rename from server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportStep.java rename to server/sonar-server/src/main/java/org/sonar/server/computation/ComputationStep.java index 2408bf3b402..d4cb50bda25 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/AnalysisReportStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationStep.java @@ -24,6 +24,6 @@ import org.sonar.api.ServerComponent; import org.sonar.core.computation.db.AnalysisReportDto; import org.sonar.core.persistence.DbSession; -public interface AnalysisReportStep extends ServerComponent { +public interface ComputationStep extends ServerComponent { void execute(DbSession session, AnalysisReportDto analysisReportDto); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationStepRegistry.java b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationStepRegistry.java new file mode 100644 index 00000000000..c4f21a948ef --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/ComputationStepRegistry.java @@ -0,0 +1,44 @@ +/* + * 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.ImmutableList; +import org.sonar.api.ServerComponent; + +import java.util.List; + +public class ComputationStepRegistry implements ServerComponent { + + private final List steps; + + public ComputationStepRegistry( + GetAndSetProjectStep getAndSetProjectStep, + SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep, + IndexProjectIssuesStep indexProjectIssuesStep, + SwitchSnapshotStep switchSnapshotStep, + DbCleanerStep dbCleanerStep) { + steps = ImmutableList.of(getAndSetProjectStep, synchronizeProjectPermissionsStep, indexProjectIssuesStep, switchSnapshotStep, dbCleanerStep); + } + + public List steps() { + return steps; + } +} diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/ProjectPurgePostJob.java b/server/sonar-server/src/main/java/org/sonar/server/computation/DbCleanerStep.java similarity index 64% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/ProjectPurgePostJob.java rename to server/sonar-server/src/main/java/org/sonar/server/computation/DbCleanerStep.java index 1a412bcda8a..6556b5cb28f 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/ProjectPurgePostJob.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/DbCleanerStep.java @@ -17,25 +17,22 @@ * 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.plugins.dbcleaner; -import org.sonar.api.batch.PostJob; -import org.sonar.api.batch.SensorContext; -import org.sonar.api.resources.Project; -import org.sonar.core.DryRunIncompatible; -import org.sonar.plugins.dbcleaner.api.PurgeTask; +package org.sonar.server.computation; -@DryRunIncompatible -public class ProjectPurgePostJob implements PostJob { +import org.sonar.core.computation.db.AnalysisReportDto; +import org.sonar.core.computation.dbcleaner.DefaultPurgeTask; +import org.sonar.core.persistence.DbSession; - private PurgeTask purgeTask; +public class DbCleanerStep implements ComputationStep { + private final DefaultPurgeTask purgeTask; - public ProjectPurgePostJob(PurgeTask purgeTask) { + public DbCleanerStep(DefaultPurgeTask purgeTask) { this.purgeTask = purgeTask; } @Override - public void executeOn(final Project project, SensorContext context) { - purgeTask.purge(project.getId()); + public void execute(DbSession session, AnalysisReportDto report) { + purgeTask.purge(report.getProject().getId()); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/GetAndSetProjectStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/GetAndSetProjectStep.java new file mode 100644 index 00000000000..7eb4091cab2 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/GetAndSetProjectStep.java @@ -0,0 +1,41 @@ +/* + * 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.ComponentDto; +import org.sonar.core.computation.db.AnalysisReportDto; +import org.sonar.core.persistence.DbSession; +import org.sonar.server.db.DbClient; + +public class GetAndSetProjectStep implements ComputationStep { + + private final DbClient dbClient; + + public GetAndSetProjectStep(DbClient dbClient) { + this.dbClient = dbClient; + } + + @Override + public void execute(DbSession session, AnalysisReportDto report) { + ComponentDto project = dbClient.componentDao().getByKey(session, report.getProjectKey()); + report.setProject(project); + } +} 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 index f49ad6c3fea..96fa7abbf3b 100644 --- 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 @@ -27,7 +27,7 @@ import org.sonar.server.db.DbClient; import org.sonar.server.issue.index.IssueIndex; import org.sonar.server.search.IndexClient; -public class IndexProjectIssuesStep implements AnalysisReportStep { +public class IndexProjectIssuesStep implements ComputationStep { private final DbClient dbClient; private final IndexClient index; 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 index 7e0f0a6e955..368aeeed362 100644 --- 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 @@ -27,7 +27,7 @@ import org.sonar.server.component.db.SnapshotDao; import java.util.List; -public class SwitchSnapshotStep implements AnalysisReportStep { +public class SwitchSnapshotStep implements ComputationStep { private SnapshotDao dao; 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 index 65efcd21924..14f0b44cf33 100644 --- 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 @@ -20,36 +20,30 @@ package org.sonar.server.computation; -import org.sonar.core.component.AuthorizedComponentDto; 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.IssueAuthorizationIndex; import org.sonar.server.permission.InternalPermissionService; import org.sonar.server.search.IndexClient; -public class SynchronizeProjectPermissionsStep implements AnalysisReportStep { +public class SynchronizeProjectPermissionsStep implements ComputationStep { private final IndexClient index; - private final DbClient dbClient; private final InternalPermissionService permissionService; - public SynchronizeProjectPermissionsStep(IndexClient index, DbClient dbClient, InternalPermissionService permissionService) { + public SynchronizeProjectPermissionsStep(IndexClient index, InternalPermissionService permissionService) { this.index = index; - this.dbClient = dbClient; this.permissionService = permissionService; } @Override public void execute(DbSession session, AnalysisReportDto report) { - synchronizeProjectPermissionsIfNotFound(session, report.getProjectKey()); + synchronizeProjectPermissionsIfNotFound(session, report); } - private void synchronizeProjectPermissionsIfNotFound(DbSession session, String projectKey) { - if (index.get(IssueAuthorizationIndex.class).getNullableByKey(projectKey) == null) { - // TODO Remove this db call by inserting the project uuid in the report - AuthorizedComponentDto project = dbClient.componentDao().getAuthorizedComponentByKey(projectKey, session); - permissionService.synchronizePermissions(session, project.uuid()); + private void synchronizeProjectPermissionsIfNotFound(DbSession session, AnalysisReportDto report) { + if (index.get(IssueAuthorizationIndex.class).getNullableByKey(report.getProjectKey()) == null) { + permissionService.synchronizePermissions(session, report.getProject().uuid()); 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 dd8b3a9877d..0288b69d3bb 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 @@ -37,6 +37,8 @@ import org.sonar.api.utils.System2; import org.sonar.api.utils.UriReader; import org.sonar.api.utils.internal.TempFolderCleaner; import org.sonar.core.component.SnapshotPerspectives; +import org.sonar.core.computation.dbcleaner.DefaultPurgeTask; +import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner; import org.sonar.core.config.CorePropertyDefinitions; import org.sonar.core.config.Logback; import org.sonar.core.i18n.DefaultI18n; @@ -271,7 +273,7 @@ class ServerComponents { ActivityNormalizer.class, ActivityIndex.class, ActivityDao.class - )); + )); components.addAll(CorePropertyDefinitions.all()); components.addAll(DatabaseMigrations.CLASSES); components.addAll(DaoUtils.getDaoClasses()); @@ -304,7 +306,7 @@ class ServerComponents { // ws RestartHandler.class, SystemWs.class - ); + ); } /** @@ -321,7 +323,7 @@ class ServerComponents { HttpDownloader.class, UriReader.class, ServerIdGenerator.class - ); + ); } void startLevel4Components(ComponentContainer pico) { @@ -591,15 +593,20 @@ class ServerComponents { // Compute engine pico.addSingleton(ComputationService.class); - pico.addSingleton(SwitchSnapshotStep.class); + pico.addSingleton(ComputationStepRegistry.class); + pico.addSingleton(GetAndSetProjectStep.class); pico.addSingleton(SynchronizeProjectPermissionsStep.class); pico.addSingleton(IndexProjectIssuesStep.class); + pico.addSingleton(SwitchSnapshotStep.class); + pico.addSingleton(DbCleanerStep.class); pico.add(AnalysisReportQueue.class); pico.addSingleton(AnalysisReportTaskLauncher.class); pico.addSingleton(AnalysisReportWebService.class); pico.addSingleton(ActiveAnalysisReportsAction.class); pico.addSingleton(IsAnalysisReportQueueEmptyAction.class); pico.addSingleton(AnalysisReportHistorySearchAction.class); + pico.addSingleton(DefaultPurgeTask.class); + pico.addSingleton(DefaultPeriodCleaner.class); for (Object components : level4AddedComponents) { pico.addSingleton(components); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java index 0e4f2363a8c..bf98168e8b2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/AnalysisReportLogMediumTest.java @@ -31,6 +31,7 @@ import org.sonar.core.computation.db.AnalysisReportDto; import org.sonar.core.persistence.DbSession; import org.sonar.server.activity.ActivityService; import org.sonar.server.activity.index.ActivityIndex; +import org.sonar.server.component.ComponentTesting; import org.sonar.server.db.DbClient; import org.sonar.server.tester.ServerTester; @@ -65,12 +66,12 @@ public class AnalysisReportLogMediumTest { public void insert_find_analysis_report_log() { AnalysisReportDto report = AnalysisReportDto.newForTests(1L) .setProjectKey("projectKey") - .setProjectName("projectName") .setStatus(FAILED) .setCreatedAt(DateUtils.parseDate("2014-10-15")) .setUpdatedAt(DateUtils.parseDate("2014-10-16")) .setStartedAt(DateUtils.parseDate("2014-10-17")) - .setFinishedAt(DateUtils.parseDate("2014-10-18")); + .setFinishedAt(DateUtils.parseDate("2014-10-18")) + .setProject(ComponentTesting.newProjectDto()); service.write(dbSession, ANALYSIS_REPORT, new AnalysisReportLog(report)); dbSession.commit(); 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 050330acba4..2e12107a20b 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 @@ -35,6 +35,7 @@ import org.sonar.core.persistence.DbSession; import org.sonar.core.persistence.MyBatis; import org.sonar.core.user.UserDto; import org.sonar.server.activity.index.ActivityIndex; +import org.sonar.server.component.ComponentTesting; import org.sonar.server.db.DbClient; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.tester.ServerTester; @@ -155,6 +156,7 @@ public class AnalysisReportQueueMediumTest { insertPermissionsForProject(DEFAULT_PROJECT_KEY); sut.add(DEFAULT_PROJECT_KEY, 123L); AnalysisReportDto report = sut.bookNextAvailable(); + report.setProject(ComponentTesting.newProjectDto()); report.setStatus(SUCCESS); sut.remove(report); 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 index 2910df14971..9a99ec197fb 100644 --- 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 @@ -20,6 +20,7 @@ package org.sonar.server.computation; +import com.google.common.collect.Lists; import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; @@ -35,36 +36,30 @@ public class ComputationServiceTest { private ComputationService sut; private DbClient dbClient; - private IndexProjectIssuesStep indexProjectIssuesStep; - private SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep; - private SwitchSnapshotStep switchSnapshotStep; + private ComputationStepRegistry stepRegistry; @Before public void before() { this.dbClient = mock(DbClient.class); + this.stepRegistry = mock(ComputationStepRegistry.class); - this.indexProjectIssuesStep = mock(IndexProjectIssuesStep.class); - this.synchronizeProjectPermissionsStep = mock(SynchronizeProjectPermissionsStep.class); - this.switchSnapshotStep = mock(SwitchSnapshotStep.class); - - this.sut = new ComputationService(dbClient, synchronizeProjectPermissionsStep, indexProjectIssuesStep, switchSnapshotStep); + this.sut = new ComputationService(dbClient, stepRegistry); } @Test - public void all_my_steps_are_called_in_the_right_order() { - sut.analyzeReport(AnalysisReportDto.newForTests(1L)); + public void call_execute_method_of_my_registry() { + ComputationStep firstStep = mock(ComputationStep.class); + ComputationStep secondStep = mock(ComputationStep.class); + ComputationStep thirdStep = mock(ComputationStep.class); - InOrder inOrder = inOrder(indexProjectIssuesStep, synchronizeProjectPermissionsStep, switchSnapshotStep); + when(stepRegistry.steps()).thenReturn(Lists.newArrayList(firstStep, secondStep, thirdStep)); - 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)); - } + sut.analyzeReport(AnalysisReportDto.newForTests(1L)); - @Test(expected = IllegalStateException.class) - public void computation_service_rethrows_exceptions() { - doThrow(IllegalStateException.class).when(switchSnapshotStep).execute(any(DbSession.class), any(AnalysisReportDto.class)); + InOrder order = inOrder(firstStep, secondStep, thirdStep); - sut.analyzeReport(AnalysisReportDto.newForTests(1L)); + order.verify(firstStep).execute(any(DbSession.class), any(AnalysisReportDto.class)); + order.verify(secondStep).execute(any(DbSession.class), any(AnalysisReportDto.class)); + order.verify(thirdStep).execute(any(DbSession.class), any(AnalysisReportDto.class)); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationStepRegistryTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationStepRegistryTest.java new file mode 100644 index 00000000000..506db4804dc --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ComputationStepRegistryTest.java @@ -0,0 +1,53 @@ +/* + * 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 static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Mockito.mock; + +public class ComputationStepRegistryTest { + + private ComputationStepRegistry sut; + private GetAndSetProjectStep getAndSetProjectStep; + private SynchronizeProjectPermissionsStep synchronizeProjectPermissionsStep; + private IndexProjectIssuesStep indexProjectIssuesStep; + private SwitchSnapshotStep switchSnapshotStep; + private DbCleanerStep dbCleanerStep; + + @Before + public void before() { + getAndSetProjectStep = mock(GetAndSetProjectStep.class); + synchronizeProjectPermissionsStep = mock(SynchronizeProjectPermissionsStep.class); + indexProjectIssuesStep = mock(IndexProjectIssuesStep.class); + switchSnapshotStep = mock(SwitchSnapshotStep.class); + dbCleanerStep = mock(DbCleanerStep.class); + + sut = new ComputationStepRegistry(getAndSetProjectStep, synchronizeProjectPermissionsStep, indexProjectIssuesStep, switchSnapshotStep, dbCleanerStep); + } + + @Test + public void steps_returned_in_the_right_order() throws Exception { + assertThat(sut.steps()).containsExactly(getAndSetProjectStep, synchronizeProjectPermissionsStep, indexProjectIssuesStep, switchSnapshotStep, dbCleanerStep); + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/DbCleanStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/DbCleanStepTest.java new file mode 100644 index 00000000000..8e092313b50 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/DbCleanStepTest.java @@ -0,0 +1,41 @@ +/* + * 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.sonar.api.config.Settings; +import org.sonar.core.computation.dbcleaner.DefaultPurgeTask; +import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner; +import org.sonar.core.purge.PurgeDao; +import org.sonar.core.purge.PurgeProfiler; + +import static org.mockito.Mockito.mock; + +public class DbCleanStepTest { + + private DbCleanerStep sut; + + @Before + public void before() { + sut = new DbCleanerStep(new DefaultPurgeTask(mock(PurgeDao.class), mock(Settings.class), mock(DefaultPeriodCleaner.class), mock(PurgeProfiler.class))); + } + +} \ No newline at end of file diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/DbCleanerStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/DbCleanerStepTest.java new file mode 100644 index 00000000000..ec6a4373d54 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/DbCleanerStepTest.java @@ -0,0 +1,56 @@ +/* + * 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.sonar.core.component.AuthorizedComponentDto; +import org.sonar.core.computation.db.AnalysisReportDto; +import org.sonar.core.computation.dbcleaner.DefaultPurgeTask; +import org.sonar.core.persistence.DbSession; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class DbCleanerStepTest { + + private DbCleanerStep sut; + private DefaultPurgeTask purgeTask; + + @Before + public void before() { + this.purgeTask = mock(DefaultPurgeTask.class); + this.sut = new DbCleanerStep(purgeTask); + } + + @Test + public void call_purge_method_of_the_purge_task() { + AnalysisReportDto report = mock(AnalysisReportDto.class); + when(report.getProject()).thenReturn(mock(AuthorizedComponentDto.class)); + + sut.execute(mock(DbSession.class), report); + + verify(purgeTask).purge(any(Long.class)); + } + +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/GetAndSetProjectStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/GetAndSetProjectStepTest.java new file mode 100644 index 00000000000..561559d44d1 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/GetAndSetProjectStepTest.java @@ -0,0 +1,67 @@ +/* + * 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.sonar.core.component.ComponentDto; +import org.sonar.core.computation.db.AnalysisReportDto; +import org.sonar.core.persistence.DbSession; +import org.sonar.server.component.ComponentTesting; +import org.sonar.server.component.db.ComponentDao; +import org.sonar.server.db.DbClient; + +import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class GetAndSetProjectStepTest { + + private GetAndSetProjectStep sut; + private DbClient dbClient; + private ComponentDto project; + private DbSession session; + + @Before + public void before() { + this.dbClient = mock(DbClient.class); + this.session = mock(DbSession.class); + this.project = ComponentTesting.newProjectDto(); + + ComponentDao componentDao = mock(ComponentDao.class); + when(dbClient.componentDao()).thenReturn(componentDao); + when(componentDao.getByKey(any(DbSession.class), anyString())).thenReturn(project); + + this.sut = new GetAndSetProjectStep(dbClient); + } + + @Test + public void set_project_return_by_dbclient() { + AnalysisReportDto report = new AnalysisReportDto().setProjectKey("123-456-789"); + + sut.execute(session, report); + + assertThat(report.getProject()).isEqualTo(project); + } + +} 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 index 99edc5f88f9..c248b93e786 100644 --- 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 @@ -53,6 +53,7 @@ public class SynchronizeProjectPermissionsStepMediumTest { private SynchronizeProjectPermissionsStep sut; private AnalysisReportQueue queue; + private GetAndSetProjectStep getAndSetProjectStep; private DbClient db; private DbSession session; private MockUserSession userSession; @@ -63,6 +64,7 @@ public class SynchronizeProjectPermissionsStepMediumTest { db = tester.get(DbClient.class); session = db.openSession(false); queue = tester.get(AnalysisReportQueue.class); + getAndSetProjectStep = tester.get(GetAndSetProjectStep.class); sut = tester.get(SynchronizeProjectPermissionsStep.class); @@ -88,6 +90,7 @@ public class SynchronizeProjectPermissionsStepMediumTest { queue.add(DEFAULT_PROJECT_KEY, 123L); List reports = queue.findByProjectKey(DEFAULT_PROJECT_KEY); + getAndSetProjectStep.execute(session, reports.get(0)); sut.execute(session, reports.get(0)); 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 5aa270e5bfb..0c78f41524c 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 @@ -59,8 +59,6 @@ public class AnalysisReportDaoTest { this.sut = new AnalysisReportDao(system2); when(system2.now()).thenReturn(DateUtils.parseDate("2014-09-26").getTime()); - - db.prepareDbUnit(getClass(), "empty.xml"); } @After @@ -70,9 +68,10 @@ public class AnalysisReportDaoTest { @Test public void insert_multiple_reports() { + db.prepareDbUnit(getClass(), "empty.xml"); + AnalysisReportDto report = new AnalysisReportDto() .setProjectKey(DEFAULT_PROJECT_KEY) - .setProjectName(DEFAULT_PROJECT_NAME) .setSnapshotId(DEFAULT_SNAPSHOT_ID) .setData("data-project") .setStatus(PENDING) @@ -169,7 +168,6 @@ public class AnalysisReportDaoTest { AnalysisReportDto report = sut.getById(session, 1L); assertThat(report.getProjectKey()).isEqualTo(DEFAULT_PROJECT_KEY); - assertThat(report.getProjectName()).isEqualTo(DEFAULT_PROJECT_NAME); assertThat(report.getCreatedAt()).isEqualTo(DateUtils.parseDate("2014-09-24")); assertThat(report.getUpdatedAt()).isEqualTo(DateUtils.parseDate("2014-09-25")); assertThat(report.getStartedAt()).isEqualTo(DateUtils.parseDate("2014-09-26")); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest.java index 56817de9884..f817a196065 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/ws/ActiveAnalysisReportsActionTest.java @@ -51,7 +51,6 @@ public class ActiveAnalysisReportsActionTest { public void list_active_reports() throws Exception { AnalysisReportDto report = AnalysisReportDto .newForTests(1L) - .setProjectName("Project Name") .setProjectKey("project-name") .setStatus(PENDING) .setData(null) 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 cb5e9a70c3f..235bdc82bf4 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 @@ -2,7 +2,6 @@ { private Long id; private String projectKey; - private String projectName; private Status status; private String data; private Long snapshotId; private Date startedAt; private Date finishedAt; + private ComponentDto project; public AnalysisReportDto() { super(); @@ -102,7 +106,6 @@ public class AnalysisReportDto extends Dto { return Objects.toStringHelper(this) .add("id", getId()) .add("projectKey", getProjectKey()) - .add("projectName", getProjectName()) .add("status", getStatus()) .add("createdAt", getCreatedAt()) .add("startedAt", getStartedAt()) @@ -111,12 +114,11 @@ public class AnalysisReportDto extends Dto { } public String getProjectName() { - return projectName; - } + if (project == null) { + return getProjectKey(); + } - public AnalysisReportDto setProjectName(String projectName) { - this.projectName = projectName; - return this; + return Strings.nullToEmpty(project.name()); } public Long getSnapshotId() { @@ -158,6 +160,15 @@ public class AnalysisReportDto extends Dto { return this; } + public AuthorizedComponentDto getProject() { + return checkNotNull(project); + } + + public AnalysisReportDto setProject(ComponentDto project) { + this.project = project; + return this; + } + public enum Status { PENDING, WORKING, SUCCESS, FAILED; diff --git a/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DbCleanerConstants.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DbCleanerConstants.java new file mode 100644 index 00000000000..a577f632608 --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DbCleanerConstants.java @@ -0,0 +1,34 @@ +/* + * 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.computation.dbcleaner; + +public interface DbCleanerConstants { + + String PLUGIN_KEY = "dbcleaner"; + String PLUGIN_NAME = "DbCleaner"; + String PROPERTY_CLEAN_DIRECTORY = "sonar.dbcleaner.cleanDirectory"; + + String HOURS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_DAY = "sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay"; + String WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_WEEK = "sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByWeek"; + String WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_MONTH = "sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByMonth"; + String WEEKS_BEFORE_DELETING_ALL_SNAPSHOTS = "sonar.dbcleaner.weeksBeforeDeletingAllSnapshots"; + String DAYS_BEFORE_DELETING_CLOSED_ISSUES = "sonar.dbcleaner.daysBeforeDeletingClosedIssues"; +} diff --git a/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DbCleanerProperties.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DbCleanerProperties.java new file mode 100644 index 00000000000..744a8873657 --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DbCleanerProperties.java @@ -0,0 +1,105 @@ +/* + * 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.computation.dbcleaner; + +import org.sonar.api.CoreProperties; +import org.sonar.api.PropertyType; +import org.sonar.api.config.PropertyDefinition; +import org.sonar.api.resources.Qualifiers; + +import java.util.Arrays; +import java.util.List; + +public final class DbCleanerProperties { + + public static List all() { + return Arrays.asList( + PropertyDefinition.builder(DbCleanerConstants.PROPERTY_CLEAN_DIRECTORY) + .defaultValue("true") + .name("Clean directory/package history") + .description("If set to true, no history is kept at directory/package level. Setting this to false can cause database bloat.") + .type(PropertyType.BOOLEAN) + .onQualifiers(Qualifiers.PROJECT) + .category(CoreProperties.CATEGORY_GENERAL) + .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) + .index(1) + .build(), + + PropertyDefinition.builder(DbCleanerConstants.DAYS_BEFORE_DELETING_CLOSED_ISSUES) + .defaultValue("30") + .name("Delete closed issues after") + .description("Issues that have been closed for more than this number of days will be deleted.") + .type(PropertyType.INTEGER) + .onQualifiers(Qualifiers.PROJECT) + .category(CoreProperties.CATEGORY_GENERAL) + .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) + .index(2) + .build(), + + PropertyDefinition.builder(DbCleanerConstants.HOURS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_DAY) + .defaultValue("24") + .name("Keep only one snapshot a day after") + .description("After this number of hours, if there are several snapshots during the same day, " + + "the DbCleaner keeps the most recent one and fully deletes the other ones.") + .type(PropertyType.INTEGER) + .onQualifiers(Qualifiers.PROJECT) + .category(CoreProperties.CATEGORY_GENERAL) + .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) + .index(3) + .build(), + + PropertyDefinition.builder(DbCleanerConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_WEEK) + .defaultValue("4") + .name("Keep only one snapshot a week after") + .description("After this number of weeks, if there are several snapshots during the same week, " + + "the DbCleaner keeps the most recent one and fully deletes the other ones") + .type(PropertyType.INTEGER) + .onQualifiers(Qualifiers.PROJECT) + .category(CoreProperties.CATEGORY_GENERAL) + .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) + .index(4) + .build(), + + PropertyDefinition.builder(DbCleanerConstants.WEEKS_BEFORE_KEEPING_ONLY_ONE_SNAPSHOT_BY_MONTH) + .defaultValue("52") + .name("Keep only one snapshot a month after") + .description("After this number of weeks, if there are several snapshots during the same month, " + + "the DbCleaner keeps the most recent one and fully deletes the other ones.") + .type(PropertyType.INTEGER) + .onQualifiers(Qualifiers.PROJECT) + .category(CoreProperties.CATEGORY_GENERAL) + .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) + .index(5) + .build(), + + PropertyDefinition.builder(DbCleanerConstants.WEEKS_BEFORE_DELETING_ALL_SNAPSHOTS) + .defaultValue("260") + .name("Delete all snapshots after") + .description("After this number of weeks, all snapshots are fully deleted.") + .type(PropertyType.INTEGER) + .onQualifiers(Qualifiers.PROJECT) + .category(CoreProperties.CATEGORY_GENERAL) + .subCategory(CoreProperties.SUBCATEGORY_DATABASE_CLEANER) + .index(6) + .build() + ); + } +} diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DefaultPurgeTask.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTask.java similarity index 89% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DefaultPurgeTask.java rename to sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTask.java index 5636515cb3e..4cd7799c297 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/DefaultPurgeTask.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTask.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner; + +package org.sonar.core.computation.dbcleaner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,17 +26,15 @@ import org.sonar.api.CoreProperties; import org.sonar.api.config.Settings; import org.sonar.api.resources.Scopes; import org.sonar.api.utils.TimeUtils; +import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner; import org.sonar.core.purge.PurgeConfiguration; import org.sonar.core.purge.PurgeDao; import org.sonar.core.purge.PurgeProfiler; -import org.sonar.plugins.dbcleaner.api.DbCleanerConstants; -import org.sonar.plugins.dbcleaner.api.PurgeTask; -import org.sonar.plugins.dbcleaner.period.DefaultPeriodCleaner; /** * @since 2.14 */ -public class DefaultPurgeTask implements PurgeTask { +public class DefaultPurgeTask { private static final Logger LOG = LoggerFactory.getLogger(DefaultPurgeTask.class); private PurgeDao purgeDao; @@ -50,14 +49,12 @@ public class DefaultPurgeTask implements PurgeTask { this.profiler = profiler; } - @Override - public PurgeTask delete(long resourceId) { + public DefaultPurgeTask delete(long resourceId) { purgeDao.deleteResourceTree(resourceId); return this; } - @Override - public PurgeTask purge(long resourceId) { + public DefaultPurgeTask purge(long resourceId) { long start = System.currentTimeMillis(); profiler.reset(); cleanHistoricalData(resourceId); diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/DefaultPeriodCleaner.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/DefaultPeriodCleaner.java similarity index 98% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/DefaultPeriodCleaner.java rename to sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/DefaultPeriodCleaner.java index ade98c3dbaf..76b1238dc07 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/DefaultPeriodCleaner.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/DefaultPeriodCleaner.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import com.google.common.annotations.VisibleForTesting; import org.slf4j.Logger; diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/DeleteAllFilter.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/DeleteAllFilter.java similarity index 96% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/DeleteAllFilter.java rename to sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/DeleteAllFilter.java index 18a795e1ee7..25dcb409ea1 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/DeleteAllFilter.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/DeleteAllFilter.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import com.google.common.collect.Lists; import org.slf4j.LoggerFactory; diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Filter.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Filter.java similarity index 95% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Filter.java rename to sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Filter.java index 4d4419be8c4..ef4a3753242 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Filter.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Filter.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import org.sonar.core.purge.PurgeableSnapshotDto; diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Filters.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Filters.java similarity index 95% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Filters.java rename to sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Filters.java index c291cd8fec4..8e59596212c 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Filters.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Filters.java @@ -17,12 +17,13 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import com.google.common.collect.Lists; import org.apache.commons.lang.time.DateUtils; import org.sonar.api.config.Settings; -import org.sonar.plugins.dbcleaner.api.DbCleanerConstants; +import org.sonar.core.computation.dbcleaner.DbCleanerConstants; import java.util.Calendar; import java.util.Date; @@ -43,10 +44,6 @@ class Filters { all.add(new DeleteAllFilter(dateToStartDeletingAllSnapshots)); } - List all() { - return all; - } - static Date getDateFromWeeks(Settings settings, String propertyKey) { int weeks = settings.getInt(propertyKey); return DateUtils.addWeeks(new Date(), -weeks); @@ -56,4 +53,8 @@ class Filters { int hours = settings.getInt(propertyKey); return DateUtils.addHours(new Date(), -hours); } + + List all() { + return all; + } } diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Interval.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Interval.java similarity index 97% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Interval.java rename to sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Interval.java index 18b02c38d08..5676a858495 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/Interval.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/Interval.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import com.google.common.collect.Lists; import org.apache.commons.lang.time.DateUtils; diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/KeepOneFilter.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/KeepOneFilter.java similarity index 98% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/KeepOneFilter.java rename to sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/KeepOneFilter.java index 81249fdd929..419add8383f 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/KeepOneFilter.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/KeepOneFilter.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; diff --git a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/package-info.java b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/package-info.java similarity index 94% rename from plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/package-info.java rename to sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/package-info.java index f5b97cfc92b..283ef7fa912 100644 --- a/plugins/sonar-dbcleaner-plugin/src/main/java/org/sonar/plugins/dbcleaner/period/package-info.java +++ b/sonar-core/src/main/java/org/sonar/core/computation/dbcleaner/period/package-info.java @@ -19,7 +19,6 @@ */ @ParametersAreNonnullByDefault -package org.sonar.plugins.dbcleaner.period; +package org.sonar.core.computation.dbcleaner.period; import javax.annotation.ParametersAreNonnullByDefault; - diff --git a/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java b/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java index d98fddab931..b678394d38a 100644 --- a/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java +++ b/sonar-core/src/main/java/org/sonar/core/config/CorePropertyDefinitions.java @@ -24,6 +24,7 @@ import com.google.common.collect.Lists; import org.sonar.api.CoreProperties; import org.sonar.api.config.PropertyDefinition; import org.sonar.api.resources.Qualifiers; +import org.sonar.core.computation.dbcleaner.DbCleanerProperties; import java.util.List; @@ -39,6 +40,7 @@ public class CorePropertyDefinitions { defs.addAll(ExclusionProperties.all()); defs.addAll(SecurityProperties.all()); defs.addAll(DebtProperties.all()); + defs.addAll(DbCleanerProperties.all()); defs.addAll(ImmutableList.of( // BATCH @@ -101,7 +103,7 @@ public class CorePropertyDefinitions { .category(CoreProperties.CATEGORY_GENERAL) .subCategory(CoreProperties.SUBCATEGORY_DIFFERENTIAL_VIEWS) .build() - )); + )); return defs; } } diff --git a/sonar-core/src/main/resources/org/sonar/core/computation/db/AnalysisReportMapper.xml b/sonar-core/src/main/resources/org/sonar/core/computation/db/AnalysisReportMapper.xml index e2166b7b36f..16613e4a946 100644 --- a/sonar-core/src/main/resources/org/sonar/core/computation/db/AnalysisReportMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/computation/db/AnalysisReportMapper.xml @@ -6,7 +6,6 @@ ar.id, ar.project_key as projectKey, - ar.project_name as projectName, ar.report_status as status, ar.snapshot_id as snapshotId, ar.created_at as createdAt, @@ -17,9 +16,9 @@ insert into analysis_reports - (project_key, project_name, snapshot_id, report_status, report_data, created_at, updated_at, started_at, + (project_key, snapshot_id, report_status, report_data, created_at, updated_at, started_at, finished_at) - values (#{projectKey}, #{projectName}, #{snapshotId}, #{status}, #{data}, #{createdAt}, #{updatedAt}, #{startedAt}, + values (#{projectKey}, #{snapshotId}, #{status}, #{data}, #{createdAt}, #{updatedAt}, #{startedAt}, #{finishedAt}) diff --git a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DbCleanerPluginTest.java b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DbCleanerPropertiesTest.java similarity index 87% rename from plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DbCleanerPluginTest.java rename to sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DbCleanerPropertiesTest.java index da6ddc93bcd..4c4311aac3b 100644 --- a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DbCleanerPluginTest.java +++ b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DbCleanerPropertiesTest.java @@ -17,16 +17,17 @@ * 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.plugins.dbcleaner; + +package org.sonar.core.computation.dbcleaner; import org.junit.Test; import static org.fest.assertions.Assertions.assertThat; -public class DbCleanerPluginTest { +public class DbCleanerPropertiesTest { @Test public void shouldGetExtensions() { - assertThat(new DbCleanerPlugin().getExtensions()).hasSize(9); + assertThat(new DbCleanerProperties().all()).hasSize(6); } } diff --git a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DbCleanerTestUtils.java b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DbCleanerTestUtils.java similarity index 97% rename from plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DbCleanerTestUtils.java rename to sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DbCleanerTestUtils.java index 944c34b3e95..392e58c0f0b 100644 --- a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DbCleanerTestUtils.java +++ b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DbCleanerTestUtils.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner; + +package org.sonar.core.computation.dbcleaner; import org.sonar.api.utils.DateUtils; import org.sonar.core.purge.PurgeableSnapshotDto; diff --git a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DefaultPurgeTaskTest.java b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTaskTest.java similarity index 90% rename from plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DefaultPurgeTaskTest.java rename to sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTaskTest.java index 7d6e48bbcce..72359ee3dee 100644 --- a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/DefaultPurgeTaskTest.java +++ b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/DefaultPurgeTaskTest.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner; + +package org.sonar.core.computation.dbcleaner; import ch.qos.logback.classic.Logger; import org.junit.Test; @@ -26,25 +27,22 @@ import org.sonar.api.CoreProperties; import org.sonar.api.config.PropertyDefinitions; import org.sonar.api.config.Settings; import org.sonar.api.resources.Scopes; +import org.sonar.core.computation.dbcleaner.period.DefaultPeriodCleaner; import org.sonar.core.purge.PurgeConfiguration; import org.sonar.core.purge.PurgeDao; import org.sonar.core.purge.PurgeProfiler; -import org.sonar.plugins.dbcleaner.api.DbCleanerConstants; -import org.sonar.plugins.dbcleaner.period.DefaultPeriodCleaner; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.argThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; public class DefaultPurgeTaskTest { + @Test public void shouldNotDeleteHistoricalDataOfDirectories() { PurgeDao purgeDao = mock(PurgeDao.class); - Settings settings = new Settings(new PropertyDefinitions(DbCleanerPlugin.propertyDefinitions())); + Settings settings = new Settings(new PropertyDefinitions(DbCleanerProperties.all())); settings.setProperty(DbCleanerConstants.PROPERTY_CLEAN_DIRECTORY, "false"); DefaultPurgeTask task = new DefaultPurgeTask(purgeDao, settings, mock(DefaultPeriodCleaner.class), mock(PurgeProfiler.class)); @@ -62,7 +60,7 @@ public class DefaultPurgeTaskTest { @Test public void shouldDeleteHistoricalDataOfDirectoriesByDefault() { PurgeDao purgeDao = mock(PurgeDao.class); - Settings settings = new Settings(new PropertyDefinitions(DbCleanerPlugin.propertyDefinitions())); + Settings settings = new Settings(new PropertyDefinitions(DbCleanerProperties.all())); DefaultPurgeTask task = new DefaultPurgeTask(purgeDao, settings, mock(DefaultPeriodCleaner.class), mock(PurgeProfiler.class)); task.purge(1L); @@ -95,7 +93,7 @@ public class DefaultPurgeTaskTest { PurgeConfiguration conf = new PurgeConfiguration(1L, new String[0], 30); PurgeDao purgeDao = mock(PurgeDao.class); when(purgeDao.purge(conf)).thenThrow(new RuntimeException()); - Settings settings = new Settings(new PropertyDefinitions(DbCleanerPlugin.propertyDefinitions())); + Settings settings = new Settings(new PropertyDefinitions(DbCleanerProperties.all())); settings.setProperty(CoreProperties.PROFILING_LOG_PROPERTY, true); PurgeProfiler profiler = mock(PurgeProfiler.class); @@ -104,4 +102,5 @@ public class DefaultPurgeTaskTest { verify(profiler).dump(anyLong(), any(Logger.class)); } + } diff --git a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/DefaultPeriodCleanerTest.java b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/DefaultPeriodCleanerTest.java similarity index 93% rename from plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/DefaultPeriodCleanerTest.java rename to sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/DefaultPeriodCleanerTest.java index c252c3bfb22..0a5872041d2 100644 --- a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/DefaultPeriodCleanerTest.java +++ b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/DefaultPeriodCleanerTest.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import org.apache.commons.lang.ObjectUtils; import org.hamcrest.BaseMatcher; @@ -35,10 +36,7 @@ import java.util.Date; import static org.mockito.Matchers.anyListOf; import static org.mockito.Matchers.argThat; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; public class DefaultPeriodCleanerTest { diff --git a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/DeleteAllFilterTest.java b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/DeleteAllFilterTest.java similarity index 93% rename from plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/DeleteAllFilterTest.java rename to sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/DeleteAllFilterTest.java index 12967c16951..2a84512355e 100644 --- a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/DeleteAllFilterTest.java +++ b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/DeleteAllFilterTest.java @@ -17,12 +17,13 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import org.junit.Test; import org.sonar.api.utils.DateUtils; +import org.sonar.core.computation.dbcleaner.DbCleanerTestUtils; import org.sonar.core.purge.PurgeableSnapshotDto; -import org.sonar.plugins.dbcleaner.DbCleanerTestUtils; import java.util.Arrays; import java.util.List; diff --git a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/IntervalTest.java b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/IntervalTest.java similarity index 93% rename from plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/IntervalTest.java rename to sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/IntervalTest.java index 5a519f721f1..a9c5aecc698 100644 --- a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/IntervalTest.java +++ b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/IntervalTest.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import org.junit.Test; import org.sonar.api.utils.DateUtils; @@ -30,10 +31,21 @@ import java.util.List; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; -import static org.sonar.plugins.dbcleaner.DbCleanerTestUtils.createSnapshotWithDate; -import static org.sonar.plugins.dbcleaner.DbCleanerTestUtils.createSnapshotWithDateTime; +import static org.sonar.core.computation.dbcleaner.DbCleanerTestUtils.createSnapshotWithDate; +import static org.sonar.core.computation.dbcleaner.DbCleanerTestUtils.createSnapshotWithDateTime; public class IntervalTest { + static int calendarField(Interval interval, int field) { + if (interval.count() == 0) { + return -1; + } + + PurgeableSnapshotDto first = interval.get().iterator().next(); + GregorianCalendar cal = new GregorianCalendar(); + cal.setTime(first.getDate()); + return cal.get(field); + } + @Test public void shouldGroupByIntervals() { List snapshots = Arrays.asList( @@ -46,7 +58,7 @@ public class IntervalTest { createSnapshotWithDate(5L, "2011-06-20"), createSnapshotWithDate(6L, "2012-06-29") // out of scope - ); + ); List intervals = Interval.group(snapshots, DateUtils.parseDate("2010-01-01"), DateUtils.parseDate("2011-12-31"), Calendar.MONTH); assertThat(intervals.size(), is(3)); @@ -66,7 +78,7 @@ public class IntervalTest { List snapshots = Arrays.asList( createSnapshotWithDate(1L, "2010-04-03"), createSnapshotWithDate(2L, "2011-04-13") - ); + ); List intervals = Interval.group(snapshots, DateUtils.parseDate("2010-01-01"), DateUtils.parseDate("2011-12-31"), Calendar.MONTH); assertThat(intervals.size(), is(2)); @@ -86,22 +98,11 @@ public class IntervalTest { createSnapshotWithDateTime(1L, "2011-05-25T16:16:48+0100"), createSnapshotWithDateTime(2L, "2012-01-26T16:16:48+0100"), createSnapshotWithDateTime(3L, "2012-01-27T16:16:48+0100") - ); + ); List intervals = Interval.group(snapshots, DateUtils.parseDate("2011-05-25"), DateUtils.parseDate("2012-01-26"), Calendar.MONTH); assertThat(intervals.size(), is(1)); assertThat(intervals.get(0).count(), is(1)); assertThat(intervals.get(0).get().get(0).getSnapshotId(), is(2L)); } - - static int calendarField(Interval interval, int field) { - if (interval.count() == 0) { - return -1; - } - - PurgeableSnapshotDto first = interval.get().iterator().next(); - GregorianCalendar cal = new GregorianCalendar(); - cal.setTime(first.getDate()); - return cal.get(field); - } } diff --git a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/KeepOneFilterTest.java b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/KeepOneFilterTest.java similarity index 95% rename from plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/KeepOneFilterTest.java rename to sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/KeepOneFilterTest.java index 4a9ecd48ea8..8e855f987df 100644 --- a/plugins/sonar-dbcleaner-plugin/src/test/java/org/sonar/plugins/dbcleaner/period/KeepOneFilterTest.java +++ b/sonar-core/src/test/java/org/sonar/core/computation/dbcleaner/period/KeepOneFilterTest.java @@ -17,7 +17,8 @@ * 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.plugins.dbcleaner.period; + +package org.sonar.core.computation.dbcleaner.period; import com.google.common.base.Function; import com.google.common.collect.Iterables; @@ -33,10 +34,19 @@ import java.util.List; import static com.google.common.collect.Lists.newArrayList; import static org.fest.assertions.Assertions.assertThat; -import static org.sonar.plugins.dbcleaner.DbCleanerTestUtils.createSnapshotWithDate; +import static org.sonar.core.computation.dbcleaner.DbCleanerTestUtils.createSnapshotWithDate; public class KeepOneFilterTest { + private static List snapshotIds(List snapshotDtos) { + return newArrayList(Iterables.transform(snapshotDtos, new Function() { + @Override + public Long apply(@Nullable PurgeableSnapshotDto input) { + return input != null ? input.getSnapshotId() : null; + } + })); + } + @Test public void shouldOnlyOneSnapshotPerInterval() { Filter filter = new KeepOneFilter(DateUtils.parseDate("2011-03-25"), DateUtils.parseDate("2011-08-25"), Calendar.MONTH, "month"); @@ -82,13 +92,4 @@ public class KeepOneFilterTest { assertThat(KeepOneFilter.isDeletable(createSnapshotWithDate(1L, "2011-05-01").setHasEvents(true))).isFalse(); } - private static List snapshotIds(List snapshotDtos){ - return newArrayList(Iterables.transform(snapshotDtos, new Function() { - @Override - public Long apply(@Nullable PurgeableSnapshotDto input) { - return input != null ? input.getSnapshotId() : null; - } - })); - } - } -- 2.39.5