2013-04-15 42 views
2

我需要一種在Sonar上使用的驗證,它應該查看XHTML頁面中的JSF元素,驗證輸入元素是否包含ID屬性。 (例如:)在PMD中使用JSP自定義規則

最初我試圖用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:

[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) 

我怎樣才能使它發揮作用:

<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> 

從日誌中的錯誤?
用checkstyle而不是PMD驗證此規則會更容易嗎?

謝謝。

回答

1

正如我所見,PMD可以解釋JSP頁面。這是對的嗎?

是的,但只有當你有良好的XHTML - 你這樣做。

我該如何讓它工作?

在PMD甚至運行您的規則之前,問題就發生了。它將文件(無論是Java還是jsp或其他)解析到AST(抽象語法樹)中,然後針對它運行相關規則。如何在運行PMD時傳遞-jsp標誌,如何使用它的章節at the bottom of the PMD JSP page?我的猜測是你不是那麼PMD把所有東西都當作Java來對待。

+0

Humm,你可能是對的。我錯過了'-jsp'。現在我將試着找出如何在Ant中使用這個參數。我忘了在問題中指定,但我正在使用Ant PMD任務來運行它。謝謝。 –

+0

我沒有看到用Ant任務執行此操作的方法。但是,您可以使用Ant exec任務將PMD作爲命令行運行。然後,您將參數作爲命令行傳遞,不需要自定義支持。 –

+0

我還沒有運行它,但我不得不離開它,並在其他需求上工作。所以我會接受這個答案,因爲我認爲這是要走的路。 –

1

您是否嘗試過使用Sonar Web Plugin?例如,它應該允許您檢查標籤上的ID。

+0

感謝您的響應。我會看看這個。 但是如果可能的話,我更喜歡PMD,一旦我們已經有一些規則(對於Java)實現使用它。 –

+0

PMD祝你好運... –

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/