From d1f5fafa49554f2a194ac63242b7ceb6d52bd5ff Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Wed, 25 Mar 2015 14:06:26 +0100 Subject: [PATCH] SONAR-6257 Fail when measures report contains duplications_data measures --- .../computation/step/PersistMeasuresStep.java | 26 ++++++++++--------- .../PersistDuplicationMeasuresStepTest.java | 5 +++- .../step/PersistMeasuresStepTest.java | 15 ++++++++--- .../measure/persistence/MetricDaoTest.java | 23 ++++++++++++++++ .../MetricDaoTest/manual_metric.xml | 7 +++++ .../org/sonar/core/measure/db/MeasureDto.java | 6 +++-- .../org/sonar/core/measure/db/MetricDto.java | 22 +++++++++++----- 7 files changed, 78 insertions(+), 26 deletions(-) create mode 100644 server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MetricDaoTest/manual_metric.xml diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java index 1e775f705c3..dfcc18cf518 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistMeasuresStep.java @@ -21,8 +21,7 @@ package org.sonar.server.computation.step; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.collect.Lists; +import org.sonar.api.measures.CoreMetrics; import org.sonar.api.resources.Qualifiers; import org.sonar.api.rule.RuleKey; import org.sonar.batch.protocol.output.BatchReport; @@ -38,8 +37,15 @@ import javax.annotation.CheckForNull; import java.util.List; +import static com.google.common.collect.Lists.newArrayList; + public class PersistMeasuresStep implements ComputationStep { + /** + * List of metrics that should not be received from the report, as they should only by fed by the compute engine + */ + private static final List FORBIDDEN_METRIC_KEYS = newArrayList(CoreMetrics.DUPLICATIONS_DATA_KEY); + private final DbClient dbClient; private final RuleCache ruleCache; private final MetricCache metricCache; @@ -80,15 +86,11 @@ public class PersistMeasuresStep implements ComputationStep { } private void persistMeasures(DbSession dbSession, List batchReportMeasures, final BatchReport.Component component) { - List measures = Lists.transform(batchReportMeasures, new Function() { - @Override - public MeasureDto apply(BatchReport.Measure batchMeasure) { - return toMeasureDto(batchMeasure, component); + for (BatchReport.Measure measure : batchReportMeasures) { + if (FORBIDDEN_METRIC_KEYS.contains(measure.getMetricKey())) { + throw new IllegalStateException(String.format("Measures on metric '%s' cannot be send in the report", measure.getMetricKey())); } - }); - - for (MeasureDto measure : measures) { - dbClient.measureDao().insert(dbSession, measure); + dbClient.measureDao().insert(dbSession, toMeasureDto(measure, component)); } } @@ -133,9 +135,9 @@ public class PersistMeasuresStep implements ComputationStep { case BOOLEAN: return measure.hasBooleanValue() ? (measure.getBooleanValue() ? 1.0d : 0.0d) : null; case INT: - return measure.hasIntValue() ? Double.valueOf(measure.getIntValue()) : null; + return measure.hasIntValue() ? (double) measure.getIntValue() : null; case LONG: - return measure.hasLongValue() ? Double.valueOf(measure.getLongValue()) : null; + return measure.hasLongValue() ? (double) measure.getLongValue() : null; case DOUBLE: return measure.hasDoubleValue() ? measure.getDoubleValue() : null; default: diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDuplicationMeasuresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDuplicationMeasuresStepTest.java index 5699b186c49..c6772f5a912 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDuplicationMeasuresStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistDuplicationMeasuresStepTest.java @@ -326,7 +326,10 @@ public class PersistDuplicationMeasuresStepTest extends BaseStepTest { } private MetricDto saveDuplicationMetric(){ - MetricDto duplicationMetric = new MetricDto().setKey(CoreMetrics.DUPLICATIONS_DATA_KEY); + MetricDto duplicationMetric = new MetricDto().setKey(CoreMetrics.DUPLICATIONS_DATA_KEY) + .setOptimizedBestValue(false) + .setDeleteHistoricalData(false) + .setHidden(false); dbClient.metricDao().insert(session, duplicationMetric); session.commit(); return duplicationMetric; diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java index cba0cf1a85e..bca0758af1f 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java @@ -50,10 +50,7 @@ import java.util.Date; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; public class PersistMeasuresStepTest extends BaseStepTest { @@ -317,6 +314,16 @@ public class PersistMeasuresStepTest extends BaseStepTest { sut.toMeasureDto(measure, component); } + @Test(expected = IllegalStateException.class) + public void fail_when_forbid_metric() throws Exception { + BatchReport.Measure measure = BatchReport.Measure.newBuilder() + .setMetricKey("duplications_data") + .build(); + BatchReport.Component component = defaultComponent() + .build(); + sut.toMeasureDto(measure, component); + } + private MeasureDto expectedFullMeasure() { return new MeasureDto() .setComponentId(2L) diff --git a/server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MetricDaoTest.java b/server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MetricDaoTest.java index 52750ec126c..bae10570671 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MetricDaoTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/measure/persistence/MetricDaoTest.java @@ -82,6 +82,29 @@ public class MetricDaoTest { assertThat(result.isEnabled()).isFalse(); } + @Test + public void get_manual_metric() throws Exception { + dbTester.prepareDbUnit(getClass(), "manual_metric.xml"); + + MetricDto result = dao.selectByKey(session, "manual"); + assertThat(result.getId()).isEqualTo(1); + assertThat(result.getKey()).isEqualTo("manual"); + assertThat(result.getShortName()).isEqualTo("Manual metric"); + assertThat(result.getDescription()).isEqualTo("Manual metric"); + assertThat(result.getDomain()).isNullOrEmpty(); + assertThat(result.getValueType()).isEqualTo("INT"); + assertThat(result.getOrigin()).isEqualTo("GUI"); + assertThat(result.getDirection()).isEqualTo(0); + assertThat(result.isQualitative()).isFalse(); + assertThat(result.isUserManaged()).isTrue(); + assertThat(result.getWorstValue()).isNull(); + assertThat(result.getBestValue()).isNull(); + assertThat(result.isOptimizedBestValue()).isNull(); + assertThat(result.isDeleteHistoricalData()).isNull(); + assertThat(result.isHidden()).isNull(); + assertThat(result.isEnabled()).isTrue(); + } + @Test public void find_all_enabled() throws Exception { dbTester.prepareDbUnit(getClass(), "shared.xml"); diff --git a/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MetricDaoTest/manual_metric.xml b/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MetricDaoTest/manual_metric.xml new file mode 100644 index 00000000000..630722c4d75 --- /dev/null +++ b/server/sonar-server/src/test/resources/org/sonar/server/measure/persistence/MetricDaoTest/manual_metric.xml @@ -0,0 +1,7 @@ + + + diff --git a/sonar-core/src/main/java/org/sonar/core/measure/db/MeasureDto.java b/sonar-core/src/main/java/org/sonar/core/measure/db/MeasureDto.java index 3cd361bcbad..e037b59ede7 100644 --- a/sonar-core/src/main/java/org/sonar/core/measure/db/MeasureDto.java +++ b/sonar-core/src/main/java/org/sonar/core/measure/db/MeasureDto.java @@ -204,11 +204,12 @@ public class MeasureDto { return this; } + @CheckForNull public Integer getRuleId() { return ruleId; } - public MeasureDto setRuleId(Integer ruleId) { + public MeasureDto setRuleId(@Nullable Integer ruleId) { this.ruleId = ruleId; return this; } @@ -222,11 +223,12 @@ public class MeasureDto { return this; } + @CheckForNull public Integer getPersonId() { return personId; } - public MeasureDto setPersonId(Integer personId) { + public MeasureDto setPersonId(@Nullable Integer personId) { this.personId = personId; return this; } diff --git a/sonar-core/src/main/java/org/sonar/core/measure/db/MetricDto.java b/sonar-core/src/main/java/org/sonar/core/measure/db/MetricDto.java index fa38fd1222e..e23be8104a5 100644 --- a/sonar-core/src/main/java/org/sonar/core/measure/db/MetricDto.java +++ b/sonar-core/src/main/java/org/sonar/core/measure/db/MetricDto.java @@ -47,13 +47,13 @@ public class MetricDto { private Double bestValue; - private boolean optimizedBestValue; + private Boolean optimizedBestValue; private String origin; - private boolean hidden; + private Boolean hidden; - private boolean deleteHistoricalData; + private Boolean deleteHistoricalData; private boolean enabled; @@ -184,20 +184,28 @@ public class MetricDto { return this; } - public boolean isHidden() { + /** + * @return null for manual metrics + */ + @CheckForNull + public Boolean isHidden() { return hidden; } - public MetricDto setHidden(boolean hidden) { + public MetricDto setHidden(@Nullable Boolean hidden) { this.hidden = hidden; return this; } - public boolean isDeleteHistoricalData() { + /** + * @return null for manual metrics + */ + @CheckForNull + public Boolean isDeleteHistoricalData() { return deleteHistoricalData; } - public MetricDto setDeleteHistoricalData(boolean deleteHistoricalData) { + public MetricDto setDeleteHistoricalData(@Nullable Boolean deleteHistoricalData) { this.deleteHistoricalData = deleteHistoricalData; return this; } -- 2.39.5