我需要在Sonar上使用一种验证,它应该查看XHTML页面中的JSF元素,验证输入元素是否包含ID属性。 (例如:)
最初我正在尝试使用PMD。 正如我所见,PMD可以解释JSP页面。这是对的吗? 这样做的方法是实现基于AbstractJspRule的自定义规则。
到目前为止,PMD试图将XHTML页面解析为Java代码的问题。它应该解释为JSP页面。
我的代码:
类:
public class TestXhtmlRule extends AbstractJspRule {
@Override
public Object visit(final ASTElement node, final Object data) {
// ...
}
@Override
public Object visit(final ASTAttribute node, final Object data) {
// ...
}
}
的xml:
<ruleset name="Basic JSF rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"
xsi:noNamespaceSchemaLocation="http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<include-pattern>**/*.xhtml</include-pattern>
<rule name="idsJSF" language="jsp"
message="..."
class="pmd.rule.TestXhtmlRule">
<description>
...
</description>
<priority>3</priority>
<example>
<![CDATA[
<h:inputText id="itNome" label="Nome" value="#{pessoaBean.nome}" />;
]]>
</example>
</rule>
</ruleset>
日志中的错误:
[pmd] net.sourceforge.pmd.lang.java.ast.ParseException: Encountered " "<" "< "" at line 1, column 1.
Was expecting one of:
<EOF>
"abstract" ...
"class" ...
"final" ...
"import" ...
"interface" ...
"native" ...
"private" ...
"protected" ...
"public" ...
"static" ...
"synchronized" ...
"transient" ...
"volatile" ...
"strictfp" ...
<IDENTIFIER> ...
";" ...
"@" ...
"\u001a" ...
"~[]" ...
"@" ...
"@" ...
"@" ...
at net.sourceforge.pmd.lang.java.ast.JavaParser.generateParseException(JavaParser.java:9867)
at net.sourceforge.pmd.lang.java.ast.JavaParser.jj_consume_token(JavaParser.java:9751)
at net.sourceforge.pmd.lang.java.ast.JavaParser.CompilationUnit(JavaParser.java:190)
at net.sourceforge.pmd.lang.java.AbstractJavaParser.parse(AbstractJavaParser.java:56)
at net.sourceforge.pmd.SourceCodeProcessor.parse(SourceCodeProcessor.java:90)
at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:136)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:75)
at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:42)
at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:75)
at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:22)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
我怎样才能使它发挥作用? 使用checkstyle而不是PMD更容易验证此规则吗?
感谢。
答案 0 :(得分:1)
您是否尝试过使用Sonar Web Plugin?例如,它应该允许您检查标签上的ID。
答案 1 :(得分:1)
正如我所见,PMD可以解释JSP页面。这是对的吗?
是的,但前提是你已经完成了XHTML - 你做了。
我怎样才能让它发挥作用?
问题出现在PMD甚至运行你的规则之前。它将文件(无论是Java还是jsp或其他任何东西)解析为AST(抽象语法树),然后针对它运行相关规则。您是否在运行PMD时传递-jsp标志,如“{3}}如何使用它”部分所述?我的猜测是你并非如此,PMD将所有东西视为Java。
答案 2 :(得分:0)
PMD中存在错误(或错过的功能)。源文件语言仅由文件名确定。 *.xml
文件假定为xml语言,*.jsp
文件 - jsp语言。未明确指定xhtml
扩展名,因此*.xhtml
文件默认为java语言,并由Java解析器解析。
以下是语言映射的当前扩展(在PMD中硬编码): https://github.com/pmd/pmd/blob/master/pmd/src/main/java/net/sourceforge/pmd/lang/Language.java?source=cc
以下是使其可配置的功能请求: http://sourceforge.net/p/pmd/feature-requests/568/