aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-db-dao
diff options
context:
space:
mode:
authorSimon Brandhof <simon.brandhof@sonarsource.com>2017-05-27 02:05:34 +0200
committerEric Hartmann <hartmann.eric@gmail.com>2017-06-14 15:43:12 +0200
commitd5bdf821a39621dbf4bd60dbb3412ea5c36b6ddc (patch)
tree6c482cb7d4b9ffade9f9e5e3fa4d47573a032715 /server/sonar-db-dao
parentb6dd52cf7cd8c47988cfdb9a9887ac4e66c61999 (diff)
downloadsonarqube-d5bdf821a39621dbf4bd60dbb3412ea5c36b6ddc.tar.gz
sonarqube-d5bdf821a39621dbf4bd60dbb3412ea5c36b6ddc.zip
SONAR-9302 built-in profiles must always be present
The profiles that have been deleted in the past by administrators should be re-created.
Diffstat (limited to 'server/sonar-db-dao')
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/loadedtemplate/LoadedTemplateDto.java5
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDao.java4
-rw-r--r--server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMapper.java8
-rw-r--r--server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml58
-rw-r--r--server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java90
5 files changed, 22 insertions, 143 deletions
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/loadedtemplate/LoadedTemplateDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/loadedtemplate/LoadedTemplateDto.java
index 0fecf4d728e..b8646499c6c 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/loadedtemplate/LoadedTemplateDto.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/loadedtemplate/LoadedTemplateDto.java
@@ -23,13 +23,8 @@ import java.util.Objects;
public final class LoadedTemplateDto {
- public static final String DASHBOARD_TYPE = "DASHBOARD";
- public static final String FILTER_TYPE = "FILTER";
- public static final String QUALITY_PROFILE_TYPE = "QUALITY_PROFILE";
- public static final String PERMISSION_TEMPLATE_TYPE = "PERM_TEMPLATE";
public static final String QUALITY_GATE_TYPE = "QUALITY_GATE";
public static final String ONE_SHOT_TASK_TYPE = "ONE_SHOT_TASK";
- public static final String ISSUE_FILTER_TYPE = "ISSUE_FILTER";
private Long id;
private String key;
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDao.java
index 1a43599dd1a..20dcba038c1 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDao.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationDao.java
@@ -75,8 +75,8 @@ public class OrganizationDao implements Dao {
return getMapper(dbSession).selectByPermission(userId, permission);
}
- public List<OrganizationDto> selectOrganizationsWithoutLoadedTemplate(DbSession dbSession, String loadedTemplateType, Pagination pagination) {
- return getMapper(dbSession).selectOrganizationsWithoutLoadedTemplate(loadedTemplateType, pagination);
+ public List<OrganizationDto> selectWithoutQualityProfile(DbSession dbSession, String profileLanguage, String profileName) {
+ return getMapper(dbSession).selectWithoutQualityProfile(profileLanguage, profileName);
}
/**
diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMapper.java b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMapper.java
index 5f891da130a..4617fec29fb 100644
--- a/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMapper.java
+++ b/server/sonar-db-dao/src/main/java/org/sonar/db/organization/OrganizationMapper.java
@@ -42,12 +42,8 @@ public interface OrganizationMapper {
List<OrganizationDto> selectByPermission(@Param("userId") Integer userId, @Param("permission") String permission);
- /**
- * Assuming the key of the loaded template with the specified type is an organization's UUID, select all organizations
- * which does not have a row in table LOADED_TEMPLATES with the specified type.
- */
- List<OrganizationDto> selectOrganizationsWithoutLoadedTemplate(@Param("loadedTemplateType") String type,
- @Param("pagination") Pagination pagination);
+ List<OrganizationDto> selectWithoutQualityProfile(@Param("profileLanguage") String profileLanguage,
+ @Param("profileName") String profileName);
DefaultTemplates selectDefaultTemplatesByUuid(@Param("uuid") String uuid);
diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml
index 45127429f1a..feacf5db7a3 100644
--- a/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml
+++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/organization/OrganizationMapper.xml
@@ -129,57 +129,17 @@
and gu.user_id = #{userId,jdbcType=INTEGER}
</select>
- <select id="selectOrganizationsWithoutLoadedTemplate" parameterType="map" resultType="Organization">
+ <select id="selectWithoutQualityProfile" parameterType="map" resultType="Organization">
select
- <include refid="selectColumns"/>
- <include refid="sqlSelectOrganizationsWithoutLoadedTemplate"/>
- order by
- org.created_at asc
- limit #{pagination.pageSize,jdbcType=INTEGER} offset #{pagination.offset,jdbcType=INTEGER}
- </select>
-
- <select id="selectOrganizationsWithoutLoadedTemplate" parameterType="map" resultType="Organization" databaseId="mssql">
- select * from (
- select
- row_number() over(order by org.created_at asc) as number,
- <include refid="selectColumns"/>
- <include refid="sqlSelectOrganizationsWithoutLoadedTemplate"/>
- ) as query
- where
- query.number between #{pagination.startRowNumber,jdbcType=INTEGER} and #{pagination.endRowNumber,jdbcType=INTEGER}
- order by
- query.createdAt asc
- </select>
-
- <select id="selectOrganizationsWithoutLoadedTemplate" parameterType="map" resultType="Organization" databaseId="oracle">
- select * from (
- select rownum as rn, t.* from (
- select
- <include refid="selectColumns"/>
- <include refid="sqlSelectOrganizationsWithoutLoadedTemplate"/>
- order by
- org.created_at asc
- ) t
- ) t
- where
- t.rn between #{pagination.startRowNumber,jdbcType=INTEGER} and #{pagination.endRowNumber,jdbcType=INTEGER}
+ <include refid="selectColumns"/>
+ from organizations org
+ where not exists (
+ select 1 from rules_profiles p
+ where p.organization_uuid = org.uuid
+ and p.language = #{profileLanguage, jdbcType=VARCHAR}
+ and p.name = #{profileName, jdbcType=VARCHAR}
+ )
</select>
-
- <sql id="sqlSelectOrganizationsWithoutLoadedTemplate">
- from
- organizations org
- where
- not exists (
- select
- 1
- from
- loaded_templates lt
- where
- lt.template_type=#{loadedTemplateType,jdbcType=VARCHAR}
- and lt.kee=org.uuid
- )
- </sql>
-
<select id="selectDefaultGroupIdByUuid" resultType="Integer">
select org.default_group_id
from organizations org
diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java
index 9912aede16c..31c968c6846 100644
--- a/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java
+++ b/server/sonar-db-dao/src/test/java/org/sonar/db/organization/OrganizationDaoTest.java
@@ -29,7 +29,6 @@ import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
-import java.util.stream.IntStream;
import javax.annotation.Nullable;
import org.apache.ibatis.exceptions.PersistenceException;
import org.assertj.core.util.Lists;
@@ -37,13 +36,12 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.sonar.api.utils.System2;
-import org.sonar.api.utils.internal.AlwaysIncreasingSystem2;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.dialect.Dialect;
import org.sonar.db.dialect.Oracle;
-import org.sonar.db.loadedtemplate.LoadedTemplateDto;
+import org.sonar.db.qualityprofile.QualityProfileDto;
import org.sonar.db.user.GroupDto;
import org.sonar.db.user.GroupTesting;
import org.sonar.db.user.UserDto;
@@ -54,7 +52,6 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import static org.sonar.db.Pagination.all;
import static org.sonar.db.Pagination.forPage;
import static org.sonar.db.organization.OrganizationQuery.newOrganizationQueryBuilder;
import static org.sonar.db.organization.OrganizationQuery.returnAll;
@@ -877,85 +874,16 @@ public class OrganizationDaoTest {
}
@Test
- public void selectOrganizationsWithoutLoadedTemplate_returns_empty_if_there_is_no_organization() {
- List<OrganizationDto> organizationDtos = underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "type1", all());
+ public void selectWithoutQualityProfile_returns_() {
+ OrganizationDto orgWithoutAnyProfiles = dbTester.organizations().insert();
+ OrganizationDto orgWithProfiles = dbTester.organizations().insert();
+ QualityProfileDto profile = dbTester.qualityProfiles().insert(orgWithProfiles);
- assertThat(organizationDtos).isEmpty();
- }
-
- @Test
- public void selectOrganizationsWithoutLoadedTemplate_returns_all_organizations_if_loaded_template_table_is_empty() {
- int organizationCount = Math.abs(new Random().nextInt(20)) + 1;
- String[] organizationUuids = IntStream.range(0, organizationCount).mapToObj(i -> "uuid_" + i).toArray(String[]::new);
- Arrays.stream(organizationUuids).forEach(uuid -> dbTester.organizations().insertForUuid(uuid));
-
- List<OrganizationDto> organizationDtos = underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "type1", all());
-
- assertThat(organizationDtos)
- .extracting(OrganizationDto::getUuid)
- .containsOnly(organizationUuids);
- }
+ assertThat(underTest.selectWithoutQualityProfile(dbSession, "js", "foo"))
+ .extracting(OrganizationDto::getUuid).containsExactlyInAnyOrder(orgWithoutAnyProfiles.getUuid(), orgWithProfiles.getUuid());
- @Test
- public void selectOrganizationsWithoutLoadedTemplate_returns_all_organizations_but_those_with_loaded_template_with_specified_type_and_org_uuid_as_key() {
- int organizationCount = Math.abs(new Random().nextInt(20)) + 5;
- String[] organizationUuids = IntStream.range(0, organizationCount).mapToObj(i -> "uuid_" + i).toArray(String[]::new);
- Arrays.stream(organizationUuids).forEach(uuid -> dbTester.organizations().insertForUuid(uuid));
- String loadedTemplateType = "type1";
- dbTester.getDbClient().loadedTemplateDao().insert(new LoadedTemplateDto(organizationUuids[0], loadedTemplateType), dbSession);
- dbTester.getDbClient().loadedTemplateDao().insert(new LoadedTemplateDto(organizationUuids[1], "foo"), dbSession);
- // matching is case sensitive
- dbTester.getDbClient().loadedTemplateDao().insert(new LoadedTemplateDto(organizationUuids[2], loadedTemplateType.toUpperCase()), dbSession);
- dbTester.getDbClient().loadedTemplateDao().insert(new LoadedTemplateDto(organizationUuids[3], loadedTemplateType), dbSession);
- dbTester.getDbClient().loadedTemplateDao().insert(new LoadedTemplateDto(organizationUuids[4] + " not exactly the uuid", loadedTemplateType), dbSession);
- dbTester.getDbClient().loadedTemplateDao().insert(new LoadedTemplateDto("foo", loadedTemplateType), dbSession);
- dbTester.getDbClient().loadedTemplateDao().insert(new LoadedTemplateDto("", loadedTemplateType), dbSession);
- dbTester.commit();
-
- List<OrganizationDto> organizationDtos = underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, loadedTemplateType, all());
-
- assertThat(organizationDtos)
- .extracting(OrganizationDto::getUuid)
- .containsOnly(
- Arrays.stream(organizationUuids)
- .filter(s -> !s.equals(organizationUuids[0]) && !s.equals(organizationUuids[3]))
- .toArray(String[]::new));
- }
-
- @Test
- public void selectOrganizationsWithoutLoadedTemplate_is_paginated() {
- AlwaysIncreasingSystem2 alwaysIncreasingSystem2 = new AlwaysIncreasingSystem2(500);
- when(system2.now()).thenAnswer(t -> alwaysIncreasingSystem2.now());
- IntStream.range(1, 31).forEach(i -> dbTester.organizations().insertForUuid("" + i));
-
- assertThat(underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "foo", all()))
- .extracting(dto -> Integer.valueOf(dto.getUuid()))
- .hasSize(30)
- .allMatch(i -> i > 0 && i <= 30);
- assertThat(underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "foo", forPage(1).andSize(30)))
- .extracting(dto -> Integer.valueOf(dto.getUuid()))
- .hasSize(30)
- .allMatch(i -> i > 0 && i <= 30);
- assertThat(underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "foo", forPage(1).andSize(10)))
- .extracting(dto -> Integer.valueOf(dto.getUuid()))
- .hasSize(10)
- .allMatch(i -> i > 0 && i <= 10);
- assertThat(underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "foo", forPage(2).andSize(10)))
- .extracting(dto -> Integer.valueOf(dto.getUuid()))
- .hasSize(10)
- .allMatch(i -> i > 10 && i <= 20);
- assertThat(underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "foo", forPage(5).andSize(5)))
- .extracting(dto -> Integer.valueOf(dto.getUuid()))
- .hasSize(5)
- .allMatch(i -> i > 20 && i <= 25);
- assertThat(underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "foo", forPage(6).andSize(5)))
- .extracting(dto -> Integer.valueOf(dto.getUuid()))
- .hasSize(5)
- .allMatch(i -> i > 25 && i <= 30);
- assertThat(underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "foo", forPage(7).andSize(5)))
- .isEmpty();
- assertThat(underTest.selectOrganizationsWithoutLoadedTemplate(dbSession, "foo", forPage(2).andSize(50)))
- .isEmpty();
+ assertThat(underTest.selectWithoutQualityProfile(dbSession, profile.getLanguage(), profile.getName()))
+ .extracting(OrganizationDto::getUuid).containsExactlyInAnyOrder(orgWithoutAnyProfiles.getUuid());
}
private void expectDtoCanNotBeNull() {