pmd: fix #992 Class java.beans.Statement triggered in CloseResource rule
This commit is contained in:
parent
c00ca9e44c
commit
589ec3c6da
@ -1,5 +1,6 @@
|
|||||||
????? ??, 2013 - 5.0.3:
|
????? ??, 2013 - 5.0.3:
|
||||||
|
|
||||||
|
Fixed bug 992: Class java.beans.Statement triggered in CloseResource rule
|
||||||
Fixed bug 1002: False +: FinalFieldCouldBeStatic on inner class
|
Fixed bug 1002: False +: FinalFieldCouldBeStatic on inner class
|
||||||
Fixed bug 1005: False + for ConstructorCallsOverridableMethod - overloaded methods
|
Fixed bug 1005: False + for ConstructorCallsOverridableMethod - overloaded methods
|
||||||
Fixed bug 1032: ImmutableField Rule: Private field in inner class gives false positive
|
Fixed bug 1032: ImmutableField Rule: Private field in inner class gives false positive
|
||||||
|
@ -48,13 +48,14 @@ import net.sourceforge.pmd.lang.rule.properties.StringMultiProperty;
|
|||||||
public class CloseResourceRule extends AbstractJavaRule {
|
public class CloseResourceRule extends AbstractJavaRule {
|
||||||
|
|
||||||
private Set<String> types = new HashSet<String>();
|
private Set<String> types = new HashSet<String>();
|
||||||
|
private Set<String> simpleTypes = new HashSet<String>();
|
||||||
|
|
||||||
private Set<String> closeTargets = new HashSet<String>();
|
private Set<String> closeTargets = new HashSet<String>();
|
||||||
private static final StringMultiProperty CLOSE_TARGETS_DESCRIPTOR = new StringMultiProperty("closeTargets",
|
private static final StringMultiProperty CLOSE_TARGETS_DESCRIPTOR = new StringMultiProperty("closeTargets",
|
||||||
"Methods which may close this resource", new String[]{}, 1.0f, ',');
|
"Methods which may close this resource", new String[]{}, 1.0f, ',');
|
||||||
|
|
||||||
private static final StringMultiProperty TYPES_DESCRIPTOR = new StringMultiProperty("types",
|
private static final StringMultiProperty TYPES_DESCRIPTOR = new StringMultiProperty("types",
|
||||||
"Affected types", new String[]{"Connection","Statement","ResultSet"}, 2.0f, ',');
|
"Affected types", new String[]{"java.sql.Connection","java.sql.Statement","java.sql.ResultSet"}, 2.0f, ',');
|
||||||
|
|
||||||
public CloseResourceRule() {
|
public CloseResourceRule() {
|
||||||
definePropertyDescriptor(CLOSE_TARGETS_DESCRIPTOR);
|
definePropertyDescriptor(CLOSE_TARGETS_DESCRIPTOR);
|
||||||
@ -69,9 +70,23 @@ public class CloseResourceRule extends AbstractJavaRule {
|
|||||||
if (types.isEmpty() && getProperty(TYPES_DESCRIPTOR) != null) {
|
if (types.isEmpty() && getProperty(TYPES_DESCRIPTOR) != null) {
|
||||||
types.addAll(Arrays.asList(getProperty(TYPES_DESCRIPTOR)));
|
types.addAll(Arrays.asList(getProperty(TYPES_DESCRIPTOR)));
|
||||||
}
|
}
|
||||||
|
if (simpleTypes.isEmpty() && getProperty(TYPES_DESCRIPTOR) != null) {
|
||||||
|
for (String type : getProperty(TYPES_DESCRIPTOR)) {
|
||||||
|
simpleTypes.add(toSimpleType(type));
|
||||||
|
}
|
||||||
|
}
|
||||||
return super.visit(node, data);
|
return super.visit(node, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String toSimpleType(String fullyQualifiedClassName) {
|
||||||
|
int lastIndexOf = fullyQualifiedClassName.lastIndexOf('.');
|
||||||
|
if (lastIndexOf > -1) {
|
||||||
|
return fullyQualifiedClassName.substring(lastIndexOf + 1);
|
||||||
|
} else {
|
||||||
|
return fullyQualifiedClassName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object visit(ASTConstructorDeclaration node, Object data) {
|
public Object visit(ASTConstructorDeclaration node, Object data) {
|
||||||
checkForResources(node, data);
|
checkForResources(node, data);
|
||||||
@ -96,7 +111,11 @@ public class CloseResourceRule extends AbstractJavaRule {
|
|||||||
ASTReferenceType ref = (ASTReferenceType) type.jjtGetChild(0);
|
ASTReferenceType ref = (ASTReferenceType) type.jjtGetChild(0);
|
||||||
if (ref.jjtGetChild(0) instanceof ASTClassOrInterfaceType) {
|
if (ref.jjtGetChild(0) instanceof ASTClassOrInterfaceType) {
|
||||||
ASTClassOrInterfaceType clazz = (ASTClassOrInterfaceType) ref.jjtGetChild(0);
|
ASTClassOrInterfaceType clazz = (ASTClassOrInterfaceType) ref.jjtGetChild(0);
|
||||||
if (types.contains(clazz.getImage())) {
|
|
||||||
|
if (clazz.getType() != null && types.contains(clazz.getType().getName())
|
||||||
|
|| (clazz.getType() == null && simpleTypes.contains(toSimpleType(clazz.getImage())))
|
||||||
|
|| types.contains(clazz.getImage())) {
|
||||||
|
|
||||||
ASTVariableDeclaratorId id = var.getFirstDescendantOfType(ASTVariableDeclaratorId.class);
|
ASTVariableDeclaratorId id = var.getFirstDescendantOfType(ASTVariableDeclaratorId.class);
|
||||||
ids.add(id);
|
ids.add(id);
|
||||||
}
|
}
|
||||||
|
@ -405,4 +405,24 @@ public class CloseResourceRuleBug {
|
|||||||
}
|
}
|
||||||
]]></code>
|
]]></code>
|
||||||
</test-code>
|
</test-code>
|
||||||
|
|
||||||
|
<test-code>
|
||||||
|
<description>#992 Class java.beans.Statement triggered in CloseResource rule</description>
|
||||||
|
<expected-problems>0</expected-problems>
|
||||||
|
<code><![CDATA[
|
||||||
|
import java.beans.Statement;
|
||||||
|
|
||||||
|
public class Test {
|
||||||
|
public void foo() {
|
||||||
|
Statement stmt = new Statement(vo, "set" + prop, new Object[] { vector });
|
||||||
|
|
||||||
|
try {
|
||||||
|
stmt.execute();
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("Could not set property prop: " + prop + "of type:" + pd.getPropertyType(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]]></code>
|
||||||
|
</test-code>
|
||||||
</test-data>
|
</test-data>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user