1 package test.net.sourceforge.pmd.jsp.ast;
2
3 import static org.junit.Assert.assertEquals;
4 import net.sourceforge.pmd.ast.Node;
5 import net.sourceforge.pmd.jsp.ast.JspCharStream;
6 import net.sourceforge.pmd.jsp.ast.JspParser;
7
8 import java.io.StringReader;
9 import java.util.HashSet;
10 import java.util.Set;
11 public abstract class AbstractJspNodesTst {
12
13 public <T> void assertNumberOfNodes(Class<T> clazz, String source, int number) {
14 Set<T> nodes = getNodes(clazz, source);
15 assertEquals("Exactly " + number + " element(s) expected", number, nodes.size());
16 }
17
18 /**
19 * Run the JSP parser on the source, and return the nodes of type clazz.
20 *
21 * @param clazz
22 * @param source
23 * @return Set
24 */
25 public <T> Set<T> getNodes(Class<T> clazz, String source) {
26 JspParser parser = new JspParser(new JspCharStream(new StringReader(source)));
27 Node rootNode = parser.CompilationUnit();
28 Set<T> nodes = new HashSet<T>();
29 addNodeAndSubnodes(rootNode, nodes, clazz);
30 return nodes;
31 }
32
33 /**
34 * Return a subset of allNodes, containing the items in allNodes
35 * that are of the given type.
36 *
37 * @param clazz
38 * @param allNodes
39 * @return Set
40 */
41 public <T> Set<T> getNodesOfType(Class<T> clazz, Set allNodes) {
42 Set<T> result = new HashSet<T>();
43 for (Object node: allNodes) {
44 if (clazz.equals(node.getClass())) {
45 result.add((T)node);
46 }
47 }
48 return result;
49 }
50
51 /**
52 * Add the given node and its subnodes to the set of nodes. If clazz is not null, only
53 * nodes of the given class are put in the set of nodes.
54 *
55 * @param node
56 * @param nodex
57 * @param clazz
58 */
59 private <T> void addNodeAndSubnodes(Node node, Set<T> nodes, Class<T> clazz) {
60 if (null != node) {
61 if ((null == clazz) || (clazz.equals(node.getClass()))) {
62 nodes.add((T)node);
63 }
64 }
65 for (int i = 0; i < node.jjtGetNumChildren(); i++) {
66 addNodeAndSubnodes(node.jjtGetChild(i), nodes, clazz);
67 }
68 }
69
70 }