From: Jean-Baptiste Lievremont Date: Mon, 9 Mar 2015 17:13:19 +0000 (+0100) Subject: SONAR-6236 Put back widgets on default "Issues" dashboard, based on new issue filter... X-Git-Tag: 5.2-RC1~2616 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=93e3a0990b80453252bf442ecf0fb52b3f95a971;p=sonarqube.git SONAR-6236 Put back widgets on default "Issues" dashboard, based on new issue filter widget --- diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboard.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboard.java index 295e62a67a8..32c23a27545 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboard.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboard.java @@ -19,9 +19,12 @@ */ package org.sonar.plugins.core.dashboards; +import com.google.common.base.Preconditions; import org.sonar.api.web.Dashboard; import org.sonar.api.web.DashboardLayout; import org.sonar.api.web.DashboardTemplate; +import org.sonar.core.issue.db.IssueFilterDao; +import org.sonar.core.issue.db.IssueFilterDto; /** * Issues dashboard for Sonar @@ -30,6 +33,12 @@ import org.sonar.api.web.DashboardTemplate; */ public final class ProjectIssuesDashboard extends DashboardTemplate { + private final IssueFilterDao issueFilterDao; + + public ProjectIssuesDashboard(IssueFilterDao issueFilterDao) { + this.issueFilterDao = issueFilterDao; + } + @Override public String getName() { return "Issues"; @@ -39,20 +48,43 @@ public final class ProjectIssuesDashboard extends DashboardTemplate { public Dashboard createDashboard() { Dashboard dashboard = Dashboard.create(); dashboard.setLayout(DashboardLayout.TWO_COLUMNS); - addFirstColumn(dashboard); - addSecondColumn(); + + IssueFilterDto unresolvedIssues = getIssueFilterByName("Unresolved Issues"); + IssueFilterDto hiddenDebt = getIssueFilterByName("False Positive and Won't Fix Issues"); + IssueFilterDto myUnresolvedIssues = getIssueFilterByName("My Unresolved Issues"); + + addFirstColumn(dashboard, unresolvedIssues); + addSecondColumn(dashboard, unresolvedIssues, hiddenDebt, myUnresolvedIssues); return dashboard; } - private void addFirstColumn(Dashboard dashboard) { - // TODO: + unresolved issues by status + private IssueFilterDto getIssueFilterByName(String name) { + IssueFilterDto filter = issueFilterDao.selectProvidedFilterByName(name); + Preconditions.checkState(filter != null, String.format("Could not find a provided issue filter with name '%s'", name)); + return filter; + } + + private void addFirstColumn(Dashboard dashboard, IssueFilterDto unresolvedIssues) { + // Unresolved issues by status + dashboard.addWidget("project_issue_filter", 1) + .setProperty("filter", Long.toString(unresolvedIssues.getId())) + .setProperty("distributionAxis", "statuses"); + // Action plans dashboard.addWidget("action_plans", 1); } - private void addSecondColumn() { - // TODO: + unresolved issues by assignee - // TODO: + my unresolved issues - // TODO: + false positive and won't fix issues + private void addSecondColumn(Dashboard dashboard, IssueFilterDto unresolvedIssues, IssueFilterDto hiddenDebt, IssueFilterDto myUnresolvedIssues) { + // Unresolved issues by assignee + dashboard.addWidget("project_issue_filter", 2) + .setProperty("filter", Long.toString(unresolvedIssues.getId())) + .setProperty("distributionAxis", "assignees"); + // My unresolved issues + dashboard.addWidget("project_issue_filter", 2) + .setProperty("filter", Long.toString(myUnresolvedIssues.getId())); + // False positive and won't fix issues by resolution + dashboard.addWidget("project_issue_filter", 2) + .setProperty("filter", Long.toString(hiddenDebt.getId())) + .setProperty("distributionAxis", "resolutions"); } } diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest.java index 7aa7d11bae0..28924a13293 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest.java @@ -20,16 +20,32 @@ package org.sonar.plugins.core.dashboards; +import org.junit.Before; +import org.junit.ClassRule; import org.junit.Test; +import org.junit.experimental.categories.Category; import org.sonar.api.web.Dashboard; import org.sonar.api.web.DashboardLayout; +import org.sonar.core.issue.db.IssueFilterDao; +import org.sonar.core.persistence.DbTester; import org.sonar.plugins.core.CorePlugin; +import org.sonar.test.DbTests; import static org.assertj.core.api.Assertions.assertThat; +@Category(DbTests.class) public class ProjectIssuesDashboardTest { - ProjectIssuesDashboard template = new ProjectIssuesDashboard(); + @ClassRule + public static final DbTester dbTester = new DbTester(); + + ProjectIssuesDashboard template; + + @Before + public void setUp() throws Exception { + IssueFilterDao issueFilterDao = new IssueFilterDao(dbTester.myBatis()); + template = new ProjectIssuesDashboard(issueFilterDao); + } @Test public void should_have_a_name() { @@ -43,10 +59,19 @@ public class ProjectIssuesDashboardTest { @Test public void should_create_dashboard() { + dbTester.prepareDbUnit(getClass(), "filters.xml"); Dashboard dashboard = template.createDashboard(); assertThat(dashboard.getLayout()).isEqualTo(DashboardLayout.TWO_COLUMNS); - assertThat(dashboard.getWidgets()).hasSize(1); + assertThat(dashboard.getWidgets()).hasSize(5); } + @Test + public void should_provide_clean_error_message_on_failure() { + try { + template.createDashboard(); + } catch (IllegalStateException illegalState) { + assertThat(illegalState).hasMessage("Could not find a provided issue filter with name 'Unresolved Issues'"); + } + } } diff --git a/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest/filters.xml b/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest/filters.xml new file mode 100644 index 00000000000..8ec92ddcdbf --- /dev/null +++ b/plugins/sonar-core-plugin/src/test/resources/org/sonar/plugins/core/dashboards/ProjectIssuesDashboardTest/filters.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterDao.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterDao.java index 1548dc84444..a8c253e61b3 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterDao.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterDao.java @@ -69,6 +69,15 @@ public class IssueFilterDao implements BatchComponent, ServerComponent { } } + public IssueFilterDto selectProvidedFilterByName(String name) { + SqlSession session = mybatis.openSession(false); + try { + return getMapper(session).selectProvidedFilterByName(name); + } finally { + MyBatis.closeQuietly(session); + } + } + public List selectSharedFilters() { SqlSession session = mybatis.openSession(false); try { diff --git a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterMapper.java b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterMapper.java index fd0479f4132..b5e8eb93fac 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/db/IssueFilterMapper.java @@ -37,9 +37,12 @@ public interface IssueFilterMapper { List selectSharedFilters(); + IssueFilterDto selectProvidedFilterByName(String name); + void insert(IssueFilterDto filter); void update(IssueFilterDto filter); void delete(long id); + } diff --git a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueFilterMapper.xml b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueFilterMapper.xml index 078620f535b..75e324a9e6e 100644 --- a/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueFilterMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/issue/db/IssueFilterMapper.xml @@ -40,6 +40,14 @@ where filters.shared=${_true} + + INSERT INTO issue_filters (name, user_login, shared, description, data, created_at, updated_at) VALUES (#{name}, #{userLogin}, #{shared}, #{description}, #{data}, #{createdAt}, #{updatedAt}) diff --git a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueFilterDaoTest.java b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueFilterDaoTest.java index da240bd11e0..621246ef967 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/db/IssueFilterDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/db/IssueFilterDaoTest.java @@ -77,6 +77,15 @@ public class IssueFilterDaoTest extends AbstractDaoTestCase { assertThat(dao.selectSharedFilters()).hasSize(1); } + @Test + public void should_select_provided_by_name() { + setupData("should_select_provided_by_name"); + + assertThat(dao.selectProvidedFilterByName("Unresolved Issues").getName()).isEqualTo("Unresolved Issues"); + assertThat(dao.selectProvidedFilterByName("My Unresolved Issues").getName()).isEqualTo("My Unresolved Issues"); + assertThat(dao.selectProvidedFilterByName("Unknown Filter")).isNull(); + } + @Test public void should_insert() { setupData("shared"); diff --git a/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueFilterDaoTest/should_select_provided_by_name.xml b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueFilterDaoTest/should_select_provided_by_name.xml new file mode 100644 index 00000000000..d2b7e3009ed --- /dev/null +++ b/sonar-core/src/test/resources/org/sonar/core/issue/db/IssueFilterDaoTest/should_select_provided_by_name.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + +