]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-15425 'api/rules/repositories' is empty for new instances
authorDuarte Meneses <duarte.meneses@sonarsource.com>
Wed, 22 Sep 2021 20:39:52 +0000 (15:39 -0500)
committersonartech <sonartech@sonarsource.com>
Thu, 23 Sep 2021 20:03:12 +0000 (20:03 +0000)
server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryDao.java
server/sonar-db-dao/src/main/java/org/sonar/db/rule/RuleRepositoryMapper.java
server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleRepositoryMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/rule/RuleRepositoryDaoTest.java
server/sonar-webserver-core/src/main/java/org/sonar/server/rule/RegisterRules.java
server/sonar-webserver-core/src/test/java/org/sonar/server/rule/RegisterRulesTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/qualityprofile/ws/CompareActionTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/AppActionTest.java
server/sonar-webserver-webapi/src/test/java/org/sonar/server/rule/ws/RepositoriesActionTest.java

index ae64c9c4cb97f6756b6d321926fbec08a9d188c4..130c499fcad914831713d2c341d712468ba75bb7 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.db.rule;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 import org.sonar.api.utils.System2;
 import org.sonar.db.Dao;
 import org.sonar.db.DatabaseUtils;
@@ -44,6 +45,10 @@ public class RuleRepositoryDao implements Dao {
     return dbSession.getMapper(RuleRepositoryMapper.class).selectAll();
   }
 
