Interface MeasureComputer


  • @ComputeEngineSide
    @ExtensionPoint
    public interface MeasureComputer
    Define how to compute new measures on some metrics declared by Metrics.

    This interface replaces the deprecated class org.sonar.api.batch.Decorator.

    How to use

     public class MyMeasureComputer implements MeasureComputer {
    
       @Override
       public MeasureComputerDefinition define(MeasureComputerDefinitionContext defContext) {
         return defContext.newDefinitionBuilder()
    
         // Input metrics can be empty, for instance if only issues will be read
         .setInputMetrics("ncloc")
    
         // Output metrics must contains at least one metric
         .setOutputMetrics("my_new_metric")
    
         .build();
       }
    
       @Override
       public void compute(MeasureComputerContext context) {
         int ncloc = context.getMeasure("ncloc");
         List<Issue> issues = context.getIssues();
         if (ncloc != null && !issues.isEmpty()) {
           double value = issues.size() / ncloc;
           context.addMeasure("my_new_metric", value);
         }
       }
     }
     

    How to test

     public class MyMeasureComputerTest {
    
       MyMeasureComputer underTest = new MyMeasureComputer();
    
       @Test
       public void test_definition() {
         TestMeasureComputerDefinitionContext defContext = new TestMeasureComputerDefinitionContext();
         MeasureComputerDefinition def = underTest.define(defContext);
         assertThat(def).isNotNull();
         assertThat(def.getInputMetrics()).containsOnly("ncloc");
         assertThat(def.getOutputMetrics()).containsOnly("my_new_metric");
       }
    
       @Test
       public void sum_ncloc_and_issues() {
         TestMeasureComputerContext context = new TestMeasureComputerContext(underTest);
         context.addMeasure("ncloc", 2);
         context.setIssues(Arrays.asList(new TestIssue.Builder().setKey("ABCD").build()));
         underTest.compute(context);
    
         assertThat(context.getMeasureValue("my_new_metric")).isEqualTo(0.5);
       }
     
    Since:
    5.2