]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5319 Return SQALE Rating and SQALE Debt ratio in /api/component/app WS
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 21 Jul 2014 13:54:06 +0000 (15:54 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 21 Jul 2014 14:00:41 +0000 (16:00 +0200)
server/sonar-server/src/main/java/org/sonar/server/component/ws/ComponentAppAction.java
server/sonar-server/src/main/resources/org/sonar/server/component/ws/components-example-app.json
server/sonar-server/src/test/java/org/sonar/server/component/ws/ComponentAppActionTest.java
server/sonar-server/src/test/resources/org/sonar/server/component/ws/ComponentAppActionTest/app_with_measures.json
server/sonar-server/src/test/resources/org/sonar/server/component/ws/ComponentAppActionTest/app_with_measures_when_period_is_set.json
sonar-batch/src/main/java/org/sonar/batch/debt/SqaleRatingDecorator.java
sonar-batch/src/test/java/org/sonar/batch/debt/SqaleRatingDecoratorTest.java
sonar-plugin-api/src/main/java/org/sonar/api/measures/CoreMetrics.java

index e73451be671b8bf990ab7ce6dfa7923186c08884..f853ce266527878a925b994b8fa8767724ac3abb 100644 (file)
@@ -211,11 +211,13 @@ public class ComponentAppAction implements RequestHandler {
   private void appendMeasures(JsonWriter json, Map<String, MeasureDto> measuresByMetricKey, Multiset<String> severitiesAggregation, Integer periodIndex) {
     json.name("measures").beginObject();
 
-    json.prop("fNcloc", formatMeasure(measuresByMetricKey.get(CoreMetrics.NCLOC_KEY), periodIndex));
-    json.prop("fCoverage", formatMeasure(measuresByMetricKey.get(CoreMetrics.COVERAGE_KEY), periodIndex));
-    json.prop("fDuplicationDensity", formatMeasure(measuresByMetricKey.get(CoreMetrics.DUPLICATED_LINES_DENSITY_KEY), periodIndex));
-    json.prop("fDebt", formatMeasure(measuresByMetricKey.get(CoreMetrics.TECHNICAL_DEBT_KEY), periodIndex));
-    json.prop("fTests", formatMeasure(measuresByMetricKey.get(CoreMetrics.TESTS_KEY), periodIndex));
+    json.prop("fNcloc", formatMeasureOrVariation(measuresByMetricKey.get(CoreMetrics.NCLOC_KEY), periodIndex));
+    json.prop("fCoverage", formatMeasureOrVariation(measuresByMetricKey.get(CoreMetrics.COVERAGE_KEY), periodIndex));
+    json.prop("fDuplicationDensity", formatMeasureOrVariation(measuresByMetricKey.get(CoreMetrics.DUPLICATED_LINES_DENSITY_KEY), periodIndex));
+    json.prop("fDebt", formatMeasureOrVariation(measuresByMetricKey.get(CoreMetrics.TECHNICAL_DEBT_KEY), periodIndex));
+    json.prop("fSqaleRating", formatMeasureOrVariation(measuresByMetricKey.get(CoreMetrics.SQALE_RATING_KEY), periodIndex));
+    json.prop("fSqaleDebtRatio", formatMeasureOrVariation(measuresByMetricKey.get(CoreMetrics.SQALE_DEBT_RATIO_KEY), periodIndex));
+    json.prop("fTests", formatMeasureOrVariation(measuresByMetricKey.get(CoreMetrics.TESTS_KEY), periodIndex));
 
     json.prop("fIssues", i18n.formatInteger(UserSession.get().locale(), severitiesAggregation.size()));
     for (String severity : severitiesAggregation.elementSet()) {
@@ -268,7 +270,7 @@ public class ComponentAppAction implements RequestHandler {
         json.beginObject()
           .prop("key", manualRule.key().toString())
           .prop("name", manualRule.name())
-        .endObject();
+          .endObject();
       }
       json.endArray();
     }
@@ -334,7 +336,7 @@ public class ComponentAppAction implements RequestHandler {
     for (MeasureDto measureDto : dbClient.measureDao().findByComponentKeyAndMetricKeys(fileKey,
       newArrayList(CoreMetrics.NCLOC_KEY, CoreMetrics.COVERAGE_KEY,
         CoreMetrics.DUPLICATED_LINES_KEY, CoreMetrics.DUPLICATED_LINES_DENSITY_KEY, CoreMetrics.TECHNICAL_DEBT_KEY, CoreMetrics.TESTS_KEY,
-        CoreMetrics.SCM_AUTHORS_BY_LINE_KEY),
+        CoreMetrics.SCM_AUTHORS_BY_LINE_KEY, CoreMetrics.SQALE_RATING_KEY, CoreMetrics.SQALE_DEBT_RATIO_KEY),
       session)) {
       measuresByMetricKey.put(measureDto.getKey().metricKey(), measureDto);
     }
@@ -368,51 +370,58 @@ public class ComponentAppAction implements RequestHandler {
   }
 
   @CheckForNull
-  private String formatMeasure(@Nullable MeasureDto measure, @Nullable Integer periodIndex) {
-    if (measure != null) {
-      Metric metric = CoreMetrics.getMetric(measure.getKey().metricKey());
-      if (periodIndex == null) {
-        Double value = measure.getValue();
-        if (value != null) {
-          return formatValue(value, metric.getType());
-        }
-      } else {
-        Double variation = measure.getVariation(periodIndex);
-        if (variation != null) {
-          return formatVariation(variation, metric.getType());
-        }
-      }
+  private String formatMeasureOrVariation(@Nullable MeasureDto measure, @Nullable Integer periodIndex) {
+    if (periodIndex == null) {
+      return formatMeasure(measure);
+    } else {
+      return formatVariation(measure, periodIndex);
     }
-    return null;
   }
 
   @CheckForNull
-  private String formatValue(Double value, Metric.ValueType metricType) {
-    if (metricType.equals(Metric.ValueType.FLOAT)) {
-      return i18n.formatDouble(UserSession.get().locale(), value);
-    }
-    if (metricType.equals(Metric.ValueType.INT)) {
-      return i18n.formatInteger(UserSession.get().locale(), value.intValue());
-    }
-    if (metricType.equals(Metric.ValueType.PERCENT)) {
-      return i18n.formatDouble(UserSession.get().locale(), value) + "%";
-    }
-    if (metricType.equals(Metric.ValueType.WORK_DUR)) {
-      return durations.format(UserSession.get().locale(), durations.create(value.longValue()), Durations.DurationFormat.SHORT);
+  private String formatMeasure(@Nullable MeasureDto measure) {
+    if (measure != null) {
+      Metric metric = CoreMetrics.getMetric(measure.getKey().metricKey());
+      Metric.ValueType metricType = metric.getType();
+      Double value = measure.getValue();
+      String data = measure.getData();
+
+      if (metricType.equals(Metric.ValueType.FLOAT) && value != null) {
+        return i18n.formatDouble(UserSession.get().locale(), value);
+      }
+      if (metricType.equals(Metric.ValueType.INT) && value != null) {
+        return i18n.formatInteger(UserSession.get().locale(), value.intValue());
+      }
+      if (metricType.equals(Metric.ValueType.PERCENT) && value != null) {
+        return i18n.formatDouble(UserSession.get().locale(), value) + "%";
+      }
+      if (metricType.equals(Metric.ValueType.WORK_DUR) && value != null) {
+        return durations.format(UserSession.get().locale(), durations.create(value.longValue()), Durations.DurationFormat.SHORT);
+      }
+      if ((metricType.equals(Metric.ValueType.STRING) || metricType.equals(Metric.ValueType.RATING)) && data != null) {
+        return data;
+      }
     }
     return null;
   }
 
   @CheckForNull
-  private String formatVariation(Double value, Metric.ValueType metricType) {
-    if (metricType.equals(Metric.ValueType.FLOAT) || metricType.equals(Metric.ValueType.PERCENT)) {
-      return i18n.formatDouble(UserSession.get().locale(), value);
-    }
-    if (metricType.equals(Metric.ValueType.INT)) {
-      return i18n.formatInteger(UserSession.get().locale(), value.intValue());
-    }
-    if (metricType.equals(Metric.ValueType.WORK_DUR)) {
-      return durations.format(UserSession.get().locale(), durations.create(value.longValue()), Durations.DurationFormat.SHORT);
+  private String formatVariation(@Nullable MeasureDto measure, Integer periodIndex) {
+    if (measure != null) {
+      Double variation = measure.getVariation(periodIndex);
+      if (variation != null) {
+        Metric metric = CoreMetrics.getMetric(measure.getKey().metricKey());
+        Metric.ValueType metricType = metric.getType();
+        if (metricType.equals(Metric.ValueType.FLOAT) || metricType.equals(Metric.ValueType.PERCENT)) {
+          return i18n.formatDouble(UserSession.get().locale(), variation);
+        }
+        if (metricType.equals(Metric.ValueType.INT)) {
+          return i18n.formatInteger(UserSession.get().locale(), variation.intValue());
+        }
+        if (metricType.equals(Metric.ValueType.WORK_DUR)) {
+          return durations.format(UserSession.get().locale(), durations.create(variation.longValue()), Durations.DurationFormat.SHORT);
+        }
+      }
     }
     return null;
   }
index a04bad19e9d90b5939650ec8f581513c5bfa3844..8070e3d3df2e2a06a8d25087a5a558e57454ab01 100644 (file)
     "fNcloc": "12",
     "fDebt": "4h",
     "fIssues": "4",
-    "fInfoIssues": "4"
+    "fInfoIssues": "4",
+    "fDuplicationDensity": "1.2",
+    "fSqaleRating" : "C",
+    "fSqaleDebtRatio" : "35.0%"
   },
   "extensions": [
     ["metricsTab", "Metrics"]
index 9a0f822eef35b2240344cffc873e27cc735ef2dc..25ee502d97a49c460f5c7253507dea662aa1308e 100644 (file)
@@ -206,6 +206,8 @@ public class ComponentAppActionTest {
     addMeasure(CoreMetrics.NCLOC_KEY, 200);
     addMeasure(CoreMetrics.COVERAGE_KEY, 95.4);
     addMeasure(CoreMetrics.DUPLICATED_LINES_DENSITY_KEY, 7.4);
+    addMeasure(CoreMetrics.SQALE_RATING_KEY, "C");
+    addMeasure(CoreMetrics.SQALE_DEBT_RATIO_KEY, 35d);
 
     measures.add(MeasureDto.createFor(MeasureKey.of(COMPONENT_KEY, CoreMetrics.TECHNICAL_DEBT_KEY)).setValue(182.0));
     when(durations.format(any(Locale.class), any(Duration.class), eq(Durations.DurationFormat.SHORT))).thenReturn("3h 2min");
@@ -227,6 +229,7 @@ public class ComponentAppActionTest {
     addVariationMeasure(CoreMetrics.NCLOC_KEY, 2, 1);
     addVariationMeasure(CoreMetrics.COVERAGE_KEY, 5d, 1);
     addVariationMeasure(CoreMetrics.DUPLICATED_LINES_DENSITY_KEY, 1.2, 1);
+    addVariationMeasure(CoreMetrics.SQALE_DEBT_RATIO_KEY, 5d, 1);
 
     measures.add(MeasureDto.createFor(MeasureKey.of(COMPONENT_KEY, CoreMetrics.TECHNICAL_DEBT_KEY)).setVariation(1, 10.0));
     when(durations.format(any(Locale.class), any(Duration.class), eq(Durations.DurationFormat.SHORT))).thenReturn("10min");
@@ -463,6 +466,10 @@ public class ComponentAppActionTest {
     when(i18n.formatDouble(any(Locale.class), eq(value))).thenReturn(Double.toString(value));
   }
 
+  private void addMeasure(String metricKey, String value) {
+    measures.add(MeasureDto.createFor(MeasureKey.of(COMPONENT_KEY, metricKey)).setTextValue(value));
+  }
+
   private void addVariationMeasure(String metricKey, Integer value, Integer periodIndex) {
     measures.add(MeasureDto.createFor(MeasureKey.of(COMPONENT_KEY, metricKey)).setVariation(periodIndex, value.doubleValue()));
     when(i18n.formatInteger(any(Locale.class), eq(value))).thenReturn(Integer.toString(value));
index 8f26dd9621c1c381db8b2deb406b9e9871f59d5f..e9d2d29c52febdb2d746b0cb3249b137c1861404 100644 (file)
@@ -19,7 +19,9 @@
     "fNcloc": "200",
     "fCoverage": "95.4%",
     "fDuplicationDensity": "7.4%",
-    "fDebt": "3h 2min"
+    "fDebt": "3h 2min",
+    "fSqaleRating" : "C",
+    "fSqaleDebtRatio" : "35.0%"
   },
   "tabs": [
     "coverage"
index cce534b0462d1d69e9252eaf0d1b99e53c90085e..41501a758ab36dd487cc7e1f9186bbd0b06abf4f 100644 (file)
@@ -21,7 +21,8 @@
     "fNcloc": "2",
     "fCoverage": "5.0",
     "fDuplicationDensity": "1.2",
-    "fDebt": "10min"
+    "fDebt": "10min",
+    "fSqaleDebtRatio" : "5.0"
   },
   "tabs": [
     "coverage"
index 458b1d27eb0d839390765d5d2b3b607e6516cd63..41b2af1fafadd728521aa105b0b4c5b25bfaeba9 100644 (file)
@@ -76,7 +76,7 @@ public final class SqaleRatingDecorator implements Decorator {
 
   @DependedUpon
   public List<Metric> generatesMetrics() {
-    return Lists.<Metric>newArrayList(CoreMetrics.RATING, CoreMetrics.DEVELOPMENT_COST, CoreMetrics.SQALE_DEBT_RATIO);
+    return Lists.<Metric>newArrayList(CoreMetrics.SQALE_RATING, CoreMetrics.DEVELOPMENT_COST, CoreMetrics.SQALE_DEBT_RATIO);
   }
 
   public void decorate(Resource resource, DecoratorContext context) {
@@ -94,7 +94,7 @@ public final class SqaleRatingDecorator implements Decorator {
   }
 
   private Measure createRatingMeasure(int rating) {
-    return new Measure(CoreMetrics.RATING).setIntValue(rating).setData(toRatingLetter(rating));
+    return new Measure(CoreMetrics.SQALE_RATING).setIntValue(rating).setData(toRatingLetter(rating));
   }
 
   static String toRatingLetter(@Nullable Integer rating) {
index 48a58f4a0508f91f303bbde50569017b3367e16d..1b1840a84439ccb299fa92dd9ab1649b27a1e60e 100644 (file)
@@ -119,7 +119,7 @@ public class SqaleRatingDecoratorTest {
     when(context.getMeasure(CoreMetrics.TECHNICAL_DEBT)).thenReturn(new Measure(CoreMetrics.TECHNICAL_DEBT, 300.0 * ONE_DAY_IN_MINUTES));
 
     decorator.decorate(file, context);
-    verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.RATING, 3.0)));
+    verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.SQALE_RATING, 3.0)));
     verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.DEVELOPMENT_COST, "9600")));
     verify(context).saveMeasure(CoreMetrics.SQALE_DEBT_RATIO, 1500d);
 
@@ -137,7 +137,7 @@ public class SqaleRatingDecoratorTest {
     when(context.getMeasure(CoreMetrics.TECHNICAL_DEBT)).thenReturn(new Measure(CoreMetrics.TECHNICAL_DEBT, 0.0));
 
     decorator.decorate(file, context);
-    verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.RATING, 1.0)));
+    verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.SQALE_RATING, 1.0)));
     verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.DEVELOPMENT_COST, "9600")));
     verify(context).saveMeasure(CoreMetrics.SQALE_DEBT_RATIO, 0d);
 