+  public Set<String> selectAllKeys(DbSession dbSession) {
+    return dbSession.getMapper(RuleRepositoryMapper.class).selectAllKeys();
+  }
+
   /**
    * @return a non-null list ordered by key (as implemented by database, order may
    * depend on case sensitivity)
@@ -52,14 +57,18 @@ public class RuleRepositoryDao implements Dao {
     return dbSession.getMapper(RuleRepositoryMapper.class).selectByLanguage(language);
   }
 
-  public void insertOrUpdate(DbSession dbSession, Collection<RuleRepositoryDto> dtos) {
+  public void insert(DbSession dbSession, Collection<RuleRepositoryDto> dtos) {
     RuleRepositoryMapper mapper = dbSession.getMapper(RuleRepositoryMapper.class);
     long now = system2.now();
     for (RuleRepositoryDto dto : dtos) {
-      int updated = mapper.update(dto);
-      if (updated == 0) {
-        mapper.insert(dto, now);
-      }
+      mapper.insert(dto, now);
+    }
+  }
+
+  public void update(DbSession dbSession, Collection<RuleRepositoryDto> dtos) {
+    RuleRepositoryMapper mapper = dbSession.getMapper(RuleRepositoryMapper.class);
+    for (RuleRepositoryDto dto : dtos) {
+      mapper.update(dto);
     }
   }
 
index 216bac31ec58dd901aa05c838302da5214f3f190..32cf93e45986148e1e4095b9492272ec35878e67 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.db.rule;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 import javax.annotation.CheckForNull;
 import org.apache.ibatis.annotations.Param;
 
@@ -28,6 +29,8 @@ public interface RuleRepositoryMapper {
 
   List<RuleRepositoryDto> selectAll();
 
+  Set<String> selectAllKeys();
+
   List<RuleRepositoryDto> selectByLanguage(@Param("language") String language);
 
   @CheckForNull
@@ -35,7 +38,7 @@ public interface RuleRepositoryMapper {
 
   void insert(@Param("repository") RuleRepositoryDto repository, @Param("now") long now);
 
-  int update(@Param("repository") RuleRepositoryDto repository);
+  void update(@Param("repository") RuleRepositoryDto repository);
 
   void deleteIfKeyNotIn(@Param("keys") Collection<String> keys);
 }
index b6e3321b95038c28aecb9162574ad809a66eea54..962dd8a1a1a64fbeba38c79bedfd5af13e801c20 100644 (file)
     order by kee
   </select>
 
+  <select id="selectAllKeys" resultType="String">
+    select kee
+    from rule_repositories
+  </select>
+
   <select id="selectByLanguage" parameterType="String" resultType="org.sonar.db.rule.RuleRepositoryDto">
     select <include refid="sqlColumns"/>
     from rule_repositories
index 0e4306e783b29f71c97329cf9972bd30d8ca7807..7ef08756877bd4610f9e716178bc35295a27fc23 100644 (file)
@@ -48,11 +48,11 @@ public class RuleRepositoryDaoTest {
   private RuleRepositoryDao underTest = new RuleRepositoryDao(system2);
 
   @Test
-  public void insertOrUpdate_insert_rows_that_do_not_exist() {
+  public void insert_insert_rows_that_do_not_exist() {
     RuleRepositoryDto repo1 = new RuleRepositoryDto("findbugs", "java", "Findbugs");
     RuleRepositoryDto repo2 = new RuleRepositoryDto("sonarjava", "java", "SonarJava");
     RuleRepositoryDto repo3 = new RuleRepositoryDto("sonarcobol", "cobol", "SonarCobol");
-    underTest.insertOrUpdate(dbTester.getSession(), asList(repo1, repo2, repo3));
+    underTest.insert(dbTester.getSession(), asList(repo1, repo2, repo3));
 
     List<RuleRepositoryDto> rows = underTest.selectAll(dbTester.getSession());
     assertThat(rows).hasSize(3);
@@ -67,15 +67,16 @@ public class RuleRepositoryDaoTest {
   }
 
   @Test
-  public void insertOrUpdate_update_rows_that_exist() {
+  public void update_update_rows_that_exist() {
     RuleRepositoryDto repo1 = new RuleRepositoryDto("findbugs", "java", "Findbugs");
     RuleRepositoryDto repo2 = new RuleRepositoryDto("sonarjava", "java", "SonarJava");
-    underTest.insertOrUpdate(dbTester.getSession(), asList(repo1, repo2));
+    underTest.insert(dbTester.getSession(), asList(repo1, repo2));
 
     // update sonarjava, insert sonarcobol
     RuleRepositoryDto repo2bis = new RuleRepositoryDto("sonarjava", "java", "SonarJava");
     RuleRepositoryDto repo3 = new RuleRepositoryDto("sonarcobol", "cobol", "SonarCobol");
-    underTest.insertOrUpdate(dbTester.getSession(), asList(repo2bis, repo3));
+    underTest.update(dbTester.getSession(), asList(repo2bis));
+    underTest.insert(dbTester.getSession(), asList(repo3));
 
     List<RuleRepositoryDto> rows = underTest.selectAll(dbTester.getSession());
     assertThat(rows).hasSize(3);
@@ -94,7 +95,7 @@ public class RuleRepositoryDaoTest {
     RuleRepositoryDto repo1 = new RuleRepositoryDto("findbugs", "java", "Findbugs");
     RuleRepositoryDto repo2 = new RuleRepositoryDto("sonarjava", "java", "SonarJava");
     RuleRepositoryDto repo3 = new RuleRepositoryDto("sonarcobol", "cobol", "SonarCobol");
-    underTest.insertOrUpdate(dbTester.getSession(), asList(repo1, repo2, repo3));
+    underTest.insert(dbTester.getSession(), asList(repo1, repo2, repo3));
 
     underTest.deleteIfKeyNotIn(dbTester.getSession(), Arrays.asList(repo2.getKey(), "unknown"));
     assertThat(underTest.selectAll(dbTester.getSession()))
@@ -106,7 +107,7 @@ public class RuleRepositoryDaoTest {
   public void deleteIfKeyNotIn_truncates_table_if_keys_are_empty() {
     RuleRepositoryDto repo1 = new RuleRepositoryDto("findbugs", "java", "Findbugs");
     RuleRepositoryDto repo2 = new RuleRepositoryDto("sonarjava", "java", "SonarJava");
-    underTest.insertOrUpdate(dbTester.getSession(), asList(repo1, repo2));
+    underTest.insert(dbTester.getSession(), asList(repo1, repo2));
 
     underTest.deleteIfKeyNotIn(dbTester.getSession(), emptyList());
 
@@ -128,18 +129,29 @@ public class RuleRepositoryDaoTest {
     RuleRepositoryDto dto1 = new RuleRepositoryDto("findbugs", "java", "Findbugs");
     RuleRepositoryDto dto2 = new RuleRepositoryDto("squid", "java", "Java");
     RuleRepositoryDto dto3 = new RuleRepositoryDto("cobol-lint", "cobol", "Cobol Lint");
-    underTest.insertOrUpdate(dbSession, asList(dto1, dto2, dto3));
+    underTest.insert(dbSession, asList(dto1, dto2, dto3));
 
     assertThat(underTest.selectByLanguage(dbSession, "java")).extracting(RuleRepositoryDto::getKey)
       // ordered by key
       .containsExactly("findbugs", "squid");
   }
 
+  @Test
+  public void selectAllKeys() {
+    DbSession dbSession = dbTester.getSession();
+    RuleRepositoryDto dto1 = new RuleRepositoryDto("findbugs", "java", "Findbugs");
+    RuleRepositoryDto dto2 = new RuleRepositoryDto("squid", "java", "Java");
+    RuleRepositoryDto dto3 = new RuleRepositoryDto("cobol-lint", "cobol", "Cobol Lint");
+    underTest.insert(dbSession, asList(dto1, dto2, dto3));
+
+    assertThat(underTest.selectAllKeys(dbSession)).containsOnly("findbugs", "squid", "cobol-lint");
+  }
+
   @Test
   public void selectByLanguage_returns_empty_list_if_no_results() {
     DbSession dbSession = dbTester.getSession();
     RuleRepositoryDto dto1 = new RuleRepositoryDto("findbugs", "java", "Findbugs");
-    underTest.insertOrUpdate(dbSession, asList(dto1));
+    underTest.insert(dbSession, asList(dto1));
 
     assertThat(underTest.selectByLanguage(dbSession, "missing")).isEmpty();
   }
index 85ca920382e0aaad66f8c0dec6a8732e07e03f1b..bab17bc450cd92cda74b7bcb2b6e2af0208c547a 100644 (file)
@@ -311,11 +311,15 @@ public class RegisterRules implements Startable {
   }
 
   private void persistRepositories(DbSession dbSession, List<RulesDefinition.Repository> repositories) {
-    List<RuleRepositoryDto> dtos = repositories.stream()
+    List<String> keys = repositories.stream().map(RulesDefinition.Repository::key).collect(toList(repositories.size()));
+    Set<String> existingKeys = dbClient.ruleRepositoryDao().selectAllKeys(dbSession);
+
+    Map<Boolean, List<RuleRepositoryDto>> dtos = repositories.stream()
       .map(r -> new RuleRepositoryDto(r.key(), r.language(), r.name()))
-      .collect(toList(repositories.size()));
-    List<String> keys = dtos.stream().map(RuleRepositoryDto::getKey).collect(toList(repositories.size()));
-    dbClient.ruleRepositoryDao().insertOrUpdate(dbSession, dtos);
+      .collect(Collectors.groupingBy(i -> existingKeys.contains(i.getKey())));
+
+    dbClient.ruleRepositoryDao().update(dbSession, dtos.getOrDefault(true, emptyList()));
+    dbClient.ruleRepositoryDao().insert(dbSession, dtos.getOrDefault(false, emptyList()));
     dbClient.ruleRepositoryDao().deleteIfKeyNotIn(dbSession, keys);
     dbSession.commit();
   }
index 4c7423de81b9bbfbdb84424108bf92667152b73a..572e470627417b505aa4ab70db855e843adb5d1c 100644 (file)
@@ -302,7 +302,7 @@ public class RegisterRulesTest {
   public void delete_repositories_that_have_been_uninstalled() {
     RuleRepositoryDto repository = new RuleRepositoryDto("findbugs", "java", "Findbugs");
     DbSession dbSession = db.getSession();
-    db.getDbClient().ruleRepositoryDao().insertOrUpdate(dbSession, singletonList(repository));
+    db.getDbClient().ruleRepositoryDao().insert(dbSession, singletonList(repository));
     dbSession.commit();
 
     execute(new FakeRepositoryV1());
index 51d20bda966ff298632cbf55503f88fc10cbc53b..10b08e5e66ceaa3c77a3e19b83c851cb45d8ba6f 100644 (file)
@@ -234,7 +234,7 @@ public class CompareActionTest {
 
   private void createRepository(String repositoryKey, String repositoryLanguage, String repositoryName) {
     RuleRepositoryDto dto = new RuleRepositoryDto(repositoryKey, repositoryLanguage, repositoryName);
-    dbClient.ruleRepositoryDao().insertOrUpdate(session, singletonList(dto));
+    dbClient.ruleRepositoryDao().insert(session, singletonList(dto));
     session.commit();
   }
 }
index 094d8337efd6f53529460d81ce1861a285c7f8b0..37a9c2ba679aab36a121ae9c885bbd6e388d4f9f 100644 (file)
@@ -115,7 +115,7 @@ public class AppActionTest {
   private void insertRules() {
     RuleRepositoryDto repo1 = new RuleRepositoryDto("xoo", "xoo", "SonarQube");
     RuleRepositoryDto repo2 = new RuleRepositoryDto("squid", "ws", "SonarQube");
-    db.getDbClient().ruleRepositoryDao().insertOrUpdate(db.getSession(), asList(repo1, repo2));
+    db.getDbClient().ruleRepositoryDao().insert(db.getSession(), asList(repo1, repo2));
     db.getSession().commit();
   }
 
index b8e628cb418460e98e18f045728b60f1f69342e7..34a3d572a69633df1752fe84f8bb9f2abe189240 100644 (file)
@@ -47,7 +47,7 @@ public class RepositoriesActionTest {
     RuleRepositoryDto repo1 = new RuleRepositoryDto("xoo", "xoo", "SonarQube");
     RuleRepositoryDto repo2 = new RuleRepositoryDto("squid", "ws", "SonarQube");
     RuleRepositoryDto repo3 = new RuleRepositoryDto("common-ws", "ws", "SonarQube Common");
-    dbTester.getDbClient().ruleRepositoryDao().insertOrUpdate(dbSession, asList(repo1, repo2, repo3));
+    dbTester.getDbClient().ruleRepositoryDao().insert(dbSession, asList(repo1, repo2, repo3));
     dbSession.commit();
   }