]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-20021 Adding clean code taxonomy to issues endpoints
authorlukasz-jarocki-sonarsource <lukasz.jarocki@sonarsource.com>
Wed, 16 Aug 2023 07:28:08 +0000 (09:28 +0200)
committersonartech <sonartech@sonarsource.com>
Fri, 18 Aug 2023 20:02:49 +0000 (20:02 +0000)
server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/AssignActionIT.java
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/WebIssueStorageIT.java
server/sonar-webserver-webapi/src/it/java/org/sonar/server/issue/ws/AssignActionIT.java
server/sonar-webserver-webapi/src/main/java/org/sonar/server/issue/WebIssueStorage.java
sonar-core/src/main/java/org/sonar/core/issue/DefaultIssue.java

index 8d16aba747d8ef3d74d7dc89fedb32d7a8c66aef..1c0143c1953f5bcc171f90943ed7027be8ea108e 100644 (file)
@@ -64,7 +64,6 @@ public final class IssueDto implements Serializable {
   private static final Splitter STRING_LIST_SPLITTER = Splitter.on(STRING_LIST_SEPARATOR).trimResults().omitEmptyStrings();
 
   private int type;
-  private CleanCodeAttribute cleanCodeAttribute;
   private String kee;
   private String componentUuid;
   private String projectUuid;
@@ -114,7 +113,10 @@ public final class IssueDto implements Serializable {
   private String closedChangeData;
 
   private Set<ImpactDto> impacts = new HashSet<>();
+
+  //non-persisted fields
   private Set<ImpactDto> ruleDefaultImpacts = new HashSet<>();
+  private CleanCodeAttribute cleanCodeAttribute;
 
   public IssueDto() {
     // nothing to do
@@ -810,6 +812,13 @@ public final class IssueDto implements Serializable {
     return this;
   }
 
+
+  public IssueDto setRuleDefaultImpacts(Set<ImpactDto> ruleDefaultImpacts) {
+    this.ruleDefaultImpacts = new HashSet<>(ruleDefaultImpacts);
+    return this;
+  }
+  
+
   public IssueDto replaceAllImpacts(Collection<ImpactDto> newImpacts) {
     Set<SoftwareQuality> newSoftwareQuality = newImpacts.stream().map(ImpactDto::getSoftwareQuality).collect(Collectors.toSet());
     if (newSoftwareQuality.size() != newImpacts.size()) {
index 0b46b040e9e016e263e31d1325f7178366b2f299..fea64debd4d046b898782393299a6c6c571b38d1 100644 (file)
@@ -47,7 +47,6 @@ public class AssignActionIT {
 
   private static final String ISSUE_CURRENT_ASSIGNEE_UUID = "current assignee uuid";
 
-
   @Rule
   public UserSessionRule userSession = standalone();
 
@@ -69,7 +68,7 @@ public class AssignActionIT {
   @Test
   public void assign_issue() {
     UserDto assignee = db.users().insertUser("john");
-    Map<String, Object> properties = new HashMap<>(ImmutableMap.of("assignee", "john"));
+    Map<String, Object> properties = new HashMap<>(Map.of("assignee", "john"));
 
     underTest.verify(properties, Collections.emptyList(), userSession);
     boolean executeResult = underTest.execute(properties, context);
@@ -80,7 +79,7 @@ public class AssignActionIT {
 
   @Test
   public void unassign_issue_if_assignee_is_empty() {
-    Map<String, Object> properties = new HashMap<>(ImmutableMap.of("assignee", ""));
+    Map<String, Object> properties = new HashMap<>(Map.of("assignee", ""));
 
     underTest.verify(properties, Collections.emptyList(), userSession);
     boolean executeResult = underTest.execute(properties, context);
index 844e312972dd757a73bc609db2ab2d585af75c99..a856e374b6be6f82000ac31e3da35ea2cd7d4423 100644 (file)
@@ -25,6 +25,9 @@ import java.util.List;
 import java.util.Map;
 import org.junit.Test;
 import org.sonar.api.impl.utils.TestSystem2;
+import org.sonar.api.issue.impact.Severity;
+import org.sonar.api.issue.impact.SoftwareQuality;
+import org.sonar.api.rules.CleanCodeAttribute;
 import org.sonar.api.rules.RuleType;
 import org.sonar.api.utils.DateUtils;
 import org.sonar.api.utils.Duration;
@@ -112,7 +115,12 @@ public class WebIssueStorageIT {
       .setUpdateDate(date)
       .setCloseDate(date);
 
-    underTest.save(db.getSession(), singletonList(issue));
+    Collection<IssueDto> createdIssues = underTest.save(db.getSession(), singletonList(issue));
+
+    assertThat(createdIssues).hasSize(1);
+
+    assertThat(createdIssues.iterator().next().getCleanCodeAttribute()).isEqualTo(CleanCodeAttribute.CLEAR);
+    assertThat(createdIssues.iterator().next().getEffectiveImpacts()).isEqualTo(Map.of(SoftwareQuality.MAINTAINABILITY, Severity.HIGH));
 
     assertThat(db.countRowsOfTable("issues")).isOne();
     assertThat(db.selectFirst("select * from issues"))
@@ -155,7 +163,11 @@ public class WebIssueStorageIT {
       .setUpdateDate(date)
       .setCloseDate(date);
 
-    underTest.save(db.getSession(), singletonList(issue));
+    Collection<IssueDto> updatedIssues = underTest.save(db.getSession(), singletonList(issue));
+    assertThat(updatedIssues).hasSize(1);
+
+    assertThat(updatedIssues.iterator().next().getCleanCodeAttribute()).isEqualTo(CleanCodeAttribute.CLEAR);
+    assertThat(updatedIssues.iterator().next().getEffectiveImpacts()).isEqualTo(Map.of(SoftwareQuality.MAINTAINABILITY, Severity.HIGH));
 
     assertThat(db.countRowsOfTable("issues")).isOne();
     assertThat(db.countRowsOfTable("issue_changes")).isZero();
index eb0ce958b7d145998f708ad87a421c4fc7603a00..9705c2526616a3e16ced5b0829ee8b62441df557 100644 (file)
@@ -49,6 +49,7 @@ import org.sonar.server.rule.RuleDescriptionFormatter;
 import org.sonar.server.tester.UserSessionRule;
 import org.sonar.server.ws.TestRequest;
 import org.sonar.server.ws.WsActionTester;
+import org.sonarqube.ws.Issues;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -114,10 +115,10 @@ public class AssignActionIT {
   public void assign_to_me() {
     IssueDto issue = newIssueWithBrowsePermission();
 
-    ws.newRequest()
+    Issues.AssignResponse assignResponse = ws.newRequest()
       .setParam("issue", issue.getKey())
       .setParam("assignee", "_me")
-      .execute();
+      .executeProtobuf(Issues.AssignResponse.class);
 
     checkIssueAssignee(issue.getKey(), currentUser.getUuid());
     Optional<IssueDto> optionalIssueDto = dbClient.issueDao().selectByKey(session, issue.getKey());
index 543b185b7c350734c4a40f98e5a085ad0e1b68fe..94d9891773205cb1c5fd2a91651e85aae9e3f3e0 100644 (file)
@@ -43,7 +43,6 @@ import org.sonar.server.issue.index.IssueIndexer;
 import org.sonar.server.rule.ServerRuleFinder;
 
 import static com.google.common.base.MoreObjects.firstNonNull;
-import static com.google.common.collect.Lists.newArrayList;
 import static java.util.Collections.emptyList;
 
 /**
@@ -101,7 +100,7 @@ public class WebIssueStorage extends IssueStorage {
    * @return the keys of the inserted issues
    */
   private Collection<IssueDto> insert(DbSession session, Iterable<DefaultIssue> issuesToInsert, long now) {
-    List<IssueDto> inserted = newArrayList();
+    List<IssueDto> inserted = new ArrayList<>();
     int count = 0;
     IssueChangeMapper issueChangeMapper = session.getMapper(IssueChangeMapper.class);
     for (DefaultIssue issue : issuesToInsert) {
@@ -121,8 +120,10 @@ public class WebIssueStorage extends IssueStorage {
   private IssueDto doInsert(DbSession session, long now, DefaultIssue issue) {
     ComponentDto component = component(session, issue);
     ComponentDto project = project(session, issue);
-    String ruleUuid = getRuleUuid(issue).orElseThrow(() -> new IllegalStateException("Rule not found: " + issue.ruleKey()));
-    IssueDto dto = IssueDto.toDtoForServerInsert(issue, component, project, ruleUuid, now);
+    RuleDto ruleDto = getRule(issue).orElseThrow(() -> new IllegalStateException("Rule not found: " + issue.ruleKey()));
+    IssueDto dto = IssueDto.toDtoForServerInsert(issue, component, project, ruleDto.getUuid(), now);
+    dto.setCleanCodeAttribute(ruleDto.getCleanCodeAttribute());
+    dto.setRuleDefaultImpacts(ruleDto.getDefaultImpacts());
 
     getDbClient().issueDao().insert(session, dto);
     return dto;
@@ -159,11 +160,14 @@ public class WebIssueStorage extends IssueStorage {
     IssueDto dto = IssueDto.toDtoForUpdate(issue, now);
     getDbClient().issueDao().update(session, dto);
     // Rule id does not exist in DefaultIssue
-    getRuleUuid(issue).ifPresent(dto::setRuleUuid);
+    Optional<RuleDto> rule = getRule(issue);
+    rule.ifPresent(r -> dto.setRuleUuid(r.getUuid()));
+    rule.ifPresent(r -> dto.setCleanCodeAttribute(r.getCleanCodeAttribute()));
+    rule.ifPresent(r -> dto.setRuleDefaultImpacts(r.getDefaultImpacts()));
     return dto;
   }
 
-  protected Optional<String> getRuleUuid(Issue issue) {
-    return ruleFinder.findDtoByKey(issue.ruleKey()).map(RuleDto::getUuid);
+  protected Optional<RuleDto> getRule(Issue issue) {
+    return ruleFinder.findDtoByKey(issue.ruleKey());
   }
 }
index 581def46912649a85d142e36b9db94d38299df6c..e2a15fd29b69ba19176523904f184b5fbad26d51 100644 (file)
@@ -45,6 +45,8 @@ import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.impact.SoftwareQuality;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.Severity;
+import org.sonar.api.rules.CleanCodeAttribute;
+import org.sonar.api.rules.CleanCodeAttributeCategory;
 import org.sonar.api.rules.RuleType;
 import org.sonar.api.utils.Duration;
 import org.sonar.core.issue.tracking.Trackable;
@@ -742,4 +744,5 @@ public class DefaultIssue implements Issue, Trackable, org.sonar.api.ce.measure.
   public Date getUpdateDate() {
     return updateDate;
   }
+
 }