From 3fa4ecf58f5caeba8442fbba90c2175968738377 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Mon, 24 Feb 2014 15:26:54 +0100 Subject: [PATCH] SONAR-4366 Add timestamp columns for quality gates and conditions --- .../db/QualityGateConditionDao.java | 5 ++-- .../db/QualityGateConditionDto.java | 23 ++++++++++++++++++ .../core/qualitygate/db/QualityGateDao.java | 5 ++-- .../core/qualitygate/db/QualityGateDto.java | 24 +++++++++++++++++++ .../org/sonar/core/persistence/schema-h2.ddl | 4 ++++ .../db/QualityGateConditionMapper.xml | 10 ++++---- .../core/qualitygate/db/QualityGateMapper.xml | 11 +++++---- .../db/QualityGateConditionDaoTest.java | 8 +++++-- .../qualitygate/db/QualityGateDaoTest.java | 11 +++++---- .../server/qualitygate/ws/QualityGatesWs.java | 7 +++--- .../db/migrate/510_create_quality_gates.rb | 1 + .../511_create_quality_gate_conditions.rb | 1 + .../qualitygate/ws/QualityGatesWsTest.java | 2 +- 13 files changed, 89 insertions(+), 23 deletions(-) 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 index 54ede4798c1..6a91789a885 100644 --- 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 @@ -23,6 +23,7 @@ import org.apache.ibatis.session.SqlSession; import org.sonar.core.persistence.MyBatis; import java.util.Collection; +import java.util.Date; /** * @since 4.3 @@ -46,7 +47,7 @@ public class QualityGateConditionDao { } public void insert(QualityGateConditionDto newQualityGate, SqlSession session) { - getMapper(session).insert(newQualityGate); + getMapper(session).insert(newQualityGate.setCreatedAt(new Date())); } public Collection selectForQualityGate(long qGateId) { @@ -100,7 +101,7 @@ public class QualityGateConditionDao { } public void update(QualityGateConditionDto qGate, SqlSession session) { - getMapper(session).update(qGate); + getMapper(session).update(qGate.setUpdatedAt(new Date())); } private QualityGateConditionMapper getMapper(SqlSession session) { 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 index 007643d37f2..98111b30275 100644 --- 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 @@ -27,6 +27,7 @@ import javax.annotation.Nullable; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.List; /** @@ -78,6 +79,10 @@ public class QualityGateConditionDto { private String errorThreshold; + private Date createdAt; + + private Date updatedAt; + public long getId() { return id; } @@ -152,6 +157,24 @@ public class QualityGateConditionDto { return this; } + public Date getCreatedAt() { + return createdAt; + } + + public QualityGateConditionDto setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + return this; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public QualityGateConditionDto setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + return this; + } + public static boolean isOperatorAllowed(String operator, ValueType metricType) { return getOperatorsForType(metricType).contains(operator); } diff --git a/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateDao.java b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateDao.java index d3eaee3fd7f..affa3349e7a 100644 --- a/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateDao.java +++ b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateDao.java @@ -23,6 +23,7 @@ import org.apache.ibatis.session.SqlSession; import org.sonar.core.persistence.MyBatis; import java.util.Collection; +import java.util.Date; /** * @since 4.3 @@ -46,7 +47,7 @@ public class QualityGateDao { } public void insert(QualityGateDto newQualityGate, SqlSession session) { - getMapper(session).insert(newQualityGate); + getMapper(session).insert(newQualityGate.setCreatedAt(new Date())); } public Collection selectAll() { @@ -113,7 +114,7 @@ public class QualityGateDao { } public void update(QualityGateDto qGate, SqlSession session) { - getMapper(session).update(qGate); + getMapper(session).update(qGate.setUpdatedAt(new Date())); } private QualityGateMapper getMapper(SqlSession session) { diff --git a/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateDto.java b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateDto.java index 6d7c3826c30..931f3db982c 100644 --- a/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateDto.java +++ b/sonar-core/src/main/java/org/sonar/core/qualitygate/db/QualityGateDto.java @@ -19,6 +19,8 @@ */ package org.sonar.core.qualitygate.db; +import java.util.Date; + /** * @since 4.3 */ @@ -28,6 +30,10 @@ public class QualityGateDto { private String name; + private Date createdAt; + + private Date updatedAt; + public Long getId() { return id; } @@ -45,4 +51,22 @@ public class QualityGateDto { this.name = name; return this; } + + public Date getCreatedAt() { + return createdAt; + } + + public QualityGateDto setCreatedAt(Date createdAt) { + this.createdAt = createdAt; + return this; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + public QualityGateDto setUpdatedAt(Date updatedAt) { + this.updatedAt = updatedAt; + return this; + } } 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 0db8de5c4db..3525e9b4acf 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 @@ -202,6 +202,8 @@ CREATE TABLE "ALERTS" ( CREATE TABLE "QUALITY_GATES" ( "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "NAME" VARCHAR(100) NOT NULL, + "CREATED_AT" TIMESTAMP, + "UPDATED_AT" TIMESTAMP, ); CREATE TABLE "QUALITY_GATE_CONDITIONS" ( @@ -212,6 +214,8 @@ CREATE TABLE "QUALITY_GATE_CONDITIONS" ( "VALUE_ERROR" VARCHAR(64), "VALUE_WARNING" VARCHAR(64), "PERIOD" INTEGER, + "CREATED_AT" TIMESTAMP, + "UPDATED_AT" TIMESTAMP, ); CREATE TABLE "PROPERTIES" ( 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 index d327cd0c861..3c8179772bf 100644 --- 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 @@ -4,12 +4,13 @@ - insert into quality_gate_conditions (qgate_id, metric_id, operator, value_error, value_warning, period) - values (#{qualityGateId}, #{metricId}, #{operator}, #{warningThreshold}, #{errorThreshold}, #{period}) + insert into quality_gate_conditions (qgate_id, metric_id, operator, value_error, value_warning, period, created_at, updated_at) + values (#{qualityGateId}, #{metricId}, #{operator}, #{warningThreshold}, #{errorThreshold}, #{period}, #{createdAt}, #{updatedAt}) - id, qgate_id as qualityGateId, metric_id as metricId, operator, value_warning as warningThreshold, value_error as errorThreshold, period + id, qgate_id as qualityGateId, metric_id as metricId, operator, value_warning as warningThreshold, value_error as errorThreshold, period, + created_at as createdAt, updated_at as updatedAt @@ -32,7 +32,10 @@ - update quality_gates set name=#{name} where id=#{id} + update quality_gates set + name=#{name}, + updated_at=#{updatedAt} + 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 index 4e81c91ecc5..ac808d81770 100644 --- 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 @@ -27,6 +27,10 @@ import static org.fest.assertions.Assertions.assertThat; public class QualityGateConditionDaoTest extends AbstractDaoTestCase { + private static final String[] COLUMNS_WITHOUT_TIMESTAMPS = { + "id", "qgate_id", "metric_id", "operator", "value_warning", "value_error", "period" + }; + private static QualityGateConditionDao dao; @Before @@ -70,14 +74,14 @@ public class QualityGateConditionDaoTest extends AbstractDaoTestCase { public void testDelete() throws Exception { setupData("selectForQualityGate"); dao.delete(new QualityGateConditionDto().setId(1L)); - checkTable("delete", "quality_gate_conditions"); + checkTable("delete", "quality_gate_conditions", COLUMNS_WITHOUT_TIMESTAMPS); } @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"); + checkTable("update", "quality_gate_conditions", COLUMNS_WITHOUT_TIMESTAMPS); } } diff --git a/sonar-core/src/test/java/org/sonar/core/qualitygate/db/QualityGateDaoTest.java b/sonar-core/src/test/java/org/sonar/core/qualitygate/db/QualityGateDaoTest.java index 78bc4cbfa7a..e3a80132e38 100644 --- a/sonar-core/src/test/java/org/sonar/core/qualitygate/db/QualityGateDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/qualitygate/db/QualityGateDaoTest.java @@ -19,12 +19,13 @@ */ package org.sonar.core.qualitygate.db; -import java.util.Collection; -import java.util.Iterator; - import org.junit.Before; import org.junit.Test; import org.sonar.core.persistence.AbstractDaoTestCase; + +import java.util.Collection; +import java.util.Iterator; + import static org.fest.assertions.Assertions.assertThat; public class QualityGateDaoTest extends AbstractDaoTestCase { @@ -74,14 +75,14 @@ public class QualityGateDaoTest extends AbstractDaoTestCase { public void testDelete() throws Exception { setupData("selectAll"); dao.delete(new QualityGateDto().setId(1L)); - checkTable("delete", "quality_gates"); + checkTable("delete", "quality_gates", "id", "name"); } @Test public void testUpdate() throws Exception { setupData("selectAll"); dao.update(new QualityGateDto().setId(1L).setName("Not so strict")); - checkTable("update", "quality_gates"); + checkTable("update", "quality_gates", "id", "name"); } } diff --git a/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java b/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java index 8e9d01d55b8..a544c81c408 100644 --- a/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java +++ b/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/QualityGatesWs.java @@ -41,6 +41,7 @@ public class QualityGatesWs implements WebService { private static final String PARAM_METRIC = "metric"; private static final String PARAM_GATE_ID = "gateId"; private static final String PARAM_ID = "id"; + private final QualityGates qualityGates; public QualityGatesWs(QualityGates qualityGates) { @@ -271,10 +272,10 @@ public class QualityGatesWs implements WebService { } } - private JsonWriter writeQualityGate(QualityGateDto newQualityGate, JsonWriter writer) { + private JsonWriter writeQualityGate(QualityGateDto qualityGate, JsonWriter writer) { return writer.beginObject() - .prop(PARAM_ID, newQualityGate.getId()) - .prop(PARAM_NAME, newQualityGate.getName()) + .prop(PARAM_ID, qualityGate.getId()) + .prop(PARAM_NAME, qualityGate.getName()) .endObject(); } diff --git a/sonar-server/src/main/webapp/WEB-INF/db/migrate/510_create_quality_gates.rb b/sonar-server/src/main/webapp/WEB-INF/db/migrate/510_create_quality_gates.rb index e5aa06ff25a..14083cf71a1 100644 --- a/sonar-server/src/main/webapp/WEB-INF/db/migrate/510_create_quality_gates.rb +++ b/sonar-server/src/main/webapp/WEB-INF/db/migrate/510_create_quality_gates.rb @@ -26,6 +26,7 @@ class CreateQualityGates < ActiveRecord::Migration def self.up create_table :quality_gates do |t| t.column :name, :string, :null => false, :limit => 100 + t.timestamps end add_index 'quality_gates', ['name'], :unique => true, :name => 'uniq_quality_gates' end 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 index 6958685e762..cdf967166a9 100644 --- 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 @@ -27,6 +27,7 @@ class CreateQualityGateConditions < ActiveRecord::Migration 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 + t.timestamps end end diff --git a/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java b/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java index a599c6f83c1..2a45a87b023 100644 --- a/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java +++ b/sonar-server/src/test/java/org/sonar/server/qualitygate/ws/QualityGatesWsTest.java @@ -253,7 +253,7 @@ public class QualityGatesWsTest { tester.newRequest("show").setParam("id", Long.toString(gateId)).execute().assertJson( "{'id':12345,'name':'Golden','conditions':[" + "{'id':1,'metric':'ncloc','op':'GT','error':'10000'}," - + "{'id':2,'metric':'new_coverage','op':'LT','warning':'90','error':'80','period':3}" + + "{'id':2,'metric':'new_coverage','op':'LT','warning':'90','period':3}" + "]}"); } -- 2.39.5