001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: ForwardPositionIterator.java 468651 2006-10-28 07:04:25Z minchau $
020 */
021
022 package org.apache.xalan.xsltc.dom;
023
024 import org.apache.xalan.xsltc.runtime.BasisLibrary;
025 import org.apache.xml.dtm.DTMAxisIterator;
026 import org.apache.xml.dtm.ref.DTMAxisIteratorBase;
027
028 /**
029 * This iterator is a wrapper that always returns the position of
030 * a node in document order. It is needed for the case where
031 * a call to position() occurs in the context of an XSLT element
032 * such as xsl:for-each, xsl:apply-templates, etc.
033 *
034 * The getPosition() methods in DTMAxisIterators defined
035 * in DTMDefaultBaseIterators always return the position
036 * in document order, which is backwards for XPath in the
037 * case of the ancestor, ancestor-or-self, previous and
038 * previous-sibling.
039 *
040 * XSLTC implements position() with the
041 * BasisLibrary.positionF() method, and uses the
042 * DTMAxisIterator.isReverse() method to determine
043 * whether the result of getPosition() should be
044 * interpreted as being equal to position().
045 * But when the expression appears in apply-templates of
046 * for-each, the position() function operates in document
047 * order.
048 *
049 * The only effect of the ForwardPositionIterator is to force
050 * the result of isReverse() to false, so that
051 * BasisLibrary.positionF() calculates position() in a way
052 * that's consistent with the context in which the
053 * iterator is being used."
054 *
055 * (Apparently the correction of isReverse() occurs
056 * implicitly, by inheritance. This class also appears
057 * to maintain its own position counter, which seems
058 * redundant.)
059 *
060 * @deprecated This class exists only for backwards compatibility with old
061 * translets. New code should not reference it.
062 */
063 public final class ForwardPositionIterator extends DTMAxisIteratorBase {
064
065 private DTMAxisIterator _source;
066
067 public ForwardPositionIterator(DTMAxisIterator source) {
068 _source = source;
069 }
070
071 public DTMAxisIterator cloneIterator() {
072 try {
073 final ForwardPositionIterator clone =
074 (ForwardPositionIterator) super.clone();
075 clone._source = _source.cloneIterator();
076 clone._isRestartable = false;
077 return clone.reset();
078 }
079 catch (CloneNotSupportedException e) {
080 BasisLibrary.runTimeError(BasisLibrary.ITERATOR_CLONE_ERR,
081 e.toString());
082 return null;
083 }
084 }
085
086 public int next() {
087 return returnNode(_source.next());
088 }
089
090 public DTMAxisIterator setStartNode(int node) {
091 _source.setStartNode(node);
092 return this;
093 }
094
095 public DTMAxisIterator reset() {
096 _source.reset();
097 return resetPosition();
098 }
099
100 public void setMark() {
101 _source.setMark();
102 }
103
104 public void gotoMark() {
105 _source.gotoMark();
106 }
107 }