14c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 24c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 34c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * or more contributor license agreements. See the NOTICE file 44c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed with this work for additional information 54c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * regarding copyright ownership. The ASF licenses this file 64c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 74c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * you may not use this file except in compliance with the License. 84c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * You may obtain a copy of the License at 94c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Unless required by applicable law or agreed to in writing, software 134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * See the License for the specific language governing permissions and 164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * limitations under the License. 174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/* 194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * $Id: OneStepIteratorForward.java 469314 2006-10-30 23:31:59Z minchau $ 204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpackage org.apache.xpath.axes; 224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.dtm.DTM; 244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xml.dtm.DTMFilter; 254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.Expression; 264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.compiler.Compiler; 274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonimport org.apache.xpath.compiler.OpMap; 284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson/** 304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * This class implements a general iterator for 314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * those LocationSteps with only one step, and perhaps a predicate, 324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * that only go forward (i.e. it can not be used with ancestors, 334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * preceding, etc.) 344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @see org.apache.xpath.axes#ChildTestIterator 354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @xsl.usage advanced 364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilsonpublic class OneStepIteratorForward extends ChildTestIterator 384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson{ 394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson static final long serialVersionUID = -1576936606178190566L; 404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** The traversal axis from where the nodes will be filtered. */ 414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected int m_axis = -1; 424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Create a OneStepIterator object. 454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param compiler A reference to the Compiler that contains the op map. 474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param opPos The position within the op map, which contains the 484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * location path expression for this itterator. 494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @throws javax.xml.transform.TransformerException 514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson OneStepIteratorForward(Compiler compiler, int opPos, int analysis) 534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson throws javax.xml.transform.TransformerException 544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super(compiler, opPos, analysis); 564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int firstStepPos = OpMap.getFirstChildPos(opPos); 574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_axis = WalkerFactory.getAxisFromStep(compiler, firstStepPos); 594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Create a OneStepIterator object that will just traverse the self axes. 644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param axis One of the org.apache.xml.dtm.Axis integers. 664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @throws javax.xml.transform.TransformerException 684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public OneStepIteratorForward(int axis) 704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super(null); 724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 734c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_axis = axis; 744c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson int whatToShow = DTMFilter.SHOW_ALL; 754c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson initNodeTest(whatToShow); 764c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 774c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 784c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 794c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 804c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 814c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 824c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Initialize the context values for this expression 834c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * after it is cloned. 844c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 854c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @param context The XPath runtime context for this 864c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * transformation. 874c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 884c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public void setRoot(int context, Object environment) 894c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 904c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson super.setRoot(context, environment); 914c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_traverser = m_cdtm.getAxisTraverser(m_axis); 924c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 934c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 944c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 954c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// /** 964c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// * Return the first node out of the nodeset, if this expression is 974c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// * a nodeset expression. This is the default implementation for 984c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// * nodesets. 994c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// * <p>WARNING: Do not mutate this class from this function!</p> 1004c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// * @param xctxt The XPath runtime context. 1014c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// * @return the first node out of the nodeset, or DTM.NULL. 1024c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// */ 1034c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// public int asNode(XPathContext xctxt) 1044c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// throws javax.xml.transform.TransformerException 1054c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// { 1064c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// if(getPredicateCount() > 0) 1074c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// return super.asNode(xctxt); 1084c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// 1094c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// int current = xctxt.getCurrentNode(); 1104c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// 1114c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// DTM dtm = xctxt.getDTM(current); 1124c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// DTMAxisTraverser traverser = dtm.getAxisTraverser(m_axis); 1134c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// 1144c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// String localName = getLocalName(); 1154c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// String namespace = getNamespace(); 1164c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// int what = m_whatToShow; 1174c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// 1184c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// // System.out.println("what: "); 1194c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// // NodeTest.debugWhatToShow(what); 1204c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// if(DTMFilter.SHOW_ALL == what 1214c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// || ((DTMFilter.SHOW_ELEMENT & what) == 0) 1224c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// || localName == NodeTest.WILD 1234c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// || namespace == NodeTest.WILD) 1244c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// { 1254c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// return traverser.first(current); 1264c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// } 1274c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// else 1284c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// { 1294c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// int type = getNodeTypeTest(what); 1304c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// int extendedType = dtm.getExpandedTypeID(namespace, localName, type); 1314c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// return traverser.first(current, extendedType); 1324c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// } 1334c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson// } 1344c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1354c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1364c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Get the next node via getFirstAttribute && getNextAttribute. 1374c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1384c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson protected int getNextNode() 1394c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1404c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson m_lastFetched = (DTM.NULL == m_lastFetched) 1414c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson ? m_traverser.first(m_context) 1424c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson : m_traverser.next(m_context, m_lastFetched); 1434c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return m_lastFetched; 1444c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1454c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1464c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1474c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * Returns the axis being iterated, if it is known. 1484c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * 1494c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @return Axis.CHILD, etc., or -1 if the axis is not known or is of multiple 1504c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * types. 1514c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1524c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public int getAxis() 1534c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1544c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return m_axis; 1554c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1564c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1574c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson /** 1584c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson * @see Expression#deepEquals(Expression) 1594c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson */ 1604c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson public boolean deepEquals(Expression expr) 1614c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson { 1624c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if(!super.deepEquals(expr)) 1634c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return false; 1644c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1654c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson if(m_axis != ((OneStepIteratorForward)expr).m_axis) 1664c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return false; 1674c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1684c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson return true; 1694c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson } 1704c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1714c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson 1724c7a0d97cf2b27790e6236965a1d798d710d7ec7Jesse Wilson} 173