1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.rules;
5
6 import net.sourceforge.pmd.AbstractRule;
7 import net.sourceforge.pmd.RuleContext;
8 import net.sourceforge.pmd.ast.ASTMethodDeclarator;
9 import net.sourceforge.pmd.ast.ASTUnmodifiedClassDeclaration;
10 import net.sourceforge.pmd.symboltable.VariableNameDeclaration;
11
12 import java.text.MessageFormat;
13 import java.util.ArrayList;
14 import java.util.Arrays;
15 import java.util.Iterator;
16
17 public class BeanMembersShouldSerializeRule extends AbstractRule {
18
19 public Object visit(ASTUnmodifiedClassDeclaration node, Object data) {
20 ArrayList methList = new ArrayList();
21 node.findChildrenOfType(ASTMethodDeclarator.class, methList);
22
23 ArrayList getSetMethList = new ArrayList();
24 for (int i = 0; i < methList.size(); i++){
25 ASTMethodDeclarator meth = (ASTMethodDeclarator)methList.get(i);
26 String methName = meth.getImage();
27 if (methName.startsWith("get") || methName.startsWith("set")){
28 getSetMethList.add(meth);
29 }
30 }
31 String[] methNameArray = new String[getSetMethList.size()];
32 for (int i = 0; i < getSetMethList.size(); i++){
33 ASTMethodDeclarator meth = (ASTMethodDeclarator)getSetMethList.get(i);
34 String methName = meth.getImage();
35 methNameArray[i] = methName;
36 }
37
38 Arrays.sort(methNameArray);
39
40 for (Iterator i = node.getScope().getVariableDeclarations(true).keySet().iterator();i.hasNext();) {
41 VariableNameDeclaration decl = (VariableNameDeclaration)i.next();
42 if (decl.getAccessNodeParent().isTransient()){
43
44 continue;
45 }
46 if (decl.getAccessNodeParent().isStatic()){
47
48 continue;
49 }
50 String varName = decl.getImage();
51 String firstChar = varName.substring(0,1);
52
53 varName = firstChar.toUpperCase() + varName.substring(1,varName.length());
54
55 boolean hasGetMethod =false;
56 if (Arrays.binarySearch(methNameArray,"get" + varName) >= 0 ){
57 hasGetMethod = true;
58 }
59 boolean hasSetMethod = false;
60 if (Arrays.binarySearch(methNameArray,"set" + varName) >= 0 ){
61 hasSetMethod = true;
62 }
63 if (!hasGetMethod || !hasSetMethod) {
64
65 RuleContext ctx = (RuleContext)data;
66 ctx.getReport().addRuleViolation(createRuleViolation(ctx, decl.getLine(), MessageFormat.format(getMessage(), new Object[] {decl.getImage()})));
67 }
68
69
70
71
72
73
74
75 }
76 return super.visit(node, data);
77 }
78
79
80 }