From 382dcdba96b3bf4a47108aafbebf0b2f721d902e Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Mon, 23 Mar 2015 15:55:18 +0100 Subject: [PATCH] SONAR-6275 Don't send measures that should not be persisted --- .../sonar/batch/report/MeasuresPublisher.java | 36 ++++++++++++++++--- .../batch/report/MeasuresPublisherTest.java | 24 +++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java b/sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java index 6a696d5d571..73ea6045304 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java +++ b/sonar-batch/src/main/java/org/sonar/batch/report/MeasuresPublisher.java @@ -19,14 +19,16 @@ */ 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 batchMeasures = measureCache.byResource(resource.resource()); + batchMeasures = Iterables.filter(batchMeasures, new Predicate() { + @Override + public boolean apply(Measure input) { + return shouldPersistMeasure(resource.resource(), input); + } + + }); Iterable reportMeasures = Iterables.transform(batchMeasures, new Function() { 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 dups) { builder.clear(); diff --git a/sonar-batch/src/test/java/org/sonar/batch/report/MeasuresPublisherTest.java b/sonar-batch/src/test/java/org/sonar/batch/report/MeasuresPublisherTest.java index ea8e3462afe..95e13d5e3c7 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/report/MeasuresPublisherTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/report/MeasuresPublisherTest.java @@ -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(); + } + } -- 2.39.5