View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.lang.xml.rule;
    5
    6   import net.sourceforge.pmd.RuleContext;
    7   import net.sourceforge.pmd.lang.xml.ast.XmlNode;
    8
    9   import org.w3c.dom.Attr;
    10  import org.w3c.dom.CharacterData;
    11  import org.w3c.dom.Comment;
    12  import org.w3c.dom.Document;
    13  import org.w3c.dom.DocumentType;
    14  import org.w3c.dom.Element;
    15  import org.w3c.dom.Entity;
    16  import org.w3c.dom.EntityReference;
    17  import org.w3c.dom.NamedNodeMap;
    18  import org.w3c.dom.Node;
    19  import org.w3c.dom.Notation;
    20  import org.w3c.dom.ProcessingInstruction;
    21  import org.w3c.dom.Text;
    22
    23  /**
    24   * This is a base class for XML Java bases rules that which to visit the nodes
    25   * using the DOM. Subclasses should override the DOM appropriate method and
    26   * can call <code>super</code> to visit children.
    27   */
    28  public class AbstractDomXmlRule extends AbstractXmlRule {
    29
    30      @Override
    31      protected void visit(XmlNode node, RuleContext ctx) {
    32  	final Node domNode = node.getNode();
    33
    34  	// Visit the node
    35  	visitDomNode(node, domNode, ctx);
    36
    37  	// Visit attributes
    38  	visitAttributeNodes(node, domNode, ctx);
    39      }
    40
    41      protected void visitDomNode(XmlNode node, Node domNode, RuleContext ctx) {
    42  	switch (domNode.getNodeType()) {
    43  	case Node.CDATA_SECTION_NODE:
    44  	    visit(node, (CharacterData) domNode, ctx);
    45  	    break;
    46  	case Node.COMMENT_NODE:
    47  	    visit(node, (Comment) domNode, ctx);
    48  	    break;
    49  	case Node.DOCUMENT_NODE:
    50  	    visit(node, (Document) domNode, ctx);
    51  	    break;
    52  	case Node.DOCUMENT_TYPE_NODE:
    53  	    visit(node, (DocumentType) domNode, ctx);
    54  	    break;
    55  	case Node.ELEMENT_NODE:
    56  	    visit(node, (Element) domNode, ctx);
    57  	    break;
    58  	case Node.ENTITY_NODE:
    59  	    visit(node, (Entity) domNode, ctx);
    60  	    break;
    61  	case Node.ENTITY_REFERENCE_NODE:
    62  	    visit(node, (EntityReference) domNode, ctx);
    63  	    break;
    64  	case Node.NOTATION_NODE:
    65  	    visit(node, (Notation) domNode, ctx);
    66  	    break;
    67  	case Node.PROCESSING_INSTRUCTION_NODE:
    68  	    visit(node, (ProcessingInstruction) domNode, ctx);
    69  	    break;
    70  	case Node.TEXT_NODE:
    71  	    visit(node, (Text) domNode, ctx);
    72  	    break;
    73  	default:
    74  	    throw new RuntimeException("Unexpected node type: " + domNode.getNodeType() + " on node: " + domNode);
    75  	}
    76      }
    77
    78      protected void visitAttributeNodes(XmlNode node, Node domNode, RuleContext ctx) {
    79  	NamedNodeMap attributes = domNode.getAttributes();
    80  	if (attributes != null) {
    81  	    for (int i = 0; i < attributes.getLength(); i++) {
    82  		visit(node, (Attr) attributes.item(i), ctx);
    83  	    }
    84  	}
    85      }
    86
    87      protected void visit(XmlNode node, Attr attr, RuleContext ctx) {
    88      }
    89
    90      protected void visit(XmlNode node, CharacterData characterData, RuleContext ctx) {
    91  	super.visit(node, ctx);
    92      }
    93
    94      protected void visit(XmlNode node, Comment comment, RuleContext ctx) {
    95  	super.visit(node, ctx);
    96      }
    97
    98      protected void visit(XmlNode node, Document document, RuleContext ctx) {
    99  	super.visit(node, ctx);
    100     }
    101
    102     protected void visit(XmlNode node, DocumentType documentType, RuleContext ctx) {
    103 	super.visit(node, ctx);
    104     }
    105
    106     protected void visit(XmlNode node, Element element, RuleContext ctx) {
    107 	super.visit(node, ctx);
    108     }
    109
    110     protected void visit(XmlNode node, Entity entity, RuleContext ctx) {
    111 	super.visit(node, ctx);
    112     }
    113
    114     protected void visit(XmlNode node, EntityReference entityReference, RuleContext ctx) {
    115 	super.visit(node, ctx);
    116     }
    117
    118     protected void visit(XmlNode node, Notation notation, RuleContext ctx) {
    119 	super.visit(node, ctx);
    120     }
    121
    122     protected void visit(XmlNode node, ProcessingInstruction processingInstruction, RuleContext ctx) {
    123 	super.visit(node, ctx);
    124     }
    125
    126     protected void visit(XmlNode node, Text text, RuleContext ctx) {
    127 	super.visit(node, ctx);
    128     }
    129 }