/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.xml.rule;
import java.util.List;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.lang.Language;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.ParserOptions;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.rule.AbstractRule;
import net.sourceforge.pmd.lang.rule.ImmutableLanguage;
import net.sourceforge.pmd.lang.rule.properties.BooleanProperty;
import net.sourceforge.pmd.lang.xml.XmlLanguageModule;
import net.sourceforge.pmd.lang.xml.XmlParserOptions;
import net.sourceforge.pmd.lang.xml.ast.XmlNode;
/**
* This is a base class for XML Java bases rules. Subclasses should override
* {@link #visit(XmlNode, RuleContext)} and can call <code>super</code> to visit
* children.
*/
public class AbstractXmlRule extends AbstractRule implements ImmutableLanguage {
public static final BooleanProperty COALESCING_DESCRIPTOR = XmlParserOptions.COALESCING_DESCRIPTOR;
public static final BooleanProperty EXPAND_ENTITY_REFERENCES_DESCRIPTOR = XmlParserOptions.EXPAND_ENTITY_REFERENCES_DESCRIPTOR;
public static final BooleanProperty IGNORING_COMMENTS_DESCRIPTOR = XmlParserOptions.IGNORING_COMMENTS_DESCRIPTOR;
public static final BooleanProperty IGNORING_ELEMENT_CONTENT_WHITESPACE_DESCRIPTOR = XmlParserOptions.IGNORING_ELEMENT_CONTENT_WHITESPACE_DESCRIPTOR;
public static final BooleanProperty NAMESPACE_AWARE_DESCRIPTOR = XmlParserOptions.NAMESPACE_AWARE_DESCRIPTOR;
public static final BooleanProperty VALIDATING_DESCRIPTOR = XmlParserOptions.VALIDATING_DESCRIPTOR;
public static final BooleanProperty XINCLUDE_AWARE_DESCRIPTOR = XmlParserOptions.XINCLUDE_AWARE_DESCRIPTOR;
public AbstractXmlRule() {
super.setLanguage(LanguageRegistry.getLanguage(XmlLanguageModule.NAME));
defineProperties();
}
protected AbstractXmlRule(Language language) {
super.setLanguage(language);
defineProperties();
}
private void defineProperties() {
definePropertyDescriptor(COALESCING_DESCRIPTOR);
definePropertyDescriptor(EXPAND_ENTITY_REFERENCES_DESCRIPTOR);
definePropertyDescriptor(IGNORING_COMMENTS_DESCRIPTOR);
definePropertyDescriptor(IGNORING_ELEMENT_CONTENT_WHITESPACE_DESCRIPTOR);
definePropertyDescriptor(NAMESPACE_AWARE_DESCRIPTOR);
definePropertyDescriptor(VALIDATING_DESCRIPTOR);
definePropertyDescriptor(XINCLUDE_AWARE_DESCRIPTOR);
}
@Override
public ParserOptions getParserOptions() {
return new XmlParserOptions(this);
}
public void apply(List<? extends Node> nodes, RuleContext ctx) {
visitAll(nodes, ctx);
}
protected void visitAll(List<? extends Node> nodes, RuleContext ctx) {
for (Object element : nodes) {
XmlNode node = (XmlNode) element;
visit(node, ctx);
}
}
protected void visit(XmlNode node, RuleContext ctx) {
final int numChildren = node.jjtGetNumChildren();
for (int i = 0; i < numChildren; i++) {
XmlNode child = (XmlNode) node.jjtGetChild(i);
visit(child, ctx);
}
}
}