我正在使用 Java 插件 API 为 SonarQube 5.6.6 开发一个插件。我已经创建了一些自定义规则(检查),现在,我想创建一个自定义指标,显示一个项目有多少特定规则的问题,例如,规则的问题数量 MyCustomRule
。
我知道 SonarQube 用户可以转到问题页面并使用这些特定规则的名称进行过滤,这样他们就可以看到存在多少问题,但我想要措施<页面上的数字/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);
}
}
这个类定义了一个output metric,就是我之前说的issues number。在方法 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(页面“Measures”)中看到它以及每 10 个的总和:
我的问题是:
如何获取特定规则的问题数?
是否应该在
Sensor
类中完成?有可能吗?
谢谢。
最佳答案
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);
}
关于java - 创建一个指标,显示 SonarQube 5.6 中特定规则的问题数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45982534/