@@ -155,7 +155,7 @@ public class SqaleRatingDecoratorTest {
     when(context.getMeasure(CoreMetrics.TECHNICAL_DEBT)).thenReturn(new Measure(CoreMetrics.TECHNICAL_DEBT, 960000.0));
 
     decorator.decorate(file, context);
-    verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.RATING, 5.0)));
+    verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.SQALE_RATING, 5.0)));
     verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.DEVELOPMENT_COST, "9600")));
     verify(context).saveMeasure(CoreMetrics.SQALE_DEBT_RATIO, 10000d);
 
@@ -171,7 +171,7 @@ public class SqaleRatingDecoratorTest {
     when(context.getChildrenMeasures(CoreMetrics.DEVELOPMENT_COST)).thenReturn(newArrayList(new Measure(CoreMetrics.DEVELOPMENT_COST, Double.toString(20.0 * ONE_DAY_IN_MINUTES))));
 
     decorator.decorate(mock(File.class), context);
-    verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.RATING, 3.0)));
+    verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.SQALE_RATING, 3.0)));
     verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.DEVELOPMENT_COST, "9600")));
     verify(context).saveMeasure(CoreMetrics.SQALE_DEBT_RATIO, 1500d);
 
index 2545bd0699ae4d60bb63596fa57d0bd44a096338..dc72077af4145d83e2b989584fb2bcdf1aaeeac1 100644 (file)
@@ -2130,7 +2130,7 @@ public final class CoreMetrics {
   /**
    * @since 4.5
    */
-  public static final Metric<String> RATING = new Metric.Builder(SQALE_RATING_KEY, "SQALE Rating", Metric.ValueType.RATING)
+  public static final Metric<String> SQALE_RATING = new Metric.Builder(SQALE_RATING_KEY, "SQALE Rating", Metric.ValueType.RATING)
     .setDomain(DOMAIN_TECHNICAL_DEBT)
     .setDirection(Metric.DIRECTION_WORST)
     .setQualitative(true)