aboutsummaryrefslogtreecommitdiff
path: root/src/com/sun/org/apache/xpath/internal/patterns/NodeTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/sun/org/apache/xpath/internal/patterns/NodeTest.java')
-rw-r--r--src/com/sun/org/apache/xpath/internal/patterns/NodeTest.java694
1 files changed, 0 insertions, 694 deletions
diff --git a/src/com/sun/org/apache/xpath/internal/patterns/NodeTest.java b/src/com/sun/org/apache/xpath/internal/patterns/NodeTest.java
deleted file mode 100644
index 5bb95fb..0000000
--- a/src/com/sun/org/apache/xpath/internal/patterns/NodeTest.java
+++ /dev/null
@@ -1,694 +0,0 @@
-/*
- * reserved comment block
- * DO NOT REMOVE OR ALTER!
- */
-/*
- * Copyright 1999-2004 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/*
- * $Id: NodeTest.java,v 1.2.4.2 2005/09/15 00:21:14 jeffsuttor Exp $
- */
-package com.sun.org.apache.xpath.internal.patterns;
-
-import com.sun.org.apache.xml.internal.dtm.DTM;
-import com.sun.org.apache.xml.internal.dtm.DTMFilter;
-import com.sun.org.apache.xpath.internal.Expression;
-import com.sun.org.apache.xpath.internal.ExpressionOwner;
-import com.sun.org.apache.xpath.internal.XPath;
-import com.sun.org.apache.xpath.internal.XPathContext;
-import com.sun.org.apache.xpath.internal.XPathVisitor;
-import com.sun.org.apache.xpath.internal.objects.XNumber;
-import com.sun.org.apache.xpath.internal.objects.XObject;
-
-/**
- * This is the basic node test class for both match patterns and location path
- * steps.
- * @xsl.usage advanced
- */
-public class NodeTest extends Expression
-{
- static final long serialVersionUID = -5736721866747906182L;
-
- /**
- * The namespace or local name for node tests with a wildcard.
- * @see <a href="http://www.w3.org/TR/xpath#NT-NameTest">the XPath NameTest production.</a>
- */
- public static final String WILD = "*";
-
- /**
- * The URL to pass to the Node#supports method, to see if the
- * DOM has already been stripped of whitespace nodes.
- */
- public static final String SUPPORTS_PRE_STRIPPING =
- "http://xml.apache.org/xpath/features/whitespace-pre-stripping";
-
- /**
- * This attribute determines which node types are accepted.
- * @serial
- */
- protected int m_whatToShow;
-
- /**
- * Special bitmap for match patterns starting with a function.
- * Make sure this does not conflict with {@link org.w3c.dom.traversal.NodeFilter}.
- */
- public static final int SHOW_BYFUNCTION = 0x00010000;
-
- /**
- * This attribute determines which node types are accepted.
- * These constants are defined in the {@link org.w3c.dom.traversal.NodeFilter}
- * interface.
- *
- * @return bitset mainly defined in {@link org.w3c.dom.traversal.NodeFilter}.
- */
- public int getWhatToShow()
- {
- return m_whatToShow;
- }
-
- /**
- * This attribute determines which node types are accepted.
- * These constants are defined in the {@link org.w3c.dom.traversal.NodeFilter}
- * interface.
- *
- * @param what bitset mainly defined in {@link org.w3c.dom.traversal.NodeFilter}.
- */
- public void setWhatToShow(int what)
- {
- m_whatToShow = what;
- }
-
- /**
- * The namespace to be tested for, which may be null.
- * @serial
- */
- String m_namespace;
-
- /**
- * Return the namespace to be tested.
- *
- * @return The namespace to be tested for, or {@link #WILD}, or null.
- */
- public String getNamespace()
- {
- return m_namespace;
- }
-
- /**
- * Set the namespace to be tested.
- *
- * @param ns The namespace to be tested for, or {@link #WILD}, or null.
- */
- public void setNamespace(String ns)
- {
- m_namespace = ns;
- }
-
- /**
- * The local name to be tested for.
- * @serial
- */
- protected String m_name;
-
- /**
- * Return the local name to be tested.
- *
- * @return the local name to be tested, or {@link #WILD}, or an empty string.
- */
- public String getLocalName()
- {
- return (null == m_name) ? "" : m_name;
- }
-
- /**
- * Set the local name to be tested.
- *
- * @param name the local name to be tested, or {@link #WILD}, or an empty string.
- */
- public void setLocalName(String name)
- {
- m_name = name;
- }
-
- /**
- * Statically calculated score for this test. One of
- * {@link #SCORE_NODETEST},
- * {@link #SCORE_NONE},
- * {@link #SCORE_NSWILD},
- * {@link #SCORE_QNAME}, or
- * {@link #SCORE_OTHER}.
- * @serial
- */
- XNumber m_score;
-
- /**
- * The match score if the pattern consists of just a NodeTest.
- * @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
- */
- public static final XNumber SCORE_NODETEST =
- new XNumber(XPath.MATCH_SCORE_NODETEST);
-
- /**
- * The match score if the pattern pattern has the form NCName:*.
- * @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
- */
- public static final XNumber SCORE_NSWILD =
- new XNumber(XPath.MATCH_SCORE_NSWILD);
-
- /**
- * The match score if the pattern has the form
- * of a QName optionally preceded by an @ character.
- * @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
- */
- public static final XNumber SCORE_QNAME =
- new XNumber(XPath.MATCH_SCORE_QNAME);
-
- /**
- * The match score if the pattern consists of something
- * other than just a NodeTest or just a qname.
- * @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
- */
- public static final XNumber SCORE_OTHER =
- new XNumber(XPath.MATCH_SCORE_OTHER);
-
- /**
- * The match score if no match is made.
- * @see <a href="http://www.w3.org/TR/xslt#conflict">XSLT Specification - 5.5 Conflict Resolution for Template Rules</a>
- */
- public static final XNumber SCORE_NONE =
- new XNumber(XPath.MATCH_SCORE_NONE);
-
- /**
- * Construct an NodeTest that tests for namespaces and node names.
- *
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
- * @param namespace The namespace to be tested.
- * @param name The local name to be tested.
- */
- public NodeTest(int whatToShow, String namespace, String name)
- {
- initNodeTest(whatToShow, namespace, name);
- }
-
- /**
- * Construct an NodeTest that doesn't test for node names.
- *
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
- */
- public NodeTest(int whatToShow)
- {
- initNodeTest(whatToShow);
- }
-
- /**
- * @see Expression#deepEquals(Expression)
- */
- public boolean deepEquals(Expression expr)
- {
- if(!isSameClass(expr))
- return false;
-
- NodeTest nt = (NodeTest)expr;
-
- if(null != nt.m_name)
- {
- if(null == m_name)
- return false;
- else if(!nt.m_name.equals(m_name))
- return false;
- }
- else if(null != m_name)
- return false;
-
- if(null != nt.m_namespace)
- {
- if(null == m_namespace)
- return false;
- else if(!nt.m_namespace.equals(m_namespace))
- return false;
- }
- else if(null != m_namespace)
- return false;
-
- if(m_whatToShow != nt.m_whatToShow)
- return false;
-
- if(m_isTotallyWild != nt.m_isTotallyWild)
- return false;
-
- return true;
- }
-
- /**
- * Null argument constructor.
- */
- public NodeTest(){}
-
- /**
- * Initialize this node test by setting the whatToShow property, and
- * calculating the score that this test will return if a test succeeds.
- *
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
- */
- public void initNodeTest(int whatToShow)
- {
-
- m_whatToShow = whatToShow;
-
- calcScore();
- }
-
- /**
- * Initialize this node test by setting the whatToShow property and the
- * namespace and local name, and
- * calculating the score that this test will return if a test succeeds.
- *
- *
- * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}.
- * @param namespace The namespace to be tested.
- * @param name The local name to be tested.
- */
- public void initNodeTest(int whatToShow, String namespace, String name)
- {
-
- m_whatToShow = whatToShow;
- m_namespace = namespace;
- m_name = name;
-
- calcScore();
- }
-
- /**
- * True if this test has a null namespace and a local name of {@link #WILD}.
- * @serial
- */
- private boolean m_isTotallyWild;
-
- /**
- * Get the static score for this node test.
- * @return Should be one of the SCORE_XXX constants.
- */
- public XNumber getStaticScore()
- {
- return m_score;
- }
-
- /**
- * Set the static score for this node test.
- * @param score Should be one of the SCORE_XXX constants.
- */
- public void setStaticScore(XNumber score)
- {
- m_score = score;
- }
-
- /**
- * Static calc of match score.
- */
- protected void calcScore()
- {
-
- if ((m_namespace == null) && (m_name == null))
- m_score = SCORE_NODETEST;
- else if (((m_namespace == WILD) || (m_namespace == null))
- && (m_name == WILD))
- m_score = SCORE_NODETEST;
- else if ((m_namespace != WILD) && (m_name == WILD))
- m_score = SCORE_NSWILD;
- else
- m_score = SCORE_QNAME;
-
- m_isTotallyWild = (m_namespace == null && m_name == WILD);
- }
-
- /**
- * Get the score that this test will return if a test succeeds.
- *
- *
- * @return the score that this test will return if a test succeeds.
- */
- public double getDefaultScore()
- {
- return m_score.num();
- }
-
- /**
- * Tell what node type to test, if not DTMFilter.SHOW_ALL.
- *
- * @param whatToShow Bit set defined mainly by
- * {@link com.sun.org.apache.xml.internal.dtm.DTMFilter}.
- * @return the node type for the whatToShow. Since whatToShow can specify
- * multiple types, it will return the first bit tested that is on,
- * so the caller of this function should take care that this is
- * the function they really want to call. If none of the known bits
- * are set, this function will return zero.
- */
- public static int getNodeTypeTest(int whatToShow)
- {
- // %REVIEW% Is there a better way?
- if (0 != (whatToShow & DTMFilter.SHOW_ELEMENT))
- return DTM.ELEMENT_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_ATTRIBUTE))
- return DTM.ATTRIBUTE_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_TEXT))
- return DTM.TEXT_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT))
- return DTM.DOCUMENT_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_FRAGMENT))
- return DTM.DOCUMENT_FRAGMENT_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_NAMESPACE))
- return DTM.NAMESPACE_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_COMMENT))
- return DTM.COMMENT_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_PROCESSING_INSTRUCTION))
- return DTM.PROCESSING_INSTRUCTION_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_TYPE))
- return DTM.DOCUMENT_TYPE_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_ENTITY))
- return DTM.ENTITY_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_ENTITY_REFERENCE))
- return DTM.ENTITY_REFERENCE_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_NOTATION))
- return DTM.NOTATION_NODE;
-
- if (0 != (whatToShow & DTMFilter.SHOW_CDATA_SECTION))
- return DTM.CDATA_SECTION_NODE;
-
-
- return 0;
- }
-
-
- /**
- * Do a diagnostics dump of a whatToShow bit set.
- *
- *
- * @param whatToShow Bit set defined mainly by
- * {@link com.sun.org.apache.xml.internal.dtm.DTMFilter}.
- */
- public static void debugWhatToShow(int whatToShow)
- {
-
- java.util.Vector v = new java.util.Vector();
-
- if (0 != (whatToShow & DTMFilter.SHOW_ATTRIBUTE))
- v.addElement("SHOW_ATTRIBUTE");
-
- if (0 != (whatToShow & DTMFilter.SHOW_NAMESPACE))
- v.addElement("SHOW_NAMESPACE");
-
- if (0 != (whatToShow & DTMFilter.SHOW_CDATA_SECTION))
- v.addElement("SHOW_CDATA_SECTION");
-
- if (0 != (whatToShow & DTMFilter.SHOW_COMMENT))
- v.addElement("SHOW_COMMENT");
-
- if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT))
- v.addElement("SHOW_DOCUMENT");
-
- if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_FRAGMENT))
- v.addElement("SHOW_DOCUMENT_FRAGMENT");
-
- if (0 != (whatToShow & DTMFilter.SHOW_DOCUMENT_TYPE))
- v.addElement("SHOW_DOCUMENT_TYPE");
-
- if (0 != (whatToShow & DTMFilter.SHOW_ELEMENT))
- v.addElement("SHOW_ELEMENT");
-
- if (0 != (whatToShow & DTMFilter.SHOW_ENTITY))
- v.addElement("SHOW_ENTITY");
-
- if (0 != (whatToShow & DTMFilter.SHOW_ENTITY_REFERENCE))
- v.addElement("SHOW_ENTITY_REFERENCE");
-
- if (0 != (whatToShow & DTMFilter.SHOW_NOTATION))
- v.addElement("SHOW_NOTATION");
-
- if (0 != (whatToShow & DTMFilter.SHOW_PROCESSING_INSTRUCTION))
- v.addElement("SHOW_PROCESSING_INSTRUCTION");
-
- if (0 != (whatToShow & DTMFilter.SHOW_TEXT))
- v.addElement("SHOW_TEXT");
-
- int n = v.size();
-
- for (int i = 0; i < n; i++)
- {
- if (i > 0)
- System.out.print(" | ");
-
- System.out.print(v.elementAt(i));
- }
-
- if (0 == n)
- System.out.print("empty whatToShow: " + whatToShow);
-
- System.out.println();
- }
-
- /**
- * Two names are equal if they and either both are null or
- * the name t is wild and the name p is non-null, or the two
- * strings are equal.
- *
- * @param p part string from the node.
- * @param t target string, which may be {@link #WILD}.
- *
- * @return true if the strings match according to the rules of this method.
- */
- private static final boolean subPartMatch(String p, String t)
- {
-
- // boolean b = (p == t) || ((null != p) && ((t == WILD) || p.equals(t)));
- // System.out.println("subPartMatch - p: "+p+", t: "+t+", result: "+b);
- return (p == t) || ((null != p) && ((t == WILD) || p.equals(t)));
- }
-
- /**
- * This is temporary to patch over Xerces issue with representing DOM
- * namespaces as "".
- *
- * @param p part string from the node, which may represent the null namespace
- * as null or as "".
- * @param t target string, which may be {@link #WILD}.
- *
- * @return true if the strings match according to the rules of this method.
- */
- private static final boolean subPartMatchNS(String p, String t)
- {
-
- return (p == t)
- || ((null != p)
- && ((p.length() > 0)
- ? ((t == WILD) || p.equals(t)) : null == t));
- }
-
- /**
- * Tell what the test score is for the given node.
- *
- *
- * @param xctxt XPath runtime context.
- * @param context The node being tested.
- *
- * @return {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NODETEST},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NONE},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NSWILD},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_QNAME}, or
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_OTHER}.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public XObject execute(XPathContext xctxt, int context)
- throws javax.xml.transform.TransformerException
- {
-
- DTM dtm = xctxt.getDTM(context);
- short nodeType = dtm.getNodeType(context);
-
- if (m_whatToShow == DTMFilter.SHOW_ALL)
- return m_score;
-
- int nodeBit = (m_whatToShow & (0x00000001 << (nodeType - 1)));
-
- switch (nodeBit)
- {
- case DTMFilter.SHOW_DOCUMENT_FRAGMENT :
- case DTMFilter.SHOW_DOCUMENT :
- return SCORE_OTHER;
- case DTMFilter.SHOW_COMMENT :
- return m_score;
- case DTMFilter.SHOW_CDATA_SECTION :
- case DTMFilter.SHOW_TEXT :
-
- // was:
- // return (!xctxt.getDOMHelper().shouldStripSourceNode(context))
- // ? m_score : SCORE_NONE;
- return m_score;
- case DTMFilter.SHOW_PROCESSING_INSTRUCTION :
- return subPartMatch(dtm.getNodeName(context), m_name)
- ? m_score : SCORE_NONE;
-
- // From the draft: "Two expanded names are equal if they
- // have the same local part, and either both have no URI or
- // both have the same URI."
- // "A node test * is true for any node of the principal node type.
- // For example, child::* will select all element children of the
- // context node, and attribute::* will select all attributes of
- // the context node."
- // "A node test can have the form NCName:*. In this case, the prefix
- // is expanded in the same way as with a QName using the context
- // namespace declarations. The node test will be true for any node
- // of the principal type whose expanded name has the URI to which
- // the prefix expands, regardless of the local part of the name."
- case DTMFilter.SHOW_NAMESPACE :
- {
- String ns = dtm.getLocalName(context);
-
- return (subPartMatch(ns, m_name)) ? m_score : SCORE_NONE;
- }
- case DTMFilter.SHOW_ATTRIBUTE :
- case DTMFilter.SHOW_ELEMENT :
- {
- return (m_isTotallyWild || (subPartMatchNS(dtm.getNamespaceURI(context), m_namespace) && subPartMatch(dtm.getLocalName(context), m_name)))
- ? m_score : SCORE_NONE;
- }
- default :
- return SCORE_NONE;
- } // end switch(testType)
- }
-
- /**
- * Tell what the test score is for the given node.
- *
- *
- * @param xctxt XPath runtime context.
- * @param context The node being tested.
- *
- * @return {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NODETEST},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NONE},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NSWILD},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_QNAME}, or
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_OTHER}.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public XObject execute(XPathContext xctxt, int context,
- DTM dtm, int expType)
- throws javax.xml.transform.TransformerException
- {
-
- if (m_whatToShow == DTMFilter.SHOW_ALL)
- return m_score;
-
- int nodeBit = (m_whatToShow & (0x00000001
- << ((dtm.getNodeType(context)) - 1)));
-
- switch (nodeBit)
- {
- case DTMFilter.SHOW_DOCUMENT_FRAGMENT :
- case DTMFilter.SHOW_DOCUMENT :
- return SCORE_OTHER;
- case DTMFilter.SHOW_COMMENT :
- return m_score;
- case DTMFilter.SHOW_CDATA_SECTION :
- case DTMFilter.SHOW_TEXT :
-
- // was:
- // return (!xctxt.getDOMHelper().shouldStripSourceNode(context))
- // ? m_score : SCORE_NONE;
- return m_score;
- case DTMFilter.SHOW_PROCESSING_INSTRUCTION :
- return subPartMatch(dtm.getNodeName(context), m_name)
- ? m_score : SCORE_NONE;
-
- // From the draft: "Two expanded names are equal if they
- // have the same local part, and either both have no URI or
- // both have the same URI."
- // "A node test * is true for any node of the principal node type.
- // For example, child::* will select all element children of the
- // context node, and attribute::* will select all attributes of
- // the context node."
- // "A node test can have the form NCName:*. In this case, the prefix
- // is expanded in the same way as with a QName using the context
- // namespace declarations. The node test will be true for any node
- // of the principal type whose expanded name has the URI to which
- // the prefix expands, regardless of the local part of the name."
- case DTMFilter.SHOW_NAMESPACE :
- {
- String ns = dtm.getLocalName(context);
-
- return (subPartMatch(ns, m_name)) ? m_score : SCORE_NONE;
- }
- case DTMFilter.SHOW_ATTRIBUTE :
- case DTMFilter.SHOW_ELEMENT :
- {
- return (m_isTotallyWild || (subPartMatchNS(dtm.getNamespaceURI(context), m_namespace) && subPartMatch(dtm.getLocalName(context), m_name)))
- ? m_score : SCORE_NONE;
- }
- default :
- return SCORE_NONE;
- } // end switch(testType)
- }
-
- /**
- * Test the current node to see if it matches the given node test.
- *
- * @param xctxt XPath runtime context.
- *
- * @return {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NODETEST},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NONE},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_NSWILD},
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_QNAME}, or
- * {@link com.sun.org.apache.xpath.internal.patterns.NodeTest#SCORE_OTHER}.
- *
- * @throws javax.xml.transform.TransformerException
- */
- public XObject execute(XPathContext xctxt)
- throws javax.xml.transform.TransformerException
- {
- return execute(xctxt, xctxt.getCurrentNode());
- }
-
- /**
- * Node tests by themselves do not need to fix up variables.
- */
- public void fixupVariables(java.util.Vector vars, int globalsSize)
- {
- // no-op
- }
-
- /**
- * @see com.sun.org.apache.xpath.internal.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor)
- */
- public void callVisitors(ExpressionOwner owner, XPathVisitor visitor)
- {
- assertion(false, "callVisitors should not be called for this object!!!");
- }
-
-}