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" ?>
<ruleset name="DependencyCheck 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
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">
<rule name="LoggerChaining"
message="Logger should be a field, don't chain it"
class="net.sourceforge.pmd.lang.rule.XPathRule"
language="java">
<description><![CDATA[
<rule name="LoggerChaining"
message="Logger should be a field, don't chain it"
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[
<properties>
<property name="xpath">
<value><![CDATA[
//PrimaryPrefix[Name/@Image = 'Logger.getLogger' and count(following-sibling::PrimarySuffix) > 2]
]]></value>
</property>
</properties>
<example><![CDATA[
</property>
</properties>
<example><![CDATA[
Logger.getLogger(Foo.class).log(Level.FINEST, "Don't do this");
]]></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>