/* * eXist Open Source Native XML Database * Copyright (C) 2001-2007 The eXist Project * http://exist-db.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * $Id$ */ package org.exist.xquery; import org.exist.dom.NodeProxy; import org.exist.dom.QName; import org.exist.xquery.value.Type; import org.exist.stax.StaXUtil; import org.w3c.dom.Node; import javax.xml.stream.XMLStreamReader; /** * Tests if a node is of a given node type. * * @author Wolfgang Meier (wolfgang@exist-db.org) */ public class TypeTest implements NodeTest { protected int nodeType = 0; public TypeTest(int nodeType) { setType(nodeType); } public void setType(int nodeType) { this.nodeType = nodeType; } public int getType() { return nodeType; } public QName getName() { return null; } protected boolean isOfType(short type) { int domType; switch (nodeType) { case Type.ELEMENT : domType = Node.ELEMENT_NODE; break; case Type.TEXT : domType = Node.TEXT_NODE; break; case Type.ATTRIBUTE : domType = Node.ATTRIBUTE_NODE; break; case Type.COMMENT : domType = Node.COMMENT_NODE; break; case Type.PROCESSING_INSTRUCTION : domType = Node.PROCESSING_INSTRUCTION_NODE; break; case Type.NODE : default : return true; } if (type == Node.CDATA_SECTION_NODE) type = Node.TEXT_NODE; return (type == domType); } protected boolean isOfEventType(int type) { if (nodeType == Type.NODE) return true; int xpathType = StaXUtil.streamType2Type(type); return xpathType == nodeType; } public String toString() { return nodeType == Type.NODE ? "node()" : Type.NODETYPES[nodeType] + "()"; } /* (non-Javadoc) * @see org.exist.xquery.NodeTest#matches(org.exist.dom.NodeProxy) */ public boolean matches(NodeProxy proxy) { short otherNodeType = proxy.getNodeType(); if(otherNodeType == Type.ITEM || otherNodeType == Type.NODE) { //TODO : what are the semantics of Type.NODE ? if (this.nodeType == Type.NODE) return true; return isOfType(proxy.getNode().getNodeType()); } else return isOfType(otherNodeType); } /* (non-Javadoc) * @see org.exist.xquery.NodeTest#matches(org.exist.dom.NodeProxy) */ public boolean matches(Node other) { if(other == null) return false; return isOfType(other.getNodeType()); } public boolean matches(XMLStreamReader reader) { return isOfEventType(reader.getEventType()); } /* (non-Javadoc) * @see org.exist.xquery.NodeTest#isWildcardTest() */ public boolean isWildcardTest() { return true; } }