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: UnionIterator.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.DOM;
025 import org.apache.xalan.xsltc.runtime.BasisLibrary;
026 import org.apache.xml.dtm.DTMAxisIterator;
027 import org.apache.xml.dtm.ref.DTMAxisIteratorBase;
028
029 /**
030 * UnionIterator takes a set of NodeIterators and produces
031 * a merged NodeSet in document order with duplicates removed
032 * The individual iterators are supposed to generate nodes
033 * in document order
034 * @author Jacek Ambroziak
035 * @author Santiago Pericas-Geertsen
036 */
037 public final class UnionIterator extends MultiValuedNodeHeapIterator {
038 /** wrapper for NodeIterators to support iterator
039 comparison on the value of their next() method
040 */
041 final private DOM _dom;
042
043 private final class LookAheadIterator
044 extends MultiValuedNodeHeapIterator.HeapNode
045 {
046 public DTMAxisIterator iterator;
047
048 public LookAheadIterator(DTMAxisIterator iterator) {
049 super();
050 this.iterator = iterator;
051 }
052
053 public int step() {
054 _node = iterator.next();
055 return _node;
056 }
057
058 public HeapNode cloneHeapNode() {
059 LookAheadIterator clone = (LookAheadIterator) super.cloneHeapNode();
060 clone.iterator = iterator.cloneIterator();
061 return clone;
062 }
063
064 public void setMark() {
065 super.setMark();
066 iterator.setMark();
067 }
068
069 public void gotoMark() {
070 super.gotoMark();
071 iterator.gotoMark();
072 }
073
074 public boolean isLessThan(HeapNode heapNode) {
075 LookAheadIterator comparand = (LookAheadIterator) heapNode;
076 return _dom.lessThan(_node, heapNode._node);
077 }
078
079 public HeapNode setStartNode(int node) {
080 iterator.setStartNode(node);
081 return this;
082 }
083
084 public HeapNode reset() {
085 iterator.reset();
086 return this;
087 }
088 } // end of LookAheadIterator
089
090 public UnionIterator(DOM dom) {
091 _dom = dom;
092 }
093
094 public UnionIterator addIterator(DTMAxisIterator iterator) {
095 addHeapNode(new LookAheadIterator(iterator));
096 return this;
097 }
098 }