From 22264aabab2636a64a18513650e973df185aeb43 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Wed, 8 Oct 2014 11:33:38 +0200 Subject: [PATCH] SONAR-5531 Fix /api/issues/search when issues are linked on removed file --- .../server/component/db/ComponentDao.java | 6 ++ .../sonar/server/issue/ws/SearchAction.java | 2 +- .../server/component/db/ComponentDaoTest.java | 7 +- .../issue/ws/SearchActionMediumTest.java | 27 +++++-- .../db/ComponentDaoTest/delete-result.xml | 75 +++++++++++++++++++ .../issue_linked_on_removed_file.json | 15 ++++ .../core/component/db/ComponentMapper.java | 2 + .../core/component/db/ComponentMapper.xml | 4 + 8 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/component/db/ComponentDaoTest/delete-result.xml create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_linked_on_removed_file.json diff --git a/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java b/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java index eaafc3c5863..7e4d49124d5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java +++ b/server/sonar-server/src/main/java/org/sonar/server/component/db/ComponentDao.java @@ -151,4 +151,10 @@ public class ComponentDao extends BaseDao mapper(session).insert(item); return item; } + + @Override + protected void doDeleteByKey(DbSession session, String key) { + // TODO shouldn't we need to also delete snapshots ? + mapper(session).deleteByKey(key); + } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java index c8cce9fdd06..3724e0eda02 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java @@ -342,7 +342,7 @@ public class SearchAction extends SearchRequestHandler { .prop("key", issue.key()) .prop("component", issue.componentKey()) // Only used for the compatibility with the Issues Java WS Client <= 4.4 used by Eclipse - .prop("componentId", componentDto.getId()) + .prop("componentId", componentDto != null ? componentDto.getId() : null) .prop("project", issue.projectKey()) .prop("rule", issue.ruleKey().toString()) .prop("status", issue.status()) diff --git a/server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java index b264446ac73..bb492c16a0b 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/component/db/ComponentDaoTest.java @@ -349,12 +349,17 @@ public class ComponentDaoTest extends AbstractDaoTestCase { ); } - @Test(expected = IllegalStateException.class) + @Test public void delete() { + setupData("shared"); + dao.delete(session, new ComponentDto() .setId(1L) .setKey("org.struts:struts-core:src/org/struts/RequestContext.java") ); + session.commit(); + + checkTable("delete", "projects"); } @Test(expected = IllegalStateException.class) diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java index 593a6a456c5..c864bccffc0 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java @@ -32,11 +32,7 @@ import org.sonar.api.utils.DateUtils; import org.sonar.api.utils.KeyValueFormat; import org.sonar.api.web.UserRole; import org.sonar.core.component.ComponentDto; -import org.sonar.core.issue.db.ActionPlanDao; -import org.sonar.core.issue.db.ActionPlanDto; -import org.sonar.core.issue.db.IssueChangeDao; -import org.sonar.core.issue.db.IssueChangeDto; -import org.sonar.core.issue.db.IssueDto; +import org.sonar.core.issue.db.*; import org.sonar.core.permission.PermissionFacade; import org.sonar.core.persistence.DbSession; import org.sonar.core.rule.RuleDto; @@ -249,6 +245,27 @@ public class SearchActionMediumTest { result.assertJson(this.getClass(), "issue_with_extra_fields.json", false); } + @Test + public void issue_linked_on_removed_file() throws Exception { + IssueDto issue = IssueTesting.newDto(rule, file, project) + .setKee("82fd47d4-b650-4037-80bc-7b112bd4eac2") + .setRule(rule) + .setRootComponent(project) + .setComponent(file) + .setStatus("OPEN").setResolution("OPEN") + .setSeverity("MAJOR") + .setIssueCreationDate(DateUtils.parseDate("2014-09-04")) + .setIssueUpdateDate(DateUtils.parseDate("2014-12-04")); + db.issueDao().insert(session, issue); + + // Remove the file + db.componentDao().deleteByKey(session, file.key()); + session.commit(); + + WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION).execute(); + result.assertJson(this.getClass(), "issue_linked_on_removed_file.json", false); + } + @Test public void issue_contains_component_id_for_eclipse() throws Exception { IssueDto issue = IssueTesting.newDto(rule, file, project); diff --git a/server/sonar-server/src/test/resources/org/sonar/server/component/db/ComponentDaoTest/delete-result.xml b/server/sonar-server/src/test/resources/org/sonar/server/component/db/ComponentDaoTest/delete-result.xml new file mode 100644 index 00000000000..28c0e32f26e --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/component/db/ComponentDaoTest/delete-result.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_linked_on_removed_file.json b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_linked_on_removed_file.json new file mode 100644 index 00000000000..e6eba81ea5f --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/issue/ws/SearchActionMediumTest/issue_linked_on_removed_file.json @@ -0,0 +1,15 @@ +{ + "issues": [ + { + "key": "82fd47d4-b650-4037-80bc-7b112bd4eac2", + "component": "MyComponent", + "project": "MyProject", + "rule": "xoo:x1", + "status": "OPEN", + "resolution": "OPEN", + "severity": "MAJOR", + "updateDate": "2014-12-04T00:00:00+0100", + "fUpdateAge": "less than a minute" + } + ] +} diff --git a/sonar-core/src/main/java/org/sonar/core/component/db/ComponentMapper.java b/sonar-core/src/main/java/org/sonar/core/component/db/ComponentMapper.java index 9102b8601d5..3ef31f6e61c 100644 --- a/sonar-core/src/main/java/org/sonar/core/component/db/ComponentMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/component/db/ComponentMapper.java @@ -67,4 +67,6 @@ public interface ComponentMapper { AuthorizedComponentDto selectAuthorizedComponentByKey(String key); void insert(ComponentDto rule); + + void deleteByKey(String key); } diff --git a/sonar-core/src/main/resources/org/sonar/core/component/db/ComponentMapper.xml b/sonar-core/src/main/resources/org/sonar/core/component/db/ComponentMapper.xml index a2b4e19ae77..06ae4a5b094 100644 --- a/sonar-core/src/main/resources/org/sonar/core/component/db/ComponentMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/component/db/ComponentMapper.xml @@ -154,5 +154,9 @@ values (#{kee}, #{name}, #{longName}, #{qualifier}, #{scope}, #{language}, #{subProjectId}, #{path}, #{createdAt}, #{authorizationUpdatedAt}) + + delete from projects where kee=#{key} + + -- 2.39.5