From 114efaae21bbf1c8a42c4f17627a0496ce65a2be Mon Sep 17 00:00:00 2001 From: Jacek Date: Fri, 6 Dec 2019 10:11:44 +0100 Subject: [PATCH] SONAR-12725 drop manual vulnerabilities * drop manual vulnerabilities * remove issues `from_hotspot` column usage --- .../projectanalysis/issue/IssueLifecycle.java | 12 -- .../issue/ComponentIssuesLoaderTest.java | 10 +- .../issue/IssueLifecycleTest.java | 66 --------- .../java/org/sonar/db/issue/IssueDto.java | 12 -- .../org/sonar/db/issue/IssueMapper.xml | 21 +-- .../java/org/sonar/db/issue/IssueDaoTest.java | 2 - .../org/sonar/db/issue/IssueMapperTest.java | 44 ------ .../db/migration/version/v81/DbVersion81.java | 3 +- ...nualVulnerabilitiesToSecurityHotSpots.java | 68 +++++++++ .../version/v81/DbVersion81Test.java | 2 +- ...VulnerabilitiesToSecurityHotSpotsTest.java | 140 ++++++++++++++++++ .../schema.sql | 54 +++++++ .../issue/workflow/IsManualVulnerability.java | 36 ----- ...alVulnerability.java => IsNotHotspot.java} | 4 +- .../server/issue/workflow/IssueWorkflow.java | 64 +++----- .../IssueWorkflowForSecurityHotspotsTest.java | 125 +--------------- .../org/sonar/server/issue/SetTypeAction.java | 4 +- .../server/issue/ws/BulkChangeAction.java | 4 + .../server/issue/ws/DoTransitionAction.java | 3 +- .../sonar/server/issue/ws/SearchAction.java | 1 + .../server/issue/ws/SearchResponseFormat.java | 1 - .../server/issue/ws/SearchResponseLoader.java | 4 +- .../sonar/server/issue/ws/SetTypeAction.java | 5 +- .../server/issue/ws/SetTypeActionTest.java | 86 ++++++++--- .../org/sonar/core/issue/DefaultIssue.java | 11 -- .../sonar/api/issue/DefaultTransitions.java | 4 +- 26 files changed, 380 insertions(+), 406 deletions(-) create mode 100644 server/sonar-db-migration/src/main/java/org/sonar/server/platform/db/migration/version/v81/MigrateManualVulnerabilitiesToSecurityHotSpots.java create mode 100644 server/sonar-db-migration/src/test/java/org/sonar/server/platform/db/migration/version/v81/MigrateManualVulnerabilitiesToSecurityHotSpotsTest.java create mode 100644 server/sonar-db-migration/src/test/resources/org/sonar/server/platform/db/migration/version/v81/MigrateManualVulnerabilitiesToSecurityHotSpotsTest/schema.sql delete mode 100644 server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/IsManualVulnerability.java rename server/sonar-server-common/src/main/java/org/sonar/server/issue/workflow/{IsNotHotspotNorManualVulnerability.java => IsNotHotspot.java} (90%) diff --git a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java index 4505d748997..7c01c43f013 100644 --- a/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java +++ b/server/sonar-ce-task-projectanalysis/src/main/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycle.java @@ -76,7 +76,6 @@ public class IssueLifecycle { issue.setCreationDate(changeContext.date()); issue.setUpdateDate(changeContext.date()); issue.setEffort(debtCalculator.calculate(issue)); - issue.setIsFromHotspot(rule.getType() == RuleType.SECURITY_HOTSPOT); setType(issue, rule); setStatus(issue, rule); } @@ -165,20 +164,9 @@ public class IssueLifecycle { // In case issue was moved from module or folder to the root project raw.setChanged(true); } - raw.setIsFromHotspot(rule.getType() == RuleType.SECURITY_HOTSPOT); setType(raw, rule); copyFields(raw, base); base.changes().forEach(raw::addChange); - if (raw.isFromHotspot() != base.isFromHotspot()) { - // This is to force DB update of the issue - raw.setChanged(true); - } - if (raw.isFromHotspot() && !base.isFromHotspot()) { - // First analysis after rule type was changed to security_hotspot. Issue will be reset to an open hotspot - updater.setType(raw, RuleType.SECURITY_HOTSPOT, changeContext); - updater.setStatus(raw, Issue.STATUS_TO_REVIEW, changeContext); - updater.setResolution(raw, null, changeContext); - } if (base.manualSeverity()) { raw.setManualSeverity(true); diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderTest.java index 746dd126efc..09e165377ff 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/ComponentIssuesLoaderTest.java @@ -80,7 +80,7 @@ public class ComponentIssuesLoaderTest { ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project)); RuleDefinitionDto rule = db.rules().insert(t -> t.setType(CODE_SMELL)); Date issueDate = addDays(NOW, -10); - IssueDto issue = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIssueCloseDate(issueDate).setType(CODE_SMELL).setIsFromHotspot(false)); + IssueDto issue = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIssueCloseDate(issueDate).setType(CODE_SMELL)); db.issues().insertFieldDiffs(issue, newToClosedDiffsWithLine(issueDate, 10)); db.issues().insertFieldDiffs(issue, newToClosedDiffsWithLine(addDays(issueDate, 3), 20)); db.issues().insertFieldDiffs(issue, newToClosedDiffsWithLine(addDays(issueDate, 1), 30)); @@ -100,7 +100,7 @@ public class ComponentIssuesLoaderTest { ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project)); RuleDefinitionDto rule = db.rules().insert(t -> t.setType(CODE_SMELL)); Date issueDate = addDays(NOW, -10); - IssueDto issue = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIssueCloseDate(issueDate).setType(CODE_SMELL).setIsFromHotspot(false)); + IssueDto issue = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIssueCloseDate(issueDate).setType(CODE_SMELL)); db.issues().insertFieldDiffs(issue, newToClosedDiffsWithLine(issueDate, 10)); db.issues().insertFieldDiffs(issue, newToClosedDiffsWithLine(addDays(issueDate, 2), null)); db.issues().insertFieldDiffs(issue, newToClosedDiffsWithLine(addDays(issueDate, 1), 30)); @@ -120,9 +120,9 @@ public class ComponentIssuesLoaderTest { ComponentDto file = db.components().insertComponent(ComponentTesting.newFileDto(project)); RuleDefinitionDto rule = db.rules().insert(t -> t.setType(CODE_SMELL)); Date issueDate = addDays(NOW, -10); - IssueDto closedIssue = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIssueCloseDate(issueDate).setType(CODE_SMELL).setIsFromHotspot(false)); + IssueDto closedIssue = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIssueCloseDate(issueDate).setType(CODE_SMELL)); db.issues().insertFieldDiffs(closedIssue, newToClosedDiffsWithLine(issueDate, 10)); - IssueDto issueNoCloseDate = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIsFromHotspot(false)); + IssueDto issueNoCloseDate = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED)); db.issues().insertFieldDiffs(issueNoCloseDate, newToClosedDiffsWithLine(issueDate, 10)); when(system2.now()).thenReturn(NOW.getTime()); @@ -198,7 +198,7 @@ public class ComponentIssuesLoaderTest { }; IssueDto[] issues = Arrays.stream(issueDates) .map(issueDate -> { - IssueDto closedIssue = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIssueCloseDate(issueDate).setType(CODE_SMELL).setIsFromHotspot(false)); + IssueDto closedIssue = db.issues().insert(rule, project, file, t -> t.setStatus(STATUS_CLOSED).setIssueCloseDate(issueDate).setType(CODE_SMELL)); db.issues().insertFieldDiffs(closedIssue, newToClosedDiffsWithLine(issueDate, 10)); return closedIssue; }) diff --git a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java index 0ce772abef6..56629df1fe2 100644 --- a/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java +++ b/server/sonar-ce-task-projectanalysis/src/test/java/org/sonar/ce/task/projectanalysis/issue/IssueLifecycleTest.java @@ -87,7 +87,6 @@ public class IssueLifecycleTest { assertThat(issue.effort()).isEqualTo(DEFAULT_DURATION); assertThat(issue.isNew()).isTrue(); assertThat(issue.isCopied()).isFalse(); - assertThat(issue.isFromHotspot()).isFalse(); } @Test @@ -107,7 +106,6 @@ public class IssueLifecycleTest { assertThat(issue.effort()).isEqualTo(DEFAULT_DURATION); assertThat(issue.isNew()).isTrue(); assertThat(issue.isCopied()).isFalse(); - assertThat(issue.isFromHotspot()).isTrue(); } @Test @@ -303,70 +301,6 @@ public class IssueLifecycleTest { verify(updater).setPastLocations(raw, issueLocations); } - @Test - public void mergeExistingOpenIssue_vulnerability_changed_to_hotspot_should_be_to_review() { - rule.setType(RuleType.SECURITY_HOTSPOT); - DefaultIssue raw = new DefaultIssue() - .setNew(true) - .setKey("RAW_KEY") - .setRuleKey(XOO_X1) - .setCreationDate(parseDate("2015-10-01")) - .setUpdateDate(parseDate("2015-10-02")) - .setCloseDate(parseDate("2015-10-03")); - - DbIssues.Locations issueLocations = DbIssues.Locations.newBuilder() - .setTextRange(DbCommons.TextRange.newBuilder() - .setStartLine(10) - .setEndLine(12) - .build()) - .build(); - DefaultIssue base = new DefaultIssue() - .setKey("BASE_KEY") - .setType(RuleType.VULNERABILITY) - // First analysis before rule was changed to hotspot - .setIsFromHotspot(false) - .setCreationDate(parseDate("2015-01-01")) - .setUpdateDate(parseDate("2015-01-02")) - .setResolution(RESOLUTION_FALSE_POSITIVE) - .setStatus(STATUS_RESOLVED) - .setSeverity(BLOCKER) - .setAssigneeUuid("base assignee uuid") - .setAuthorLogin("base author") - .setTags(newArrayList("base tag")) - .setSelectedAt(1000L) - .setLine(10) - .setMessage("message") - .setGap(15d) - .setEffort(Duration.create(15L)) - .setManualSeverity(false) - .setLocations(issueLocations); - - when(debtCalculator.calculate(raw)).thenReturn(DEFAULT_DURATION); - - underTest.mergeExistingOpenIssue(raw, base); - - assertThat(raw.isNew()).isFalse(); - assertThat(raw.key()).isEqualTo("BASE_KEY"); - assertThat(raw.creationDate()).isEqualTo(base.creationDate()); - assertThat(raw.updateDate()).isEqualTo(base.updateDate()); - assertThat(raw.assignee()).isEqualTo("base assignee uuid"); - assertThat(raw.authorLogin()).isEqualTo("base author"); - assertThat(raw.tags()).containsOnly("base tag"); - assertThat(raw.effort()).isEqualTo(DEFAULT_DURATION); - assertThat(raw.selectedAt()).isEqualTo(1000L); - assertThat(raw.isFromHotspot()).isTrue(); - assertThat(raw.isChanged()).isTrue(); - - verify(updater).setType(raw, RuleType.SECURITY_HOTSPOT, issueChangeContext); - verify(updater).setStatus(raw, STATUS_TO_REVIEW, issueChangeContext); - verify(updater).setResolution(raw, null, issueChangeContext); - verify(updater).setPastSeverity(raw, BLOCKER, issueChangeContext); - verify(updater).setPastLine(raw, 10); - verify(updater).setPastMessage(raw, "message", issueChangeContext); - verify(updater).setPastEffort(raw, Duration.create(15L), issueChangeContext); - verify(updater).setPastLocations(raw, issueLocations); - } - @Test public void mergeExistingOpenIssue_with_manual_severity() { DefaultIssue raw = new DefaultIssue() diff --git a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java index de6a05fe6a9..2c151d26e79 100644 --- a/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java +++ b/server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java @@ -122,7 +122,6 @@ public final class IssueDto implements Serializable { .setRuleId(ruleId) .setRuleKey(issue.ruleKey().repository(), issue.ruleKey().rule()) .setExternal(issue.isFromExternalRuleEngine()) - .setIsFromHotspot(issue.isFromHotspot()) .setTags(issue.tags()) .setComponentUuid(issue.componentUuid()) .setComponentKey(issue.componentKey()) @@ -171,7 +170,6 @@ public final class IssueDto implements Serializable { .setAuthorLogin(issue.authorLogin()) .setRuleKey(issue.ruleKey().repository(), issue.ruleKey().rule()) .setExternal(issue.isFromExternalRuleEngine()) - .setIsFromHotspot(issue.isFromHotspot()) .setTags(issue.tags()) .setComponentUuid(issue.componentUuid()) .setComponentKey(issue.componentKey()) @@ -489,15 +487,6 @@ public final class IssueDto implements Serializable { return this; } - public boolean isFromHotspot() { - return isFromHotspot; - } - - public IssueDto setIsFromHotspot(boolean value) { - isFromHotspot = value; - return this; - } - public String getComponentKey() { return componentKey; } @@ -742,7 +731,6 @@ public final class IssueDto implements Serializable { issue.setSelectedAt(selectedAt); issue.setLocations(parseLocations()); issue.setIsFromExternalRuleEngine(isExternal); - issue.setIsFromHotspot(isFromHotspot); return issue; } } 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 8aba7f1cd67..37ea21fbe49 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 @@ -38,8 +38,7 @@ p.path as filePath, root.kee as projectKey, i.project_uuid as projectUuid, - i.issue_type as type, - i.from_hotspot as "isFromHotspot" + i.issue_type as type @@ -96,8 +95,7 @@ p.scope, p.organization_uuid as "organizationUuid", i.tags, - i.issue_type as "issueType", - i.from_hotspot as "isFromHotspot" + i.issue_type as "issueType" @@ -105,7 +103,7 @@ INSERT INTO issues (kee, rule_id, severity, manual_severity, message, line, locations, gap, effort, status, tags, resolution, checksum, assignee, author_login, issue_attributes, issue_creation_date, issue_update_date, - issue_close_date, created_at, updated_at, component_uuid, project_uuid, issue_type, from_hotspot) + issue_close_date, created_at, updated_at, component_uuid, project_uuid, issue_type) VALUES (#{kee,jdbcType=VARCHAR}, #{ruleId,jdbcType=INTEGER}, #{severity,jdbcType=VARCHAR}, #{manualSeverity,jdbcType=BOOLEAN}, #{message,jdbcType=VARCHAR}, #{line,jdbcType=INTEGER}, @@ -118,7 +116,7 @@ #{issueAttributes,jdbcType=VARCHAR}, #{issueCreationTime,jdbcType=BIGINT},#{issueUpdateTime,jdbcType=BIGINT}, #{issueCloseTime,jdbcType=BIGINT}, #{createdAt,jdbcType=BIGINT}, #{updatedAt,jdbcType=BIGINT}, - #{componentUuid,jdbcType=VARCHAR}, #{projectUuid,jdbcType=VARCHAR}, #{type,jdbcType=INTEGER}, #{isFromHotspot,jdbcType=BOOLEAN}) + #{componentUuid,jdbcType=VARCHAR}, #{projectUuid,jdbcType=VARCHAR}, #{type,jdbcType=INTEGER})