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