View Javadoc

    1   package net.sourceforge.pmd.lang.rule.xpath;
    2
    3   import java.util.ArrayList;
    4   import java.util.List;
    5   import java.util.Map;
    6
    7   import net.sourceforge.pmd.PropertyDescriptor;
    8   import net.sourceforge.pmd.RuleContext;
    9   import net.sourceforge.pmd.lang.ast.Node;
    10
    11  /**
    12   * This implementation of XPathRuleQuery provides support for RuleChain visits.
    13   */
    14  public abstract class AbstractXPathRuleQuery implements XPathRuleQuery {
    15
    16      /**
    17       * The XPath query string.
    18       */
    19      protected String xpath;
    20
    21      /**
    22       * The XPath version;
    23       */
    24      protected String version;
    25
    26      /**
    27       * The properties.
    28       */
    29      protected Map<PropertyDescriptor<?>, Object> properties;
    30
    31      /**
    32       * Subclasses can manage RuleChain visits via this list.
    33       */
    34      protected final List<String> ruleChainVisits = new ArrayList<String>();
    35
    36      /**
    37       * {@inheritDoc}
    38       */
    39      public void setXPath(String xpath) {
    40  	this.xpath = xpath;
    41      }
    42
    43      /**
    44       * {@inheritDoc}
    45       */
    46      public void setVersion(String version) throws UnsupportedOperationException {
    47  	if (!isSupportedVersion(version)) {
    48  	    throw new UnsupportedOperationException(this.getClass().getSimpleName()
    49  		    + " does not support XPath version: " + version);
    50  	}
    51  	this.version = version;
    52      }
    53
    54      /**
    55       * Subclasses should implement to indicate whether an XPath version is supported.
    56       * @param version The XPath version.
    57       * @return <code>true</code> if the XPath version is supported, <code>false</code> otherwise.
    58       */
    59      protected abstract boolean isSupportedVersion(String version);
    60
    61      /**
    62       * {@inheritDoc}
    63       */
    64      public void setProperties(Map<PropertyDescriptor<?>, Object> properties) {
    65  	this.properties = properties;
    66      }
    67
    68      /**
    69       * {@inheritDoc}
    70       */
    71      public List<String> getRuleChainVisits() {
    72  	return ruleChainVisits;
    73      }
    74
    75      /**
    76       * {@inheritDoc}
    77       */
    78      public abstract List<Node> evaluate(Node node, RuleContext data);
    79  }