2017-04-13 144 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去对付未使用的导入。