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: AbsoluteIterator.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 import org.apache.xml.dtm.ref.DTMDefaultBase; 028 029 /** 030 * Absolute iterators ignore the node that is passed to setStartNode(). 031 * Instead, they always start from the root node. The node passed to 032 * setStartNode() is not totally useless, though. It is needed to obtain the 033 * DOM mask, i.e. the index into the MultiDOM table that corresponds to the 034 * DOM "owning" the node. 035 * 036 * The DOM mask is cached, so successive calls to setStartNode() passing 037 * nodes from other DOMs will have no effect (i.e. this iterator cannot 038 * migrate between DOMs). 039 * @author Jacek Ambroziak 040 * @author Santiago Pericas-Geertsen 041 */ 042 public final class AbsoluteIterator extends DTMAxisIteratorBase { 043 044 /** 045 * Source for this iterator. 046 */ 047 private DTMAxisIterator _source; 048 049 public AbsoluteIterator(DTMAxisIterator source) { 050 _source = source; 051 // System.out.println("AI source = " + source + " this = " + this); 052 } 053 054 public void setRestartable(boolean isRestartable) { 055 _isRestartable = isRestartable; 056 _source.setRestartable(isRestartable); 057 } 058 059 public DTMAxisIterator setStartNode(int node) { 060 _startNode = DTMDefaultBase.ROOTNODE; 061 if (_isRestartable) { 062 _source.setStartNode(_startNode); 063 resetPosition(); 064 } 065 return this; 066 } 067 068 public int next() { 069 return returnNode(_source.next()); 070 } 071 072 public DTMAxisIterator cloneIterator() { 073 try { 074 final AbsoluteIterator clone = (AbsoluteIterator) super.clone(); 075 clone._source = _source.cloneIterator(); // resets source 076 clone.resetPosition(); 077 clone._isRestartable = false; 078 return clone; 079 } 080 catch (CloneNotSupportedException e) { 081 BasisLibrary.runTimeError(BasisLibrary.ITERATOR_CLONE_ERR, 082 e.toString()); 083 return null; 084 } 085 } 086 087 public DTMAxisIterator reset() { 088 _source.reset(); 089 return resetPosition(); 090 } 091 092 public void setMark() { 093 _source.setMark(); 094 } 095 096 public void gotoMark() { 097 _source.gotoMark(); 098 } 099 }