]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-19050 Add rule type rule characteristic to issue dto
authorLéo Geoffroy <leo.geoffroy@sonarsource.com>
Thu, 20 Apr 2023 15:41:05 +0000 (17:41 +0200)
committersonartech <sonartech@sonarsource.com>
Mon, 24 Apr 2023 20:04:24 +0000 (20:04 +0000)
server/sonar-db-dao/src/it/java/org/sonar/db/issue/IssueDaoIT.java
server/sonar-db-dao/src/it/java/org/sonar/db/rule/RuleDaoIT.java
server/sonar-db-dao/src/main/java/org/sonar/db/issue/IssueDto.java
server/sonar-db-dao/src/main/resources/org/sonar/db/issue/IssueMapper.xml
server/sonar-db-dao/src/main/resources/org/sonar/db/rule/RuleMapper.xml
server/sonar-db-dao/src/test/java/org/sonar/db/issue/IssueDtoTest.java
server/sonar-db-dao/src/testFixtures/java/org/sonar/db/rule/RuleTesting.java

index c83cf5a4850bb2fe64412ff393ace2ff455c0666..1bcd0b5d3d8e783aa3d0af312318af3e27f44f77 100644 (file)
@@ -28,6 +28,7 @@ import java.util.stream.Stream;
 import org.junit.Rule;
 import org.junit.Test;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rules.RuleCharacteristic;
 import org.sonar.api.rules.RuleType;
 import org.sonar.api.utils.System2;
 import org.sonar.db.DbTester;
@@ -122,6 +123,9 @@ public class IssueDaoIT {
     assertThat(issue.getLocations()).isNull();
     assertThat(issue.parseLocations()).isNull();
     assertThat(issue.isExternal()).isTrue();
+    assertThat(issue.getRuleType()).isEqualTo(RuleType.CODE_SMELL.getDbConstant());
+    assertThat(issue.getRuleCharacteristic()).isEqualTo(RuleCharacteristic.CLEAR);
+    assertThat(issue.getEffectiveRuleCharacteristic()).isEqualTo(RuleCharacteristic.CLEAR);
     assertFalse(issue.isQuickFixAvailable());
   }
 
index 498680a187310499a2c71077635b048c8abdec85..117f5a9b054c1912e43924e64aa41b4a4e29182a 100644 (file)
@@ -56,6 +56,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.assertj.core.api.Assertions.tuple;
 import static org.sonar.api.rule.RuleStatus.REMOVED;
