2017-04-13 11 views
0

私はすべてのロガークラスがlog4j型である必要があるレポ用のPMDルールを作成しようとしています。 例:XPathクエリで条件を使用する

コード:

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

PMDルールのための私のXPathクエリ:

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

関連する問題