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: MatchPatternIterator.java 469314 2006-10-30 23:31:59Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xpath.axes; 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.DTMIterator; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext; 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.Compiler; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.compiler.OpMap; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.objects.XObject; 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.patterns.NodeTest; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.patterns.StepPattern; 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class treats a 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <a href="http://www.w3.org/TR/xpath#location-paths">LocationPath</a> as a 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * filtered iteration over the tree, evaluating each node in a super axis 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * traversal against the LocationPath interpreted as a match pattern. This 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * class is useful to find nodes in document order that are complex paths 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * whose steps probably criss-cross each other. 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class MatchPatternIterator extends LocPathIterator 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final long serialVersionUID = -5201153767396296474L; 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** This is the select pattern, translated into a match pattern. */ 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected StepPattern m_pattern; 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The traversal axis from where the nodes will be filtered. */ 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected int m_superAxis = -1; 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The DTM inner traversal class, that corresponds to the super axis. */ 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected DTMAxisTraverser m_traverser; 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** DEBUG flag for diagnostic dumps. */ 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private static final boolean DEBUG = false; 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// protected int m_nsElemBase = DTM.NULL; 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Create a LocPathIterator object, including creation 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of step walkers from the opcode list, and call back 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * into the Compiler to create predicate expressions. 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param compiler The Compiler which is creating 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this expression. 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param opPos The position of this iterator in the 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * opcode list from the compiler. 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param analysis Analysis bits that give general information about the 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * LocationPath. 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws javax.xml.transform.TransformerException 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson MatchPatternIterator(Compiler compiler, int opPos, int analysis) 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws javax.xml.transform.TransformerException 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super(compiler, opPos, analysis, false); 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int firstStepPos = OpMap.getFirstChildPos(opPos); 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_pattern = WalkerFactory.loadSteps(this, compiler, firstStepPos, 0); 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean fromRoot = false; 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean walkBack = false; 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean walkDescendants = false; 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean walkAttributes = false; 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (0 != (analysis & (WalkerFactory.BIT_ROOT | 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson WalkerFactory.BIT_ANY_DESCENDANT_FROM_ROOT))) 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson fromRoot = true; 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (0 != (analysis 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson & (WalkerFactory.BIT_ANCESTOR 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson | WalkerFactory.BIT_ANCESTOR_OR_SELF 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson | WalkerFactory.BIT_PRECEDING 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson | WalkerFactory.BIT_PRECEDING_SIBLING 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson | WalkerFactory.BIT_FOLLOWING 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson | WalkerFactory.BIT_FOLLOWING_SIBLING 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson | WalkerFactory.BIT_PARENT | WalkerFactory.BIT_FILTER))) 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson walkBack = true; 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (0 != (analysis 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson & (WalkerFactory.BIT_DESCENDANT_OR_SELF 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson | WalkerFactory.BIT_DESCENDANT 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson | WalkerFactory.BIT_CHILD))) 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson walkDescendants = true; 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (0 != (analysis 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson & (WalkerFactory.BIT_ATTRIBUTE | WalkerFactory.BIT_NAMESPACE))) 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson walkAttributes = true; 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(false || DEBUG) 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.print("analysis: "+Integer.toBinaryString(analysis)); 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println(", "+WalkerFactory.getAnalysisString(analysis)); 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(fromRoot || walkBack) 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(walkAttributes) 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_superAxis = Axis.ALL; 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_superAxis = Axis.DESCENDANTSFROMROOT; 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if(walkDescendants) 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(walkAttributes) 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_superAxis = Axis.ALLFROMNODE; 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_superAxis = Axis.DESCENDANTORSELF; 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_superAxis = Axis.ALL; 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(false || DEBUG) 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("axis: "+Axis.getNames(m_superAxis)); 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Initialize the context values for this expression 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * after it is cloned. 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param context The XPath runtime context for this 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * transformation. 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setRoot(int context, Object environment) 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.setRoot(context, environment); 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_traverser = m_cdtm.getAxisTraverser(m_superAxis); 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Detaches the iterator from the set which it iterated over, releasing 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * any computational resources and placing the iterator in the INVALID 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * state. After<code>detach</code> has been invoked, calls to 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>nextNode</code> or<code>previousNode</code> will raise the 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * exception INVALID_STATE_ERR. 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void detach() 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(m_allowDetach) 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_traverser = null; 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Always call the superclass detach last! 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson super.detach(); 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the next node via getNextXXX. Bottlenecked for derived class override. 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The next node on the axis, or DTM.NULL. 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected int getNextNode() 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lastFetched = (DTM.NULL == m_lastFetched) 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ? m_traverser.first(m_context) 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson : m_traverser.next(m_context, m_lastFetched); 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_lastFetched; 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns the next node in the set and advances the position of the 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * iterator in the set. After a NodeIterator is created, the first call 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to nextNode() returns the first node in the set. 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The next <code>Node</code> in the set being iterated over, or 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <code>null</code> if there are no more members in that set. 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int nextNode() 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(m_foundLast) 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return DTM.NULL; 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int next; 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson org.apache.xpath.VariableStack vars; 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int savedStart; 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (-1 != m_stackFrame) 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson vars = m_execContext.getVarStack(); 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // These three statements need to be combined into one operation. 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson savedStart = vars.getStackFrame(); 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson vars.setStackFrame(m_stackFrame); 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Yuck. Just to shut up the compiler! 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson vars = null; 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson savedStart = 0; 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(DEBUG) 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("m_pattern"+m_pattern.toString()); 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson do 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson next = getNextNode(); 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (DTM.NULL != next) 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(DTMIterator.FILTER_ACCEPT == acceptNode(next, m_execContext)) 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson continue; 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson break; 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (next != DTM.NULL); 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (DTM.NULL != next) 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(DEBUG) 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("next: "+next); 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("name: "+m_cdtm.getNodeName(next)); 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson incrementCurrentPos(); 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return next; 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_foundLast = true; 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return DTM.NULL; 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (-1 != m_stackFrame) 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // These two statements need to be combined into one operation. 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson vars.setStackFrame(savedStart); 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Test whether a specified node is visible in the logical view of a 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TreeWalker or NodeIterator. This function will be called by the 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * implementation of TreeWalker and NodeIterator; it is not intended to 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * be called directly from user code. 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param n The node to check to see if it passes the filter or not. 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return a constant to determine whether the node is accepted, 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * rejected, or skipped, as defined above . 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public short acceptNode(int n, XPathContext xctxt) 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushCurrentNode(n); 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.pushIteratorRoot(m_context); 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(DEBUG) 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("traverser: "+m_traverser); 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.print("node: "+n); 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println(", "+m_cdtm.getNodeName(n)); 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // if(m_cdtm.getNodeName(n).equals("near-east")) 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("pattern: "+m_pattern.toString()); 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_pattern.debugWhatToShow(m_pattern.getWhatToShow()); 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XObject score = m_pattern.execute(xctxt); 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(DEBUG) 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("analysis: "+Integer.toBinaryString(m_analysis)); 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("score: "+score); 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson System.out.println("skip: "+(score == NodeTest.SCORE_NONE)); 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("\n::acceptNode - score: "+score.num()+"::"); 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (score == NodeTest.SCORE_NONE) ? DTMIterator.FILTER_SKIP 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson : DTMIterator.FILTER_ACCEPT; 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch (javax.xml.transform.TransformerException se) 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // TODO: Fix this. 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new RuntimeException(se.getMessage()); 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson finally 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popCurrentNode(); 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson xctxt.popIteratorRoot(); 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 332