+import static org.sonar.api.rules.RuleCharacteristic.CLEAR;
 
 public class RuleDaoIT {
   private static final String UNKNOWN_RULE_UUID = "unknown-uuid";
@@ -456,6 +457,7 @@ public class RuleDaoIT {
       .setSystemTags(newHashSet("systag1", "systag2"))
       .setSecurityStandards(newHashSet("owaspTop10:a1", "cwe:123"))
       .setType(RuleType.BUG)
+      .setCharacteristic(CLEAR)
       .setScope(Scope.ALL)
       .setCreatedAt(1_500_000_000_000L)
       .setUpdatedAt(2_000_000_000_000L);
@@ -483,6 +485,8 @@ public class RuleDaoIT {
     assertThat(ruleDto.getSecurityStandards()).containsOnly("owaspTop10:a1", "cwe:123");
     assertThat(ruleDto.getScope()).isEqualTo(Scope.ALL);
     assertThat(ruleDto.getType()).isEqualTo(RuleType.BUG.getDbConstant());
+    assertThat(ruleDto.getCharacteristic()).isEqualTo(CLEAR);
+
     assertThat(ruleDto.getCreatedAt()).isEqualTo(1_500_000_000_000L);
     assertThat(ruleDto.getUpdatedAt()).isEqualTo(2_000_000_000_000L);
     assertThat(ruleDto.getDescriptionFormat()).isEqualTo(RuleDto.Format.MARKDOWN);
index 10a8a1620c4149887754601617a9d11bae7076df..10d8ce2474893d3781173655877f1f5c37bf7f83 100644 (file)
@@ -19,6 +19,7 @@
  */
 package org.sonar.db.issue;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
@@ -34,6 +35,7 @@ import javax.annotation.Nullable;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rules.RuleCharacteristic;
 import org.sonar.api.rules.RuleType;
 import org.sonar.api.utils.Duration;
 import org.sonar.core.issue.DefaultIssue;
@@ -44,6 +46,7 @@ import org.sonar.db.rule.RuleDto;
 import static com.google.common.base.Preconditions.checkArgument;
 import static org.sonar.api.utils.DateUtils.dateToLong;
 import static org.sonar.api.utils.DateUtils.longToDate;
+import static org.sonar.db.rule.RuleTypeToRuleCharacteristicConverter.convertToRuleCharacteristic;
 
 public final class IssueDto implements Serializable {
 
@@ -53,6 +56,8 @@ public final class IssueDto implements Serializable {
   private static final Splitter TAGS_SPLITTER = Splitter.on(',').trimResults().omitEmptyStrings();
 
   private int type;
+  private int ruleType;
+  private RuleCharacteristic ruleCharacteristic;
   private String kee;
   private String componentUuid;
   private String projectUuid;
@@ -710,6 +715,37 @@ public final class IssueDto implements Serializable {
     return this;
   }
 
+  @CheckForNull
+  public RuleCharacteristic getRuleCharacteristic() {
+    return ruleCharacteristic;
+  }
+
+  @VisibleForTesting
+  IssueDto setRuleCharacteristic(RuleCharacteristic ruleCharacteristic) {
+    this.ruleCharacteristic = ruleCharacteristic;
+    return this;
+  }
+
+  @CheckForNull
+  public RuleCharacteristic getEffectiveRuleCharacteristic() {
+    return ruleCharacteristic != null ? ruleCharacteristic : convertTypeToCharacteristic(ruleType);
+  }
+
+  private static RuleCharacteristic convertTypeToCharacteristic(int type) {
+    RuleType ruleType = RuleType.valueOf(type);
+    return convertToRuleCharacteristic(ruleType);
+  }
+
+  public int getRuleType() {
+    return ruleType;
+  }
+
+  @VisibleForTesting
+  IssueDto setRuleType(int  ruleType) {
+    this.ruleType = ruleType;
+    return this;
+  }
+
   public Optional<String> getClosedChangeData() {
     return Optional.ofNullable(closedChangeData);
   }
index 83ea44866933155822fe0b5e6f6da9dc0d2bc58f..d97719958810d4b7c804758bbf27ae5e2d6809d6 100644 (file)
@@ -32,6 +32,8 @@
     r.plugin_name as ruleRepo,
     r.language as language,
     r.security_standards as securityStandards,
+    r.rule_type as ruleType,
+    r.characteristic as ruleCharacteristic,
     p.kee as componentKey,
     i.component_uuid as componentUuid,
     p.path as filePath,
index ca8352d9cd809ddf41b8e2362289b2f8e09fe726..e481e9a3930b7fb504c44ca9988811a7a5816902 100644 (file)
       system_tags,
       security_standards,
       rule_type,
+      characteristic,
       scope,
       note_data,
       note_user_uuid,
       #{systemTagsField,jdbcType=VARCHAR},
       #{securityStandardsField,jdbcType=VARCHAR},
       #{type,jdbcType=TINYINT},
+      #{characteristic,jdbcType=VARCHAR},
       #{scope,jdbcType=VARCHAR},
       #{noteData,jdbcType=CLOB},
       #{noteUserUuid,jdbcType=VARCHAR},
index e7ecde672662bb72f4332dd1cfb1e2bb5ea72830..7366e54998e49d2648ac6d8c1304ffe5a7176432 100644 (file)
@@ -29,6 +29,7 @@ import org.apache.commons.lang.time.DateUtils;
 import org.junit.Test;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.api.rules.RuleCharacteristic;
 import org.sonar.api.rules.RuleType;
 import org.sonar.api.utils.Duration;
 import org.sonar.core.issue.DefaultIssue;
@@ -155,19 +156,19 @@ public class IssueDtoTest {
     assertThat(issueDto).extracting(IssueDto::getKey, IssueDto::getType, IssueDto::getRuleKey).containsExactly("key", RuleType.BUG.getDbConstant(), RuleKey.of("repo", "rule"));
 
     assertThat(issueDto).extracting(IssueDto::getIssueCreationDate, IssueDto::getIssueCloseDate,
-      IssueDto::getIssueUpdateDate, IssueDto::getSelectedAt, IssueDto::getUpdatedAt, IssueDto::getCreatedAt)
+        IssueDto::getIssueUpdateDate, IssueDto::getSelectedAt, IssueDto::getUpdatedAt, IssueDto::getCreatedAt)
       .containsExactly(dateNow, dateNow, dateNow, dateNow.getTime(), now, now);
 
     assertThat(issueDto).extracting(IssueDto::getLine, IssueDto::getMessage,
-      IssueDto::getGap, IssueDto::getEffort, IssueDto::getResolution, IssueDto::getStatus, IssueDto::getSeverity)
+        IssueDto::getGap, IssueDto::getEffort, IssueDto::getResolution, IssueDto::getStatus, IssueDto::getSeverity)
       .containsExactly(1, "message", 1.0, 1L, Issue.RESOLUTION_FALSE_POSITIVE, Issue.STATUS_CLOSED, "BLOCKER");
 
     assertThat(issueDto).extracting(IssueDto::getTags, IssueDto::getAuthorLogin)
       .containsExactly(Set.of("todo"), "admin");
 
     assertThat(issueDto).extracting(IssueDto::isManualSeverity, IssueDto::getChecksum, IssueDto::getAssigneeUuid,
-      IssueDto::isExternal, IssueDto::getComponentUuid, IssueDto::getComponentKey,
-      IssueDto::getProjectUuid, IssueDto::getProjectKey, IssueDto::getRuleUuid)
+        IssueDto::isExternal, IssueDto::getComponentUuid, IssueDto::getComponentKey,
+        IssueDto::getProjectUuid, IssueDto::getProjectKey, IssueDto::getRuleUuid)
       .containsExactly(true, "123", "123", true, "123", "componentKey", "123", "projectKey", "ruleUuid");
 
     assertThat(issueDto.isQuickFixAvailable()).isTrue();
@@ -186,18 +187,18 @@ public class IssueDtoTest {
     assertThat(issueDto).extracting(IssueDto::getKey, IssueDto::getType, IssueDto::getRuleKey).containsExactly("key", RuleType.BUG.getDbConstant(), RuleKey.of("repo", "rule"));
 
     assertThat(issueDto).extracting(IssueDto::getIssueCreationDate, IssueDto::getIssueCloseDate,
-      IssueDto::getIssueUpdateDate, IssueDto::getSelectedAt, IssueDto::getUpdatedAt)
+        IssueDto::getIssueUpdateDate, IssueDto::getSelectedAt, IssueDto::getUpdatedAt)
       .containsExactly(dateNow, dateNow, dateNow, dateNow.getTime(), now);
 
     assertThat(issueDto).extracting(IssueDto::getLine, IssueDto::getMessage,
-      IssueDto::getGap, IssueDto::getEffort, IssueDto::getResolution, IssueDto::getStatus, IssueDto::getSeverity)
+        IssueDto::getGap, IssueDto::getEffort, IssueDto::getResolution, IssueDto::getStatus, IssueDto::getSeverity)
       .containsExactly(1, "message", 1.0, 1L, Issue.RESOLUTION_FALSE_POSITIVE, Issue.STATUS_CLOSED, "BLOCKER");
 
     assertThat(issueDto).extracting(IssueDto::getTags, IssueDto::getAuthorLogin)
       .containsExactly(Set.of("todo"), "admin");
 
     assertThat(issueDto).extracting(IssueDto::isManualSeverity, IssueDto::getChecksum, IssueDto::getAssigneeUuid,
-      IssueDto::isExternal, IssueDto::getComponentUuid, IssueDto::getComponentKey, IssueDto::getProjectUuid, IssueDto::getProjectKey)
+        IssueDto::isExternal, IssueDto::getComponentUuid, IssueDto::getComponentKey, IssueDto::getProjectUuid, IssueDto::getProjectKey)
       .containsExactly(true, "123", "123", true, "123", "componentKey", "123", "projectKey");
 
     assertThat(issueDto.isQuickFixAvailable()).isTrue();
@@ -236,4 +237,16 @@ public class IssueDtoTest {
       .setRuleDescriptionContextKey(TEST_CONTEXT_KEY);
     return defaultIssue;
   }
+
+  @Test
+  public void getEffectiveCharacteristic_when_characteristicInitialized_should_return_characteristicDbConstantValue() {
+    IssueDto issueDto = new IssueDto().setRuleType(RuleType.CODE_SMELL.getDbConstant()).setRuleCharacteristic(RuleCharacteristic.CLEAR);
+    assertThat(issueDto.getEffectiveRuleCharacteristic()).isEqualTo(RuleCharacteristic.CLEAR);
+  }
+
+  @Test
+  public void getEffectiveCharacteristic_when_characteristicNotInitialized_should_return_characteristicDbConstantValue() {
+    IssueDto issueDto = new IssueDto().setRuleType(RuleType.CODE_SMELL.getDbConstant());
+    assertThat(issueDto.getEffectiveRuleCharacteristic()).isEqualTo(RuleCharacteristic.CLEAR);
+  }
 }
index 6d5cc8f4cfd9909f983cbeb7d9ef2fc80b3ea67b..7cc01d1ec50a7bba32539d4b2669eba1b4f61773 100644 (file)
@@ -26,6 +26,7 @@ import javax.annotation.Nullable;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
 import org.sonar.api.rule.Severity;
+import org.sonar.api.rules.RuleCharacteristic;
 import org.sonar.api.rules.RuleType;
 import org.sonar.api.server.rule.RuleParamType;
 import org.sonar.core.util.UuidFactory;
@@ -92,6 +93,7 @@ public class RuleTesting {
       .setName("name_" + randomAlphanumeric(5))
       .setDescriptionFormat(RuleDto.Format.HTML)
       .setType(CODE_SMELL)
+      .setCharacteristic(RuleCharacteristic.CLEAR)
       .setStatus(RuleStatus.READY)
       .setConfigKey("configKey_" + ruleKey.rule())
       .setSeverity(Severity.ALL.get(nextInt(Severity.ALL.size())))