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 }