From 32428f49443f18796d73237b892117e171c1f5af Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Tue, 1 Sep 2015 16:30:44 +0200 Subject: [PATCH] SONAR-6730 Add boolean measure --- .../api/MeasureComputerContextImpl.java | 7 +++++++ .../computation/measure/api/MeasureImpl.java | 9 ++++++++- .../api/MeasureComputerContextImplTest.java | 15 ++++++++++++++- .../measure/api/MeasureImplTest.java | 19 +++++++++++++++++-- .../org/sonar/api/ce/measure/Measure.java | 15 +++++++++++---- .../sonar/api/ce/measure/MeasureComputer.java | 8 ++++++++ .../api/ce/measure/test/TestMeasure.java | 13 +++++++++++++ .../test/TestMeasureComputerContext.java | 11 +++++++++++ .../test/TestMeasureComputerContextTest.java | 7 +++++++ .../api/ce/measure/test/TestMeasureTest.java | 13 +++++++++++++ 10 files changed, 109 insertions(+), 8 deletions(-) diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerContextImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerContextImpl.java index 434e18d1185..13d3a9a4578 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerContextImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerContextImpl.java @@ -168,6 +168,13 @@ public class MeasureComputerContextImpl implements MeasureComputerContext { measureRepository.add(internalComponent, metric, newMeasureBuilder().create(value)); } + @Override + public void addMeasure(String metricKey, boolean value) { + Metric metric = metricRepository.getByKey(metricKey); + validateAddMeasure(metric); + measureRepository.add(internalComponent, metric, newMeasureBuilder().create(value)); + } + private void validateInputMetric(String metric) { checkArgument(allowedMetrics.contains(metric), "Only metrics in %s can be used to load measures", definition.getInputMetrics()); } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureImpl.java index 285a05ab68e..5d0371d3f41 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureImpl.java @@ -28,6 +28,7 @@ import org.sonar.api.ce.measure.Measure; import static com.google.common.base.Preconditions.checkState; import static java.util.Objects.requireNonNull; +import static org.sonar.server.computation.measure.Measure.ValueType.BOOLEAN; import static org.sonar.server.computation.measure.Measure.ValueType.DOUBLE; import static org.sonar.server.computation.measure.Measure.ValueType.INT; import static org.sonar.server.computation.measure.Measure.ValueType.LONG; @@ -36,7 +37,7 @@ import static org.sonar.server.computation.measure.Measure.ValueType.STRING; @Immutable public class MeasureImpl implements Measure { - private static final Set ALLOWED_VALUE_TYPES = ImmutableSet.of(INT, LONG, DOUBLE, STRING); + private static final Set ALLOWED_VALUE_TYPES = ImmutableSet.of(INT, LONG, DOUBLE, STRING, BOOLEAN); private final org.sonar.server.computation.measure.Measure measure; @@ -69,6 +70,12 @@ public class MeasureImpl implements Measure { return measure.getStringValue(); } + @Override + public boolean getBooleanValue() { + checkValueType(BOOLEAN); + return measure.getBooleanValue(); + } + private void checkValueType(org.sonar.server.computation.measure.Measure.ValueType expected) { checkState(measure.getValueType() == expected, String.format( "Value can not be converted to %s because current value type is a %s", diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerContextImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerContextImplTest.java index 74c2cd64b3a..683324ed989 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerContextImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerContextImplTest.java @@ -60,6 +60,7 @@ public class MeasureComputerContextImplTest { private static final String DOUBLE_METRIC_KEY = "double_metric_key"; private static final String LONG_METRIC_KEY = "long_metric_key"; private static final String STRING_METRIC_KEY = "string_metric_key"; + private static final String BOOLEAN_METRIC_KEY = "boolean_metric_key"; private static final int PROJECT_REF = 1; private static final int FILE_1_REF = 12341; @@ -84,7 +85,9 @@ public class MeasureComputerContextImplTest { .add(new MetricImpl(2, INT_METRIC_KEY, "int metric", Metric.MetricType.INT)) .add(new MetricImpl(3, DOUBLE_METRIC_KEY, "double metric", Metric.MetricType.FLOAT)) .add(new MetricImpl(4, LONG_METRIC_KEY, "long metric", Metric.MetricType.MILLISEC)) - .add(new MetricImpl(5, STRING_METRIC_KEY, "string metric", Metric.MetricType.STRING)); + .add(new MetricImpl(5, STRING_METRIC_KEY, "string metric", Metric.MetricType.STRING)) + .add(new MetricImpl(6, BOOLEAN_METRIC_KEY, "boolean metric", Metric.MetricType.BOOL)) + ; @Rule public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); @@ -216,6 +219,16 @@ public class MeasureComputerContextImplTest { assertThat(measure.get().getStringValue()).isEqualTo("data"); } + @Test + public void add_boolean_measure_create_measure_of_type_boolean_with_right_value() throws Exception { + MeasureComputerContextImpl underTest = newContext(PROJECT_REF, NCLOC_KEY, BOOLEAN_METRIC_KEY); + underTest.addMeasure(BOOLEAN_METRIC_KEY, true); + + Optional measure = measureRepository.getAddedRawMeasure(PROJECT_REF, BOOLEAN_METRIC_KEY); + assertThat(measure).isPresent(); + assertThat(measure.get().getBooleanValue()).isTrue(); + } + @Test public void fail_with_IAE_when_add_measure_is_called_on_metric_not_in_output_list() throws Exception { thrown.expect(IllegalArgumentException.class); diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureImplTest.java index cd7d24d690f..c6b11e3fdbd 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureImplTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureImplTest.java @@ -92,10 +92,25 @@ public class MeasureImplTest { measure.getStringValue(); } + @Test + public void get_boolean_value() throws Exception { + MeasureImpl measure = new MeasureImpl(Measure.newMeasureBuilder().create(true)); + assertThat(measure.getBooleanValue()).isTrue(); + } + + @Test + public void fail_with_ISE_when_not_boolean_value() throws Exception { + thrown.expect(IllegalStateException.class); + thrown.expectMessage("Value can not be converted to boolean because current value type is a DOUBLE"); + + MeasureImpl measure = new MeasureImpl(Measure.newMeasureBuilder().create(1d)); + measure.getBooleanValue(); + } + @Test public void fail_with_ISE_when_creating_measure_with_no_value() throws Exception { thrown.expect(IllegalStateException.class); - thrown.expectMessage("Only following types are allowed [INT, LONG, DOUBLE, STRING]"); + thrown.expectMessage("Only following types are allowed [INT, LONG, DOUBLE, STRING, BOOLEAN]"); new MeasureImpl(Measure.newMeasureBuilder().createNoValue()); } @@ -103,7 +118,7 @@ public class MeasureImplTest { @Test public void fail_with_ISE_when_creating_measure_with_not_allowed_value() throws Exception { thrown.expect(IllegalStateException.class); - thrown.expectMessage("Only following types are allowed [INT, LONG, DOUBLE, STRING]"); + thrown.expectMessage("Only following types are allowed [INT, LONG, DOUBLE, STRING, BOOLEAN]"); new MeasureImpl(Measure.newMeasureBuilder().create(Measure.Level.ERROR)); } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/Measure.java b/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/Measure.java index 948f33eee6c..dc53a428d3f 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/Measure.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/Measure.java @@ -30,29 +30,36 @@ public interface Measure { /** * The value of this measure as a integer. * - * @throws IllegalStateException if the value type of the metric is not a integer {see @link org.sonar.api.measures.Metric.ValueType} + * @throws IllegalStateException if the value type of the metric is not a integer. See {@link org.sonar.api.measures.Metric.ValueType} */ int getIntValue(); /** * The value of this measure as a long. * - * @throws IllegalStateException if the value type of the metric is not a long {see @link org.sonar.api.measures.Metric.ValueType} + * @throws IllegalStateException if the value type of the metric is not a long. See {@link org.sonar.api.measures.Metric.ValueType} */ long getLongValue(); /** * The value of this measure as a double. * - * @throws IllegalStateException if the value type of the metric is not a double {see @link org.sonar.api.measures.Metric.ValueType} + * @throws IllegalStateException if the value type of the metric is not a double. See {@link org.sonar.api.measures.Metric.ValueType} */ double getDoubleValue(); /** * The value of this measure as a string. * - * @throws IllegalStateException if the value type of the metric is not a string {see @link org.sonar.api.measures.Metric.ValueType} + * @throws IllegalStateException if the value type of the metric is not a string. See {@link org.sonar.api.measures.Metric.ValueType} */ String getStringValue(); + /** + * The value of this measure as a boolean. + * + * @throws IllegalStateException if the value type of the metric is not a boolean. See {@link org.sonar.api.measures.Metric.ValueType} + */ + boolean getBooleanValue(); + } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/MeasureComputer.java b/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/MeasureComputer.java index 76a8dfa5c96..df3e4f2ce37 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/MeasureComputer.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/MeasureComputer.java @@ -212,6 +212,14 @@ public interface MeasureComputer { */ void addMeasure(String metric, String value); + /** + * Add a new measure of a given metric which measure type will be boolean + * + * @throws IllegalArgumentException if the metric is not listed in {@link MeasureComputerDefinition#getOutputMetrics()} + * @throws UnsupportedOperationException if a measure for the specified metric already exists for the current component + */ + void addMeasure(String metric, boolean value); + /** * Return list of all issues (open, closed, etc.) of current component. */ diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasure.java b/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasure.java index fbe8bc90679..b74eda4aee0 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasure.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasure.java @@ -33,6 +33,7 @@ public class TestMeasure implements Measure { private Long longValue; private Double doubleValue; private String stringValue; + private Boolean booleanValue; public static TestMeasure createMeasure(double doubleValue){ TestMeasure measure = new TestMeasure(); @@ -58,6 +59,12 @@ public class TestMeasure implements Measure { return measure; } + public static TestMeasure createMeasure(boolean booleanValue) { + TestMeasure measure = new TestMeasure(); + measure.booleanValue = requireNonNull(booleanValue, "Value cannot be null"); + return measure; + } + @Override public int getIntValue() { checkState(intValue != null, "Not an integer measure"); @@ -81,4 +88,10 @@ public class TestMeasure implements Measure { checkState(stringValue != null, "Not a string measure"); return stringValue; } + + @Override + public boolean getBooleanValue() { + checkState(booleanValue != null, "Not a boolean measure"); + return booleanValue; + } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasureComputerContext.java b/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasureComputerContext.java index 55ed0218b99..9a0aac70bc4 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasureComputerContext.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasureComputerContext.java @@ -131,6 +131,17 @@ public class TestMeasureComputerContext implements MeasureComputerContext { componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value)); } + @Override + public void addMeasure(String metricKey, boolean value) { + validateAddMeasure(metricKey); + componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value)); + } + + + public void addInputMeasure(String metricKey, boolean value) { + componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value)); + } + public void addInputMeasure(String metricKey, String value) { componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value)); } diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureComputerContextTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureComputerContextTest.java index 8ad7b6730b0..ea3cda844a6 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureComputerContextTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureComputerContextTest.java @@ -91,6 +91,13 @@ public class TestMeasureComputerContextTest { assertThat(underTest.getMeasure(INPUT_METRIC).getStringValue()).isEqualTo("text"); } + @Test + public void get_boolean_measure() throws Exception { + underTest.addInputMeasure(INPUT_METRIC, true); + + assertThat(underTest.getMeasure(INPUT_METRIC).getBooleanValue()).isTrue(); + } + @Test public void fail_with_IAE_when_trying_to_get_measure_on_unknown_metric() throws Exception { thrown.expect(IllegalArgumentException.class); diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureTest.java index fb54b4ba8f1..b1786bdd143 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureTest.java @@ -51,6 +51,11 @@ public class TestMeasureTest { assertThat(TestMeasure.createMeasure("value").getStringValue()).isEqualTo("value"); } + @Test + public void create_boolean_measure() throws Exception { + assertThat(TestMeasure.createMeasure(true).getBooleanValue()).isTrue(); + } + @Test public void getDoubleValue_fails_with_ISE_when_not_a_double() throws Exception { thrown.expect(IllegalStateException.class); @@ -82,4 +87,12 @@ public class TestMeasureTest { TestMeasure.createMeasure(10).getStringValue(); } + + @Test + public void getBooleanValue_fails_with_ISE_when_not_a_boolean() throws Exception { + thrown.expect(IllegalStateException.class); + thrown.expectMessage("Not a boolean measure"); + + TestMeasure.createMeasure(10).getBooleanValue(); + } } -- 2.39.5