我正在使用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个的总和:
我的问题是:
如何获取特定规则的问题数量?
是否应该在课程Sensor
中完成?
甚至可能吗?
感谢。
答案 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);
}