2017-04-13 99 views
0

我正在嘗試爲我的回購編寫PMD規則,我需要所有logger類只能是log4j類型。 如:在XPath查詢中使用條件

代碼:

import some; 
class Foo{ 
    Logger log = Logger.getLogger(Foo.class.getName()); 
    } 
} 

我的XPath查詢的PMD規則:

(//ImportDeclaration //Name[@Image!='org.apache.log4j.Logger']) 
| 
(//ClassOrInterfaceBodyDeclaration //FieldDeclaration //Type //ReferenceType //ClassOrInterfaceType[@Image='Logger']) 

如果logger類代碼&使用我在這裏測試它的類型是log4j的不,那麼這是違規行爲。

+0

這個xpath查詢似乎有一些錯誤。我想檢查是否在類中創建了Logger對象,然後應該導入apache log4j。但我無法把和運營商或if..else條件相同。 – babu29

回答

0

由於可以有明星進口,相同的包裝訪問和簡單且完全限定的名稱,我建議您使用typeresolution

//ClassOrInterfaceBodyDeclaration//FieldDeclaration//Type//ReferenceType//ClassOrInterfaceType[ends-with(@Image, 'Logger') and not(typeof(@Image, 'org.apache.log4j.Logger', 'Logger'))] 

最終規則將被表述爲:

<rule name="All Loggers must be Log4J Loggers" 
     message="All Loggers must be Log4J Loggers" 
     class="net.sourceforge.pmd.lang.rule.XPathRule" 
     language="java" 
     typeResolution="true"> 
    <description> 
     All Loggers must be Log4J Loggers 
    </description> 
    <priority>3</priority> 
    <properties> 
     <property name="xpath"> 
      <value> 
    //ClassOrInterfaceBodyDeclaration//FieldDeclaration//Type//ReferenceType//ClassOrInterfaceType[ends-with(@Image, 'Logger') and not(typeof(@Image, 'org.apache.log4j.Logger', 'Logger'))] 
      </value> 
     </property> 
    </properties> 
</rule> 

通知的rule節點上的typeResolution="true"屬性。還要確保正確填充類型解析的auxclasspath。 Gradle會自動執行此操作,在Maven上您必須enable it through configuration,使用Ant時需要手動通過auxclasspath

最後一個音符,此規則是隻找領域,未使用的導入/星進口其他記錄器將不被發現,即使他們可以增加,我會簡單地用the existing rule去對付未使用的導入。