From 93de024100e8df86468e25551be24f70fdc52adb Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Fri, 16 Dec 2011 13:08:40 +0100 Subject: [PATCH] SONAR-1929 do not register dashboards which name already exits + remove the useless column DASHBOARDS.KEE --- .../core/dashboards/DefaultDashboard.java | 7 +- .../core/dashboards/HotspotsDashboard.java | 7 +- .../core/dashboards/DefaultDashboardTest.java | 10 +- .../dashboards/HotspotsDashboardTest.java | 6 +- .../resources/org/sonar/l10n/core.properties | 13 +- .../org/sonar/jpa/entity/SchemaMigration.java | 2 +- .../dashboard/ActiveDashboardDao.java | 5 +- .../persistence/dashboard/DashboardDao.java | 10 ++ .../persistence/dashboard/DashboardDto.java | 113 ++++------------- .../dashboard/DashboardMapper.java | 2 + .../dashboard/DashboardMapper-oracle.xml | 17 ++- .../persistence/dashboard/DashboardMapper.xml | 13 +- .../org/sonar/persistence/rows-derby.sql | 1 - .../org/sonar/persistence/schema-derby.ddl | 1 - .../dashboard/ActiveDashboardDaoTest.java | 17 ++- .../dashboard/DashboardDaoTest.java | 21 +++- .../DashboardDaoTest/shouldInsert-result.xml | 1 - ...shouldInsertWithNullableColumns-result.xml | 1 - .../shouldSelectGlobalDashboard.xml | 20 +++ .../api/web/AbstractDashboardWidget.java | 0 .../main/java/org/sonar/api/web/Section.java | 0 .../java/org/sonar/api/web/Dashboard.java | 57 +-------- .../org/sonar/api/web/DashboardTemplate.java | 4 + .../java/org/sonar/api/web/DashboardTest.java | 33 +---- .../server/startup/RegisterNewDashboards.java | 66 +++++----- .../webapp/WEB-INF/app/models/dashboard.rb | 16 +-- .../app/views/resource/_violation.html.erb | 2 +- .../WEB-INF/app/views/reviews/index.html.erb | 8 +- .../db/migrate/235_create_loaded_templates.rb | 8 +- .../db/migrate/236_add_key_to_dashboards.rb | 39 ------ ...lete_value_type_from_widget_properties.rb} | 0 .../startup/RegisterNewDashboardsTest.java | 116 +++++++++--------- 32 files changed, 248 insertions(+), 368 deletions(-) create mode 100644 sonar-core/src/test/resources/org/sonar/persistence/dashboard/DashboardDaoTest/shouldSelectGlobalDashboard.xml rename {sonar-plugin-api => sonar-deprecated}/src/main/java/org/sonar/api/web/AbstractDashboardWidget.java (100%) rename {sonar-plugin-api => sonar-deprecated}/src/main/java/org/sonar/api/web/Section.java (100%) delete mode 100644 sonar-server/src/main/webapp/WEB-INF/db/migrate/236_add_key_to_dashboards.rb rename sonar-server/src/main/webapp/WEB-INF/db/migrate/{237_delete_value_type_from_widget_properties.rb => 236_delete_value_type_from_widget_properties.rb} (100%) diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/DefaultDashboard.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/DefaultDashboard.java index 7b935de8a70..68ba5c20735 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/DefaultDashboard.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/DefaultDashboard.java @@ -30,9 +30,14 @@ import org.sonar.api.web.DashboardTemplate; */ public final class DefaultDashboard extends DashboardTemplate { + @Override + public String getName() { + return "Dashboard"; + } + @Override public Dashboard createDashboard() { - Dashboard dashboard = Dashboard.create("dashboard", "Dashboard"); + Dashboard dashboard = Dashboard.create(); dashboard.setLayout(DashboardLayout.TWO_COLUMNS); addFirstColumn(dashboard); addSecondColumn(dashboard); diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/HotspotsDashboard.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/HotspotsDashboard.java index 0def3bd740b..5241d62215f 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/HotspotsDashboard.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/HotspotsDashboard.java @@ -34,9 +34,14 @@ public final class HotspotsDashboard extends DashboardTemplate { private static final String TITLE_PROPERTY = "title"; private static final String METRIC_PROPERTY = "metric"; + @Override + public String getName() { + return "Hotspots"; + } + @Override public Dashboard createDashboard() { - Dashboard dashboard = Dashboard.createByName("Hotspots"); + Dashboard dashboard = Dashboard.create(); dashboard.setLayout(DashboardLayout.TWO_COLUMNS); addFirstColumn(dashboard); diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/DefaultDashboardTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/DefaultDashboardTest.java index bd4c5bd895b..3d27bae2f3f 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/DefaultDashboardTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/DefaultDashboardTest.java @@ -29,10 +29,10 @@ import static org.junit.Assert.assertThat; public class DefaultDashboardTest { @Test public void shouldCreateDashboard() { - Dashboard main = new DefaultDashboard().createDashboard(); - assertThat(main.getId(), Is.is("dashboard")); - assertThat(main.getName(), Is.is("Dashboard")); - assertThat(main.getLayout(), Is.is(DashboardLayout.TWO_COLUMNS)); - assertThat(main.getWidgets().size(), Is.is(11)); + DefaultDashboard template = new DefaultDashboard(); + Dashboard dashboard = template.createDashboard(); + assertThat(template.getName(), Is.is("Dashboard")); + assertThat(dashboard.getLayout(), Is.is(DashboardLayout.TWO_COLUMNS)); + assertThat(dashboard.getWidgets().size(), Is.is(11)); } } diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/HotspotsDashboardTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/HotspotsDashboardTest.java index 83042ef59fc..e5e4c211ba2 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/HotspotsDashboardTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/HotspotsDashboardTest.java @@ -29,9 +29,9 @@ import static org.junit.Assert.assertThat; public class HotspotsDashboardTest { @Test public void shouldCreateDashboard() { - Dashboard hotspots = new HotspotsDashboard().createDashboard(); - assertThat(hotspots.getId(), Is.is("hotspots")); - assertThat(hotspots.getName(), Is.is("Hotspots")); + HotspotsDashboard template = new HotspotsDashboard(); + Dashboard hotspots = template.createDashboard(); + assertThat(template.getName(), Is.is("Hotspots")); assertThat(hotspots.getLayout(), Is.is(DashboardLayout.TWO_COLUMNS)); assertThat(hotspots.getWidgets().size(), Is.is(8)); } diff --git a/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties b/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties index fed078cfa23..98922d6175e 100644 --- a/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties +++ b/plugins/sonar-l10n-en-plugin/src/main/resources/org/sonar/l10n/core.properties @@ -167,8 +167,8 @@ delta_since_version=Δ since version {0} disable_treemap=Disable treemap enable_treemap=Enable treemap equals=Equals -false_positive=False-Positive -false_positives_only=False-Positives only +false_positive=False-positive +false_positives_only=False-positives only full_source=Full source greater_or_equals=Greater or equals greater_than=Greater than @@ -396,6 +396,7 @@ reviews.reopen_submit=Reopen reviews.status.REOPENED=Reopened reviews.status.RESOLVED=Resolved reviews.status.OPEN=Open +reviews.status.CLOSED=Closed reviews.resolution.FALSE-POSITIVE=False-positive reviews.resolution.FIXED=Fixed @@ -460,11 +461,11 @@ property.category.server_id=Server ID #------------------------------------------------------------------------------ # Default dashboard -dashboard.dashboard.name=Dashboard -dashboard.dashboard.description=Default dashboard +dashboard.Dashboard.name=Dashboard +dashboard.Dashboard.description=Default dashboard -dashboard.hotspots.name=Hotspots -dashboard.hotspots.description=Most useful hotspots widgets +dashboard.Hotspots.name=Hotspots +dashboard.Hotspots.description=Most useful hotspots widgets #------------------------------------------------------------------------------ diff --git a/sonar-core/src/main/java/org/sonar/jpa/entity/SchemaMigration.java b/sonar-core/src/main/java/org/sonar/jpa/entity/SchemaMigration.java index 1b69803b7c8..81e9315bedb 100644 --- a/sonar-core/src/main/java/org/sonar/jpa/entity/SchemaMigration.java +++ b/sonar-core/src/main/java/org/sonar/jpa/entity/SchemaMigration.java @@ -42,7 +42,7 @@ public class SchemaMigration { - complete the Derby DDL file used for unit tests : sonar-testing-harness/src/main/resources/org/sonar/test/persistence/sonar-test.ddl */ - public static final int LAST_VERSION = 237; + public static final int LAST_VERSION = 236; public final static String TABLE_NAME = "schema_migrations"; diff --git a/sonar-core/src/main/java/org/sonar/persistence/dashboard/ActiveDashboardDao.java b/sonar-core/src/main/java/org/sonar/persistence/dashboard/ActiveDashboardDao.java index 54394966840..1005824af09 100644 --- a/sonar-core/src/main/java/org/sonar/persistence/dashboard/ActiveDashboardDao.java +++ b/sonar-core/src/main/java/org/sonar/persistence/dashboard/ActiveDashboardDao.java @@ -43,11 +43,12 @@ public class ActiveDashboardDao implements BatchComponent, ServerComponent { } } - public Integer selectMaxOrderIndexForNullUser() { + public int selectMaxOrderIndexForNullUser() { SqlSession session = mybatis.openSession(); ActiveDashboardMapper mapper = session.getMapper(ActiveDashboardMapper.class); try { - return mapper.selectMaxOrderIndexForNullUser(); + Integer max = mapper.selectMaxOrderIndexForNullUser(); + return (max != null ? max.intValue() : 0); } finally { session.close(); } diff --git a/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardDao.java b/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardDao.java index edacc692d9e..8c3754295df 100644 --- a/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardDao.java +++ b/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardDao.java @@ -32,6 +32,16 @@ public class DashboardDao implements BatchComponent, ServerComponent { this.mybatis = mybatis; } + public DashboardDto selectGlobalDashboard(String name) { + SqlSession sqlSession = mybatis.openSession(); + try { + DashboardMapper mapper = sqlSession.getMapper(DashboardMapper.class); + return mapper.selectGlobalDashboard(name); + } finally { + sqlSession.close(); + } + } + public void insert(DashboardDto dashboardDto) { SqlSession session = mybatis.openSession(); DashboardMapper dashboardMapper = session.getMapper(DashboardMapper.class); diff --git a/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardDto.java b/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardDto.java index c32f401c2cd..efe7a2f3407 100644 --- a/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardDto.java +++ b/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardDto.java @@ -19,17 +19,15 @@ */ package org.sonar.persistence.dashboard; +import com.google.common.collect.Lists; + import java.util.Collection; import java.util.Date; import java.util.List; - -import com.google.common.collect.Lists; - -public class DashboardDto { +public final class DashboardDto { private Long id; - private String key; private Long userId; private String name; private String description; @@ -39,154 +37,85 @@ public class DashboardDto { private Date updatedAt; private List widgetDtos = Lists.newArrayList(); - /** - * @return the id - */ public Long getId() { return id; } - /** - * @param id - * the id to set - */ - public void setId(Long id) { + public DashboardDto setId(Long id) { this.id = id; + return this; } - /** - * @return the key - */ - public String getKey() { - return key; - } - - /** - * @param key - * the key to set - */ - public void setKey(String key) { - this.key = key; - } - - /** - * @return the userId - */ public Long getUserId() { return userId; } - /** - * @param userId - * the userId to set - */ - public void setUserId(Long userId) { + public DashboardDto setUserId(Long userId) { this.userId = userId; + return this; } - /** - * @return the name - */ public String getName() { return name; } - /** - * @param name - * the name to set - */ - public void setName(String name) { + public DashboardDto setName(String name) { this.name = name; + return this; } - /** - * @return the description - */ public String getDescription() { return description; } - /** - * @param description - * the description to set - */ - public void setDescription(String description) { + public DashboardDto setDescription(String description) { this.description = description; + return this; } - /** - * @return the columnLayout - */ public String getColumnLayout() { return columnLayout; } - /** - * @param columnLayout - * the columnLayout to set - */ - public void setColumnLayout(String columnLayout) { + public DashboardDto setColumnLayout(String columnLayout) { this.columnLayout = columnLayout; + return this; } - /** - * @return the shared - */ public boolean getShared() { return shared; } - /** - * @param shared - * the shared to set - */ - public void setShared(boolean shared) { + public DashboardDto setShared(boolean shared) { this.shared = shared; + return this; } - /** - * @return the createdAt - */ public Date getCreatedAt() { return createdAt; } - /** - * @param createdAt - * the createdAt to set - */ - public void setCreatedAt(Date createdAt) { + public DashboardDto setCreatedAt(Date createdAt) { this.createdAt = createdAt; + return this; } - /** - * @return the updatedAt - */ public Date getUpdatedAt() { return updatedAt; } - /** - * @param updatedAt - * the updatedAt to set - */ - public void setUpdatedAt(Date updatedAt) { + public DashboardDto setUpdatedAt(Date updatedAt) { this.updatedAt = updatedAt; + return this; } - /** - * @return the widgets - */ public Collection getWidgets() { return widgetDtos; } - /** - * @param widgetDto - * the widget to add - */ - public void addWidget(WidgetDto widgetDto) { + public DashboardDto addWidget(WidgetDto widgetDto) { widgetDtos.add(widgetDto); + return this; } } diff --git a/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardMapper.java b/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardMapper.java index c1d89860e7e..1dce842f43a 100644 --- a/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardMapper.java +++ b/sonar-core/src/main/java/org/sonar/persistence/dashboard/DashboardMapper.java @@ -22,6 +22,8 @@ package org.sonar.persistence.dashboard; public interface DashboardMapper { + DashboardDto selectGlobalDashboard(String name); + void insert(DashboardDto dashboardDto); } diff --git a/sonar-core/src/main/resources/org/sonar/persistence/dashboard/DashboardMapper-oracle.xml b/sonar-core/src/main/resources/org/sonar/persistence/dashboard/DashboardMapper-oracle.xml index 4f287e953bc..3e7a66ff070 100644 --- a/sonar-core/src/main/resources/org/sonar/persistence/dashboard/DashboardMapper-oracle.xml +++ b/sonar-core/src/main/resources/org/sonar/persistence/dashboard/DashboardMapper-oracle.xml @@ -3,13 +3,18 @@ - - - select dashboards_seq.NEXTVAL from DUAL + + + + + select dashboards_seq.NEXTVAL from DUAL - INSERT INTO dashboards (id, kee, user_id, name, description, column_layout, shared, created_at, updated_at) - VALUES (#{id}, #{key}, #{userId, jdbcType=FLOAT}, #{name, jdbcType=VARCHAR}, #{description, jdbcType=VARCHAR}, - #{columnLayout, jdbcType=INTEGER}, #{shared}, #{createdAt, jdbcType=TIMESTAMP}, #{updatedAt, jdbcType=TIMESTAMP}) + INSERT INTO dashboards (id, user_id, name, description, column_layout, shared, created_at, updated_at) + VALUES (#{id}, #{userId, jdbcType=FLOAT}, #{name, jdbcType=VARCHAR}, #{description, jdbcType=VARCHAR}, + #{columnLayout, jdbcType=INTEGER}, #{shared}, #{createdAt, jdbcType=TIMESTAMP}, #{updatedAt, jdbcType=TIMESTAMP}) diff --git a/sonar-core/src/main/resources/org/sonar/persistence/dashboard/DashboardMapper.xml b/sonar-core/src/main/resources/org/sonar/persistence/dashboard/DashboardMapper.xml index 8c1a7c3f8c4..3cb07d02a72 100644 --- a/sonar-core/src/main/resources/org/sonar/persistence/dashboard/DashboardMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/persistence/dashboard/DashboardMapper.xml @@ -3,10 +3,15 @@ - - INSERT INTO dashboards (kee, user_id, name, description, column_layout, shared, created_at, updated_at) - VALUES (#{key}, #{userId, jdbcType=FLOAT}, #{name, jdbcType=VARCHAR}, #{description, jdbcType=VARCHAR}, - #{columnLayout, jdbcType=INTEGER}, #{shared}, #{createdAt, jdbcType=TIMESTAMP}, #{updatedAt, jdbcType=TIMESTAMP}) + + + + INSERT INTO dashboards (user_id, name, description, column_layout, shared, created_at, updated_at) + VALUES (#{userId, jdbcType=FLOAT}, #{name, jdbcType=VARCHAR}, #{description, jdbcType=VARCHAR}, + #{columnLayout, jdbcType=INTEGER}, #{shared}, #{createdAt, jdbcType=TIMESTAMP}, #{updatedAt, jdbcType=TIMESTAMP}) diff --git a/sonar-core/src/main/resources/org/sonar/persistence/rows-derby.sql b/sonar-core/src/main/resources/org/sonar/persistence/rows-derby.sql index fa0381c613c..294d38fd155 100644 --- a/sonar-core/src/main/resources/org/sonar/persistence/rows-derby.sql +++ b/sonar-core/src/main/resources/org/sonar/persistence/rows-derby.sql @@ -165,7 +165,6 @@ INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('233'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('234'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('235'); INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('236'); -INSERT INTO SCHEMA_MIGRATIONS(VERSION) VALUES ('237'); 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/persistence/schema-derby.ddl b/sonar-core/src/main/resources/org/sonar/persistence/schema-derby.ddl index 010332f89b6..47c09d21f48 100644 --- a/sonar-core/src/main/resources/org/sonar/persistence/schema-derby.ddl +++ b/sonar-core/src/main/resources/org/sonar/persistence/schema-derby.ddl @@ -412,7 +412,6 @@ CREATE TABLE "FILTERS" ( CREATE TABLE "DASHBOARDS" ( "ID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), - "KEE" VARCHAR(256) NOT NULL, "USER_ID" INTEGER, "NAME" VARCHAR(256), "DESCRIPTION" VARCHAR(1000), diff --git a/sonar-core/src/test/java/org/sonar/persistence/dashboard/ActiveDashboardDaoTest.java b/sonar-core/src/test/java/org/sonar/persistence/dashboard/ActiveDashboardDaoTest.java index 6bc5eaf4977..4f68be3ef85 100644 --- a/sonar-core/src/test/java/org/sonar/persistence/dashboard/ActiveDashboardDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/persistence/dashboard/ActiveDashboardDaoTest.java @@ -19,15 +19,12 @@ */ package org.sonar.persistence.dashboard; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; -import static org.junit.Assert.assertThat; - import org.junit.Before; import org.junit.Test; import org.sonar.persistence.DaoTestCase; -import org.sonar.persistence.dashboard.ActiveDashboardDao; -import org.sonar.persistence.dashboard.ActiveDashboardDto; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; public class ActiveDashboardDaoTest extends DaoTestCase { @@ -67,18 +64,18 @@ public class ActiveDashboardDaoTest extends DaoTestCase { public void shouldGetMaxOrderIndexForNullUser() throws Exception { setupData("shouldGetMaxOrderIndexForNullUser"); - Integer index = dao.selectMaxOrderIndexForNullUser(); + int index = dao.selectMaxOrderIndexForNullUser(); assertThat(index, is(15)); } @Test - public void shouldGetEmptyMaxOrderIndex() throws Exception { + public void shouldGetZeroMaxOrderIndex() throws Exception { setupData("empty"); - Integer index = dao.selectMaxOrderIndexForNullUser(); + int index = dao.selectMaxOrderIndexForNullUser(); - assertThat(index, is(nullValue())); + assertThat(index, is(0)); } } diff --git a/sonar-core/src/test/java/org/sonar/persistence/dashboard/DashboardDaoTest.java b/sonar-core/src/test/java/org/sonar/persistence/dashboard/DashboardDaoTest.java index e7160dd0294..d63bfb871e5 100644 --- a/sonar-core/src/test/java/org/sonar/persistence/dashboard/DashboardDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/persistence/dashboard/DashboardDaoTest.java @@ -25,22 +25,36 @@ import org.sonar.persistence.DaoTestCase; import java.util.Date; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; + public class DashboardDaoTest extends DaoTestCase { private DashboardDao dao; @Before - public void createDao() throws Exception { + public void createDao() { dao = new DashboardDao(getMyBatis()); } @Test - public void shouldInsert() throws Exception { + public void shouldSelectGlobalDashboard() { + setupData("shouldSelectGlobalDashboard"); + DashboardDto dashboard = dao.selectGlobalDashboard("SQALE"); + assertThat(dashboard.getId(), is(2L)); + assertThat(dashboard.getUserId(), nullValue()); + + assertNull(dao.selectGlobalDashboard("unknown")); + } + + @Test + public void shouldInsert() { setupData("shouldInsert"); Date aDate = new Date(); DashboardDto dashboardDto = new DashboardDto(); - dashboardDto.setKey("d-key"); dashboardDto.setUserId(6L); dashboardDto.setName("My Dashboard"); dashboardDto.setDescription("This is a dashboard"); @@ -75,7 +89,6 @@ public class DashboardDaoTest extends DaoTestCase { setupData("shouldInsert"); DashboardDto dashboardDto = new DashboardDto(); - dashboardDto.setKey("d-key"); dashboardDto.setUserId(null); dashboardDto.setName(null); dashboardDto.setDescription(null); diff --git a/sonar-core/src/test/resources/org/sonar/persistence/dashboard/DashboardDaoTest/shouldInsert-result.xml b/sonar-core/src/test/resources/org/sonar/persistence/dashboard/DashboardDaoTest/shouldInsert-result.xml index 91f73beae63..8c4415d3657 100644 --- a/sonar-core/src/test/resources/org/sonar/persistence/dashboard/DashboardDaoTest/shouldInsert-result.xml +++ b/sonar-core/src/test/resources/org/sonar/persistence/dashboard/DashboardDaoTest/shouldInsert-result.xml @@ -2,7 +2,6 @@ + + + + + + + diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/web/AbstractDashboardWidget.java b/sonar-deprecated/src/main/java/org/sonar/api/web/AbstractDashboardWidget.java similarity index 100% rename from sonar-plugin-api/src/main/java/org/sonar/api/web/AbstractDashboardWidget.java rename to sonar-deprecated/src/main/java/org/sonar/api/web/AbstractDashboardWidget.java diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/web/Section.java b/sonar-deprecated/src/main/java/org/sonar/api/web/Section.java similarity index 100% rename from sonar-plugin-api/src/main/java/org/sonar/api/web/Section.java rename to sonar-deprecated/src/main/java/org/sonar/api/web/Section.java diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/web/Dashboard.java b/sonar-plugin-api/src/main/java/org/sonar/api/web/Dashboard.java index 8e709bd8e4b..ca0602a6f92 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/web/Dashboard.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/web/Dashboard.java @@ -22,7 +22,6 @@ package org.sonar.api.web; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; -import org.apache.commons.lang.StringUtils; import java.util.Collection; import java.util.List; @@ -38,8 +37,6 @@ import java.util.Map; */ public final class Dashboard { - private String id; - private String name; private String description; private DashboardLayout layout = DashboardLayout.TWO_COLUMNS; private ListMultimap widgetsByColumn = ArrayListMultimap.create(); @@ -50,22 +47,8 @@ public final class Dashboard { /** * Creates a new {@link Dashboard}. */ - public static Dashboard create(String id, String name) { - return new Dashboard() - .setId(id) - .setName(name); - } - - /** - * The id is deduced from the name. - */ - public static Dashboard createByName(String name) { - String id = StringUtils.trimToEmpty(name); - id = StringUtils.lowerCase(id); - id = StringUtils.replaceChars(id, ' ', '_'); - return new Dashboard() - .setId(id) - .setName(name); + public static Dashboard create() { + return new Dashboard(); } /** @@ -92,40 +75,6 @@ public final class Dashboard { return widgetsByColumn.get(columnId); } - /** - * Returns the identifier of the dashboard. - * - * @return the id - */ - public String getId() { - return id; - } - - private Dashboard setId(String id) { - if (StringUtils.isBlank(id)) { - throw new IllegalArgumentException("Dashboard id can not be blank"); - } - this.id = id; - return this; - } - - /** - * Returns the name of the dashboard. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name the name to set - */ - private Dashboard setName(String name) { - this.name = name; - return this; - } - /** * Returns the description of the dashboard. * @@ -158,7 +107,7 @@ public final class Dashboard { public Dashboard setLayout(DashboardLayout dl) { if (dl == null) { - throw new IllegalArgumentException("The layout of the dashboard '" + getId() + "' can not be null"); + throw new IllegalArgumentException("The layout can not be null"); } this.layout = dl; return this; diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/web/DashboardTemplate.java b/sonar-plugin-api/src/main/java/org/sonar/api/web/DashboardTemplate.java index ead4a5223df..897685fcf09 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/web/DashboardTemplate.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/web/DashboardTemplate.java @@ -35,4 +35,8 @@ public abstract class DashboardTemplate implements ServerExtension { */ public abstract Dashboard createDashboard(); + /** + * Dashboard name + */ + public abstract String getName(); } diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/web/DashboardTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/web/DashboardTest.java index ecc09898b8c..b5db3019272 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/web/DashboardTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/web/DashboardTest.java @@ -19,7 +19,6 @@ */ package org.sonar.api.web; -import org.hamcrest.core.Is; import org.junit.Test; import static org.hamcrest.Matchers.is; @@ -30,16 +29,15 @@ public class DashboardTest { @Test public void shouldCreateDashboard() { - Dashboard dashboard = Dashboard.create("fake-dashboard", "Fake"); - assertThat(dashboard.getId(), is("fake-dashboard")); - assertThat(dashboard.getName(), is("Fake")); + Dashboard dashboard = Dashboard.create(); assertThat(dashboard.getLayout(), is(DashboardLayout.TWO_COLUMNS)); assertThat(dashboard.getDescription(), nullValue()); + assertThat(dashboard.getWidgets().size(), is(0)); } @Test public void shouldAddWidgets() { - Dashboard dashboard = Dashboard.createByName("Fake"); + Dashboard dashboard = Dashboard.create(); Dashboard.Widget mostViolatedRules = dashboard.addWidget("most_violated_rules", 1); assertThat(mostViolatedRules.getId(), is("most_violated_rules")); assertThat(dashboard.getWidgets().size(), is(1)); @@ -55,7 +53,7 @@ public class DashboardTest { @Test public void shouldAddWidgetsOnDifferentColumns() { - Dashboard dashboard = Dashboard.createByName("Fake"); + Dashboard dashboard = Dashboard.create(); dashboard.addWidget("most_violated_rules", 1); assertThat(dashboard.getWidgets().size(), is(1)); @@ -66,28 +64,9 @@ public class DashboardTest { assertThat(dashboard.getWidgetsOfColumn(2).size(), is(1)); } - @Test(expected = IllegalArgumentException.class) - public void shouldFailIfBlankId() { - Dashboard.create(" ", "Fake"); - } - - @Test(expected = IllegalArgumentException.class) - public void shouldFailToDeduceIdFromName() { - Dashboard.createByName(" "); - } - - @Test - public void shouldCreateByName() { - Dashboard dashboard = Dashboard.createByName("Fake"); - assertThat(dashboard.getId(), Is.is("fake")); - - dashboard = Dashboard.createByName(" Fake You "); - assertThat(dashboard.getId(), Is.is("fake_you")); - } - @Test public void shouldAddSeveralTimesTheSameWidget() { - Dashboard dashboard = Dashboard.createByName("Fake"); + Dashboard dashboard = Dashboard.create(); dashboard.addWidget("most_violated_rules", 1); dashboard.addWidget("most_violated_rules", 1).setProperty("foo", "bar"); @@ -98,7 +77,7 @@ public class DashboardTest { @Test public void shouldSetWidgetProperty() { - Dashboard dashboard = Dashboard.createByName("Fake"); + Dashboard dashboard = Dashboard.create(); Dashboard.Widget widget = dashboard.addWidget("fake-widget", 1); widget.setProperty("foo", "bar"); diff --git a/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewDashboards.java b/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewDashboards.java index c8cc09c9a03..f46dad792b5 100644 --- a/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewDashboards.java +++ b/sonar-server/src/main/java/org/sonar/server/startup/RegisterNewDashboards.java @@ -41,7 +41,7 @@ import java.util.Map.Entry; public final class RegisterNewDashboards { private static final Logger LOG = LoggerFactory.getLogger(RegisterNewDashboards.class); - static final String DEFAULT_DASHBOARD_ID = "dashboard"; + static final String DEFAULT_DASHBOARD_NAME = "Dashboard"; private List dashboardTemplates; private DashboardDao dashboardDao; @@ -63,41 +63,31 @@ public final class RegisterNewDashboards { public void start() { TimeProfiler profiler = new TimeProfiler().start("Register dashboards"); - // load the dashboards that need to be loaded - List loadedDashboards = Lists.newArrayList(); - DashboardDto defaultDashboard = null; - for (DashboardTemplate dashboardTemplate : dashboardTemplates) { - Dashboard dashboard = dashboardTemplate.createDashboard(); - if (shouldRegister(dashboard)) { - DashboardDto dashboardDto = registerDashboard(dashboard); - if (DEFAULT_DASHBOARD_ID.equals(dashboard.getId())) { - defaultDashboard = dashboardDto; - } else { - loadedDashboards.add(dashboardDto); + List registeredDashboards = Lists.newArrayList(); + for (DashboardTemplate template : dashboardTemplates) { + if (shouldRegister(template.getName())) { + Dashboard dashboard = template.createDashboard(); + DashboardDto dto = register(template.getName(), dashboard); + if (dto != null) { + registeredDashboards.add(dto); } } } - // and activate them - activateDashboards(loadedDashboards, defaultDashboard); + + activate(registeredDashboards); profiler.stop(); } - protected void activateDashboards(List loadedDashboards, DashboardDto defaultDashboard) { - int nextOrderIndex; - if (defaultDashboard != null) { - activateDashboard(defaultDashboard, 1); - nextOrderIndex = 2; - } else { - nextOrderIndex = activeDashboardDao.selectMaxOrderIndexForNullUser() + 1; - } + protected void activate(List loadedDashboards) { + int nextOrderIndex = activeDashboardDao.selectMaxOrderIndexForNullUser() + 1; Collections.sort(loadedDashboards, new DashboardComparator()); for (DashboardDto dashboardDto : loadedDashboards) { - activateDashboard(dashboardDto, nextOrderIndex++); + activate(dashboardDto, nextOrderIndex++); } } - private void activateDashboard(DashboardDto dashboardDto, int index) { + private void activate(DashboardDto dashboardDto, int index) { ActiveDashboardDto activeDashboardDto = new ActiveDashboardDto(); activeDashboardDto.setDashboardId(dashboardDto.getId()); activeDashboardDto.setOrderIndex(index); @@ -105,20 +95,21 @@ public final class RegisterNewDashboards { LOG.info("New dashboard '" + dashboardDto.getName() + "' registered"); } - protected DashboardDto registerDashboard(Dashboard dashboard) { - DashboardDto dto = createDtoFromExtension(dashboard); - // save the new dashboard - dashboardDao.insert(dto); + protected DashboardDto register(String name, Dashboard dashboard) { + DashboardDto dto = null; + if (dashboardDao.selectGlobalDashboard(name) == null) { + dto = createDtoFromExtension(name, dashboard); + dashboardDao.insert(dto); + } // and save the fact that is has now already been loaded - loadedTemplateDao.insert(new LoadedTemplateDto(dashboard.getId(), LoadedTemplateDto.DASHBOARD_TYPE)); + loadedTemplateDao.insert(new LoadedTemplateDto(name, LoadedTemplateDto.DASHBOARD_TYPE)); return dto; } - protected DashboardDto createDtoFromExtension(Dashboard dashboard) { + protected DashboardDto createDtoFromExtension(String name, Dashboard dashboard) { Date now = new Date(); DashboardDto dashboardDto = new DashboardDto(); - dashboardDto.setKey(dashboard.getId()); - dashboardDto.setName(dashboard.getName()); + dashboardDto.setName(name); dashboardDto.setDescription(dashboard.getDescription()); dashboardDto.setColumnLayout(dashboard.getLayout().getCode()); dashboardDto.setShared(true); @@ -150,12 +141,19 @@ public final class RegisterNewDashboards { return dashboardDto; } - protected boolean shouldRegister(Dashboard dashboard) { - return loadedTemplateDao.countByTypeAndKey(LoadedTemplateDto.DASHBOARD_TYPE, dashboard.getId()) == 0; + protected boolean shouldRegister(String dashboardName) { + return loadedTemplateDao.countByTypeAndKey(LoadedTemplateDto.DASHBOARD_TYPE, dashboardName) == 0; } protected static class DashboardComparator implements Comparator { public int compare(DashboardDto d1, DashboardDto d2) { + // the default dashboard must be the first one to be activated + if (d1.getName().equals(DEFAULT_DASHBOARD_NAME)) { + return -1; + } + if (d2.getName().equals(DEFAULT_DASHBOARD_NAME)) { + return 1; + } return d1.getName().compareTo(d2.getName()); } } diff --git a/sonar-server/src/main/webapp/WEB-INF/app/models/dashboard.rb b/sonar-server/src/main/webapp/WEB-INF/app/models/dashboard.rb index c48acf060f0..1ed552fc661 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/models/dashboard.rb +++ b/sonar-server/src/main/webapp/WEB-INF/app/models/dashboard.rb @@ -30,25 +30,25 @@ class Dashboard < ActiveRecord::Base validates_length_of :description, :maximum => 1000, :allow_blank => true, :allow_nil => true validates_length_of :column_layout, :maximum => 20, :allow_blank => false, :allow_nil => false validates_uniqueness_of :name, :scope => :user_id - - before_create { |dashboard| dashboard.kee=dashboard.name.strip.downcase.sub(/\s+/, '_') } - + def name(l10n=true) + n=read_attribute(:name) if l10n - Api::Utils.message("dashboard.#{kee}.name", :default => read_attribute(:name)) + Api::Utils.message("dashboard.#{n}.name", :default => n) else - read_attribute(:name) + n end end def description(l10n=true) + n=name(false) if l10n - Api::Utils.message("dashboard.#{kee}.description", :default => read_attribute(:description)) + Api::Utils.message("dashboard.#{n}.description", :default => read_attribute(:description)) else read_attribute(:description) end end - + def shared? read_attribute(:shared) || false end @@ -74,7 +74,7 @@ class Dashboard < ActiveRecord::Base end def column_size(column_index) - last_widget=widgets.select{|w| w.column_index==column_index}.max{|x,y| x.row_index <=> y.row_index} + last_widget=widgets.select { |w| w.column_index==column_index }.max { |x, y| x.row_index <=> y.row_index } last_widget ? last_widget.row_index : 0 end diff --git a/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb b/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb index 5af5c6c4058..7a150b1fe12 100644 --- a/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb +++ b/sonar-server/src/main/webapp/WEB-INF/app/views/resource/_violation.html.erb @@ -59,7 +59,7 @@
<% if current_user %>