001: package net.sf.saxon.pattern;
002:
003: import net.sf.saxon.om.NamePool;
004: import net.sf.saxon.om.NodeInfo;
005: import net.sf.saxon.tinytree.TinyTree;
006:
007: /**
008: * NodeTest is an interface that enables a test of whether a node has a particular
009: * name and type. A LocalNameTest matches the node type and the local name,
010: * it represents an XPath 2.0 test of the form *:name.
011: *
012: * @author Michael H. Kay
013: */
014:
015: public final class LocalNameTest extends NodeTest {
016:
017: private NamePool namePool;
018: private int nodeKind;
019: private String localName;
020:
021: public LocalNameTest(NamePool pool, int nodeType, String localName) {
022: namePool = pool;
023: nodeKind = nodeType;
024: this .localName = localName;
025: }
026:
027: /**
028: * Test whether this node test is satisfied by a given node
029: * @param nodeType The type of node to be matched
030: * @param fingerprint identifies the expanded name of the node to be matched
031: */
032:
033: public boolean matches(int nodeType, int fingerprint, int annotation) {
034: if (fingerprint == -1)
035: return false;
036: if (nodeType != nodeKind)
037: return false;
038: return localName.equals(namePool.getLocalName(fingerprint));
039: }
040:
041: /**
042: * Test whether this node test is satisfied by a given node on a TinyTree. The node
043: * must be a document, element, text, comment, or processing instruction node.
044: * This method is provided so that when navigating a TinyTree a node can be rejected without
045: * actually instantiating a NodeInfo object.
046: *
047: * @param tree the TinyTree containing the node
048: * @param nodeNr the number of the node within the TinyTree
049: * @return true if the node matches the NodeTest, otherwise false
050: */
051:
052: public boolean matches(TinyTree tree, int nodeNr) {
053: int fingerprint = tree.getNameCode(nodeNr) & NamePool.FP_MASK;
054: if (fingerprint == -1)
055: return false;
056: if (tree.getNodeKind(nodeNr) != nodeKind)
057: return false;
058: return localName.equals(namePool.getLocalName(fingerprint));
059: }
060:
061: /**
062: * Test whether this node test is satisfied by a given node. This alternative
063: * method is used in the case of nodes where calculating the fingerprint is expensive,
064: * for example DOM or JDOM nodes.
065: * @param node the node to be matched
066: */
067:
068: public boolean matches(NodeInfo node) {
069: return localName.equals(node.getLocalPart());
070: }
071:
072: /**
073: * Determine the default priority of this node test when used on its own as a Pattern
074: */
075:
076: public final double getDefaultPriority() {
077: return -0.25;
078: }
079:
080: /**
081: * Determine the types of nodes to which this pattern applies. Used for optimisation.
082: * For patterns that match nodes of several types, return Type.NODE
083: * @return the type of node matched by this pattern. e.g. Type.ELEMENT or Type.TEXT
084: */
085:
086: public int getPrimitiveType() {
087: return nodeKind;
088: }
089:
090: /**
091: * Get a mask indicating which kinds of nodes this NodeTest can match. This is a combination
092: * of bits: 1<<Type.ELEMENT for element nodes, 1<<Type.TEXT for text nodes, and so on.
093: */
094:
095: public int getNodeKindMask() {
096: return 1 << nodeKind;
097: }
098:
099: public String toString() {
100: return "*:" + localName;
101: }
102:
103: /**
104: * Returns a hash code value for the object.
105: */
106:
107: public int hashCode() {
108: return nodeKind << 20 ^ localName.hashCode();
109: }
110:
111: /**
112: * Indicates whether some other object is "equal to" this one.
113: */
114: public boolean equals(Object other) {
115: return other instanceof LocalNameTest
116: && ((LocalNameTest) other).namePool == namePool
117: && ((LocalNameTest) other).nodeKind == nodeKind
118: && ((LocalNameTest) other).localName.equals(localName);
119: }
120:
121: }
122:
123: //
124: // The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License");
125: // you may not use this file except in compliance with the License. You may obtain a copy of the
126: // License at http://www.mozilla.org/MPL/
127: //
128: // Software distributed under the License is distributed on an "AS IS" basis,
129: // WITHOUT WARRANTY OF ANY KIND, either express or implied.
130: // See the License for the specific language governing rights and limitations under the License.
131: //
132: // The Original Code is: all this file.
133: //
134: // The Initial Developer of the Original Code is Michael H. Kay.
135: //
136: // Portions created by (your name) are Copyright (C) (your legal entity). All Rights Reserved.
137: //
138: // Contributor(s): none.
139: //
|