package org.exist.xquery;
import org.exist.dom.NodeProxy;
import org.exist.dom.QName;
import org.exist.memtree.NodeImpl;
import org.exist.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) {
super(type);
nodeName = name;
}
public QName getName() {
return nodeName;
}
/* (non-Javadoc)
* @see org.exist.xquery.NodeTest#matches(org.exist.dom.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 matchesName(Node other) {
if (other.getNodeType() == NodeImpl.REFERENCE_NODE)
return matchesName(((ReferenceNode)other).getReference().getNode());
if (nodeName.getNamespaceURI() != null) {
if (!nodeName.getNamespaceURI().equals(other.getNamespaceURI()))
return false;
}
if (nodeName.getLocalName() != null) {
return nodeName.getLocalName().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.getNamespaceURI() != null) {
if (!nodeName.getNamespaceURI().equals(reader.getNamespaceURI()))
return false;
}
if (nodeName.getLocalName() != null) {
return nodeName.getLocalName().equals(reader.getLocalName());
}
break;
case XMLStreamReader.PROCESSING_INSTRUCTION :
if (nodeName.getLocalName() != null) {
return nodeName.getLocalName().equals(reader.getPITarget());
}
break;
}
return true;
}
/* (non-Javadoc)
* @see org.exist.xquery.NodeTest#isWildcardTest()
*/
public boolean isWildcardTest() {
return nodeName.getLocalName() == null || nodeName.getNamespaceURI() == null;
}
public void dump(ExpressionDumper dumper) {
if(nodeName.getLocalName() == null)
dumper.display(nodeName.getPrefix() + ":*");
else
dumper.display(nodeName.getStringValue());
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
StringBuilder result = new StringBuilder();
if(nodeName.getLocalName() == null)
result.append(nodeName.getPrefix() + ":*");
else
result.append(nodeName.getStringValue());
return result.toString();
}
}