+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2020 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program 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.
- *
- * This program 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.db.qualitygate;
-
-import java.util.Date;
-
-/**
- * This Dto is a join between QualityGates and Organizations.
- *
- * Tables : QUALITY_GATES joined with ORG_QUALITY_GATES
- */
-public class QGateWithOrgDto extends QualityGateDto {
- private String organizationUuid;
-
- public String getOrganizationUuid() {
- return organizationUuid;
- }
-
- public void setOrganizationUuid(String organizationUuid) {
- this.organizationUuid = organizationUuid;
- }
-
- @Override
- public QGateWithOrgDto setUuid(String uuid) {
- super.setUuid(uuid);
- return this;
- }
-
- @Override
- public QGateWithOrgDto setName(String name) {
- super.setName(name);
- return this;
- }
-
- @Override
- public QGateWithOrgDto setBuiltIn(boolean builtIn) {
- super.setBuiltIn(builtIn);
- return this;
- }
-
- @Override
- public QGateWithOrgDto setCreatedAt(Date createdAt) {
- super.setCreatedAt(createdAt);
- return this;
- }
-
- @Override
- public QGateWithOrgDto setUpdatedAt(Date updatedAt) {
- super.setUpdatedAt(updatedAt);
- return this;
- }
-}
import org.sonar.db.Dao;
import org.sonar.db.DatabaseUtils;
import org.sonar.db.DbSession;
-import org.sonar.db.organization.OrganizationDto;
-import org.sonar.db.property.InternalPropertiesDao;
public class QualityGateDao implements Dao {
- private static final String DEFAULT_ORGANIZATION_PROPERTY_KEY = "organization.default";
private final UuidFactory uuidFactory;
- private final InternalPropertiesDao internalPropertiesDao;
- public QualityGateDao(UuidFactory uuidFactory, InternalPropertiesDao internalPropertiesDao) {
+ public QualityGateDao(UuidFactory uuidFactory) {
this.uuidFactory = uuidFactory;
- this.internalPropertiesDao = internalPropertiesDao;
}
public QualityGateDto insert(DbSession session, QualityGateDto newQualityGate) {
return newQualityGate;
}
- /**
- * @deprecated drop when org are dropped
- */
- @Deprecated
- public void associate(DbSession dbSession, String uuid, OrganizationDto organization, QualityGateDto qualityGate) {
- mapper(dbSession).insertOrgQualityGate(uuid, organization.getUuid(), qualityGate.getUuid());
- }
-
- public void associate(DbSession dbSession, String uuid, QualityGateDto qualityGate) {
- String defaultOrganizationUuid = getDefaultOrganizationUuid(dbSession);
- mapper(dbSession).insertOrgQualityGate(uuid, defaultOrganizationUuid, qualityGate.getUuid());
- }
-
public Collection<QualityGateDto> selectAll(DbSession session) {
- String defaultOrganizationUuid = getDefaultOrganizationUuid(session);
- return selectAll(session, defaultOrganizationUuid);
- }
-
- /**
- * @deprecated drop when org are dropped
- */
- @Deprecated
- public Collection<QualityGateDto> selectAll(DbSession session, String organizationUuid) {
- return mapper(session).selectAll(organizationUuid);
+ return mapper(session).selectAll();
}
@CheckForNull
return mapper(session).selectByUuid(uuid);
}
- @CheckForNull
- public QGateWithOrgDto selectByDefaultOrganizationAndUuid(DbSession dbSession, String qualityGateUuid) {
- String defaultOrganizationUuid = getDefaultOrganizationUuid(dbSession);
- return mapper(dbSession).selectByUuidAndOrganization(qualityGateUuid, defaultOrganizationUuid);
- }
-
- /**
- * @deprecated drop when org are dropped
- */
- @CheckForNull
- @Deprecated
- public QGateWithOrgDto selectByOrganizationAndUuid(DbSession dbSession, OrganizationDto organization, String qualityGateUuid) {
- return mapper(dbSession).selectByUuidAndOrganization(qualityGateUuid, organization.getUuid());
- }
-
- @CheckForNull
- public QGateWithOrgDto selectByDefaultOrganizationAndName(DbSession session, String name) {
- String defaultOrganizationUuid = getDefaultOrganizationUuid(session);
- return mapper(session).selectByNameAndOrganization(name, defaultOrganizationUuid);
- }
-
public void delete(QualityGateDto qGate, DbSession session) {
mapper(session).delete(qGate.getUuid());
- mapper(session).deleteOrgQualityGatesByQualityGateUuid(qGate.getUuid());
}
public void deleteByUuids(DbSession session, Collection<String> uuids) {
DatabaseUtils.executeLargeUpdates(uuids, mapper::deleteByUuids);
}
- public void deleteOrgQualityGatesByOrganization(DbSession session, OrganizationDto organization) {
- mapper(session).deleteOrgQualityGatesByOrganization(organization.getUuid());
- }
-
public void update(QualityGateDto qGate, DbSession session) {
mapper(session).update(qGate.setUpdatedAt(new Date()));
}
public QualityGateDto selectByProjectUuid(DbSession dbSession, String projectUuid) {
return mapper(dbSession).selectByProjectUuid(projectUuid);
}
-
- private String getDefaultOrganizationUuid(DbSession dbSession) {
- return internalPropertiesDao.selectByKey(dbSession, DEFAULT_ORGANIZATION_PROPERTY_KEY)
- .orElseThrow(() -> new IllegalStateException("Default organization does not exist."));
- }
}
void insertQualityGate(QualityGateDto qualityGate);
- void insertOrgQualityGate(@Param("uuid") String uuid, @Param("organizationUuid") String organizationUuid, @Param("qualityGateUuid") String qualityGateUuuid);
-
- List<QualityGateDto> selectAll(@Param("organizationUuid") String organizationUuid);
+ List<QualityGateDto> selectAll();
QualityGateDto selectByName(String name);
- QGateWithOrgDto selectByUuidAndOrganization(@Param("qualityGateUuid") String qualityGateUuid, @Param("organizationUuid") String organizationUuid);
-
- QGateWithOrgDto selectByNameAndOrganization(@Param("name") String name, @Param("organizationUuid") String organizationUuid);
-
- QGateWithOrgDto selectDefault(@Param("organizationUuid") String organizationUuid);
-
QualityGateDto selectBuiltIn();
void delete(String uuid);
void deleteByUuids(@Param("uuids") Collection<String> uuids);
- void deleteOrgQualityGatesByQualityGateUuid(String uuid);
-
- void deleteOrgQualityGatesByOrganization(@Param("organizationUuid") String organizationUuid);
-
void update(QualityGateDto qGate);
void ensureOneBuiltInQualityGate(String builtInQualityName);
uuid, name, is_built_in as isBuiltIn, created_at as createdAt, updated_at as updatedAt
</sql>
- <sql id="qateWithOrgColumns">
- qg.uuid as uuid,
- qg.name as name,
- qg.is_built_in as isBuiltIn,
- oqg.organization_uuid as organizationUuid,
- qg.created_at as createdAt,
- qg.updated_at as updatedAd
- </sql>
-
<insert id="insertQualityGate" parameterType="QualityGate" useGeneratedKeys="false">
insert into quality_gates (uuid, name, is_built_in, created_at, updated_at)
values (#{uuid, jdbcType=VARCHAR}, #{name, jdbcType=VARCHAR}, #{isBuiltIn, jdbcType=BOOLEAN}, #{createdAt, jdbcType=TIMESTAMP}, #{updatedAt, jdbcType=TIMESTAMP})
</insert>
- <insert id="insertOrgQualityGate" parameterType="Map">
- INSERT INTO org_quality_gates (uuid, organization_uuid, quality_gate_uuid)
- VALUES (#{uuid, jdbcType=VARCHAR}, #{organizationUuid, jdbcType=VARCHAR}, #{qualityGateUuid, jdbcType=VARCHAR})
- </insert>
-
- <select id="selectAll" resultType="org.sonar.db.qualitygate.QGateWithOrgDto">
+ <select id="selectAll" resultType="QualityGate">
SELECT
- <include refid="qateWithOrgColumns"/>
+ <include refid="gateColumns"/>
FROM quality_gates qg
- INNER JOIN
- org_quality_gates oqg ON oqg.quality_gate_uuid = qg.uuid AND oqg.organization_uuid = #{organizationUuid, jdbcType=VARCHAR}
ORDER BY qg.name ASC
</select>
where uuid=#{uuid, jdbcType=VARCHAR}
</select>
- <select id="selectByUuidAndOrganization" parameterType="Map" resultType="org.sonar.db.qualitygate.QGateWithOrgDto">
- SELECT
- <include refid="qateWithOrgColumns"/>
- FROM
- quality_gates qg
- INNER JOIN
- org_quality_gates oqg ON oqg.quality_gate_uuid = qg.uuid AND oqg.organization_uuid = #{organizationUuid, jdbcType=VARCHAR}
- WHERE
- qg.uuid = #{qualityGateUuid, jdbcType=VARCHAR}
- </select>
-
- <select id="selectByNameAndOrganization" parameterType="Map" resultType="org.sonar.db.qualitygate.QGateWithOrgDto">
- SELECT
- <include refid="qateWithOrgColumns"/>
- FROM
- quality_gates qg
- INNER JOIN
- org_quality_gates oqg ON oqg.quality_gate_uuid = qg.uuid AND oqg.organization_uuid = #{organizationUuid, jdbcType=VARCHAR}
- WHERE
- qg.name = #{name, jdbcType=VARCHAR}
- </select>
-
<select id="selectByProjectUuid" parameterType="Map" resultType="org.sonar.db.qualitygate.QualityGateDto">
SELECT
<include refid="gateColumns"/>
<foreach collection="uuids" open="(" close=")" item="uuid" separator=",">#{uuid, jdbcType=VARCHAR}</foreach>
</update>
- <update id="deleteOrgQualityGatesByQualityGateUuid" parameterType="String">
- delete from org_quality_gates where quality_gate_uuid=#{uuid}
- </update>
-
- <update id="deleteOrgQualityGatesByOrganization" parameterType="String">
- delete from org_quality_gates
- where organization_uuid = #{organizationUuid, jdbcType=VARCHAR}
- </update>
-
<update id="update" parameterType="QualityGate">
update quality_gates set
name=#{name},
import org.sonar.db.DbTester;
import org.sonar.db.project.ProjectDto;
-import static java.lang.String.format;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
public class QualityGateDaoTest {
@Rule
- public DbTester db = DbTester.create(System2.INSTANCE);
+ public final DbTester db = DbTester.create(System2.INSTANCE);
- private QualityGateDbTester qualityGateDbTester = new QualityGateDbTester(db);
- private DbSession dbSession = db.getSession();
- private QualityGateDao underTest = db.getDbClient().qualityGateDao();
+ private final QualityGateDbTester qualityGateDbTester = new QualityGateDbTester(db);
+ private final DbSession dbSession = db.getSession();
+ private final QualityGateDao underTest = db.getDbClient().qualityGateDao();
@Test
public void insert() {
assertThat(reloaded.getUpdatedAt()).isNotNull();
}
- // TODO::
- // @Test
- // public void associate() {
- // QualityGateDto qgate = db.qualityGates().(db.getDefaultOrganization());
- // OrganizationDto org = db.organizations().insert();
- //
- // underTest.associate(dbSession, Uuids.createFast(), org, qgate);
- //
- // assertThat(underTest.selectByOrganizationAndUuid(dbSession, org, qgate.getUuid())).isNotNull();
- // assertThat(underTest.selectByOrganizationAndUuid(dbSession, org, qgate.getUuid()))
- // .extracting(QualityGateDto::getUuid, QualityGateDto::getUuid, QualityGateDto::getOrganizationUuid, QualityGateDto::getName)
- // .containsExactly(qgate.getUuid(), qgate.getUuid(), org.getUuid(), qgate.getName());
- // }
-
@Test
public void insert_built_in() {
underTest.insert(db.getSession(), new QualityGateDto().setName("test").setBuiltIn(true).setUuid(Uuids.createFast()));
assertThat(underTest.selectByUuid(dbSession, "not-existing-uuid")).isNull();
}
- @Test
- public void select_by_organization_and_name() {
- QualityGateDto qualityGate1 = db.qualityGates().insertQualityGate();
- QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate();
- QualityGateDto qualityGate3 = db.qualityGates().insertQualityGate();
-
- assertThat(underTest.selectByDefaultOrganizationAndName(dbSession, qualityGate1.getName()).getUuid()).isEqualTo(qualityGate1.getUuid());
- assertThat(underTest.selectByDefaultOrganizationAndName(dbSession, qualityGate3.getName()).getUuid()).isEqualTo(qualityGate3.getUuid());
- assertThat(underTest.selectByDefaultOrganizationAndName(dbSession, "Unknown")).isNull();
- }
-
- @Test
- public void select_by_organization_and_id() {
- QualityGateDto qualityGate1 = db.qualityGates().insertQualityGate();
- QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate();
- QualityGateDto qualityGate3 = db.qualityGates().insertQualityGate();
-
- assertThat(underTest.selectByDefaultOrganizationAndUuid(dbSession, qualityGate1.getUuid()).getUuid()).isEqualTo(qualityGate1.getUuid());
- assertThat(underTest.selectByDefaultOrganizationAndUuid(dbSession, qualityGate3.getUuid()).getUuid()).isEqualTo(qualityGate3.getUuid());
- assertThat(underTest.selectByDefaultOrganizationAndUuid(dbSession, "123")).isNull();
- }
-
@Test
public void select_by_project_uuid() {
ProjectDto project = db.components().insertPrivateProjectDto();
underTest.delete(qualityGate, dbSession);
dbSession.commit();
- assertThat(underTest.selectByDefaultOrganizationAndUuid(dbSession, qualityGate.getUuid())).isNull();
- assertThat(db.countSql(dbSession, format("select count(*) from org_quality_gates where quality_gate_uuid='%s'", qualityGate.getUuid()))).isZero();
- assertThat(underTest.selectByDefaultOrganizationAndUuid(dbSession, otherQualityGate.getUuid())).isNotNull();
- assertThat(db.countSql(dbSession, format("select count(*) from org_quality_gates where quality_gate_uuid='%s'", otherQualityGate.getUuid()))).isEqualTo(1);
+ assertThat(underTest.selectByUuid(dbSession, qualityGate.getUuid())).isNull();
+ assertThat(underTest.selectByUuid(dbSession, otherQualityGate.getUuid())).isNotNull();
}
@Test
assertThat(db.countRowsOfTable(dbSession, "quality_gates")).isEqualTo(nbOfQualityGates);
}
- // TODO::
- // @Test
- // public void deleteOrgQualityGatesByOrganization() {
- // OrganizationDto organization = db.organizations().insert();
- // qualityGateDbTester.insertQualityGate(organization);
- // OrganizationDto otherOrganization = db.organizations().insert();
- // qualityGateDbTester.insertQualityGate(otherOrganization);
- //
- // underTest.deleteOrgQualityGatesByOrganization(dbSession, organization);
- // dbSession.commit();
- //
- // assertThat(db.select("select organization_uuid as \"organizationUuid\" from org_quality_gates"))
- // .extracting(row -> (String) row.get("organizationUuid"))
- // .containsOnly(otherOrganization.getUuid());
- // }
-
@Test
public void update() {
QualityGateDto qualityGate = qualityGateDbTester.insertQualityGate(qg -> qg.setName("old name"));
underTest.update(qualityGate.setName("Not so strict"), dbSession);
dbSession.commit();
- QualityGateDto reloaded = underTest.selectByDefaultOrganizationAndUuid(dbSession, qualityGate.getUuid());
+ QualityGateDto reloaded = underTest.selectByUuid(dbSession, qualityGate.getUuid());
assertThat(reloaded.getName()).isEqualTo("Not so strict");
}
+ @Test
+ public void selectBuiltIn() {
+ QualityGateDto builtInQualityGate = qualityGateDbTester.insertQualityGate(qg -> qg.setName("Built in").setBuiltIn(true));
+ QualityGateDto qualityGate = qualityGateDbTester.insertQualityGate(qg -> qg.setName("Random quality gate").setBuiltIn(false));
+ dbSession.commit();
+
+ QualityGateDto result = underTest.selectBuiltIn(dbSession);
+
+ assertThat(result.getUuid()).isEqualTo(builtInQualityGate.getUuid());
+ assertThat(result.getName()).isEqualTo(builtInQualityGate.getName());
+ }
+
+ @Test
+ public void ensureOneBuiltInQualityGate() {
+ String builtInQgName = "Sonar Way";
+ QualityGateDto builtInQualityGate = qualityGateDbTester.insertQualityGate(qg -> qg.setName(builtInQgName).setBuiltIn(true));
+ QualityGateDto qualityGate1 = qualityGateDbTester.insertQualityGate(qg -> qg.setName("QG1").setBuiltIn(true));
+ QualityGateDto qualityGate2 = qualityGateDbTester.insertQualityGate(qg -> qg.setName("QG2"));
+
+ underTest.ensureOneBuiltInQualityGate(dbSession, builtInQgName);
+ dbSession.commit();
+
+ QualityGateDto reloaded = underTest.selectByName(dbSession, builtInQgName);
+ assertThat(reloaded.getUuid()).isEqualTo(builtInQualityGate.getUuid());
+ assertThat(reloaded.getName()).isEqualTo(builtInQualityGate.getName());
+ assertThat(reloaded.isBuiltIn()).isTrue();
+ }
+
private void insertQualityGates() {
qualityGateDbTester.insertQualityGate(g -> g.setName("Very strict").setBuiltIn(false));
qualityGateDbTester.insertQualityGate(g -> g.setName("Balanced").setBuiltIn(false));
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
import org.sonar.db.metric.MetricDto;
-import org.sonar.db.organization.OrganizationDto;
import org.sonar.db.project.ProjectDto;
import org.sonar.db.property.PropertyDto;
}
@SafeVarargs
- public final QGateWithOrgDto insertQualityGate(Consumer<QualityGateDto>... dtoPopulators) {
- return insertQualityGate(db.getDefaultOrganization(), dtoPopulators);
- }
-
- @Deprecated
- @SafeVarargs
- public final QGateWithOrgDto insertQualityGate(OrganizationDto organization, Consumer<QualityGateDto>... dtoPopulators) {
+ public final QualityGateDto insertQualityGate(Consumer<QualityGateDto>... dtoPopulators) {
QualityGateDto qualityGate = new QualityGateDto()
.setName(randomAlphanumeric(30))
.setUuid(Uuids.createFast())
.setBuiltIn(false);
Arrays.stream(dtoPopulators).forEach(dtoPopulator -> dtoPopulator.accept(qualityGate));
dbClient.qualityGateDao().insert(dbSession, qualityGate);
- dbClient.qualityGateDao().associate(dbSession, Uuids.createFast(), organization, qualityGate);
db.commit();
- return dbClient.qualityGateDao().selectByOrganizationAndUuid(dbSession, organization, qualityGate.getUuid());
+ return dbClient.qualityGateDao().selectByUuid(dbSession, qualityGate.getUuid());
}
public void associateProjectToQualityGate(ProjectDto project, QualityGateDto qualityGate) {
db.commit();
}
- @Deprecated
- public void associateQualityGateToOrganization(QualityGateDto qualityGate, OrganizationDto organization) {
- dbClient.qualityGateDao().associate(dbSession, Uuids.createFast(), organization, qualityGate);
- db.commit();
- }
-
@SafeVarargs
public final QualityGateDto createDefaultQualityGate(Consumer<QualityGateDto>... dtoPopulators) {
QualityGateDto defaultQGate = insertQualityGate(dtoPopulators);
QualityGateDto builtInQualityGate = dbClient.qualityGateDao().selectBuiltIn(dbSession);
OrganizationDto organization = insertOrganization(dbSession, newOrganization, builtInQualityGate);
beforeCommit.accept(organization);
- dbClient.qualityGateDao().associate(dbSession, uuidFactory.create(), organization, builtInQualityGate);
GroupDto ownerGroup = insertOwnersGroup(dbSession);
GroupDto defaultGroup = defaultGroupCreator.create(dbSession);
insertDefaultTemplateOnGroups(dbSession, organization, ownerGroup, defaultGroup);
.setBuiltIn(false)
.setUuid(uuidFactory.create());
dbClient.qualityGateDao().insert(dbSession, newQualityGate);
- dbClient.qualityGateDao().associate(dbSession, uuidFactory.create(), newQualityGate);
return newQualityGate;
}
@Rule
public DbTester db = DbTester.create(System2.INSTANCE);
- private DbClient dbClient = db.getDbClient();
- private WsActionTester ws = new WsActionTester(new DeleteAction(dbClient, userSessionRule));
+ private final DbClient dbClient = db.getDbClient();
+ private final WsActionTester ws = new WsActionTester(new DeleteAction(dbClient, userSessionRule));
@Test
public void verify_definition() {
loggedAsSystemAdministrator();
MetricDto customMetric = insertCustomMetric("custom-key");
MetricDto nonCustomMetric = insertMetric(newMetricDto().setEnabled(true).setUserManaged(false).setKey("non-custom"));
- QualityGateDto qualityGate1 = db.qualityGates().insertQualityGate(db.getDefaultOrganization());
+ QualityGateDto qualityGate1 = db.qualityGates().insertQualityGate();
db.qualityGates().addCondition(qualityGate1, customMetric);
- QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate(db.getDefaultOrganization());
+ QualityGateDto qualityGate2 = db.qualityGates().insertQualityGate();
db.qualityGates().addCondition(qualityGate2, customMetric);
db.qualityGates().addCondition(qualityGate2, nonCustomMetric);
import org.junit.rules.ExpectedException;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.System2;
-import org.sonar.core.util.Uuids;
import org.sonar.db.DbClient;
import org.sonar.db.DbSession;
import org.sonar.db.DbTester;
public void does_not_delete_built_in_quality_gate() {
db.qualityGates().createDefaultQualityGate();
QualityGateDto builtInQualityGate = db.qualityGates().insertBuiltInQualityGate();
- db.getDbClient().qualityGateDao().associate(db.getSession(), Uuids.createFast(), builtInQualityGate);
db.commit();
userSession.addPermission(ADMINISTER_QUALITY_GATES);