sonar plugin DefaultMeasure与DefaultHighlighting

本文详细解析了SonarQube中sensorContext的使用原则,特别强调了DefaultHighlighting和DefaultMeasure的唯一性限制,避免重复设置导致的UnsupportedOperationException错误。通过具体代码示例,展示了如何正确应用sensorContext进行代码质量分析。

一次sonar project 扫描,sensorContext 分别会创建DefaultHighlighting(语言高亮标记设置)

和DefaultMeasure(统计测量属性),且只能设置一次。否则会报错:

Caused by: java.lang.UnsupportedOperationException: Can not add the same measure twice on src/main/resources/application-dev.properties: DefaultMeasure[component=src/main/resources/application-dev.properties,metric=Metric[id=<null>,key=ncloc,description=Non commenting lines of code,type=INT,direction=-1,domain=Size,name=Lines of Code,qualitative=false,userManaged=false,enabled=true,worstValue=<null>,bestValue=<null>,optimizedBestValue=false,hidden=false,deleteHistoricalData=false,decimalScale=<null>],value=12,fromCore=false]
	at org.sonar.scanner.sensor.DefaultSensorStorage.saveMeasure(DefaultSensorStorage.java:298)
	at org.sonar.scanner.sensor.DefaultSensorStorage.store(DefaultSensorStorage.java:236)
	at org.sonar.api.batch.sensor.measure.internal.DefaultMeasure.doSave(DefaultMeasure.java:95)
	at org.sonar.api.batch.sensor.internal.DefaultStorable.save(DefaultStorable.java:45)
	at com.lingtian.sonar.utils.api.visitors.metrics.MetricsVisitor.saveMetricOnFile(MetricsVisitor.java:56)
	at com.lingtian.sonar.utils.api.visitors.metrics.MetricsVisitor.leaveFile(MetricsVisitor.java:41)
	at com.lingtian.sonar.utils.astvisitor.SubscriptionVisitor.scanTree(SubscriptionVisitor.java:44)
	at com.lingtian.sonar.sensor.ConfigFileScanSensor.scanFile(ConfigFileScanSensor.java:152)
	at com.lingtian.sonar.sensor.ConfigFileScanSensor.analyzeFile(ConfigFileScanSensor.java:124)
	... 31 more

再次调用了sensorContext.<T>newMeasure().withValue(value).forMetric(metric).on(inputFile).save();

 @Override
  public void leaveFile(Tree tree) {
    LinesOfCodeVisitor linesOfCodeVisitor = new LinesOfCodeVisitor(tree);
    saveMetricOnFile(CoreMetrics.NCLOC, linesOfCodeVisitor.getNumberOfLinesOfCode());

    CommentLinesVisitor commentLinesVisitor = new CommentLinesVisitor(tree);
    saveMetricOnFile(CoreMetrics.COMMENT_LINES, commentLinesVisitor.getNumberOfCommentLines());

    StatementsVisitor statementsVisitor = new StatementsVisitor(tree);
    saveMetricOnFile(CoreMetrics.STATEMENTS, statementsVisitor.getNumberOfStatements());
  }

  @SuppressWarnings({ "rawtypes", "unchecked" })
  private <T extends Serializable> void saveMetricOnFile(Metric metric, T value) {
    sensorContext.<T>newMeasure()
      .withValue(value)
      .forMetric(metric)
      .on(inputFile)
      .save();
  }

DefaultHighlighting报错:

Caused by: java.lang.UnsupportedOperationException: Trying to save highlighting twice for the 
same file is not supported: src/main/resources/application-dev.properties
	at org.sonar.scanner.sensor.DefaultSensorStorage.
store(DefaultSensorStorage.java:432)
	at org.sonar.api.batch.sensor.highlighting.internal.
DefaultHighlighting.doSave(DefaultHighlighting.java:121)
	at org.sonar.api.batch.sensor.internal.
DefaultStorable.save(DefaultStorable.java:45)
	at com.lingtian.sonar.utils.api.visitors.SyntaxHighlighterVisitor.
leaveFile(SyntaxHighlighterVisitor.java:50)
	at com.lingtian.sonar.utils.astvisitor.SubscriptionVisitor.
scanTree(SubscriptionVisitor.java:46)
	at com.lingtian.sonar.sensor.ConfigFileScanSensor.
scanFile(ConfigFileScanSensor.java:152)
	at com.lingtian.sonar.sensor.ConfigFileScanSensor.
analyzeFile(ConfigFileScanSensor.java:124)
	... 31 more

再次调用了:

@Override
  public void visitFile(Tree tree) {
    highlighting = sensorContext.newHighlighting().onFile(fileSystem.inputFile(fileSystem.predicates().is(getContext().getFile())));
  }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值