19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License. 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License. 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: StepPattern.java 468655 2006-10-28 07:12:06Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.patterns; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.Axis; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTM; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMAxisTraverser; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.dtm.DTMFilter; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.Expression; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExpressionOwner; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathVisitor; 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.axes.SubContextList; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.PsuedoNames; 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class represents a single pattern match step. 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class StepPattern extends NodeTest implements SubContextList, ExpressionOwner 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final long serialVersionUID = 9071668960168152644L; 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The axis for this test. */ 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected int m_axis; 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Construct a StepPattern that tests for namespaces and node names. 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}. 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param namespace The namespace to be tested. 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param name The local name to be tested. 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc. 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param axisForPredicate No longer used. 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StepPattern(int whatToShow, String namespace, String name, int axis, 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int axisForPredicate) 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(whatToShow, namespace, name); 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_axis = axis; 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Construct a StepPattern that doesn't test for node names. 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param whatToShow Bit set defined mainly by {@link org.w3c.dom.traversal.NodeFilter}. 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc. 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param axisForPredicate No longer used. 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StepPattern(int whatToShow, int axis, int axisForPredicate) 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(whatToShow); 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_axis = axis; 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The target local name or psuedo name, for hash table lookup optimization. 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String m_targetString; // only calculate on head 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Calculate the local name or psuedo name of the node that this pattern will test, 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for hash table lookup optimization. 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.apache.xpath.compiler.PsuedoNames 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void calcTargetString() 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int whatToShow = getWhatToShow(); 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson switch (whatToShow) 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case DTMFilter.SHOW_COMMENT : 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_targetString = PsuedoNames.PSEUDONAME_COMMENT; 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case DTMFilter.SHOW_TEXT : 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case DTMFilter.SHOW_CDATA_SECTION : 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case (DTMFilter.SHOW_TEXT | DTMFilter.SHOW_CDATA_SECTION) : 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_targetString = PsuedoNames.PSEUDONAME_TEXT; 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case DTMFilter.SHOW_ALL : 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_targetString = PsuedoNames.PSEUDONAME_ANY; 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case DTMFilter.SHOW_DOCUMENT : 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT : 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_targetString = PsuedoNames.PSEUDONAME_ROOT; 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson case DTMFilter.SHOW_ELEMENT : 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (this.WILD == m_name) 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_targetString = PsuedoNames.PSEUDONAME_ANY; 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_targetString = m_name; 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson default : 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_targetString = PsuedoNames.PSEUDONAME_ANY; 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the local name or psuedo name of the node that this pattern will test, 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for hash table lookup optimization. 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return local name or psuedo name of the node. 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.apache.xpath.compiler.PsuedoNames 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getTargetString() 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_targetString; 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Reference to nodetest and predicate for 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * parent or ancestor. 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StepPattern m_relativePathPattern; 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This function is used to fixup variables from QNames to stack frame 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * indexes at stylesheet build time. 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param vars List of QNames that correspond to variables. This list 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * should be searched backwards for the first qualified name that 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * corresponds to the variable reference qname. The position of the 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * QName in the vector from the start of the vector will be its position 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * in the stack frame (but variables above the globalsTop value will need 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to be offset to the current stack frame). 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param globalsSize The number of variables in the global variable area. 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void fixupVariables(java.util.Vector vars, int globalsSize) 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.fixupVariables(vars, globalsSize); 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_predicates) 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < m_predicates.length; i++) 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_predicates[i].fixupVariables(vars, globalsSize); 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_relativePathPattern) 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_relativePathPattern.fixupVariables(vars, globalsSize); 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the reference to nodetest and predicate for 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * parent or ancestor. 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param expr The relative pattern expression. 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setRelativePathPattern(StepPattern expr) 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_relativePathPattern = expr; 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson expr.exprSetParent(this); 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson calcScore(); 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the reference to nodetest and predicate for 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * parent or ancestor. 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The relative pattern expression. 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StepPattern getRelativePathPattern() 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_relativePathPattern; 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // /** 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // * Set the list of predicate expressions for this pattern step. 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // * @param predicates List of expression objects. 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // */ 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // public void setPredicates(Expression[] predicates) 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // { 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // m_predicates = predicates; 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // } 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the list of predicate expressions for this pattern step. 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return List of expression objects. 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Expression[] getPredicates() 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_predicates; 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The list of predicate expressions for this pattern step. 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Expression[] m_predicates; 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this expression or it's subexpressions can traverse outside 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the current subtree. 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * NOTE: Ancestors tests with predicates are problematic, and will require 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * special treatment. 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if traversal outside the context node's subtree can occur. 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean canTraverseOutsideSubtree() 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = getPredicateCount(); 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (getPredicate(i).canTraverseOutsideSubtree()) 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get a predicate expression. 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param i The index of the predicate. 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A predicate expression. 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Expression getPredicate(int i) 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_predicates[i]; 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the number of predicates for this match pattern step. 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the number of predicates for this match pattern step. 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public final int getPredicateCount() 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null == m_predicates) ? 0 : m_predicates.length; 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the predicates for this match pattern step. 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param predicates An array of expressions that define predicates 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for this step. 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setPredicates(Expression[] predicates) 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_predicates = predicates; 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != predicates) 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for(int i = 0; i < predicates.length; i++) 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson predicates[i].exprSetParent(this); 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson calcScore(); 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Static calc of match score. 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void calcScore() 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((getPredicateCount() > 0) || (null != m_relativePathPattern)) 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_score = SCORE_OTHER; 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.calcScore(); 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_targetString) 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson calcTargetString(); 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute this pattern step, including predicates. 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt XPath runtime context. 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param currentNode The current node context. 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST}, 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE}, 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD}, 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}. 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XObject execute(XPathContext xctxt, int currentNode) 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM dtm = xctxt.getDTM(currentNode); 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (dtm != null) 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int expType = dtm.getExpandedTypeID(currentNode); 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return execute(xctxt, currentNode, dtm, expType); 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return NodeTest.SCORE_NONE; 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute this pattern step, including predicates. 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt XPath runtime context. 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST}, 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE}, 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD}, 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}. 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XObject execute(XPathContext xctxt) 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return execute(xctxt, xctxt.getCurrentNode()); 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute an expression in the XPath runtime context, and return the 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * result of the expression. 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt The XPath runtime context. 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param currentNode The currentNode. 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param dtm The DTM of the current node. 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param expType The expanded type ID of the current node. 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The result of the expression in the form of a <code>XObject</code>. 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException if a runtime exception 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * occurs. 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public XObject execute( 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPathContext xctxt, int currentNode, DTM dtm, int expType) 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_whatToShow == NodeTest.SHOW_BYFUNCTION) 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_relativePathPattern) 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_relativePathPattern.execute(xctxt); 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return NodeTest.SCORE_NONE; 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XObject score; 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson score = super.execute(xctxt, currentNode, dtm, expType); 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (score == NodeTest.SCORE_NONE) 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return NodeTest.SCORE_NONE; 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (getPredicateCount() != 0) 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!executePredicates(xctxt, dtm, currentNode)) 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return NodeTest.SCORE_NONE; 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_relativePathPattern) 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_relativePathPattern.executeRelativePathPattern(xctxt, dtm, 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson currentNode); 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return score; 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * New Method to check whether the current node satisfies a position predicate 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt The XPath runtime context. 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param predPos Which predicate we're evaluating of foo[1][2][3]. 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param dtm The DTM of the current node. 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param context The currentNode. 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param pos The position being requested, i.e. the value returned by 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * m_predicates[predPos].execute(xctxt). 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true of the position of the context matches pos, false otherwise. 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private final boolean checkProximityPosition(XPathContext xctxt, 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int predPos, DTM dtm, int context, int pos) 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTMAxisTraverser traverser = 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson dtm.getAxisTraverser(Axis.PRECEDINGSIBLING); 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int child = traverser.first(context); DTM.NULL != child; 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson child = traverser.next(context, child)) 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentNode(child); 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (NodeTest.SCORE_NONE != super.execute(xctxt, child)) 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean pass = true; 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushSubContextList(this); 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < predPos; i++) 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushPredicatePos(i); 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XObject pred = m_predicates[i].execute(xctxt); 4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (XObject.CLASS_NUMBER == pred.getType()) 4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new Error("Why: Should never have been called"); 4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (!pred.boolWithSideEffects()) 4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pass = false; 4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pred.detach(); 4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popPredicatePos(); 4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popSubContextList(); 4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (pass) 4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pos--; 4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (pos < 1) 4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentNode(); 4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (javax.xml.transform.TransformerException se) 5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // TODO: should keep throw sax exception... 5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new java.lang.RuntimeException(se.getMessage()); 5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (pos == 1); 5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the proximity position index of the current node based on this 5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * node test. 5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt XPath runtime context. 5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param predPos Which predicate we're evaluating of foo[1][2][3]. 5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param findLast If true, don't terminate when the context node is found. 5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the proximity position index of the current node based on the 5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * node test. 5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private final int getProximityPosition(XPathContext xctxt, int predPos, 5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean findLast) 5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int pos = 0; 5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int context = xctxt.getCurrentNode(); 5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTM dtm = xctxt.getDTM(context); 5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int parent = dtm.getParent(context); 5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTMAxisTraverser traverser = dtm.getAxisTraverser(Axis.CHILD); 5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int child = traverser.first(parent); DTM.NULL != child; 5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson child = traverser.next(parent, child)) 5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentNode(child); 5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (NodeTest.SCORE_NONE != super.execute(xctxt, child)) 5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean pass = true; 5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushSubContextList(this); 5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < predPos; i++) 5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushPredicatePos(i); 5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XObject pred = m_predicates[i].execute(xctxt); 5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (XObject.CLASS_NUMBER == pred.getType()) 5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((pos + 1) != (int) pred.numWithSideEffects()) 5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pass = false; 5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (!pred.boolWithSideEffects()) 5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pass = false; 5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pred.detach(); 5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popPredicatePos(); 5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popSubContextList(); 5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (pass) 5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pos++; 5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!findLast && child == context) 5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return pos; 5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentNode(); 6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (javax.xml.transform.TransformerException se) 6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // TODO: should keep throw sax exception... 6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new java.lang.RuntimeException(se.getMessage()); 6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return pos; 6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the proximity position index of the current node based on this 6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * node test. 6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt XPath runtime context. 6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the proximity position index of the current node based on the 6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * node test. 6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getProximityPosition(XPathContext xctxt) 6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getProximityPosition(xctxt, xctxt.getPredicatePos(), false); 6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the count of the nodes that match the test, which is the proximity 6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * position of the last node that can pass this test in the sub context 6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * selection. In XSLT 1-based indexing, this count is the index of the last 6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * node. 6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt XPath runtime context. 6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the count of the nodes that match the test. 6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getLastPos(XPathContext xctxt) 6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getProximityPosition(xctxt, xctxt.getPredicatePos(), true); 6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute the match pattern step relative to another step. 6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt The XPath runtime context. 6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param dtm The DTM of the current node. 6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param currentNode The current node context. 6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST}, 6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE}, 6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD}, 6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or 6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}. 6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected final XObject executeRelativePathPattern( 6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPathContext xctxt, DTM dtm, int currentNode) 6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XObject score = NodeTest.SCORE_NONE; 6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int context = currentNode; 6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson DTMAxisTraverser traverser; 6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson traverser = dtm.getAxisTraverser(m_axis); 6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int relative = traverser.first(context); DTM.NULL != relative; 6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson relative = traverser.next(context, relative)) 6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentNode(relative); 6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson score = execute(xctxt); 6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (score != NodeTest.SCORE_NONE) 6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentNode(); 6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return score; 6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute the predicates on this step to determine if the current node 6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * should be filtered or accepted. 6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt The XPath runtime context. 7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param dtm The DTM of the current node. 7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param currentNode The current node context. 7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the node should be accepted, false otherwise. 7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected final boolean executePredicates( 7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XPathContext xctxt, DTM dtm, int currentNode) 7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean result = true; 7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean positionAlreadySeen = false; 7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = getPredicateCount(); 7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushSubContextList(this); 7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushPredicatePos(i); 7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XObject pred = m_predicates[i].execute(xctxt); 7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (XObject.CLASS_NUMBER == pred.getType()) 7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int pos = (int) pred.num(); 7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (positionAlreadySeen) 7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson result = (pos == 1); 7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson positionAlreadySeen = true; 7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!checkProximityPosition(xctxt, i, dtm, currentNode, pos)) 7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson result = false; 7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (!pred.boolWithSideEffects()) 7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson result = false; 7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson pred.detach(); 7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popPredicatePos(); 7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popSubContextList(); 7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return result; 7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the string represenentation of this step for diagnostic purposes. 7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A string representation of this step, built by reverse-engineering 7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the contained info. 7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String toString() 7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StringBuffer buf = new StringBuffer(); 7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (StepPattern pat = this; pat != null; pat = pat.m_relativePathPattern) 7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (pat != this) 7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("/"); 7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(Axis.getNames(pat.m_axis)); 7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("::"); 7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (0x000005000 == pat.m_whatToShow) 8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("doc()"); 8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (DTMFilter.SHOW_BYFUNCTION == pat.m_whatToShow) 8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("function()"); 8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (DTMFilter.SHOW_ALL == pat.m_whatToShow) 8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("node()"); 8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (DTMFilter.SHOW_TEXT == pat.m_whatToShow) 8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("text()"); 8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (DTMFilter.SHOW_PROCESSING_INSTRUCTION == pat.m_whatToShow) 8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("processing-instruction("); 8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != pat.m_name) 8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(pat.m_name); 8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(")"); 8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (DTMFilter.SHOW_COMMENT == pat.m_whatToShow) 8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("comment()"); 8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (null != pat.m_name) 8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (DTMFilter.SHOW_ATTRIBUTE == pat.m_whatToShow) 8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("@"); 8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != pat.m_namespace) 8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("{"); 8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(pat.m_namespace); 8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("}"); 8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(pat.m_name); 8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (DTMFilter.SHOW_ATTRIBUTE == pat.m_whatToShow) 8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("@"); 8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if ((DTMFilter.SHOW_DOCUMENT | DTMFilter.SHOW_DOCUMENT_FRAGMENT) 8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson == pat.m_whatToShow) 8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("doc-root()"); 8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("?" + Integer.toHexString(pat.m_whatToShow)); 8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != pat.m_predicates) 8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < pat.m_predicates.length; i++) 8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("["); 8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append(pat.m_predicates[i]); 8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson buf.append("]"); 8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return buf.toString(); 8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Set to true to send diagnostics about pattern matches to the consol. */ 8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private static final boolean DEBUG_MATCHES = false; 8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the match score of the given node. 8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param xctxt The XPath runtime context. 8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param context The node to be tested. 8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST}, 8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE}, 8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD}, 8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or 8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}. 8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public double getMatchScore(XPathContext xctxt, int context) 8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentNode(context); 8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentExpressionNode(context); 8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XObject score = execute(xctxt); 9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return score.num(); 9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentNode(); 9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentExpressionNode(); 9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // return XPath.MATCH_SCORE_NONE; 9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the axis that this step should follow. 9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param axis The Axis for this test, one of of Axes.ANCESTORORSELF, etc. 9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setAxis(int axis) 9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_axis = axis; 9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the axis that this step follows. 9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The Axis for this test, one of of Axes.ANCESTORORSELF, etc. 9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getAxis() 9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_axis; 9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson class PredOwner implements ExpressionOwner 9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int m_index; 9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson PredOwner(int index) 9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_index = index; 9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExpressionOwner#getExpression() 9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Expression getExpression() 9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_predicates[m_index]; 9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExpressionOwner#setExpression(Expression) 9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setExpression(Expression exp) 9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exp.exprSetParent(StepPattern.this); 9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_predicates[m_index] = exp; 9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.apache.xpath.XPathVisitable#callVisitors(ExpressionOwner, XPathVisitor) 9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void callVisitors(ExpressionOwner owner, XPathVisitor visitor) 9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(visitor.visitMatchPattern(owner, this)) 9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson callSubtreeVisitors(visitor); 9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Call the visitors on the subtree. Factored out from callVisitors 9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * so it may be called by derived classes. 9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void callSubtreeVisitors(XPathVisitor visitor) 9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_predicates) 9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_predicates.length; 9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ExpressionOwner predOwner = new PredOwner(i); 9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (visitor.visitPredicate(predOwner, m_predicates[i])) 9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_predicates[i].callVisitors(predOwner, visitor); 9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_relativePathPattern) 9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_relativePathPattern.callVisitors(this, visitor); 9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExpressionOwner#getExpression() 10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Expression getExpression() 10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_relativePathPattern; 10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see ExpressionOwner#setExpression(Expression) 10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setExpression(Expression exp) 10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson exp.exprSetParent(this); 10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_relativePathPattern = (StepPattern)exp; 10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Expression#deepEquals(Expression) 10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean deepEquals(Expression expr) 10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(!super.deepEquals(expr)) 10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StepPattern sp = (StepPattern)expr; 10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_predicates) 10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_predicates.length; 10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if ((null == sp.m_predicates) || (sp.m_predicates.length != n)) 10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!m_predicates[i].deepEquals(sp.m_predicates[i])) 10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (null != sp.m_predicates) 10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != m_relativePathPattern) 10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(!m_relativePathPattern.deepEquals(sp.m_relativePathPattern)) 10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if(sp.m_relativePathPattern != null) 10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 1054