]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6275 Don't send measures that should not be persisted
authorJulien HENRY <julien.henry@sonarsource.com>
Mon, 23 Mar 2015 14:55:18 +0000 (15:55 +0100)
committerJulien HENRY <julien.henry@sonarsource.com>
Mon, 23 Mar 2015 14:57:10 +0000 (15:57 +0100)
sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java
sonar-batch/src/test/java/org/sonar/batch/report/MeasuresPublisherTest.java

index 6a696d5d5715d497ed0253e60c54e878c43bfab0..73ea6045304fc42ac52a4218fd1db3746870f965 100644 (file)
  */
 package org.sonar.batch.report;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
+import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import org.sonar.api.batch.sensor.duplication.internal.DefaultDuplication;
-import org.sonar.api.measures.CoreMetrics;
-import org.sonar.api.measures.Measure;
+import org.sonar.api.measures.*;
 import org.sonar.api.measures.Metric.Level;
 import org.sonar.api.measures.Metric.ValueType;
-import org.sonar.api.measures.RuleMeasure;
+import org.sonar.api.resources.Resource;
+import org.sonar.api.resources.ResourceUtils;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rules.RulePriority;
 import org.sonar.api.technicaldebt.batch.Characteristic;
@@ -40,6 +42,8 @@ import org.sonar.batch.protocol.output.BatchReport;
 import org.sonar.batch.protocol.output.BatchReportWriter;
 import org.sonar.batch.scan.measure.MeasureCache;
 
+import javax.annotation.Nullable;
+
 import java.io.Serializable;
 import java.util.Arrays;
 
@@ -57,8 +61,15 @@ public class MeasuresPublisher implements ReportPublisher {
 
   @Override
   public void publish(BatchReportWriter writer) {
-    for (BatchResource resource : resourceCache.all()) {
+    for (final BatchResource resource : resourceCache.all()) {
       Iterable<Measure> batchMeasures = measureCache.byResource(resource.resource());
+      batchMeasures = Iterables.filter(batchMeasures, new Predicate<Measure>() {
+        @Override
+        public boolean apply(Measure input) {
+          return shouldPersistMeasure(resource.resource(), input);
+        }
+
+      });
       Iterable<org.sonar.batch.protocol.output.BatchReport.Measure> reportMeasures = Iterables.transform(batchMeasures, new Function<Measure, BatchReport.Measure>() {
         private BatchReport.Measure.Builder builder = BatchReport.Measure.newBuilder();
 
@@ -77,6 +88,23 @@ public class MeasuresPublisher implements ReportPublisher {
     }
   }
 
+  @VisibleForTesting
+  static boolean shouldPersistMeasure(@Nullable Resource resource, @Nullable Measure measure) {
+    if (resource == null || measure == null) {
+      return false;
+    }
+    return measure.getPersistenceMode().useDatabase() &&
+      !(ResourceUtils.isEntity(resource) && measure.isBestValue()) && isMeasureNotEmpty(measure);
+  }
+
+  private static boolean isMeasureNotEmpty(Measure measure) {
+    boolean isNotEmpty = false;
+    for (int i = 1; i <= 5; i++) {
+      isNotEmpty = isNotEmpty || measure.getVariation(i) != null;
+    }
+    return measure.getValue() != null || measure.getData() != null || isNotEmpty;
+  }
+
   private BatchReport.Measure toReportMeasure(BatchReport.Measure.Builder builder, Iterable<DefaultDuplication> dups) {
     builder.clear();
 
index ea8e3462afec8fee2673908a2a1a9c5c8dc4101c..95e13d5e3c72afec6510d446c835594272eb106a 100644 (file)
@@ -60,6 +60,7 @@ public class MeasuresPublisherTest {
   private MeasureCache measureCache;
   private DuplicationCache duplicationCache;
   private MeasuresPublisher publisher;
+  private org.sonar.api.resources.File aFile = org.sonar.api.resources.File.create("org/foo/Bar.java");
 
   private org.sonar.api.resources.Resource sampleFile;
 
@@ -160,4 +161,27 @@ public class MeasuresPublisherTest {
 
   }
 
+  @Test
+  public void should_not_save_some_file_measures_with_best_value() {
+    assertThat(MeasuresPublisher.shouldPersistMeasure(aFile, new Measure(CoreMetrics.LINES, 200.0))).isTrue();
+    assertThat(MeasuresPublisher.shouldPersistMeasure(aFile, new Measure(CoreMetrics.DUPLICATED_LINES_DENSITY, 3.0))).isTrue();
+
+    Measure duplicatedLines = new Measure(CoreMetrics.DUPLICATED_LINES_DENSITY, 0.0);
+    assertThat(MeasuresPublisher.shouldPersistMeasure(aFile, duplicatedLines)).isFalse();
+
+    duplicatedLines.setVariation1(0.0);
+    assertThat(MeasuresPublisher.shouldPersistMeasure(aFile, duplicatedLines)).isFalse();
+
+    duplicatedLines.setVariation1(-3.0);
+    assertThat(MeasuresPublisher.shouldPersistMeasure(aFile, duplicatedLines)).isTrue();
+  }
+
+  @Test
+  public void should_not_save_measures_without_data() {
+    assertThat(MeasuresPublisher.shouldPersistMeasure(aFile, new Measure(CoreMetrics.LINES))).isFalse();
+
+    Measure duplicatedLines = new Measure(CoreMetrics.DUPLICATED_LINES_DENSITY);
+    assertThat(MeasuresPublisher.shouldPersistMeasure(aFile, duplicatedLines)).isFalse();
+  }
+
 }