diff options
author | Simon Brandhof <simon.brandhof@sonarsource.com> | 2017-05-27 02:05:34 +0200 |
---|---|---|
committer | Eric Hartmann <hartmann.eric@gmail.com> | 2017-06-14 15:43:12 +0200 |
commit | d5bdf821a39621dbf4bd60dbb3412ea5c36b6ddc (patch) | |
tree | 6c482cb7d4b9ffade9f9e5e3fa4d47573a032715 /server/sonar-db-dao | |
parent | b6dd52cf7cd8c47988cfdb9a9887ac4e66c61999 (diff) | |
download | sonarqube-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')
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() { |