From: Sébastien Lesaint Date: Mon, 17 Aug 2015 14:45:44 +0000 (+0200) Subject: rename ProjectSettingsRepository to SettingsRepository interface X-Git-Tag: 5.2-RC1~654 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=f0c595d3df4178754dfbb3121508d7713694c5fc;p=sonarqube.git rename ProjectSettingsRepository to SettingsRepository interface also now use a Component as argument of the repository method getSettings instead of a String in addition, new SettingsRepositoryImpl implementation can holds the properties of any component, not just the one of the root project --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/ProjectSettingsRepository.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/ProjectSettingsRepository.java deleted file mode 100644 index 2a12477b8de..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/ProjectSettingsRepository.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.component; - -import org.sonar.api.config.Settings; -import org.sonar.server.properties.ProjectSettingsFactory; - -/** - * Lazy loading of project settings. - * - * TODO Should be refactored to be able to load settings from any components. - */ -public class ProjectSettingsRepository { - - private final ProjectSettingsFactory projectSettingsFactory; - - private Settings projectSettings; - - public ProjectSettingsRepository(ProjectSettingsFactory projectSettingsFactory) { - this.projectSettingsFactory = projectSettingsFactory; - } - - public Settings getProjectSettings(String projectKey){ - if (projectSettings == null) { - projectSettings = projectSettingsFactory.newProjectSettings(projectKey); - } - return projectSettings; - } - -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/SettingsRepository.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/SettingsRepository.java new file mode 100644 index 00000000000..3bbdf2f4c8e --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/SettingsRepository.java @@ -0,0 +1,32 @@ +/* + * 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.component; + +import org.sonar.api.config.Settings; + +/** + * Repository of component settings. + */ +public interface SettingsRepository { + /** + * Returns the settings for the specified Component. + */ + Settings getSettings(Component component); +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/SettingsRepositoryImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/SettingsRepositoryImpl.java new file mode 100644 index 00000000000..f14ddc19a21 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/SettingsRepositoryImpl.java @@ -0,0 +1,57 @@ +/* + * 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.component; + +import java.util.Collection; +import java.util.Map; +import org.sonar.api.config.Settings; +import org.sonar.server.properties.ProjectSettingsFactory; +import org.sonar.server.util.cache.CacheLoader; +import org.sonar.server.util.cache.MemoryCache; + +/** + * Repository of component settings implementation based on a memory cache. + */ +public class SettingsRepositoryImpl implements SettingsRepository { + + private final ProjectSettingsFactory projectSettingsFactory; + private final MemoryCache cache = new MemoryCache<>(new CacheLoader() { + @Override + public Settings load(String key) { + return projectSettingsFactory.newProjectSettings(key); + } + + @Override + public Map loadAll(Collection keys) { + throw new UnsupportedOperationException("loadAll is not supported"); + } + }); + + public SettingsRepositoryImpl(ProjectSettingsFactory projectSettingsFactory) { + this.projectSettingsFactory = projectSettingsFactory; + } + + @Override + public Settings getSettings(Component component){ + return cache.get(component.getKey()); + } + +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java index 6a9e37d7342..0ba7ab203e6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java @@ -31,8 +31,8 @@ import org.sonar.server.computation.analysis.ReportAnalysisMetadataHolder; import org.sonar.server.computation.batch.BatchReportDirectoryHolderImpl; import org.sonar.server.computation.batch.BatchReportReaderImpl; import org.sonar.server.computation.component.DbIdsRepositoryImpl; -import org.sonar.server.computation.component.ProjectSettingsRepository; import org.sonar.server.computation.component.ReportTreeRootHolderImpl; +import org.sonar.server.computation.component.SettingsRepositoryImpl; import org.sonar.server.computation.debt.DebtModelHolderImpl; import org.sonar.server.computation.event.EventRepositoryImpl; import org.sonar.server.computation.issue.BaseIssuesLoader; @@ -126,7 +126,7 @@ public final class ReportComputeEngineContainerPopulator implements ContainerPop LanguageRepositoryImpl.class, MeasureRepositoryImpl.class, EventRepositoryImpl.class, - ProjectSettingsRepository.class, + SettingsRepositoryImpl.class, DbIdsRepositoryImpl.class, QualityGateServiceImpl.class, EvaluationResultTextConverterImpl.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DefaultAssignee.java b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DefaultAssignee.java index 7cdd0a5da73..6468bb492f5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DefaultAssignee.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/DefaultAssignee.java @@ -24,7 +24,7 @@ import javax.annotation.CheckForNull; import org.sonar.api.CoreProperties; import org.sonar.api.utils.log.Logger; import org.sonar.api.utils.log.Loggers; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.user.index.UserDoc; import org.sonar.server.user.index.UserIndex; @@ -39,21 +39,21 @@ public class DefaultAssignee { private final TreeRootHolder treeRootHolder; private final UserIndex userIndex; - private final ProjectSettingsRepository settings; + private final SettingsRepository settingsRepository; private boolean loaded = false; private String login = null; - public DefaultAssignee(TreeRootHolder treeRootHolder, UserIndex userIndex, ProjectSettingsRepository settings) { + public DefaultAssignee(TreeRootHolder treeRootHolder, UserIndex userIndex, SettingsRepository settingsRepository) { this.treeRootHolder = treeRootHolder; this.userIndex = userIndex; - this.settings = settings; + this.settingsRepository = settingsRepository; } @CheckForNull public String getLogin() { if (!loaded) { - String configuredLogin = settings.getProjectSettings(treeRootHolder.getRoot().getKey()).getString(CoreProperties.DEFAULT_ISSUE_ASSIGNEE); + String configuredLogin = settingsRepository.getSettings(treeRootHolder.getRoot()).getString(CoreProperties.DEFAULT_ISSUE_ASSIGNEE); if (!Strings.isNullOrEmpty(configuredLogin) && isValidLogin(configuredLogin)) { this.login = configuredLogin; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java index 488b09d5c63..0b61fcd7867 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java @@ -21,7 +21,7 @@ package org.sonar.server.computation.measure; import org.sonar.api.ce.measure.MeasureComputer; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.component.TypeAwareVisitorAdapter; import org.sonar.server.computation.measure.api.MeasureComputerImplementationContext; import org.sonar.server.computation.metric.MetricRepository; @@ -33,11 +33,11 @@ public class MeasureComputersVisitor extends TypeAwareVisitorAdapter { private final MetricRepository metricRepository; private final MeasureRepository measureRepository; - private final ProjectSettingsRepository settings; + private final SettingsRepository settings; private final MeasureComputersHolder measureComputersHolder; - public MeasureComputersVisitor(MetricRepository metricRepository, MeasureRepository measureRepository, ProjectSettingsRepository settings, + public MeasureComputersVisitor(MetricRepository metricRepository, MeasureRepository measureRepository, SettingsRepository settings, MeasureComputersHolder measureComputersHolder) { super(FILE, PRE_ORDER); this.metricRepository = metricRepository; diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContext.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContext.java index b710678e68e..e8f74f449a9 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContext.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContext.java @@ -33,7 +33,7 @@ import org.sonar.api.ce.measure.Component; import org.sonar.api.ce.measure.Measure; import org.sonar.api.ce.measure.MeasureComputer; import org.sonar.api.ce.measure.Settings; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.measure.MeasureRepository; import org.sonar.server.computation.metric.Metric; import org.sonar.server.computation.metric.MetricRepository; @@ -44,7 +44,7 @@ import static org.sonar.server.computation.measure.Measure.newMeasureBuilder; public class MeasureComputerImplementationContext implements MeasureComputer.Implementation.Context { private final MeasureComputer measureComputer; - private final ProjectSettingsRepository settings; + private final SettingsRepository settings; private final MeasureRepository measureRepository; private final MetricRepository metricRepository; @@ -54,7 +54,7 @@ public class MeasureComputerImplementationContext implements MeasureComputer.Imp private final Set allowedMetrics; public MeasureComputerImplementationContext(org.sonar.server.computation.component.Component component, MeasureComputer measureComputer, - ProjectSettingsRepository settings, MeasureRepository measureRepository, MetricRepository metricRepository) { + SettingsRepository settings, MeasureRepository measureRepository, MetricRepository metricRepository) { this.measureComputer = measureComputer; this.settings = settings; this.internalComponent = component; @@ -103,7 +103,7 @@ public class MeasureComputerImplementationContext implements MeasureComputer.Imp } private org.sonar.api.config.Settings getComponentSettings(){ - return settings.getProjectSettings(internalComponent.getKey()); + return settings.getSettings(internalComponent); } @Override diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PurgeDatastoresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PurgeDatastoresStep.java index c32a2c77ed4..ad849343048 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PurgeDatastoresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PurgeDatastoresStep.java @@ -26,7 +26,7 @@ import org.sonar.db.MyBatis; import org.sonar.db.purge.IdUuidPair; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DbIdsRepository; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.db.DbClient; @@ -36,15 +36,15 @@ public class PurgeDatastoresStep implements ComputationStep { private final DbClient dbClient; private final DbIdsRepository dbIdsRepository; private final TreeRootHolder treeRootHolder; - private final ProjectSettingsRepository projectSettingsRepository; + private final SettingsRepository settingsRepository; public PurgeDatastoresStep(DbClient dbClient, ProjectCleaner projectCleaner, DbIdsRepository dbIdsRepository, TreeRootHolder treeRootHolder, - ProjectSettingsRepository projectSettingsRepository) { + SettingsRepository settingsRepository) { this.projectCleaner = projectCleaner; this.dbClient = dbClient; this.dbIdsRepository = dbIdsRepository; this.treeRootHolder = treeRootHolder; - this.projectSettingsRepository = projectSettingsRepository; + this.settingsRepository = settingsRepository; } @Override @@ -52,7 +52,7 @@ public class PurgeDatastoresStep implements ComputationStep { DbSession session = dbClient.openSession(true); try { Component project = treeRootHolder.getRoot(); - projectCleaner.purge(session, new IdUuidPair(dbIdsRepository.getComponentId(project), project.getUuid()), projectSettingsRepository.getProjectSettings(project.getKey())); + projectCleaner.purge(session, new IdUuidPair(dbIdsRepository.getComponentId(project), project.getUuid()), settingsRepository.getSettings(project)); session.commit(); } finally { MyBatis.closeQuietly(session); diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java index 6ebeccd2b1c..7fcc26c49f6 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java @@ -27,7 +27,7 @@ import org.sonar.api.utils.log.Loggers; import org.sonar.server.computation.ReportQueue; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.component.TreeRootHolder; import org.sonar.server.computation.qualitygate.MutableQualityGateHolder; import org.sonar.server.computation.qualitygate.QualityGate; @@ -46,14 +46,14 @@ public class QualityGateLoadingStep implements ComputationStep { private static final String PROPERTY_QUALITY_GATE = "sonar.qualitygate"; private final TreeRootHolder treeRootHolder; - private final ProjectSettingsRepository projectSettingsRepository; + private final SettingsRepository settingsRepository; private final QualityGateService qualityGateService; private final MutableQualityGateHolder qualityGateHolder; - public QualityGateLoadingStep(TreeRootHolder treeRootHolder, ProjectSettingsRepository projectSettingsRepository, + public QualityGateLoadingStep(TreeRootHolder treeRootHolder, SettingsRepository settingsRepository, QualityGateService qualityGateService, MutableQualityGateHolder qualityGateHolder) { this.treeRootHolder = treeRootHolder; - this.projectSettingsRepository = projectSettingsRepository; + this.settingsRepository = settingsRepository; this.qualityGateService = qualityGateService; this.qualityGateHolder = qualityGateHolder; } @@ -70,7 +70,7 @@ public class QualityGateLoadingStep implements ComputationStep { private void executeForProject(Component project) { String projectKey = project.getKey(); - Settings settings = projectSettingsRepository.getProjectSettings(projectKey); + Settings settings = settingsRepository.getSettings(project); String qualityGateSetting = settings.getString(PROPERTY_QUALITY_GATE); if (qualityGateSetting == null || StringUtils.isBlank(qualityGateSetting)) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ProjectSettingsRepositoryTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/ProjectSettingsRepositoryTest.java deleted file mode 100644 index 950590970ac..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/component/ProjectSettingsRepositoryTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * 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.component; - -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.sonar.api.config.Settings; -import org.sonar.api.utils.System2; -import org.sonar.db.DbClient; -import org.sonar.db.DbSession; -import org.sonar.db.DbTester; -import org.sonar.db.component.ComponentDto; -import org.sonar.db.property.PropertiesDao; -import org.sonar.db.property.PropertyDto; -import org.sonar.db.component.ComponentTesting; -import org.sonar.server.properties.ProjectSettingsFactory; -import org.sonar.test.DbTests; - -import static org.assertj.core.api.Assertions.assertThat; - -@Category(DbTests.class) -public class ProjectSettingsRepositoryTest { - - private static final String PROJECT_KEY = "PROJECT_KEY"; - - @Rule - public final DbTester dbTester = DbTester.create(System2.INSTANCE); - - DbClient dbClient = dbTester.getDbClient(); - - DbSession session; - - Settings globalSettings; - - ProjectSettingsRepository underTest; - - @Before - public void createDao() { - dbTester.truncateTables(); - globalSettings = new Settings(); - PropertiesDao propertiesDao = new PropertiesDao(dbTester.myBatis()); - session = dbClient.openSession(false); - underTest = new ProjectSettingsRepository(new ProjectSettingsFactory(globalSettings, propertiesDao)); - } - - @After - public void tearDown() { - session.close(); - } - - @Test - public void get_project_settings_from_global_settings() { - globalSettings.setProperty("key", "value"); - - Settings settings = underTest.getProjectSettings(PROJECT_KEY); - - assertThat(settings.getString("key")).isEqualTo("value"); - } - - @Test - public void get_project_settings_from_db() { - ComponentDto project = ComponentTesting.newProjectDto().setKey(PROJECT_KEY); - dbClient.componentDao().insert(session, project); - dbClient.propertiesDao().insertProperty(session, new PropertyDto().setResourceId(project.getId()).setKey("key").setValue("value")); - session.commit(); - - Settings settings = underTest.getProjectSettings(PROJECT_KEY); - - assertThat(settings.getString("key")).isEqualTo("value"); - } - - @Test - public void call_twice_get_project_settings() { - globalSettings.setProperty("key", "value"); - - Settings settings = underTest.getProjectSettings(PROJECT_KEY); - assertThat(settings.getString("key")).isEqualTo("value"); - - settings = underTest.getProjectSettings(PROJECT_KEY); - assertThat(settings.getString("key")).isEqualTo("value"); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/component/SettingsRepositoryTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/component/SettingsRepositoryTest.java new file mode 100644 index 00000000000..bc444a06ffe --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/component/SettingsRepositoryTest.java @@ -0,0 +1,104 @@ +/* + * 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.component; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.sonar.api.config.Settings; +import org.sonar.api.utils.System2; +import org.sonar.db.DbClient; +import org.sonar.db.DbSession; +import org.sonar.db.DbTester; +import org.sonar.db.component.ComponentDto; +import org.sonar.db.property.PropertiesDao; +import org.sonar.db.property.PropertyDto; +import org.sonar.db.component.ComponentTesting; +import org.sonar.server.properties.ProjectSettingsFactory; +import org.sonar.test.DbTests; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.server.computation.component.Component.Type.PROJECT; + +@Category(DbTests.class) +public class SettingsRepositoryTest { + + private static final Component ROOT = ReportComponent.builder(PROJECT, 1).setKey("ROOT").build(); + + @Rule + public final DbTester dbTester = DbTester.create(System2.INSTANCE); + + DbClient dbClient = dbTester.getDbClient(); + + DbSession session; + + Settings globalSettings; + + SettingsRepository underTest; + + @Before + public void createDao() { + dbTester.truncateTables(); + globalSettings = new Settings(); + PropertiesDao propertiesDao = new PropertiesDao(dbTester.myBatis()); + session = dbClient.openSession(false); + underTest = new SettingsRepositoryImpl(new ProjectSettingsFactory(globalSettings, propertiesDao)); + } + + @After + public void tearDown() { + session.close(); + } + + @Test + public void get_project_settings_from_global_settings() { + globalSettings.setProperty("key", "value"); + + Settings settings = underTest.getSettings(ROOT); + + assertThat(settings.getString("key")).isEqualTo("value"); + } + + @Test + public void get_project_settings_from_db() { + ComponentDto project = ComponentTesting.newProjectDto().setKey(ROOT.getKey()); + dbClient.componentDao().insert(session, project); + dbClient.propertiesDao().insertProperty(session, new PropertyDto().setResourceId(project.getId()).setKey("key").setValue("value")); + session.commit(); + + Settings settings = underTest.getSettings(ROOT); + + assertThat(settings.getString("key")).isEqualTo("value"); + } + + @Test + public void call_twice_get_project_settings() { + globalSettings.setProperty("key", "value"); + + Settings settings = underTest.getSettings(ROOT); + assertThat(settings.getString("key")).isEqualTo("value"); + + settings = underTest.getSettings(ROOT); + assertThat(settings.getString("key")).isEqualTo("value"); + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DefaultAssigneeTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DefaultAssigneeTest.java index 99fc8f47064..cac7306f86f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DefaultAssigneeTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/issue/DefaultAssigneeTest.java @@ -25,7 +25,8 @@ import org.mockito.Mockito; import org.sonar.api.CoreProperties; import org.sonar.api.config.Settings; import org.sonar.server.computation.batch.TreeRootHolderRule; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.user.index.UserDoc; import org.sonar.server.user.index.UserIndex; @@ -40,14 +41,14 @@ public class DefaultAssigneeTest { TreeRootHolderRule rootHolder = mock(TreeRootHolderRule.class, Mockito.RETURNS_DEEP_STUBS); UserIndex userIndex = mock(UserIndex.class); Settings settings = new Settings(); - ProjectSettingsRepository settingsRepository = mock(ProjectSettingsRepository.class); + SettingsRepository settingsRepository = mock(SettingsRepository.class); DefaultAssignee underTest = new DefaultAssignee(rootHolder, userIndex, settingsRepository); @Before public void before() { - when(rootHolder.getRoot().getKey()).thenReturn(PROJECT_KEY); - when(settingsRepository.getProjectSettings(PROJECT_KEY)).thenReturn(settings); + when(rootHolder.getRoot()).thenReturn(mock(Component.class)); + when(settingsRepository.getSettings(rootHolder.getRoot())).thenReturn(settings); } @Test diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContextTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContextTest.java index 161d6c7673e..3bb8df5ba43 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContextTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContextTest.java @@ -30,7 +30,7 @@ import org.sonar.api.ce.measure.Component; import org.sonar.api.ce.measure.MeasureComputer; import org.sonar.api.measures.CoreMetrics; import org.sonar.server.computation.batch.TreeRootHolderRule; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.measure.Measure; import org.sonar.server.computation.measure.MeasureRepositoryRule; import org.sonar.server.computation.metric.Metric; @@ -62,11 +62,13 @@ public class MeasureComputerImplementationContextTest { private static final String FILE_1_KEY = "fileKey"; private static final int FILE_2_REF = 12342; + private static final org.sonar.server.computation.component.Component FILE_1 = builder(org.sonar.server.computation.component.Component.Type.FILE, FILE_1_REF).setKey(FILE_1_KEY).build(); + @Rule public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule() .setRoot(builder(org.sonar.server.computation.component.Component.Type.PROJECT, PROJECT_REF).setKey("project") .addChildren( - builder(org.sonar.server.computation.component.Component.Type.FILE, FILE_1_REF).setKey(FILE_1_KEY).build(), + FILE_1, builder(org.sonar.server.computation.component.Component.Type.FILE, FILE_2_REF).setKey("fileKey2").build() ).build()); @@ -82,7 +84,7 @@ public class MeasureComputerImplementationContextTest { @Rule public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); - ProjectSettingsRepository projectSettingsRepository = mock(ProjectSettingsRepository.class); + SettingsRepository settingsRepository = mock(SettingsRepository.class); @Test public void get_component() throws Exception { @@ -94,7 +96,7 @@ public class MeasureComputerImplementationContextTest { public void get_string_settings() throws Exception { org.sonar.api.config.Settings serverSettings = new org.sonar.api.config.Settings(); serverSettings.setProperty("prop", "value"); - when(projectSettingsRepository.getProjectSettings(FILE_1_KEY)).thenReturn(serverSettings); + when(settingsRepository.getSettings(FILE_1)).thenReturn(serverSettings); MeasureComputer.Implementation.Context underTest = newContext(FILE_1_REF); assertThat(underTest.getSettings().getString("prop")).isEqualTo("value"); @@ -105,7 +107,7 @@ public class MeasureComputerImplementationContextTest { public void get_string_array_settings() throws Exception { org.sonar.api.config.Settings serverSettings = new org.sonar.api.config.Settings(); serverSettings.setProperty("prop", "1,3.4,8,50"); - when(projectSettingsRepository.getProjectSettings(FILE_1_KEY)).thenReturn(serverSettings); + when(settingsRepository.getSettings(FILE_1)).thenReturn(serverSettings); MeasureComputer.Implementation.Context underTest = newContext(FILE_1_REF); assertThat(underTest.getSettings().getStringArray("prop")).containsExactly("1", "3.4", "8", "50"); @@ -247,6 +249,6 @@ public class MeasureComputerImplementationContextTest { return null; } }; - return new MeasureComputerImplementationContext(treeRootHolder.getComponentByRef(componentRef), measureComputer, projectSettingsRepository, measureRepository, metricRepository); + return new MeasureComputerImplementationContext(treeRootHolder.getComponentByRef(componentRef), measureComputer, settingsRepository, measureRepository, metricRepository); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java index 8cea9530661..c0587515bd2 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java @@ -20,7 +20,6 @@ package org.sonar.server.computation.step; -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -35,7 +34,7 @@ import org.sonar.server.computation.batch.TreeRootHolderRule; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.DbIdsRepositoryImpl; import org.sonar.server.computation.component.ReportComponent; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.db.DbClient; import static org.assertj.core.api.Assertions.assertThat; @@ -57,19 +56,15 @@ public class PurgeDatastoresStepTest extends BaseStepTest { DbIdsRepositoryImpl dbIdsRepository = new DbIdsRepositoryImpl(); ProjectCleaner projectCleaner = mock(ProjectCleaner.class); - ProjectSettingsRepository projectSettingsRepository = mock(ProjectSettingsRepository.class); + SettingsRepository settingsRepository = mock(SettingsRepository.class); - PurgeDatastoresStep underTest = new PurgeDatastoresStep(mock(DbClient.class, Mockito.RETURNS_DEEP_STUBS), projectCleaner, dbIdsRepository, treeRootHolder, projectSettingsRepository); - - @Before - public void setUp() { - when(projectSettingsRepository.getProjectSettings(PROJECT_KEY)).thenReturn(new Settings()); - } + PurgeDatastoresStep underTest = new PurgeDatastoresStep(mock(DbClient.class, Mockito.RETURNS_DEEP_STUBS), projectCleaner, dbIdsRepository, treeRootHolder, settingsRepository); @Test public void call_purge_method_of_the_purge_task() { Component project = ReportComponent.builder(Component.Type.PROJECT, 1).setUuid("UUID-1234").setKey(PROJECT_KEY).build(); treeRootHolder.setRoot(project); + when(settingsRepository.getSettings(project)).thenReturn(new Settings()); dbIdsRepository.setComponentId(project, 123L); reportReader.setMetadata(BatchReport.Metadata.newBuilder() diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/QualityGateLoadingStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/QualityGateLoadingStepTest.java index 27781488aeb..ba15c22f7ec 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/QualityGateLoadingStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/QualityGateLoadingStepTest.java @@ -28,7 +28,7 @@ import org.sonar.api.config.Settings; import org.sonar.server.computation.batch.TreeRootHolderRule; import org.sonar.server.computation.component.Component; import org.sonar.server.computation.component.ReportComponent; -import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.SettingsRepository; import org.sonar.server.computation.qualitygate.Condition; import org.sonar.server.computation.qualitygate.MutableQualityGateHolderRule; import org.sonar.server.computation.qualitygate.QualityGate; @@ -52,23 +52,24 @@ public class QualityGateLoadingStepTest { @Rule public MutableQualityGateHolderRule mutableQualityGateHolder = new MutableQualityGateHolderRule(); - private ProjectSettingsRepository projectSettingsRepository = mock(ProjectSettingsRepository.class); + private SettingsRepository settingsRepository = mock(SettingsRepository.class); private QualityGateService qualityGateService = mock(QualityGateService.class); - private QualityGateLoadingStep underTest = new QualityGateLoadingStep(treeRootHolder, projectSettingsRepository, qualityGateService, mutableQualityGateHolder); + private QualityGateLoadingStep underTest = new QualityGateLoadingStep(treeRootHolder, settingsRepository, qualityGateService, mutableQualityGateHolder); @Test public void execute_sets_default_QualityGate_when_project_has_no_settings() { - treeRootHolder.setRoot(ReportComponent.builder(Component.Type.PROJECT, 1).setKey(PROJECT_KEY).addChildren(ReportComponent.builder(Component.Type.FILE, 2).build()).build()); - when(projectSettingsRepository.getProjectSettings(PROJECT_KEY)).thenReturn(new Settings()); + ReportComponent root = ReportComponent.builder(Component.Type.PROJECT, 1).setKey(PROJECT_KEY).addChildren(ReportComponent.builder(Component.Type.FILE, 2).build()).build(); + treeRootHolder.setRoot(root); + when(settingsRepository.getSettings(root)).thenReturn(new Settings()); underTest.execute(); verifyNoQualityGate(); // verify only project is processed - verify(projectSettingsRepository).getProjectSettings(PROJECT_KEY); - verifyNoMoreInteractions(projectSettingsRepository); + verify(settingsRepository).getSettings(root); + verifyNoMoreInteractions(settingsRepository); } @Test @@ -77,7 +78,7 @@ public class QualityGateLoadingStepTest { expectedException.expectMessage(String.format("Unsupported value (%s) in property sonar.qualitygate", "10 sds")); treeRootHolder.setRoot(PROJECT_ALONE); - when(projectSettingsRepository.getProjectSettings(PROJECT_KEY)).thenReturn(new Settings().setProperty("sonar.qualitygate", "10 sds")); + when(settingsRepository.getSettings(PROJECT_ALONE)).thenReturn(new Settings().setProperty("sonar.qualitygate", "10 sds")); underTest.execute(); } @@ -85,7 +86,7 @@ public class QualityGateLoadingStepTest { @Test public void execute_sets_default_QualityGate_if_it_can_not_be_found_by_service() { treeRootHolder.setRoot(PROJECT_ALONE); - when(projectSettingsRepository.getProjectSettings(PROJECT_KEY)).thenReturn(new Settings().setProperty("sonar.qualitygate", 10)); + when(settingsRepository.getSettings(PROJECT_ALONE)).thenReturn(new Settings().setProperty("sonar.qualitygate", 10)); when(qualityGateService.findById(10)).thenReturn(Optional.absent()); underTest.execute(); @@ -98,7 +99,7 @@ public class QualityGateLoadingStepTest { QualityGate qualityGate = new QualityGate("name", Collections.emptyList()); treeRootHolder.setRoot(PROJECT_ALONE); - when(projectSettingsRepository.getProjectSettings(PROJECT_KEY)).thenReturn(new Settings().setProperty("sonar.qualitygate", 10)); + when(settingsRepository.getSettings(PROJECT_ALONE)).thenReturn(new Settings().setProperty("sonar.qualitygate", 10)); when(qualityGateService.findById(10)).thenReturn(Optional.of(qualityGate)); underTest.execute();