diff options
author | Julien Lancelot <julien.lancelot@sonarsource.com> | 2016-03-01 16:50:31 +0100 |
---|---|---|
committer | Julien Lancelot <julien.lancelot@sonarsource.com> | 2016-03-02 14:19:36 +0100 |
commit | 9f6e09c73c158be3400a76991bfd0c66033d4eab (patch) | |
tree | 66b48dc8218b0f7da2a1cad385407414638c424d /server/sonar-server | |
parent | 84bc220fc84aaa1bbf88fc5c29ff7db113aef711 (diff) | |
download | sonarqube-9f6e09c73c158be3400a76991bfd0c66033d4eab.tar.gz sonarqube-9f6e09c73c158be3400a76991bfd0c66033d4eab.zip |
SONAR-7333 Set issue type from rule type
Diffstat (limited to 'server/sonar-server')
3 files changed, 32 insertions, 16 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/RuleImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/RuleImpl.java index 001521960c2..f5d81dd6760 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/issue/RuleImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/issue/RuleImpl.java @@ -51,8 +51,7 @@ public class RuleImpl implements Rule { this.status = dto.getStatus(); this.tags = union(dto.getSystemTags(), dto.getTags()); this.remediationFunction = effectiveRemediationFunction(dto); - // TODO get rule type - this.type = RuleType.CODE_SMELL; + this.type = RuleType.valueOf(dto.getType()); } @Override diff --git a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java index a2f7742c812..71f0d9b9db1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/issue/IssueService.java @@ -34,8 +34,8 @@ import org.apache.commons.lang.StringUtils; import org.sonar.api.issue.ActionPlan; import org.sonar.api.issue.Issue; import org.sonar.api.rule.RuleKey; +import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; -import org.sonar.api.rules.Rule; import org.sonar.api.rules.RuleFinder; import org.sonar.api.server.ServerSide; import org.sonar.api.user.User; @@ -44,11 +44,13 @@ import org.sonar.api.web.UserRole; import org.sonar.core.issue.DefaultIssue; import org.sonar.core.issue.DefaultIssueBuilder; import org.sonar.core.issue.IssueChangeContext; +import org.sonar.core.rule.RuleType; import org.sonar.db.DbClient; import org.sonar.db.DbSession; import org.sonar.db.component.ComponentDto; import org.sonar.db.issue.IssueDto; import org.sonar.db.protobuf.DbFileSources; +import org.sonar.db.rule.RuleDto; import org.sonar.server.es.SearchOptions; import org.sonar.server.es.SearchResult; import org.sonar.server.exceptions.BadRequestException; @@ -249,17 +251,17 @@ public class IssueService { if (!ruleKey.isManual()) { throw new IllegalArgumentException("Issues can be created only on rules marked as 'manual': " + ruleKey); } - Rule rule = getNullableRuleByKey(ruleKey); - if (rule == null) { + Optional<RuleDto> rule = getRuleByKey(dbSession, ruleKey); + if (!rule.isPresent()) { throw new IllegalArgumentException("Unknown rule: " + ruleKey); } DefaultIssue issue = new DefaultIssueBuilder() .componentKey(component.getKey()) - // TODO use rule type: type(rule.type()) + .type(RuleType.valueOf(rule.get().getType())) .projectKey(project.getKey()) .line(line) - .message(!Strings.isNullOrEmpty(message) ? message : rule.getName()) + .message(!Strings.isNullOrEmpty(message) ? message : rule.get().getName()) .severity(Objects.firstNonNull(severity, Severity.MAJOR)) .ruleKey(ruleKey) .reporter(userSession.getLogin()) @@ -292,23 +294,24 @@ public class IssueService { throw new IllegalStateException(String.format("Issue '%s' has no project key", issue.key())); } issueStorage.save(session, issue); - Rule rule = getNullableRuleByKey(issue.ruleKey()); + Optional<RuleDto> rule = getRuleByKey(session, issue.getRuleKey()); ComponentDto project = dbClient.componentDao().selectOrFailByKey(session, projectKey); notificationService.scheduleForSending(new IssueChangeNotification() .setIssue(issue) .setChangeAuthorLogin(context.login()) - .setRuleName(rule != null ? rule.getName() : null) + .setRuleName(rule.isPresent() ? rule.get().getName() : null) .setProject(project.getKey(), project.name()) .setComponent(dbClient.componentDao().selectOrFailByKey(session, issue.componentKey())) .setComment(comment)); } - /** - * Should use {@link org.sonar.server.rule.RuleService#getByKey(org.sonar.api.rule.RuleKey)}, but it's not possible as IssueNotifications is still used by the batch. - * Can be null for removed rules - */ - private Rule getNullableRuleByKey(RuleKey ruleKey) { - return ruleFinder.findByKey(ruleKey); + private Optional<RuleDto> getRuleByKey(DbSession session, RuleKey ruleKey) { + Optional<RuleDto> rule = dbClient.ruleDao().selectByKey(session, ruleKey); + if (rule.isPresent() && rule.get().getStatus() != RuleStatus.REMOVED) { + return rule; + } else { + return Optional.absent(); + } } public SearchResult<IssueDoc> search(IssueQuery query, SearchOptions options) { diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java index 2913daeb75d..e3f72de470c 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/IssueServiceMediumTest.java @@ -33,6 +33,7 @@ import org.sonar.api.config.Settings; import org.sonar.api.issue.DefaultTransitions; import org.sonar.api.issue.Issue; import org.sonar.api.rule.RuleKey; +import org.sonar.api.rule.RuleStatus; import org.sonar.api.rule.Severity; import org.sonar.api.security.DefaultGroups; import org.sonar.api.web.UserRole; @@ -472,6 +473,16 @@ public class IssueServiceMediumTest { service.createManualIssue("UNKNOWN", manualRule.getKey(), null, "Fix it", Severity.MINOR); } + @Test(expected = IllegalArgumentException.class) + public void fail_create_manual_issue_on_removed_rule() { + RuleDto rule = newRule(RuleTesting.newXooX1().setStatus(RuleStatus.REMOVED)); + ComponentDto project = newProject(); + ComponentDto file = newFile(project); + userSessionRule.login("john").addProjectPermissions(UserRole.USER, project.key()); + + service.createManualIssue(file.key(), rule.getKey(), 10, "Fix it", null); + } + @Test public void search_issues() { RuleDto rule = newRule(); @@ -574,7 +585,10 @@ public class IssueServiceMediumTest { } private RuleDto newRule() { - RuleDto rule = RuleTesting.newXooX1(); + return newRule(RuleTesting.newXooX1()); + } + + private RuleDto newRule(RuleDto rule) { tester.get(RuleDao.class).insert(session, rule); session.commit(); ruleIndexer.index(); |