From d41462d3f6f8a3114e6d7b22906a19a4d150cf92 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Thu, 20 Feb 2014 17:57:20 +0100 Subject: [PATCH] SONAR-4366 Create DB components for management of quality gate conditions --- .../core/persistence/DatabaseVersion.java | 3 +- .../org/sonar/core/persistence/MyBatis.java | 10 +- .../db/QualityGateConditionDao.java | 109 ++++++++++++++++++ .../db/QualityGateConditionDto.java | 103 +++++++++++++++++ .../db/QualityGateConditionMapper.java | 35 ++++++ .../org/sonar/core/persistence/rows-h2.sql | 1 + .../org/sonar/core/persistence/schema-h2.ddl | 10 ++ .../db/QualityGateConditionMapper.xml | 39 +++++++ .../db/QualityGateConditionDaoTest.java | 83 +++++++++++++ .../delete-result.xml | 8 ++ .../insert-result.xml | 5 + .../db/QualityGateConditionDaoTest/insert.xml | 3 + .../selectForQualityGate.xml | 9 ++ .../update-result.xml | 9 ++ .../org/sonar/server/platform/Platform.java | 2 + .../server/qualitygate/QualityGates.java | 12 +- .../511_create_quality_gate_conditions.rb | 33 ++++++ .../server/qualitygate/QualityGatesTest.java | 29 ++--- 18 files changed, 484 insertions(+), 19 deletions(-) create mode 100644 sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionDao.java create mode 100644 sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionDto.java create mode 100644 sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateConditionMapper.java create mode 100644 sonar-core/src/main/resources/org/sonar/core/qualitygate/db/QualityGateConditionMapper.xml create mode 100644 sonar-core/src/test/java/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest.java create mode 100644 sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/delete-result.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/insert-result.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/insert.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/selectForQualityGate.xml create mode 100644 sonar-core/src/test/resources/org/sonar/core/qualitygate/db/QualityGateConditionDaoTest/update-result.xml create mode 100644 sonar-server/src/main/webapp/WEB-INF/db/migrate/511_create_quality_gate_conditions.rb 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 selectForQualityGate(long qGateId) { + SqlSession session = myBatis.openSession(); + try { + return selectForQualityGate(qGateId, session); + } finally { + MyBatis.closeQuietly(session); + } + } + + public Collection 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 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 @@ + + + + + + + insert into quality_gate_conditions (qgate_id, metric_id, operator, value_error, value_warning, period) + values (#{qualityGateId}, #{metricId}, #{operator}, #{warningThreshold}, #{errorThreshold}, #{period}) + + + + qgate_id as qualityGateId, metric_id as metricId, operator, value_warning as warningThreshold, value_error as errorThreshold, period + + + + + + + + delete from quality_gate_conditions where id=#{id} + + + + update quality_gate_conditions set + metric_id=#{metricId}, + operator=#{operator}, + value_warning=#{warningThreshold}, + value_error=#{errorThreshold}, + period=#{period} + where id=#{id} + + + + 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 @@ + + + + + + + + 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 @@ + + + + + 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 @@ + + + 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 @@ + + + + + + + + + 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 @@ + + + + + + + + + diff --git a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java index 907f66dfe5b..145b32ddc39 100644 --- a/sonar-server/src/main/java/org/sonar/server/platform/Platform.java +++ b/sonar-server/src/main/java/org/sonar/server/platform/Platform.java @@ -57,6 +57,7 @@ import org.sonar.core.persistence.*; import org.sonar.core.preview.PreviewCache; import org.sonar.core.profiling.Profiling; import org.sonar.core.purge.PurgeProfiler; +import org.sonar.core.qualitygate.db.QualityGateConditionDao; import org.sonar.core.qualitygate.db.QualityGateDao; import org.sonar.core.resource.DefaultResourcePermissions; import org.sonar.core.rule.DefaultRuleFinder; @@ -300,6 +301,7 @@ public final class Platform { // quality gates servicesContainer.addSingleton(QualityGateDao.class); + servicesContainer.addSingleton(QualityGateConditionDao.class); servicesContainer.addSingleton(QualityGates.class); servicesContainer.addSingleton(QualityGatesWs.class); diff --git a/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGates.java b/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGates.java index d59782c77cf..edd328d13c0 100644 --- a/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGates.java +++ b/sonar-server/src/main/java/org/sonar/server/qualitygate/QualityGates.java @@ -24,6 +24,8 @@ import org.apache.commons.lang.StringUtils; import org.sonar.core.permission.GlobalPermissions; import org.sonar.core.properties.PropertiesDao; import org.sonar.core.properties.PropertyDto; +import org.sonar.core.qualitygate.db.QualityGateConditionDao; +import org.sonar.core.qualitygate.db.QualityGateConditionDto; import org.sonar.core.qualitygate.db.QualityGateDao; import org.sonar.core.qualitygate.db.QualityGateDto; import org.sonar.server.exceptions.BadRequestException; @@ -49,10 +51,13 @@ public class QualityGates { private final QualityGateDao dao; + private final QualityGateConditionDao conditionDao; + private final PropertiesDao propertiesDao; - public QualityGates(QualityGateDao dao, PropertiesDao propertiesDao) { + public QualityGates(QualityGateDao dao, QualityGateConditionDao conditionDao, PropertiesDao propertiesDao) { this.dao = dao; + this.conditionDao = conditionDao; this.propertiesDao = propertiesDao; } @@ -106,6 +111,11 @@ public class QualityGates { } } + public QualityGateConditionDto createCondition(long qGateId, long metricId, String operator, + @Nullable String warningThreshold, @Nullable String errorThreshold, @Nullable Integer period) { + return null; + } + private boolean isDefault(QualityGateDto qGate) { return qGate.getName().equals(getDefaultName()); } diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/511_create_quality_gate_conditions.rb b/sonar-server/src/main/webapp/WEB-INF/db/migrate/511_create_quality_gate_conditions.rb new file mode 100644 index 00000000000..6958685e762 --- /dev/null +++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/511_create_quality_gate_conditions.rb @@ -0,0 +1,33 @@ +# +# 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. +# +class CreateQualityGateConditions < ActiveRecord::Migration + + def self.up + create_table :quality_gate_conditions do |t| + t.column :qgate_id, :integer + t.column :metric_id, :integer + t.column :period, :integer, :null => true + t.column :operator, :string, :limit => 3, :null => true + t.column :value_error, :string, :limit => 64, :null => true + t.column :value_warning, :string, :limit => 64, :null => true + end + end + +end diff --git a/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGatesTest.java b/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGatesTest.java index 57396a96954..10ce9f10a3a 100644 --- a/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGatesTest.java +++ b/sonar-server/src/test/java/org/sonar/server/qualitygate/QualityGatesTest.java @@ -19,30 +19,30 @@ */ package org.sonar.server.qualitygate; -import org.sonar.core.properties.PropertyDto; -import org.mockito.ArgumentCaptor; -import org.mockito.Matchers; -import org.sonar.server.exceptions.NotFoundException; -import org.sonar.core.properties.PropertiesDao; -import org.sonar.server.exceptions.ForbiddenException; -import org.sonar.server.exceptions.UnauthorizedException; -import org.sonar.server.user.UserSessionTestUtils; -import org.sonar.core.permission.GlobalPermissions; -import org.sonar.server.user.MockUserSession; -import org.sonar.server.user.UserSession; import com.google.common.collect.Lists; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.sonar.core.permission.GlobalPermissions; +import org.sonar.core.properties.PropertiesDao; +import org.sonar.core.properties.PropertyDto; +import org.sonar.core.qualitygate.db.QualityGateConditionDao; import org.sonar.core.qualitygate.db.QualityGateDao; import org.sonar.core.qualitygate.db.QualityGateDto; import org.sonar.server.exceptions.BadRequestException; +import org.sonar.server.exceptions.ForbiddenException; +import org.sonar.server.exceptions.NotFoundException; +import org.sonar.server.exceptions.UnauthorizedException; +import org.sonar.server.user.MockUserSession; +import org.sonar.server.user.UserSession; +import org.sonar.server.user.UserSessionTestUtils; import java.util.List; -import static org.fest.assertions.Assertions.*; +import static org.fest.assertions.Assertions.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -52,6 +52,9 @@ public class QualityGatesTest { @Mock private QualityGateDao dao; + @Mock + private QualityGateConditionDao conditionDao; + @Mock private PropertiesDao propertiesDao; @@ -63,7 +66,7 @@ public class QualityGatesTest { @Before public void initialize() { - qGates = new QualityGates(dao, propertiesDao); + qGates = new QualityGates(dao, conditionDao, propertiesDao); UserSessionTestUtils.setUserSession(authorizedUserSession); } -- 2.39.5