View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.lang;
5   
6   import java.io.Reader;
7   import java.util.ArrayList;
8   import java.util.Arrays;
9   import java.util.Collections;
10  import java.util.List;
11  import java.util.Map;
12  
13  import net.sourceforge.pmd.Rule;
14  import net.sourceforge.pmd.RuleContext;
15  import net.sourceforge.pmd.RuleViolation;
16  import net.sourceforge.pmd.lang.ast.DummyNode;
17  import net.sourceforge.pmd.lang.ast.Node;
18  import net.sourceforge.pmd.lang.ast.ParseException;
19  import net.sourceforge.pmd.lang.rule.AbstractRuleChainVisitor;
20  import net.sourceforge.pmd.lang.rule.AbstractRuleViolationFactory;
21  import net.sourceforge.pmd.lang.rule.ParametricRuleViolation;
22  
23  
24  /**
25   * Dummy language used for testing PMD.
26   */
27  public class DummyLanguageModule extends BaseLanguageModule {
28  
29      public static final String NAME = "Dummy";
30      public static final String TERSE_NAME = "dummy";
31  
32      public DummyLanguageModule() {
33          super(NAME, null, TERSE_NAME, DummyRuleChainVisitor.class, "dummy");
34          addVersion("1.0", new Handler(), true);
35          addVersion("1.1", new Handler(), false);
36          addVersion("1.2", new Handler(), false);
37          addVersion("1.3", new Handler(), false);
38          addVersion("1.4", new Handler(), false);
39          addVersion("1.5", new Handler(), false);
40          addVersion("1.6", new Handler(), false);
41          addVersion("1.7", new Handler(), false);
42          addVersion("1.8", new Handler(), false);
43      }
44  
45      public static class DummyRuleChainVisitor extends AbstractRuleChainVisitor {
46          @Override
47          protected void visit(Rule rule, Node node, RuleContext ctx) {
48              rule.apply(Arrays.asList(node), ctx);
49          }
50          @Override
51          protected void indexNodes(List<Node> nodes, RuleContext ctx) {
52              for (Node n : nodes) {
53                  indexNode(n);
54                  List<Node> childs = new ArrayList<Node>();
55                  for (int i = 0; i < n.jjtGetNumChildren(); i++) {
56                      childs.add(n.jjtGetChild(i));
57                  }
58                  indexNodes(childs, ctx);
59              }
60          }
61      }
62      
63      public static class Handler extends AbstractLanguageVersionHandler {
64          @Override
65          public RuleViolationFactory getRuleViolationFactory() {
66              return new RuleViolationFactory();
67          }
68          
69          @Override
70          public Parser getParser(ParserOptions parserOptions) {
71              return new AbstractParser(parserOptions) {
72                  @Override
73                  public Node parse(String fileName, Reader source) throws ParseException {
74                      DummyNode node = new DummyNode(1);
75                      node.testingOnly__setBeginLine(1);
76                      node.testingOnly__setBeginColumn(1);
77                      node.setImage("Foo");
78                      return node;
79                  }
80                  @Override
81                  public Map<Integer, String> getSuppressMap() {
82                      return Collections.emptyMap();
83                  }
84                  @Override
85                  public boolean canParse() {
86                      return true;
87                  }
88                  @Override
89                  protected TokenManager createTokenManager(Reader source) {
90                      return null;
91                  }
92              };
93          }
94      }
95  
96      public static class RuleViolationFactory extends AbstractRuleViolationFactory {
97          @Override
98          protected RuleViolation createRuleViolation(Rule rule, RuleContext ruleContext, Node node, String message) {
99              return createRuleViolation(rule, ruleContext, node, message, 0, 0);
100         }
101         @Override
102         protected RuleViolation createRuleViolation(Rule rule, RuleContext ruleContext, Node node, String message,
103                 int beginLine, int endLine) {
104             ParametricRuleViolation<Node> rv = new ParametricRuleViolation<Node>(rule, ruleContext, node, message) {
105                 {
106                     this.packageName = "foo"; // just for testing variable expansion
107                 }
108             };
109             rv.setLines(beginLine, endLine);
110             return rv;
111         }
112     }
113 }