]> source.dussan.org Git - sonarqube.git/commitdiff
Added debt model for RuleWS
authorStephane Gamard <stephane.gamard@searchbox.com>
Wed, 14 May 2014 16:00:39 +0000 (18:00 +0200)
committerStephane Gamard <stephane.gamard@searchbox.com>
Wed, 14 May 2014 16:00:52 +0000 (18:00 +0200)
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleDoc.java
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleIndex.java
sonar-server/src/main/java/org/sonar/server/rule2/index/RuleNormalizer.java
sonar-server/src/main/java/org/sonar/server/rule2/ws/SearchAction.java
sonar-server/src/test/java/org/sonar/server/rule2/index/RuleIndexMediumTest.java
sonar-server/src/test/java/org/sonar/server/rule2/ws/RulesWebServiceTest.java
sonar-server/src/test/resources/org/sonar/server/rule2/ws/RulesWebServiceTest/search_2_rules.json
sonar-server/src/test/resources/org/sonar/server/rule2/ws/RulesWebServiceTest/search_active_rules.json
sonar-server/src/test/resources/org/sonar/server/rule2/ws/RulesWebServiceTest/search_active_rules_params.json
sonar-server/src/test/resources/org/sonar/server/rule2/ws/RulesWebServiceTest/search_debt_rule.json [new file with mode: 0644]

