package name.panitz.xml.xpath;

import java.util.List;
import java.util.ArrayList;
import static org.w3c.dom.Node.*;
import org.w3c.dom.*;

public class DoNodeTest extends NodeTestVisitor<Boolean> {
  Node current;
  public DoNodeTest(Node n){current=n;}  public Boolean eval(StarTest _){
    return    current.getNodeType()==ELEMENT_NODE
           || current.getNodeType()==ATTRIBUTE_NODE;
  }  public Boolean eval(PrefixStar e){
    String currentPrefix = current.getPrefix();
    if (currentPrefix==null) currentPrefix="";
    return   new StarTest().visit(this) 
         && currentPrefix.equals(e.getPrefix());
  }  public Boolean eval(QName e){
    return   new PrefixStar(e.getPrefix()).visit(this) 
         &&  current.getNodeName().equals(e.getName());
  }  public Boolean eval(IsComment _){
    return current.getNodeType()==COMMENT_NODE;}  public Boolean eval(IsText _){
    return current.getNodeType()==TEXT_NODE;}  public Boolean eval(IsProcessingInstruction _){
    return current.getNodeType()==PROCESSING_INSTRUCTION_NODE;}  public Boolean eval(IsNamedProcessingInstruction e){
    return current.getNodeType()==PROCESSING_INSTRUCTION_NODE
        && e.getName().equals(current.getNodeName());
  }  public Boolean eval(IsNode _){return true;}  static public List<Node> evalAxisExpr
        (AxisType axis,NodeTest test,Node context){
    List<Node> result = new ArrayList<Node>();
    for (Node node:Axes.getAxis(context,axis)){
      if (test.visit(new DoNodeTest(node)))
        result.add(node);
    }
    return result;
  }
}