]> source.dussan.org Git - sonarqube.git/commitdiff
rename ProjectSettingsRepository to SettingsRepository interface
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 17 Aug 2015 14:45:44 +0000 (16:45 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 24 Aug 2015 12:00:31 +0000 (14:00 +0200)
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

15 files changed:
server/sonar-server/src/main/java/org/sonar/server/computation/component/ProjectSettingsRepository.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/computation/component/SettingsRepository.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/component/SettingsRepositoryImpl.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/container/ReportComputeEngineContainerPopulator.java
server/sonar-server/src/main/java/org/sonar/server/computation/issue/DefaultAssignee.java
server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java
server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContext.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PurgeDatastoresStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/QualityGateLoadingStep.java
server/sonar-server/src/test/java/org/sonar/server/computation/component/ProjectSettingsRepositoryTest.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/computation/component/SettingsRepositoryTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/issue/DefaultAssigneeTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerImplementationContextTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PurgeDatastoresStepTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/QualityGateLoadingStepTest.java

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 (file)
index 2a12477..0000000
+++ /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 (file)
index 0000000..3bbdf2f
--- /dev/null
@@ -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 (file)
index 0000000..f14ddc1
--- /dev/null
@@ -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<String, Settings> cache = new MemoryCache<>(new CacheLoader<String, Settings>() {
+    @Override
+    public Settings load(String key) {
+      return projectSettingsFactory.newProjectSettings(key);
+    }
+
+    @Override
+    public Map<String, Settings> loadAll(Collection<? extends String> 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());
+  }
+
+}
index 6a9e37d7342554af227359353fa07a0c4b43c2c4..0ba7ab203e6fc04185eb04a3decc596c937932e4 100644 (file)
@@ -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,
index 7cdd0a5da73fbd1ec0869a8c2722e26d74c230a3..6468bb492f5ab8bbd8d4f5bb845d321c195f2ef4 100644 (file)
@@ -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;
       }
index 488b09d5c63d6389f6f427fb202bfafa2cc9c903..0b61fcd78670693c017a0cee6494ed22ea4de4f5 100644 (file)
@@ -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;
index b710678e68eacfaf367ac3a14b3fbae546567b4e..e8f74f449a92e6f30eab94c0c7f76d639d9ecb4e 100644 (file)
@@ -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<String> 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
index c32a2c77ed43d5d0669ee057feeb393fb7d45577..ad84934304879f9e77c951aabbd830c39fd14d6f 100644 (file)
@@ -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);
index 6ebeccd2b1c0fc6d339c22c26591065501615d1c..7fcc26c49f64f62608c6d1f0c27f635a8689246c 100644 (file)
@@ -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 (file)
index 9505909..0000000
+++ /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 (file)
index 0000000..bc444a0
--- /dev/null
@@ -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");
+  }
+}
index 99fc8f47064f198d00633ef124cf780844863b3a..cac7306f86f33eff3aaa75882323eb79c517fd5f 100644 (file)
@@ -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
index 161d6c7673e50b37c57fa6ea0668b6a5ee2d75c7..3bb8df5ba4391c3a461c9e3002bb460921e3aced 100644 (file)
@@ -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);
   }
 }
index 8cea9530661ebf242da08e956c6ad2c81ae6320a..c0587515bd204d379a63c14553aec8d4e0473785 100644 (file)
@@ -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()
index 27781488aebd61d27468094fca94e1842b8dd8a1..ba15c22f7ec643834035bbd9f77e3f927facbf91 100644 (file)
@@ -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.<QualityGate>absent());
 
     underTest.execute();
@@ -98,7 +99,7 @@ public class QualityGateLoadingStepTest {
     QualityGate qualityGate = new QualityGate("name", Collections.<Condition>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();