From af22e6008c26cf2aeb1848f7dd9fdbaffcc17eb2 Mon Sep 17 00:00:00 2001 From: Guillaume Jambet Date: Fri, 13 Apr 2018 15:46:09 +0200 Subject: [PATCH] SONAR-10587 do not not return external issues in batch/issues --- .../java/org/sonar/db/issue/IssueDao.java | 4 ++-- .../org/sonar/db/issue/IssueMapper.xml | 2 ++ .../java/org/sonar/db/issue/IssueDaoTest.java | 18 +++++++++----- .../org/sonar/server/batch/IssuesAction.java | 4 ++-- .../sonar/server/batch/IssuesActionTest.java | 24 +++++++++++++++++++ 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDao.java b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDao.java index 482857eecfb..61b10d7fd4a 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDao.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDao.java @@ -61,11 +61,11 @@ public class IssueDao implements Dao { return mapper(session).selectComponentUuidsOfOpenIssuesForProjectUuid(projectUuid); } - public void scrollNonClosedByComponentUuid(DbSession dbSession, String componentUuid, ResultHandler handler) { + public void scrollNonClosedByComponentUuidExcludingExternals(DbSession dbSession, String componentUuid, ResultHandler handler) { mapper(dbSession).scrollNonClosedByComponentUuid(componentUuid, handler); } - public void scrollNonClosedByModuleOrProject(DbSession dbSession, ComponentDto module, ResultHandler handler) { + public void scrollNonClosedByModuleOrProjectExcludingExternals(DbSession dbSession, ComponentDto module, ResultHandler handler) { String likeModuleUuidPath = buildLikeValue(module.moduleUuidPath(), WildcardPosition.AFTER); mapper(dbSession).scrollNonClosedByModuleOrProject(module.projectUuid(), likeModuleUuidPath, handler); } diff --git a/server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml b/server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml index 5f2e0f482cb..1716b6af4ac 100644 --- a/server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml +++ b/server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml @@ -192,6 +192,7 @@ inner join projects p on p.uuid=i.component_uuid inner join projects root on root.uuid=i.project_uuid where + r.is_external = 'false' and i.component_uuid = #{componentUuid,jdbcType=VARCHAR} and i.status <> 'CLOSED' @@ -244,6 +245,7 @@ inner join projects p on p.uuid = i.component_uuid inner join projects root on root.uuid = i.project_uuid where + r.is_external = 'false' and i.project_uuid = #{projectUuid, jdbcType=VARCHAR} and p.module_uuid_path like #{likeModuleUuidPath, jdbcType=VARCHAR} escape '/' and i.status <> 'CLOSED' diff --git a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java index a96d88a9031..a6f5219347c 100644 --- a/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java +++ b/server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDaoTest.java @@ -133,16 +133,19 @@ public class IssueDaoTest { IssueDto closedIssueOnFile = db.issues().insert(rule, project, file, i -> i.setStatus("CLOSED").setResolution("FIXED")); IssueDto openIssueOnProject = db.issues().insert(rule, project, project, i -> i.setStatus("OPEN").setResolution(null)); + RuleDefinitionDto external = db.rules().insert(ruleDefinitionDto -> ruleDefinitionDto.setIsExternal(true)); + IssueDto issueFromExteralruleOnFile = db.issues().insert(external, project, file, i -> i.setKee("ON_FILE_FROM_EXTERNAL")); + Accumulator accumulator = new Accumulator(); - underTest.scrollNonClosedByComponentUuid(db.getSession(), file.uuid(), accumulator); + underTest.scrollNonClosedByComponentUuidExcludingExternals(db.getSession(), file.uuid(), accumulator); accumulator.assertThatContainsOnly(openIssue1OnFile, openIssue2OnFile); accumulator.clear(); - underTest.scrollNonClosedByComponentUuid(db.getSession(), project.uuid(), accumulator); + underTest.scrollNonClosedByComponentUuidExcludingExternals(db.getSession(), project.uuid(), accumulator); accumulator.assertThatContainsOnly(openIssueOnProject); accumulator.clear(); - underTest.scrollNonClosedByComponentUuid(db.getSession(), "does_not_exist", accumulator); + underTest.scrollNonClosedByComponentUuidExcludingExternals(db.getSession(), "does_not_exist", accumulator); assertThat(accumulator.list).isEmpty(); } @@ -160,17 +163,20 @@ public class IssueDaoTest { IssueDto openIssueOnProject = db.issues().insert(rule, project, project, i -> i.setStatus("OPEN").setResolution(null)); IssueDto openIssueOnAnotherProject = db.issues().insert(rule, anotherProject, anotherProject, i -> i.setStatus("OPEN").setResolution(null)); + RuleDefinitionDto external = db.rules().insert(ruleDefinitionDto -> ruleDefinitionDto.setIsExternal(true)); + IssueDto issueFromExteralruleOnFile = db.issues().insert(external, project, file, i -> i.setKee("ON_FILE_FROM_EXTERNAL")); + Accumulator accumulator = new Accumulator(); - underTest.scrollNonClosedByModuleOrProject(db.getSession(), project, accumulator); + underTest.scrollNonClosedByModuleOrProjectExcludingExternals(db.getSession(), project, accumulator); accumulator.assertThatContainsOnly(openIssue1OnFile, openIssue2OnFile, openIssueOnModule, openIssueOnProject); accumulator.clear(); - underTest.scrollNonClosedByModuleOrProject(db.getSession(), module, accumulator); + underTest.scrollNonClosedByModuleOrProjectExcludingExternals(db.getSession(), module, accumulator); accumulator.assertThatContainsOnly(openIssue1OnFile, openIssue2OnFile, openIssueOnModule); accumulator.clear(); ComponentDto notPersisted = ComponentTesting.newPrivateProjectDto(db.getDefaultOrganization()); - underTest.scrollNonClosedByModuleOrProject(db.getSession(), notPersisted, accumulator); + underTest.scrollNonClosedByModuleOrProjectExcludingExternals(db.getSession(), notPersisted, accumulator); assertThat(accumulator.list).isEmpty(); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/batch/IssuesAction.java b/server/sonar-server/src/main/java/org/sonar/server/batch/IssuesAction.java index 018797fed54..9b805f9258f 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/batch/IssuesAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/batch/IssuesAction.java @@ -102,10 +102,10 @@ public class IssuesAction implements BatchWsAction { }; switch (component.scope()) { case Scopes.PROJECT: - dbClient.issueDao().scrollNonClosedByModuleOrProject(dbSession, component, handler); + dbClient.issueDao().scrollNonClosedByModuleOrProjectExcludingExternals(dbSession, component, handler); break; case Scopes.FILE: - dbClient.issueDao().scrollNonClosedByComponentUuid(dbSession, component.uuid(), handler); + dbClient.issueDao().scrollNonClosedByComponentUuidExcludingExternals(dbSession, component.uuid(), handler); break; default: // only projects, modules and files are supported. Other types of components are not allowed. diff --git a/server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java index d30962a7bca..06dfddf00d9 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/batch/IssuesActionTest.java @@ -159,6 +159,30 @@ public class IssuesActionTest { } } + @Test + public void does_not_return_issues_from_external_rules() { + RuleDefinitionDto rule = db.rules().insert(); + ComponentDto project = db.components().insertPrivateProject(); + ComponentDto module = db.components().insertComponent(newModuleDto(project)); + ComponentDto file = db.components().insertComponent(newFileDto(module, null)); + IssueDto issueOnProject = db.issues().insert(rule, project, project, i -> i.setKee("ON_PROJECT")); + IssueDto issueOnModule = db.issues().insert(rule, project, module, i -> i.setKee("ON_MODULE")); + IssueDto issueOnFile = db.issues().insert(rule, project, file, i -> i.setKee("ON_FILE")); + + RuleDefinitionDto external = db.rules().insert(ruleDefinitionDto -> ruleDefinitionDto.setIsExternal(true)); + IssueDto issueFromExteralruleOnFile = db.issues().insert(external, project, file, i -> i.setKee("ON_FILE_FROM_EXTERNAL")); + + addPermissionTo(project); + try (CloseableIterator result = callStream(project.getKey(), null)) { + assertThat(result) + .extracting(ServerIssue::getKey, ServerIssue::getModuleKey) + .containsExactlyInAnyOrder( + tuple(issueOnFile.getKey(), module.getKey()), + tuple(issueOnModule.getKey(), module.getKey()), + tuple(issueOnProject.getKey(), project.getKey())); + } + } + @Test public void return_issues_of_module() { RuleDefinitionDto rule = db.rules().insert(); -- 2.39.5