01 package net.sourceforge.pmd.lang.jsp.rule.basic;
02
03 import java.util.HashSet;
04 import java.util.List;
05 import java.util.Set;
06 import java.util.StringTokenizer;
07
08 import net.sourceforge.pmd.RuleContext;
09 import net.sourceforge.pmd.lang.ast.Node;
10 import net.sourceforge.pmd.lang.java.rule.ImportWrapper;
11 import net.sourceforge.pmd.lang.jsp.ast.ASTJspDirectiveAttribute;
12 import net.sourceforge.pmd.lang.jsp.rule.AbstractJspRule;
13
14 public class DuplicateJspImportsRule extends AbstractJspRule {
15
16 private Set<ImportWrapper> imports = new HashSet<ImportWrapper>();
17
18 @Override
19 public void apply(List<? extends Node> nodes, RuleContext ctx) {
20 /*
21 * TODO: This method is a hack! It's overriding the parent's method
22 * because the JSP parsing doesn't seem to hit ASTCompilationUnit
23 * properly
24 */
25 imports.clear();
26 super.apply(nodes, ctx);
27 }
28
29 @Override
30 public Object visit(ASTJspDirectiveAttribute node, Object data) {
31
32 if (!"import".equals(node.getName())) {
33 return super.visit(node, data);
34 }
35 String values = node.getValue();
36 StringTokenizer st = new StringTokenizer(values, ",");
37 int count = st.countTokens();
38 for (int ix = 0; ix < count; ix++) {
39 String token = st.nextToken();
40 ImportWrapper wrapper = new ImportWrapper(token, token, node);
41 if (imports.contains(wrapper)) {
42 addViolation(data, node, node.getImage());
43 } else {
44 imports.add(wrapper);
45 }
46 }
47 return super.visit(node, data);
48 }
49
50 }
|