View Javadoc

1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.rules.design;
5   
6   import net.sourceforge.pmd.AbstractRule;
7   import net.sourceforge.pmd.RuleContext;
8   import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration;
9   import net.sourceforge.pmd.ast.ASTCompilationUnit;
10  import net.sourceforge.pmd.ast.ASTConstructorDeclaration;
11  import net.sourceforge.pmd.ast.ASTFieldDeclaration;
12  import net.sourceforge.pmd.ast.ASTMethodDeclaration;
13  
14  public class UseSingleton extends AbstractRule {
15  
16      private boolean isOK;
17      private int methodCount;
18  
19      public Object visit(ASTCompilationUnit cu, Object data) {
20          methodCount = 0;
21          isOK = false;
22          Object result = cu.childrenAccept(this, data);
23          if (!isOK && methodCount > 0) {
24              RuleContext ctx = (RuleContext) data;
25              ctx.getReport().addRuleViolation(createRuleViolation(ctx, cu));
26          }
27  
28          return result;
29      }
30  
31      public Object visit(ASTFieldDeclaration decl, Object data) {
32          if (!decl.isStatic()) {
33              isOK = true;
34          }
35          return data;
36      }
37  
38      public Object visit(ASTConstructorDeclaration decl, Object data) {
39          if (decl.isPrivate()) {
40              isOK = true;
41          }
42          return data;
43      }
44  
45      public Object visit(ASTClassOrInterfaceDeclaration decl, Object data) {
46          if (decl.isAbstract()) {
47              isOK = true;
48          }
49          return super.visit(decl, data);
50      }
51  
52      public Object visit(ASTMethodDeclaration decl, Object data) {
53          methodCount++;
54  
55          if (!isOK && !decl.isStatic()) {
56              isOK = true;
57          }
58  
59          return data;
60      }
61  
62  }