package org.exist.xquery; import org.exist.dom.persistent.NodeProxy; import org.exist.dom.QName; import org.exist.dom.memtree.NodeImpl; import org.exist.dom.memtree.ReferenceNode; import org.exist.xquery.util.ExpressionDumper; import org.exist.xquery.value.Type; import org.w3c.dom.Node; import javax.xml.stream.XMLStreamReader; public class NameTest extends TypeTest { protected final QName nodeName; public NameTest(int type, QName name) throws XPathException { super(type); name.isValid(); nodeName = name; } public QName getName() { return nodeName; } /* (non-Javadoc) * @see org.exist.xquery.NodeTest#matches(org.exist.dom.persistent.NodeProxy) */ public boolean matches(NodeProxy proxy) { Node node = null; short type = proxy.getNodeType(); if(proxy.getType() == Type.ITEM) { node = proxy.getNode(); type = node.getNodeType(); } if (!isOfType(type)) {return false;} if(node == null) {node = proxy.getNode();} return matchesName(node); } public boolean matches(Node other) { if (other.getNodeType() == NodeImpl.REFERENCE_NODE) { return matches(((ReferenceNode)other).getReference()); } if(!isOfType(other.getNodeType())) { return false; } return matchesName(other); } public boolean matches(QName name) { if(!(nodeName instanceof QName.WildcardNamespaceURIQName)) { if (!nodeName.getNamespaceURI().equals(name.getNamespaceURI())) { return false; } } if(!(nodeName instanceof QName.WildcardLocalPartQName)) { return nodeName.getLocalPart().equals(name.getLocalPart()); } return true; } public boolean matchesName(Node other) { if (other.getNodeType() == NodeImpl.REFERENCE_NODE) { return matchesName(((ReferenceNode)other).getReference().getNode()); } if(!(nodeName instanceof QName.WildcardNamespaceURIQName)) { if (!nodeName.getNamespaceURI().equals(other.getNamespaceURI())) { return false; } } if(!(nodeName instanceof QName.WildcardLocalPartQName)) { return nodeName.getLocalPart().equals(other.getLocalName()); } return true; } public boolean matches(XMLStreamReader reader) { final int ev = reader.getEventType(); if (!isOfEventType(ev)) { return false; } switch (ev) { case XMLStreamReader.START_ELEMENT : if(!(nodeName instanceof QName.WildcardNamespaceURIQName)) { if (!nodeName.getNamespaceURI().equals(reader.getNamespaceURI())) {return false;} } if(!(nodeName instanceof QName.WildcardLocalPartQName)) { return nodeName.getLocalPart().equals(reader.getLocalName()); } break; case XMLStreamReader.PROCESSING_INSTRUCTION : if(!(nodeName instanceof QName.WildcardLocalPartQName)) { return nodeName.getLocalPart().equals(reader.getPITarget()); } break; } return true; } /* (non-Javadoc) * @see org.exist.xquery.NodeTest#isWildcardTest() */ public boolean isWildcardTest() { return nodeName instanceof QName.PartialQName; } @Override public boolean equals(Object obj) { if (obj instanceof NameTest) { final NameTest other = (NameTest) obj; return other.nodeType == nodeType && other.nodeName.equals(nodeName); } return false; } public void dump(ExpressionDumper dumper) { dumper.display(nodeName.getStringValue()); } /* (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { final StringBuilder result = new StringBuilder(); if(nodeName.getPrefix() != null) { result.append(nodeName.getPrefix()); result.append(":"); } else if(!(nodeName instanceof QName.WildcardNamespaceURIQName)) { result.append("{"); result.append(nodeName.getNamespaceURI()); result.append("}"); } result.append(nodeName.getLocalPart()); return result.toString(); } }