added rough rule to look for copy paste errors regarding loggers (i.e. obtaining the logger for the wrong class per PR #247)

Former-commit-id: ca6b2566ea496909ea4ab4f48241bb664b130183
This commit is contained in:
Jeremy Long
2015-06-05 19:59:40 -04:00
parent d662c693f1
commit 1204d98e8d

View File

@@ -1,28 +1,61 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<ruleset name="DependencyCheck Rules" <ruleset name="DependencyCheck Rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0
http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
<rule name="LoggerChaining" <rule name="LoggerChaining"
message="Logger should be a field, don't chain it" message="Logger should be a field, don't chain it"
class="net.sourceforge.pmd.lang.rule.XPathRule" class="net.sourceforge.pmd.lang.rule.XPathRule"
language="java"> language="java">
<description><![CDATA[ <description><![CDATA[
Loggers should be created as fields within the class for general Loggers should be created as fields within the class for general
use, rather than chaining the call to getLogger() followed by use, rather than chaining the call to getLogger() followed by
the work on the Logger. the work on the Logger.
]]></description> ]]></description>
<properties> <properties>
<property name="xpath"> <property name="xpath">
<value><![CDATA[ <value><![CDATA[
//PrimaryPrefix[Name/@Image = 'Logger.getLogger' and count(following-sibling::PrimarySuffix) > 2] //PrimaryPrefix[Name/@Image = 'Logger.getLogger' and count(following-sibling::PrimarySuffix) > 2]
]]></value> ]]></value>
</property> </property>
</properties> </properties>
<example><![CDATA[ <example><![CDATA[
Logger.getLogger(Foo.class).log(Level.FINEST, "Don't do this"); Logger.getLogger(Foo.class).log(Level.FINEST, "Don't do this");
]]></example> ]]></example>
</rule> </rule>
<rule name="LoggingWrongClass"
message="The logger is obtained for the wrong class"
class="net.sourceforge.pmd.lang.rule.XPathRule"
language="java">
<description><![CDATA[
Loggers should be created as fields within the class for general
use, rather than chaining the call to getLogger() followed by
the work on the Logger.
]]></description>
<properties>
<property name="xpath">
<value><![CDATA[
//ClassOrInterfaceDeclaration[.//PrimaryExpression[PrimaryPrefix/Name[@Image = 'Logger.getLogger']]
and not(@Image = .//PrimaryExpression[PrimaryPrefix/Name[@Image = 'Logger.getLogger']]
/PrimarySuffix
/Arguments
/ArgumentList
/Expression
/PrimaryExpression
/PrimaryPrefix
/ResultType
/Type
/ReferenceType
/ClassOrInterfaceType/@Image
)] ]]></value>
</property>
</properties>
<example><![CDATA[
public class Foo {
Logger LOGGER = Logger.getLogger(Bar.class.getName()); //should be Foo.class
}
]]></example>
</rule>
</ruleset> </ruleset>