diff options
author | Jean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com> | 2014-02-20 17:57:20 +0100 |
---|---|---|
committer | Jean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com> | 2014-02-25 08:43:24 +0100 |
commit | d41462d3f6f8a3114e6d7b22906a19a4d150cf92 (patch) | |
tree | 84ff70ea3f8618887d7ad60234683ce3e6254294 /sonar-core | |
parent | 2438e8442ab65565b361a9e4a0ca85a1c19f6d59 (diff) | |
download | sonarqube-d41462d3f6f8a3114e6d7b22906a19a4d150cf92.tar.gz sonarqube-d41462d3f6f8a3114e6d7b22906a19a4d150cf92.zip |
SONAR-4366 Create DB components for management of quality gate conditions
Diffstat (limited to 'sonar-core')
14 files changed, 422 insertions, 5 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java index 8e2a9f07174..4131095f5ff 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DatabaseVersion.java @@ -33,7 +33,7 @@ import java.util.List; */ public class DatabaseVersion implements BatchComponent, ServerComponent { - public static final int LAST_VERSION = 510; + public static final int LAST_VERSION = 511; public static enum Status { UP_TO_DATE, REQUIRES_UPGRADE, REQUIRES_DOWNGRADE, FRESH_INSTALL @@ -77,6 +77,7 @@ public class DatabaseVersion implements BatchComponent, ServerComponent { "perm_templates_users", "perm_templates_groups", "quality_gates", + "quality_gate_conditions", "projects", "project_links", "project_measures", diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java b/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java index 1b38ccd7f0d..85adbd63778 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java @@ -19,9 +19,6 @@ */ package org.sonar.core.persistence; -import org.sonar.core.qualitygate.db.QualityGateMapper; - -import org.sonar.core.qualitygate.db.QualityGateDto; import ch.qos.logback.classic.Level; import com.google.common.io.Closeables; import org.apache.ibatis.builder.xml.XMLMapperBuilder; @@ -58,6 +55,10 @@ import org.sonar.core.properties.PropertiesMapper; import org.sonar.core.properties.PropertyDto; import org.sonar.core.purge.PurgeMapper; import org.sonar.core.purge.PurgeableSnapshotDto; +import org.sonar.core.qualitygate.db.QualityGateConditionDto; +import org.sonar.core.qualitygate.db.QualityGateConditionMapper; +import org.sonar.core.qualitygate.db.QualityGateDto; +import org.sonar.core.qualitygate.db.QualityGateMapper; import org.sonar.core.qualityprofile.db.*; import org.sonar.core.resource.*; import org.sonar.core.rule.*; @@ -111,6 +112,7 @@ public class MyBatis implements BatchComponent, ServerComponent { loadAlias(conf, "Property", PropertyDto.class); loadAlias(conf, "PurgeableSnapshot", PurgeableSnapshotDto.class); loadAlias(conf, "QualityGate", QualityGateDto.class); + loadAlias(conf, "QualityGateCondition", QualityGateConditionDto.class); loadAlias(conf, "Resource", ResourceDto.class); loadAlias(conf, "ResourceIndex", ResourceIndexDto.class); loadAlias(conf, "ResourceSnapshot", ResourceSnapshotDto.class); @@ -159,7 +161,7 @@ public class MyBatis implements BatchComponent, ServerComponent { MeasureMapper.class, SnapshotDataMapper.class, SnapshotSourceMapper.class, ActionPlanMapper.class, ActionPlanStatsMapper.class, NotificationQueueMapper.class, CharacteristicMapper.class, RuleTagMapper.class, GroupMembershipMapper.class, QualityProfileMapper.class, ActiveRuleMapper.class, - MeasureDataMapper.class, QualityGateMapper.class + MeasureDataMapper.class, QualityGateMapper.class, QualityGateConditionMapper.class }; loadMappers(conf, mappers); configureLogback(mappers); diff --git a/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionDao.java b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionDao.java new file mode 100644 index 00000000000..54ede4798c1 --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionDao.java @@ -0,0 +1,109 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 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.core.qualitygate.db; + +import org.apache.ibatis.session.SqlSession; +import org.sonar.core.persistence.MyBatis; + +import java.util.Collection; + +/** + * @since 4.3 + */ +public class QualityGateConditionDao { + + private final MyBatis myBatis; + + public QualityGateConditionDao(MyBatis myBatis) { + this.myBatis = myBatis; + } + + public void insert(QualityGateConditionDto newQualityGate) { + SqlSession session = myBatis.openSession(); + try { + insert(newQualityGate, session); + session.commit(); + } finally { + MyBatis.closeQuietly(session); + } + } + + public void insert(QualityGateConditionDto newQualityGate, SqlSession session) { + getMapper(session).insert(newQualityGate); + } + + public Collection<QualityGateConditionDto> selectForQualityGate(long qGateId) { + SqlSession session = myBatis.openSession(); + try { + return selectForQualityGate(qGateId, session); + } finally { + MyBatis.closeQuietly(session); + } + } + + public Collection<QualityGateConditionDto> selectForQualityGate(long qGateId, SqlSession session) { + return getMapper(session).selectForQualityGate(qGateId); + } + + public QualityGateConditionDto selectById(long id) { + SqlSession session = myBatis.openSession(); + try { + return selectById(id, session); + } finally { + MyBatis.closeQuietly(session); + } + } + + public QualityGateConditionDto selectById(long id, SqlSession session) { + return getMapper(session).selectById(id); + } + + public void delete(QualityGateConditionDto qGate) { + SqlSession session = myBatis.openSession(); + try { + delete(qGate, session); + session.commit(); + } finally { + MyBatis.closeQuietly(session); + } + } + + public void delete(QualityGateConditionDto qGate, SqlSession session) { + getMapper(session).delete(qGate.getId()); + } + + public void update(QualityGateConditionDto qGate) { + SqlSession session = myBatis.openSession(); + try { + update(qGate, session); + session.commit(); + } finally { + MyBatis.closeQuietly(session); + } + } + + public void update(QualityGateConditionDto qGate, SqlSession session) { + getMapper(session).update(qGate); + } + + private QualityGateConditionMapper getMapper(SqlSession session) { + return session.getMapper(QualityGateConditionMapper.class); + } +} diff --git a/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionDto.java b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionDto.java new file mode 100644 index 00000000000..e6652820b5b --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionDto.java @@ -0,0 +1,103 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 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.core.qualitygate.db; + +/** + * @since 4.3 + */ +public class QualityGateConditionDto { + + private long id; + + private long qualityGateId; + + private long metricId; + + private int period; + + private String operator; + + private String warningThreshold; + + private String errorThreshold; + + public long getId() { + return id; + } + + public QualityGateConditionDto setId(long id) { + this.id = id; + return this; + } + + public long getQualityGateId() { + return qualityGateId; + } + + public QualityGateConditionDto setQualityGateId(long qualityGateId) { + this.qualityGateId = qualityGateId; + return this; + } + + public long getMetricId() { + return metricId; + } + + public QualityGateConditionDto setMetricId(long metricId) { + this.metricId = metricId; + return this; + } + + public int getPeriod() { + return period; + } + + public QualityGateConditionDto setPeriod(int period) { + this.period = period; + return this; + } + + public String getOperator() { + return operator; + } + + public QualityGateConditionDto setOperator(String operator) { + this.operator = operator; + return this; + } + + public String getWarningThreshold() { + return warningThreshold; + } + + public QualityGateConditionDto setWarningThreshold(String warningThreshold) { + this.warningThreshold = warningThreshold; + return this; + } + + public String getErrorThreshold() { + return errorThreshold; + } + + public QualityGateConditionDto setErrorThreshold(String errorThreshold) { + this.errorThreshold = errorThreshold; + return this; + } +} diff --git a/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionMapper.java b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionMapper.java new file mode 100644 index 00000000000..6d27e1d8556 --- /dev/null +++ b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionMapper.java @@ -0,0 +1,35 @@ +package org.sonar.core.qualitygate.db; + +import java.util.List; + +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 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. + */ +public interface QualityGateConditionMapper { + + void insert(QualityGateConditionDto newCondition); + + List<QualityGateConditionDto> selectForQualityGate(long qGateId); + + void update(QualityGateConditionDto newCondition); + + QualityGateConditionDto selectById(long id); + + void delete(long id); +} diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql index a08579d8976..3fb9d9bc0b3 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/rows-h2.sql @@ -209,6 +209,7 @@ INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('496'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('497'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('498'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('510'); +INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('511'); INSERT INTO USERS(ID, LOGIN, NAME, EMAIL, CRYPTED_PASSWORD, SALT, CREATED_AT, UPDATED_AT, REMEMBER_TOKEN, REMEMBER_TOKEN_EXPIRES_AT) VALUES (1, 'admin', 'Administrator', '', 'a373a0e667abb2604c1fd571eb4ad47fe8cc0878', '48bc4b0d93179b5103fd3885ea9119498e9d161b', '2011-09-26 22:27:48.0', '2011-09-26 22:27:48.0', null, null); ALTER TABLE USERS ALTER COLUMN ID RESTART WITH 2; diff --git a/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl b/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl index 9fb2bf557ed..0db8de5c4db 100644 --- a/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl +++ b/sonar-core/src/main/resources/org/sonar/core/persistence/schema-h2.ddl @@ -204,6 +204,16 @@ CREATE TABLE "QUALITY_GATES" ( "NAME" VARCHAR(100) NOT NULL, ); +CREATE TABLE "QUALITY_GATE_CONDITIONS" ( + "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), + "QGATE_ID" INTEGER, + "METRIC_ID" INTEGER, + "OPERATOR" VARCHAR(3), + "VALUE_ERROR" VARCHAR(64), + "VALUE_WARNING" VARCHAR(64), + "PERIOD" INTEGER, +); + CREATE TABLE "PROPERTIES" ( "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "PROP_KEY" VARCHAR(512), diff --git a/sonar-core/src/main/resources/org/sonar/core/qualitygate/db/QualityGateConditionMapper.xml b/sonar-core/src/main/resources/org/sonar/core/qualitygate/db/QualityGateConditionMapper.xml new file mode 100644 index 00000000000..84ee9aa247f --- /dev/null +++ b/sonar-core/src/main/resources/org/sonar/core/qualitygate/db/QualityGateConditionMapper.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + +<mapper namespace="org.sonar.core.qualitygate.db.QualityGateConditionMapper"> + + <insert id="insert" parameterType="QualityGateCondition" keyColumn="id" useGeneratedKeys="true" keyProperty="id"> + insert into quality_gate_conditions (qgate_id, metric_id, operator, value_error, value_warning, period) + values (#{qualityGateId}, #{metricId}, #{operator}, #{warningThreshold}, #{errorThreshold}, #{period}) + </insert> + + <sql id="conditionColumns"> + qgate_id as qualityGateId, metric_id as metricId, operator, value_warning as warningThreshold, value_error as errorThreshold, period + </sql> + + <select id="selectForQualityGate" resultType="QualityGateCondition" parameterType="long"> + select <include refid="conditionColumns"/> from quality_gate_conditions where qgate_id=#{qGateId} + order by id asc + </select> + + <select id="selectById" parameterType="long" resultType="QualityGateCondition"> + select <include refid="conditionColumns"/> from quality_gate_conditions where id=#{id} + </select> + + <update id="delete" parameterType="long"> + delete from quality_gate_conditions where id=#{id} + </update> + + <update id="update" parameterType="QualityGateCondition"> + update quality_gate_conditions set + metric_id=#{metricId}, + operator=#{operator}, + value_warning=#{warningThreshold}, + value_error=#{errorThreshold}, + period=#{period} + where id=#{id} + </update> + +</mapper> + diff --git a/sonar-core/src/test/java/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest.java b/sonar-core/src/test/java/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest.java new file mode 100644 index 00000000000..096d4fbb7a3 --- /dev/null +++ b/sonar-core/src/test/java/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest.java @@ -0,0 +1,83 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2013 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.core.qualitygate.db; + +import org.junit.Before; +import org.junit.Test; +import org.sonar.core.persistence.AbstractDaoTestCase; + +import static org.fest.assertions.Assertions.assertThat; + +public class QualityGateConditionDaoTest extends AbstractDaoTestCase { + + private static QualityGateConditionDao dao; + + @Before + public void createDao() throws Exception { + dao = new QualityGateConditionDao(getMyBatis()); + } + + @Test + public void testInsert() throws Exception { + setupData("insert"); + QualityGateConditionDto newCondition = new QualityGateConditionDto() + .setQualityGateId(1L).setMetricId(2L).setOperator(">").setWarningThreshold("10").setErrorThreshold("20").setPeriod(3); + dao.insert(newCondition); + checkTable("insert", "quality_gate_conditions", "name"); + assertThat(newCondition.getId()).isNotNull(); + } + + @Test + public void testSelectForQualityGate() throws Exception { + setupData("selectForQualityGate"); + assertThat(dao.selectForQualityGate(1L)).hasSize(3); + assertThat(dao.selectForQualityGate(2L)).hasSize(2); + } + + @Test + public void testSelectById() throws Exception { + setupData("selectForQualityGate"); + QualityGateConditionDto selectById = dao.selectById(1L); + assertThat(selectById).isNotNull(); + assertThat(selectById.getId()).isNotNull(); + assertThat(selectById.getMetricId()).isEqualTo(2L); + assertThat(selectById.getOperator()).isEqualTo("<"); + assertThat(selectById.getPeriod()).isEqualTo(3); + assertThat(selectById.getQualityGateId()).isEqualTo(1L); + assertThat(selectById.getWarningThreshold()).isEqualTo("10"); + assertThat(selectById.getErrorThreshold()).isEqualTo("20"); + assertThat(dao.selectById(42L)).isNull(); + } + + @Test + public void testDelete() throws Exception { + setupData("selectForQualityGate"); + dao.delete(new QualityGateConditionDto().setId(1L)); + checkTable("delete", "quality_gate_conditions"); + } + + @Test + public void testUpdate() throws Exception { + setupData("selectForQualityGate"); + dao.update(new QualityGateConditionDto().setId(1L).setMetricId(7L).setOperator(">").setPeriod(1).setWarningThreshold("50").setErrorThreshold("80")); + checkTable("update", "quality_gate_conditions"); + } + +} diff --git a/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/delete-result.xml b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/delete-result.xml new file mode 100644 index 00000000000..6547653931a --- /dev/null +++ b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/delete-result.xml @@ -0,0 +1,8 @@ +<dataset> + + <quality_gate_conditions id="2" qgate_id="1" metric_id="3" operator="<" value_warning="10" value_error="20" period="[null]" /> + <quality_gate_conditions id="3" qgate_id="1" metric_id="4" operator="<" value_warning="10" value_error="[null]" period="1" /> + <quality_gate_conditions id="4" qgate_id="2" metric_id="5" operator="<" value_warning="[null]" value_error="20" period="3" /> + <quality_gate_conditions id="5" qgate_id="2" metric_id="6" operator="<" value_warning="[null]" value_error="20" period="[null]" /> + +</dataset> diff --git a/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/insert-result.xml b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/insert-result.xml new file mode 100644 index 00000000000..4037e3783bc --- /dev/null +++ b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/insert-result.xml @@ -0,0 +1,5 @@ +<dataset> + + <quality_gate_conditions id="1" qgate_id="1" metric_id="2" operator="<" value_warning="10" value_error="20" period="3" /> + +</dataset> diff --git a/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/insert.xml b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/insert.xml new file mode 100644 index 00000000000..871dedcb5e9 --- /dev/null +++ b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/insert.xml @@ -0,0 +1,3 @@ +<dataset> + +</dataset> diff --git a/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/selectForQualityGate.xml b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/selectForQualityGate.xml new file mode 100644 index 00000000000..2b5e08055b7 --- /dev/null +++ b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/selectForQualityGate.xml @@ -0,0 +1,9 @@ +<dataset> + + <quality_gate_conditions id="1" qgate_id="1" metric_id="2" operator="<" value_warning="10" value_error="20" period="3" /> + <quality_gate_conditions id="2" qgate_id="1" metric_id="3" operator="<" value_warning="10" value_error="20" period="[null]" /> + <quality_gate_conditions id="3" qgate_id="1" metric_id="4" operator="<" value_warning="10" value_error="[null]" period="1" /> + <quality_gate_conditions id="4" qgate_id="2" metric_id="5" operator="<" value_warning="[null]" value_error="20" period="3" /> + <quality_gate_conditions id="5" qgate_id="2" metric_id="6" operator="<" value_warning="[null]" value_error="20" period="[null]" /> + +</dataset> diff --git a/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/update-result.xml b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/update-result.xml new file mode 100644 index 00000000000..503a7ba0c76 --- /dev/null +++ b/sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/update-result.xml @@ -0,0 +1,9 @@ +<dataset> + + <quality_gate_conditions id="1" qgate_id="1" metric_id="7" operator=">" value_warning="50" value_error="80" period="1" /> + <quality_gate_conditions id="2" qgate_id="1" metric_id="3" operator="<" value_warning="10" value_error="20" period="[null]" /> + <quality_gate_conditions id="3" qgate_id="1" metric_id="4" operator="<" value_warning="10" value_error="[null]" period="1" /> + <quality_gate_conditions id="4" qgate_id="2" metric_id="5" operator="<" value_warning="[null]" value_error="20" period="3" /> + <quality_gate_conditions id="5" qgate_id="2" metric_id="6" operator="<" value_warning="[null]" value_error="20" period="[null]" /> + +</dataset> |