创建一个指标,显示SonarQube 5.6

时间:2017-08-31 13:22:37

标签: java plugins sonarqube

我正在使用Java Plugin API为SonarQube 5.6.6开发一个插件。我已经创建了一些自定义规则(检查),现在,我想创建一个自定义指标,显示项目具有的某些规则的问题,例如,问题的数量规则MyCustomRule

我知道SonarQube用户可以转到问题页面并使用这些特定规则的名称进行过滤,这样他们就可以看到存在多少问题,但我希望页面上的数字 Measures < / em>的

我有一个实现MeasureComputer的课程:

public class MyMeasureComputer implements MeasureComputer {

    @Override
    public MeasureComputerDefinition define(MeasureComputerDefinitionContext defContext) {
        return defContext.newDefinitionBuilder()
                .setOutputMetrics(MY_CUSTOM_METRIC.key())
                .build();
    }

    @Override
    public void compute(MeasureComputerContext context) {
        int totalSum = 0;
        for (Measure measure : context.getChildrenMeasures(MY_CUSTOM_METRIC.key())) {
            totalSum += measure.getIntValue();
        }

        context.addMeasure(MY_CUSTOM_METRIC.key(), totalSum);
    }
}

此类定义输出指标,这是我之前说过的问题数。在方法compute中,它获取每个文件的度量MY_CUSTOM_METRIC的值并将它们全部加起来。最后,它会创建度量MY_CUSTOM_METRIC,这是问题的数量。

此时,我需要在每个文件中定义度量MY_CUSTOM_METRIC的值,因此MyMeasureComputer可以计算它,但我不知道该怎么做。我认为应该是Sensor

public class MySensor implements Sensor {

    @Override
    public void describe(SensorDescriptor descriptor) {
        descriptor.name("MySensor").onlyOnLanguage(Java.KEY);
    }

    @Override
    public void execute(SensorContext context) {
        final FileSystem fs = context.fileSystem();

        for (InputFile file : fs.inputFiles(fs.predicates().all())) {
            context.<Integer>newMeasure()
                .forMetric(MY_CUSTOM_METRIC)
                .on(file)
                .withValue(getNumCertainIssues(context, file))
                .save();
        }
    }

    private int getNumCertainIssues(SensorContext context, InputFile file) {
        return 10;   // TODO: how to get the number of issues?
    }

}

在方法execute中,我可以使用示例值(10)在每个文件中设置度量标准并且它可以正常工作;我可以在SonarQube UI中看到它(页面&#34;测量&#34;)以及每10个的总和:

Total

Every file

我的问题是:

  • 如何获取特定规则的问题数量?

  • 是否应该在课程Sensor中完成?

  • 甚至可能吗?

感谢。

1 个答案:

答案 0 :(得分:2)

对每个组件执行MeasureComputer:文件,目录,模块和项目。

  • 在文件(Component#getType#FILE)上,您可以获得问题(使用MeasureComputerContext#getIssues),计算规则MyCustomRule中的问题数量,然后保存它使用MeasureComputerContext#addMeasure

  • 在没有任何文件组件上,您可以从子项计算度量并保存它,这是您编写的代码。

您的代码看起来像这样:

public class MyMeasureComputer implements MeasureComputer {
    @Override
    public MeasureComputerDefinition define(MeasureComputerDefinitionContext defContext) {
        return defContext.newDefinitionBuilder()
                .setOutputMetrics(MY_CUSTOM_METRIC.key())
                .build();
    }

@Override public void compute(MeasureComputerContext context) { if (context.getComponent().getType() == FILE) { List<Issue> fileIssues = context.getIssues(); // TODO get number of issues of type MyCustomRule context.addMeasure(MY_CUSTOM_METRIC.key(), sum); return; } int totalSum = 0; for (Measure measure : context.getChildrenMeasures(MY_CUSTOM_METRIC.key())) { totalSum += measure.getIntValue(); } context.addMeasure(MY_CUSTOM_METRIC.key(), totalSum); }