Remove and replace java rule by XPath rule
This commit is contained in:
1 parent
8b89010e6f
commit
fcdade475d
2 files changed
+18
-89
No files matched your search
-88
@@ -1,88 +0,0 @@
|
||||
/**
|
||||
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
|
||||
*/
|
||||
|
||||
package net.sourceforge.pmd.lang.java.rule.errorprone;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
import net.sourceforge.pmd.lang.ast.Node;
|
||||
import net.sourceforge.pmd.lang.java.ast.ASTAnnotationTypeDeclaration;
|
||||
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceDeclaration;
|
||||
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
|
||||
import net.sourceforge.pmd.lang.java.ast.ASTEnumDeclaration;
|
||||
import net.sourceforge.pmd.lang.java.ast.ASTReferenceType;
|
||||
import net.sourceforge.pmd.lang.java.ast.ASTType;
|
||||
import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclarator;
|
||||
import net.sourceforge.pmd.lang.java.ast.JavaNode;
|
||||
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
|
||||
import net.sourceforge.pmd.lang.java.types.TypeTestUtil;
|
||||
import net.sourceforge.pmd.util.NumericConstants;
|
||||
|
||||
public class MoreThanOneLoggerRule extends AbstractJavaRule {
|
||||
|
||||
private static final String LOG4J_LOGGER_NAME = "org.apache.log4j.Logger";
|
||||
private static final String LOG4J2_LOGGER_NAME = "org.apache.logging.log4j.Logger";
|
||||
private static final String JAVA_LOGGER_NAME = "java.util.logging.Logger";
|
||||
private static final String SLF4J_LOGGER_NAME = "org.slf4j.Logger";
|
||||
|
||||
private Stack<Integer> stack = new Stack<>();
|
||||
|
||||
private Integer count;
|
||||
|
||||
@Override
|
||||
public Object visit(ASTClassOrInterfaceDeclaration node, Object data) {
|
||||
return init(node, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(ASTEnumDeclaration node, Object data) {
|
||||
return init(node, data);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(ASTAnnotationTypeDeclaration node, Object data) {
|
||||
return init(node, data);
|
||||
}
|
||||
|
||||
private Object init(JavaNode node, Object data) {
|
||||
stack.push(count);
|
||||
count = NumericConstants.ZERO;
|
||||
|
||||
node.childrenAccept(this, data);
|
||||
|
||||
if (count > 1) {
|
||||
addViolation(data, node);
|
||||
}
|
||||
count = stack.pop();
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object visit(ASTVariableDeclarator node, Object data) {
|
||||
if (count > 1) {
|
||||
return super.visit(node, data);
|
||||
}
|
||||
ASTType type = node.getParent().getFirstChildOfType(ASTType.class);
|
||||
if (type != null) {
|
||||
Node reftypeNode = type.getChild(0);
|
||||
if (reftypeNode instanceof ASTReferenceType) {
|
||||
Node classOrIntType = reftypeNode.getChild(0);
|
||||
if (classOrIntType instanceof ASTClassOrInterfaceType) {
|
||||
ASTClassOrInterfaceType classType = (ASTClassOrInterfaceType) classOrIntType;
|
||||
if (TypeTestUtil.isA(LOG4J_LOGGER_NAME, classType)
|
||||
|| TypeTestUtil.isA(LOG4J2_LOGGER_NAME, classType)
|
||||
|| TypeTestUtil.isA(JAVA_LOGGER_NAME, classType)
|
||||
|| TypeTestUtil.isA(SLF4J_LOGGER_NAME, classType)
|
||||
|| "Logger".equals(classOrIntType.getImage())) {
|
||||
++count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return super.visit(node, data);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2591,13 +2591,30 @@ public class Foo {
|
||||
language="java"
|
||||
since="2.0"
|
||||
message="Class contains more than one logger."
|
||||
class="net.sourceforge.pmd.lang.java.rule.errorprone.MoreThanOneLoggerRule"
|
||||
class="net.sourceforge.pmd.lang.rule.XPathRule"
|
||||
externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_errorprone.html#morethanonelogger">
|
||||
<description>
|
||||
Normally only one logger is used in each class. This rule supports slf4j, log4j, Java Util Logging and
|
||||
log4j2 (since 6.19.0).
|
||||
</description>
|
||||
<priority>2</priority>
|
||||
<properties>
|
||||
<property name="version" value="2.0"/>
|
||||
<property name="xpath">
|
||||
<value><![CDATA[
|
||||
//ClassOrInterfaceDeclaration[
|
||||
count(
|
||||
ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration//ClassOrInterfaceType[
|
||||
pmd-java:typeIs("org.apache.log4j.Logger") or
|
||||
pmd-java:typeIs("org.apache.logging.log4j.Logger") or
|
||||
pmd-java:typeIs("java.util.logging.Logger") or
|
||||
pmd-java:typeIs("org.slf4j.Logger")
|
||||
]
|
||||
) > 1
|
||||
]
|
||||
]]></value>
|
||||
</property>
|
||||
</properties>
|
||||
<example>
|
||||
<![CDATA[
|
||||
public class Foo {
|
||||
|
||||
Reference in new issue
Block a user