【问题标题】:Using JSP Custom Rule in PMD在 PMD 中使用 JSP 自定义规则
【发布时间】:2013-04-08 01:10:27
【问题描述】:

我需要一种在 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 更容易验证此规则?

谢谢。

【问题讨论】:

    标签: java sonarqube checkstyle pmd


    【解决方案1】:

    正如我所见,PMD 可以解释 JSP 页面。对吗?

    是的,但前提是您拥有格式良好的 XHTML - 您这样做。

    我怎样才能让它工作?

    问题发生在 PMD 甚至运行您的规则之前。它将文件(无论是 Java 还是 jsp 或其他任何文件)解析为 AST(抽象语法树),然后针对它运行相关规则。您是否在运行 PMD 时传递了 -jsp 标志,如如何使用它部分 at the bottom of the PMD JSP page 中所述?我的猜测是,您不是 PMD 将所有内容都视为 Java。

    【讨论】:

    • 嗯,你可能是对的。我错过了'-jsp'。现在我将尝试找出如何在 Ant 中使用这个参数。我忘了在问题中指定,但我正在使用 Ant PMD 任务来运行它。谢谢。
    • 我看不到用 Ant 任务来做这件事的方法。但是,您可以使用 Ant exec 任务将 PMD 作为命令行运行。然后将参数作为命令行传递,不需要自定义支持。
    • 我还没有开始运行它,但我不得不暂时搁置它,并根据其他需求工作。所以我会接受这个答案,因为我认为这是要走的路。
    【解决方案2】:

    您是否尝试过使用Sonar Web Plugin?例如,它应该允许您检查标签上的 ID。

    【讨论】:

    • 感谢您的回复。我会看看这个。但如果可能的话,我更喜欢 PMD,一旦我们已经使用它实现了一些规则(用于 java)。
    【解决方案3】:

    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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多