@Override String kindDisplayName(ASTVariableDeclaratorId node, PropertyDescriptor<Pattern> descriptor) { ASTFieldDeclaration field = (ASTFieldDeclaration) node.getNthParent(2); if (field.isFinal() && field.isStatic()) { return field.isPublic() ? "public constant" : "constant"; } else if (field.isFinal()) { return "final field"; } else if (field.isStatic()) { return "static field"; } else { return "field"; } }
@Override public Object visit(ASTFieldDeclaration node, Object data) { for (ASTVariableDeclaratorId id : node) { if (getProperty(EXCLUDED_NAMES).contains(id.getVariableName())) { continue; } if (node.isFinal() && node.isStatic()) { checkMatches(id, node.isPublic() ? publicConstantFieldRegex : constantFieldRegex, data); } else if (node.isFinal()) { checkMatches(id, finalFieldRegex, data); } else if (node.isStatic()) { checkMatches(id, staticFieldRegex, data); } else { checkMatches(id, defaultFieldRegex, data); } } return data; }
@Override String kindDisplayName(ASTVariableDeclaratorId node, PropertyDescriptor<Pattern> descriptor) { ASTFieldDeclaration field = (ASTFieldDeclaration) node.getNthParent(2); if (field.isFinal() && field.isStatic()) { return field.isPublic() ? "public constant" : "constant"; } else if (field.isFinal()) { return "final field"; } else if (field.isStatic()) { return "static field"; } else { return "field"; } }
@Override public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { if (!isPojo(node)) { return super.visit(node, data); } try { List<Node> fields = node.findChildNodesWithXPath( "ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration"); for (Node fieldNode : fields) { ASTFieldDeclaration field = (ASTFieldDeclaration)fieldNode; boolean shouldProcess = !field.isPublic() && !field.isStatic() && !field.isTransient(); if (!shouldProcess) { continue; } Class type = field.getType(); // TODO works only in current compilation file, by crossing files will be null if (type != null && type.isPrimitive()) { addViolationWithMessage(data, field.getFirstDescendantOfType(ASTType.class), "java.oop.PojoMustUsePrimitiveFieldRule.violation.msg", new Object[] {field.getVariableName()}); } } } catch (JaxenException e) { throw new RuntimeException(e.getMessage(), e); } return super.visit(node, data); } }
@Override public Object visit(ASTFieldDeclaration node, Object data) { for (ASTVariableDeclaratorId id : node) { if (getProperty(EXCLUDED_NAMES).contains(id.getVariableName())) { continue; } if (node.isFinal() && node.isStatic()) { checkMatches(id, node.isPublic() ? publicConstantFieldRegex : constantFieldRegex, data); } else if (node.isFinal()) { checkMatches(id, finalFieldRegex, data); } else if (node.isStatic()) { checkMatches(id, staticFieldRegex, data); } else { checkMatches(id, defaultFieldRegex, data); } } return data; }
@Override public Object visit(ASTClassOrInterfaceDeclaration node, Object data) { if (!isPojo(node)) { return super.visit(node, data); } try { List<Node> fields = node.findChildNodesWithXPath( "ClassOrInterfaceBody/ClassOrInterfaceBodyDeclaration/FieldDeclaration"); for (Node fieldNode : fields) { ASTFieldDeclaration field = (ASTFieldDeclaration)fieldNode; boolean shouldProcess = !field.isPublic() && !field.isFinal() && !field.isStatic() && !field .isVolatile() && field.hasDescendantOfType(ASTVariableInitializer.class); if (!shouldProcess) { continue; } ViolationUtils.addViolationWithPrecisePosition(this, field, data, I18nResources.getMessage("java.oop.PojoNoDefaultValueRule.violation.msg", field.getVariableName())); } } catch (JaxenException e) { throw new RuntimeException(e.getMessage(), e); } return super.visit(node, data); } }