Clover coverage report - PMD - 3.7 Coverage timestamp: Wed May 31 2006 09:25:59 EDT FRAMES NO FRAMES |
file stats: | LOC: | 59 |  | Methods: | 1
| NCLOC: | 53 |  | Classes: | 1
Source file | Conditionals | Statements | Methods | TOTAL
PreserveStackTrace.java | 81.2% | 81.5% | 100% | 81.8% |

1 |  | package net.sourceforge.pmd.rules.design;
2 |  |
3 |  | import net.sourceforge.pmd.AbstractRule;
4 |  | import net.sourceforge.pmd.RuleContext;
5 |  | import net.sourceforge.pmd.ast.ASTArgumentList;
6 |  | import net.sourceforge.pmd.ast.ASTCastExpression;
7 |  | import net.sourceforge.pmd.ast.ASTCatchStatement;
8 |  | import net.sourceforge.pmd.ast.ASTPrimaryExpression;
9 |  | import net.sourceforge.pmd.ast.ASTPrimaryPrefix;
10 |  | import net.sourceforge.pmd.ast.ASTThrowStatement;
11 |  | import net.sourceforge.pmd.ast.SimpleNode;
12 |  |
13 |  | import java.util.Iterator;
14 |  | import java.util.List;
15 |  |
16 |  | import org.jaxen.JaxenException;
17 |  |
18 |  | public class PreserveStackTrace extends AbstractRule {
19 |  |
20 | 9 | public Object visit(ASTCatchStatement node, Object data) {
21 | 9 | String target = (((SimpleNode) node.jjtGetChild(0).jjtGetChild(1)).getImage());
22 | 9 | List lstThrowStatements = node.findChildrenOfType(ASTThrowStatement.class);
23 | 9 | for (Iterator iter = lstThrowStatements.iterator(); iter.hasNext();) {
24 | 7 | ASTThrowStatement throwStatement = (ASTThrowStatement) iter.next();
25 | 7 | SimpleNode sn = (SimpleNode)throwStatement.jjtGetChild(0).jjtGetChild(0);
26 | 7 | if(sn.getClass().equals(ASTCastExpression.class)){
27 | 2 | ASTPrimaryExpression expr = (ASTPrimaryExpression)sn.jjtGetChild(1);
28 | 2 | if(expr.jjtGetNumChildren()> 1 && expr.jjtGetChild(1).getClass().equals(ASTPrimaryPrefix.class)) {
29 | 0 | RuleContext ctx = (RuleContext) data;
30 | 0 | addViolation(ctx, throwStatement);
31 |  | }
32 | 2 | continue;
33 |  | }
34 | 5 | ASTArgumentList args = (ASTArgumentList) throwStatement.getFirstChildOfType(ASTArgumentList.class);
35 |  |
36 | 5 | if (args != null) {
37 | 4 | try {
38 | 4 | List lst = args.findChildNodesWithXPath("//Name[@Image='" + target + "']");
39 | 4 | if (lst.size() == 0) {
40 | 1 | RuleContext ctx = (RuleContext) data;
41 | 1 | addViolation(ctx, throwStatement);
42 |  | }
43 |  | } catch (JaxenException e) {
44 | 0 | e.printStackTrace();
45 |  | }
46 | 1 | } else if (args == null) {
47 | 1 | SimpleNode child = (SimpleNode) throwStatement.jjtGetChild(0);
48 | 1 | while (child != null && child.jjtGetNumChildren() > 0 && !child.getClass().getName().equals("net.sourceforge.pmd.ast.ASTName")) {
49 | 3 | child = (SimpleNode) child.jjtGetChild(0);
50 |  | }
51 | 1 | if (child != null && (!target.equals(child.getImage()) && !child.getImage().equals(target + ".fillInStackTrace"))) {
52 | 0 | RuleContext ctx = (RuleContext) data;
53 | 0 | addViolation(ctx, throwStatement);
54 |  | }
55 |  | }
56 |  | }
57 | 9 | return super.visit(node, data);
58 |  | }
59 |  | }