index 41b5b32d9b7ebac5a29440264e4f4b312753d235..be2042f88f02eb06b88d9dcca6f384b2ed297303 100644 (file)
@@ -160,14 +160,34 @@ class RuleDoc implements Rule {
 
   @Override
   @CheckForNull
-  public String debtSubCharacteristicKey() {
-    throw new UnsupportedOperationException("TODO");
+  public String debtSubCharacteristicKey(){
+    return (String) fields.get(RuleField.SUB_CHARACTERISTIC.key());
   }
 
   @Override
   @CheckForNull
   public DebtRemediationFunction debtRemediationFunction() {
-    throw new UnsupportedOperationException("TODO");
+    final String function = (String) this.fields.get(RuleField.DEBT_FUNCTION_TYPE.key());
+    if(function == null || function.isEmpty()){
+      return null;
+    } else {
+      return new DebtRemediationFunction() {
+        @Override
+        public Type type() {
+          return Type.valueOf(function.toUpperCase());
+        }
+
+        @Override
+        public String coefficient() {
+          return (String) fields.get(RuleField.DEBT_FUNCTION_COEFFICIENT.key());
+        }
+
+        @Override
+        public String offset() {
+          return (String) fields.get(RuleField.DEBT_FUNCTION_OFFSET.key());
+        }
+      };
+    }
   }
 
   @Override
index 52c742ae386ad7392c7f284b0de94503e13f662b..09ac64cdabc0cc8b929015ac1f027df9ef272f48 100644 (file)
@@ -69,7 +69,12 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> {
     RuleNormalizer.RuleField.ACTIVE.key(),
     RuleNormalizer.RuleField.TEMPLATE.key(),
     RuleNormalizer.RuleField.INTERNAL_KEY.key(),
-    RuleNormalizer.RuleField.UPDATED_AT.key());
+    RuleNormalizer.RuleField.UPDATED_AT.key(),
+    RuleNormalizer.RuleField.DEBT_FUNCTION_TYPE.key(),
+    RuleNormalizer.RuleField.DEBT_FUNCTION_COEFFICIENT.key(),
+    RuleNormalizer.RuleField.DEBT_FUNCTION_OFFSET.key(),
+    RuleNormalizer.RuleField.SUB_CHARACTERISTIC.key());
+
 
   public RuleIndex(RuleNormalizer normalizer, WorkQueue workQueue, ESNode node) {
     super(new RuleIndexDefinition(), normalizer, workQueue, node);
index 8e232e736daa9866f51869bc39fe55da7a2bdb64..11dfa2fd83e0be1d8d44cbacab14a33715d60e92 100644 (file)
@@ -49,7 +49,10 @@ public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {
     UPDATED_AT("updatedAt"),
     PARAMS("params"),
     ACTIVE("active"),
-    DEBT_FUNCTION("debtRemFunction");
+    DEBT_FUNCTION_TYPE("debtFunction"),
+    DEBT_FUNCTION_COEFFICIENT("debtCoefficient"),
+    DEBT_FUNCTION_OFFSET("debtOffset"),
+    SUB_CHARACTERISTIC("subCharacteristicKey");
 
     private final String key;
 
@@ -118,7 +121,31 @@ public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {
       indexField(RuleField.LANGUAGE.key(), rule.getLanguage(), document);
       indexField(RuleField.INTERNAL_KEY.key(), rule.getConfigKey(), document);
       indexField(RuleField.TEMPLATE.key(), rule.getCardinality() == Cardinality.MULTIPLE, document);
-      indexField(RuleField.DEBT_FUNCTION.key(), rule.getDefaultRemediationFunction(),document);
+
+      //TODO Change on key when available
+      String subChar = null;
+      if(rule.getDefaultSubCharacteristicId() != null){
+        subChar = rule.getDefaultSubCharacteristicId().toString();
+      }
+      if(rule.getSubCharacteristicId() != null){
+        subChar = rule.getSubCharacteristicId().toString();
+      }
+      indexField(RuleField.SUB_CHARACTERISTIC.key(),subChar,document);
+
+      String dType = null, dCoefficient = null, dOffset = null;
+      if(rule.getDefaultRemediationFunction() != null){
+        dType = rule.getDefaultRemediationFunction();
+        dCoefficient = rule.getDefaultRemediationCoefficient();
+        dOffset= rule.getDefaultRemediationOffset();
+      }
+      if(rule.getRemediationFunction() != null){
+        dType = rule.getRemediationFunction();
+        dCoefficient = rule.getRemediationCoefficient();
+        dOffset= rule.getRemediationOffset();
+      }
+      indexField(RuleField.DEBT_FUNCTION_TYPE.key(), dType, document);
+      indexField(RuleField.DEBT_FUNCTION_COEFFICIENT.key(), dCoefficient, document);
+      indexField(RuleField.DEBT_FUNCTION_OFFSET.key(), dOffset, document);
 
 
 
index 03e72a143485c7f27c270c4bf2d466a3368df2f2..f6a423dd3f65abded40a2bb4b079312dec33e38e 100644 (file)
@@ -230,6 +230,16 @@ public class SearchAction implements RequestHandler {
         .prop("severity", rule.severity())
         .name("tags").beginArray().values(rule.tags()).endArray()
         .name("sysTags").beginArray().values(rule.systemTags()).endArray();
+      if(rule.debtSubCharacteristicKey() != null && !rule.debtSubCharacteristicKey().isEmpty()){
+        json
+          .prop("debtSubCharacteristicKey", rule.debtSubCharacteristicKey());
+      }
+      if(rule.debtRemediationFunction() != null){
+        json
+          .prop("debtRemediationFunctionType", rule.debtRemediationFunction().type().name())
+          .prop("debtRemediationFunctionCoefficient", rule.debtRemediationFunction().coefficient())
+          .prop("debtRemediationFunctionOffset", rule.debtRemediationFunction().offset());
+      }
       json.name("params").beginArray();
       for (RuleParam param : rule.params()) {
         json
index a29836ab080ec51c09afcdc48bb39703293e582d..33d537721cc7ad5cf1439107cbaeec6c302326ea 100644 (file)
@@ -46,7 +46,8 @@ import static org.fest.assertions.Assertions.assertThat;
 public class RuleIndexMediumTest {
 
   @ClassRule
-  public static ServerTester tester = new ServerTester();
+  public static ServerTester tester = new ServerTester()
+    .setProperty("sonar.es.http.port","9200");
 
   MyBatis myBatis = tester.get(MyBatis.class);
   RuleDao dao = tester.get(RuleDao.class);
@@ -64,6 +65,36 @@ public class RuleIndexMediumTest {
     dbSession.close();
   }
 
+  @Test
+  public void insert_rule() throws InterruptedException {
+    RuleDto ruleDto = newRuleDto(RuleKey.of("javascript", "S001"));
+    dao.insert(ruleDto, dbSession);
+    dbSession.commit();
+
+    index.refresh();
+
+
+    Rule rule = index.getByKey(RuleKey.of("javascript", "S001"));
+
+    System.out.println("rule = " + rule);
+
+    assertThat(rule.htmlDescription()).isEqualTo(ruleDto.getDescription());
+    assertThat(rule.key()).isEqualTo(ruleDto.getKey());
+//
+//    assertThat(rule.debtSubCharacteristicKey())
+//      .isEqualTo(ruleDto.getDefaultSubCharacteristicId().toString());
+    assertThat(rule.debtRemediationFunction().type().name())
+      .isEqualTo(ruleDto.getRemediationFunction());
+
+
+//
+//    assertThat(rule.tags()).containsExactly(ruleDto.getTags());
+//    assertThat(rule.systemTags()).containsExactly(ruleDto.getSystemTags());
+
+
+  }
+
+
   @Test
   public void facet_test_with_repository() {
     dao.insert(newRuleDto(RuleKey.of("javascript", "S001")).setRuleKey("X001"), dbSession);
@@ -392,6 +423,7 @@ public class RuleIndexMediumTest {
     assertThat(results.getHits()).hasSize(1);
   }
 
+
   private RuleDto newRuleDto(RuleKey ruleKey) {
     return new RuleDto()
       .setRuleKey(ruleKey.rule())
@@ -403,7 +435,7 @@ public class RuleIndexMediumTest {
       .setSeverity(Severity.INFO)
       .setCardinality(Cardinality.SINGLE)
       .setLanguage("js")
-      .setRemediationFunction("linear")
+      .setRemediationFunction("LINEAR")
       .setDefaultRemediationFunction("linear_offset")
       .setRemediationCoefficient("1h")
       .setDefaultRemediationCoefficient("5d")
index d416f30ec101ebc52af1952e0dc56352c55eb5d1..7b9f71ee79a901f65d7becda601600b48bea1079 100644 (file)
@@ -95,7 +95,6 @@ public class RulesWebServiceTest {
 
     MockUserSession.set();
     WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
-    System.out.println("request.toString() = " + request.toString());
 
     WsTester.Result result = request.execute();
 
@@ -117,6 +116,26 @@ public class RulesWebServiceTest {
     result.assertJson(this.getClass(),"search_2_rules.json");
   }
 
+
+  @Test
+  public void search_debt_rules() throws Exception {
+    ruleDao.insert(newRuleDto(RuleKey.of("javascript", "S001"))
+      .setDefaultRemediationCoefficient("DefaultCoef")
+      .setDefaultRemediationFunction("DefaultFunction")
+      .setDefaultRemediationCoefficient("DefaultCoef")
+      .setDefaultSubCharacteristicId(1), session);
+    session.commit();
+
+    tester.get(RuleService.class).refresh();
+
+    MockUserSession.set();
+    WsTester.TestRequest request = wsTester.newGetRequest("api/rules2", "search");
+    WsTester.Result result = request.execute();
+
+    result.assertJson(this.getClass(),"search_debt_rule.json");
+  }
+
+
   @Test
   public void search_active_rules() throws Exception {
     QualityProfileDto profile = newQualityProfile();
index f41ade2b7759482dfdc7fe59a2c23d9fac15679c..bae661386c0352d4a081c80663dce4bb4a4a651c 100644 (file)
@@ -1,4 +1,4 @@
-{"total": 2, "p":1,"ps":25, "rules": [
+{"total": 2, "p": 1, "ps": 25, "rules": [
     {
         "key": "javascript:S002",
         "repo": "javascript",
@@ -11,6 +11,9 @@
         "severity": "INFO",
         "tags": [],
         "sysTags": [],
+        "debtRemediationFunctionType": "LINEAR",
+        "debtRemediationFunctionCoefficient": "1h",
+        "debtRemediationFunctionOffset": "5min",
         "params": [],
         "actives": []
     },
@@ -26,6 +29,9 @@
         "severity": "INFO",
         "tags": [],
         "sysTags": [],
+        "debtRemediationFunctionType": "LINEAR",
+        "debtRemediationFunctionCoefficient": "1h",
+        "debtRemediationFunctionOffset": "5min",
         "params": [],
         "actives": []
     }
index fc63e918b39c7a1847459984416456c084730d6b..df474318c3118c3658508c7c4085076aad6f177f 100644 (file)
@@ -11,6 +11,9 @@
         "severity": "INFO",
         "tags": [],
         "sysTags": [],
+        "debtRemediationFunctionType": "LINEAR",
+        "debtRemediationFunctionCoefficient": "1h",
+        "debtRemediationFunctionOffset": "5min",
         "params": [],
         "actives": [
             {
index 853aac8c4d2f5c640ed144213dd6c24b5cd61636..dc72a0b1a7af7fb4d70e533ac25a162edbeb5abd 100644 (file)
@@ -11,6 +11,9 @@
         "severity": "INFO",
         "tags": [],
         "sysTags": [],
+        "debtRemediationFunctionType": "LINEAR",
+        "debtRemediationFunctionCoefficient": "1h",
+        "debtRemediationFunctionOffset": "5min",
         "params": [
             {
                 "key": "my_var",
diff --git a/sonar-server/src/test/resources/org/sonar/server/rule2/ws/RulesWebServiceTest/search_debt_rule.json b/sonar-server/src/test/resources/org/sonar/server/rule2/ws/RulesWebServiceTest/search_debt_rule.json
new file mode 100644 (file)
index 0000000..58ae5c9
--- /dev/null
@@ -0,0 +1,21 @@
+{"total": 1, "p": 1, "ps": 25, "rules": [
+    {
+        "key": "javascript:S001",
+        "repo": "javascript",
+        "lang": "js",
+        "name": "Rule S001",
+        "htmlDesc": "Description S001",
+        "status": "READY",
+        "template": false,
+        "internalKey": "InternalKeyS001",
+        "severity": "INFO",
+        "tags": [],
+        "sysTags": [],
+        "debtSubCharacteristicKey": "1",
+        "debtRemediationFunctionType": "LINEAR",
+        "debtRemediationFunctionCoefficient": "1h",
+        "debtRemediationFunctionOffset": "5min",
+        "params": [],
+        "actives": []
+    }
+]}