KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sourceforge > pmd > rules > design > ExceptionAsFlowControl


1 package net.sourceforge.pmd.rules.design;
2
3 import net.sourceforge.pmd.AbstractRule;
4 import net.sourceforge.pmd.ast.ASTCatchStatement;
5 import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
6 import net.sourceforge.pmd.ast.ASTFormalParameter;
7 import net.sourceforge.pmd.ast.ASTThrowStatement;
8 import net.sourceforge.pmd.ast.ASTTryStatement;
9 import net.sourceforge.pmd.ast.ASTType;
10
11 import java.util.Iterator JavaDoc;
12 import java.util.List JavaDoc;
13
14 /**
15  * Catches the use of exception statements as a flow control device.
16  *
17  * @author Will Sargent
18  */

19 public class ExceptionAsFlowControl extends AbstractRule {
20
21     public Object JavaDoc visit(ASTThrowStatement node, Object JavaDoc data) {
22         ASTTryStatement parent = (ASTTryStatement) node.getFirstParentOfType(ASTTryStatement.class);
23         if (parent == null) {
24             return data;
25         }
26         for (parent = (ASTTryStatement) parent.getFirstParentOfType(ASTTryStatement.class)
27                 ; parent != null
28                 ; parent = (ASTTryStatement) parent.getFirstParentOfType(ASTTryStatement.class)) {
29
30             List JavaDoc list = parent.findChildrenOfType(ASTCatchStatement.class);
31             for (Iterator JavaDoc iter = list.iterator(); iter.hasNext();) {
32                 ASTCatchStatement catchStmt = (ASTCatchStatement) iter.next();
33                 ASTFormalParameter fp = (ASTFormalParameter) catchStmt.jjtGetChild(0);
34                 ASTType type = (ASTType) fp.findChildrenOfType(ASTType.class).get(0);
35                 ASTClassOrInterfaceType name = (ASTClassOrInterfaceType) type.findChildrenOfType(ASTClassOrInterfaceType.class).get(0);
36                 if (node.getFirstClassOrInterfaceTypeImage() != null && node.getFirstClassOrInterfaceTypeImage().equals(name.getImage())) {
37                     addViolation(data, name);
38                 }
39             }
40         }
41         return data;
42     }
43
44 }
45
Popular Tags