1
2
3
4 package net.sourceforge.pmd;
5
6 import java.util.HashMap;
7 import java.util.List;
8 import java.util.Map;
9
10 import net.sourceforge.pmd.lang.Language;
11 import net.sourceforge.pmd.lang.ast.Node;
12 import net.sourceforge.pmd.lang.rule.RuleChainVisitor;
13
14
15
16
17
18
19
20 public class RuleChain {
21
22 private final Map<Language, RuleChainVisitor> languageToRuleChainVisitor = new HashMap<Language, RuleChainVisitor>();
23
24
25
26
27
28
29
30
31 public void add(RuleSet ruleSet) {
32 for (Rule r : ruleSet.getRules()) {
33 add(ruleSet, r);
34 }
35 }
36
37
38
39
40
41
42
43
44
45 private void add(RuleSet ruleSet, Rule rule) {
46 RuleChainVisitor visitor = getRuleChainVisitor(rule.getLanguage());
47 if (visitor != null) {
48 visitor.add(ruleSet, rule);
49 }
50 }
51
52
53
54
55
56
57
58
59
60
61
62
63 public void apply(List<Node> nodes, RuleContext ctx, Language language) {
64 RuleChainVisitor visitor = getRuleChainVisitor(language);
65 if (visitor != null) {
66 visitor.visitAll(nodes, ctx);
67 }
68 }
69
70
71 private RuleChainVisitor getRuleChainVisitor(Language language) {
72 RuleChainVisitor visitor = languageToRuleChainVisitor.get(language);
73 if (visitor == null) {
74 if (language.getRuleChainVisitorClass() != null) {
75 try {
76 visitor = (RuleChainVisitor) language.getRuleChainVisitorClass().newInstance();
77 } catch (InstantiationException e) {
78 throw new IllegalStateException("Failure to created RuleChainVisitor: "
79 + language.getRuleChainVisitorClass(), e);
80 } catch (IllegalAccessException e) {
81 throw new IllegalStateException("Failure to created RuleChainVisitor: "
82 + language.getRuleChainVisitorClass(), e);
83 }
84 languageToRuleChainVisitor.put(language, visitor);
85 } else {
86 throw new IllegalArgumentException("Language does not have a RuleChainVisitor: " + language);
87 }
88 }
89 return visitor;
90 }
91 }