我是Sonar的新手
我正在尝试为声纳制作自己的插件。下载插件示例后,我使用mvn eclipse:eclipse并将其导入到工作空间。编译正常
但我需要添加自己的规则文件。
为此,我创建了2个文件。
MyCustomNLSRuleTest .java
package org.sonar.samples.java.checks;
import org.junit.Test;
import org.sonar.java.checks.verifier.JavaCheckVerifier;
public class MyCustomNLSRuleTest {
@Test
public void check() {
// Verifies that the check will raise the adequate issues with the expected message.
// In the test file, lines which should raise an issue have been commented out
// by using the following syntax: "// Noncompliant {{EXPECTED_MESSAGE}}"
JavaCheckVerifier.verify("src/test/files/MissingCheck.java", new MyCustomSubscriptionRule());
}
}
我在以下java文件中提供了实际规则,如下所示 -
MissingCheck.java
public class MissingCheck extends Check
{
private HashMap<Integer, Integer> lineStringMap;
@Override
public void beginTree(DetailAST aRootAST) {
super.beginTree(aRootAST);
lineStringMap = new HashMap<>();
}
@Override
public int[] getDefaultTokens() {
return new int[] { TokenTypes.STRING_LITERAL};
}
@Override
public void visitToken(DetailAST ast) {
DetailAST parent = ast.getParent();
if (parent != null) {
DetailAST grandpa = parent.getParent();
if (isAnnotation(grandpa.getType())) {
return;
}
}
Integer count = lineStringMap.get(ast.getLineNo());
if (count == null) {
count = new Integer(1);
} else {
count++;
}
FileContents contents = getFileContents();
String[] line = contents.getLines();
if (line.length >= ast.getLineNo()) {
String l = line[ast.getLineNo() - 1];
if (!l.contains("$NON-NLS-" + count + "$")) {
log(ast.getLineNo(), "String_Not_Externalized", new Object[] { ast.getText() });
}
}
lineStringMap.put(ast.getLineNo(), count);
}
/**
* Checks if type is an annotation.
* @param type to check
* @return <code>true</code> if type is an annotation.
*/
private boolean isAnnotation(int type) {
return (type >= TokenTypes.ANNOTATION_DEF && type <= TokenTypes.ANNOTATION_ARRAY_INIT);
}
}
但是,我正在尝试做mvn clean package这个项目,它给了我错误:
Results :
Tests in error:
MyCustomNLSRuleTest.check:13 » IllegalState At least one issue expected
Tests run: 8, Failures: 0, Errors: 1, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ---------------------------------------------------------------------
任何想法,我如何在插件中添加新规则?
谢谢!
答案 0 :(得分:1)
好吧,在编写java插件的自定义规则时,你似乎离你应该做的很远......首先要提出几个问题:
您是否真的试图查看SonarQube汇合处的专用页面? http://docs.sonarqube.org/display/DEV/Custom+Rules+for+Java
在尝试编写规则之前,您是否真的查看了以下链接?
现在......让我们首先向您解释您目前正在做什么,显然它根本不清楚。
MyCustomNLSRuleTest.java
的测试文件,理论上它应该与名为MyCustomNLSRule
的规则相对应。请注意,情况可能并非如此,因为您在MissingCheck.java
文件中提供了规则。JavaCheckVerifier
来验证作为参数"src/test/files/MissingCheck.java"
提供的文件在针对它播放规则MyCustomSubscriptionRule
时会引发所有预期的问题。此时,您根本没有测试您的MissingCheck
,但是将其用作MyCustomSubscriptionRule
规则的数据......这可能是您的主要问题。
但是,如果这实际上是你想要实现的,那就意味着:
MyCustomSubscriptionRule
以使其具有自定义行为,与原始示例项目中的行为不同。MissingCheck.java
上执行时,检查会引发问题(使用// Noncompliant {{expected message}}
注释问题的行)请查看上面提供的所有链接,了解自定义规则的工作原理,java插件API中提供的内容以及使用它可以实现的目标。