1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Licensed to the Apache Software Foundation (ASF) under one or more
7  * contributor license agreements.  See the NOTICE file distributed with
8  * this work for additional information regarding copyright ownership.
9  * The ASF licenses this file to You under the Apache License, Version 2.0
10  * (the "License"); you may not use this file except in compliance with
11  * the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 package com.sun.org.apache.xalan.internal.xsltc.dom;
23 
24 import com.sun.org.apache.xalan.internal.xsltc.DOM;
25 import com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary;
26 import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
27 import com.sun.org.apache.xml.internal.dtm.ref.DTMAxisIteratorBase;
28 
29 /**
30  * UnionIterator takes a set of NodeIterators and produces
31  * a merged NodeSet in document order with duplicates removed
32  * The individual iterators are supposed to generate nodes
33  * in document order
34  * @author Jacek Ambroziak
35  * @author Santiago Pericas-Geertsen
36  */
37 public final class UnionIterator extends MultiValuedNodeHeapIterator {
38     /** wrapper for NodeIterators to support iterator
39         comparison on the value of their next() method
40     */
41     final private DOM _dom;
42 
43     private final class LookAheadIterator
44             extends MultiValuedNodeHeapIterator.HeapNode
45     {
46         public DTMAxisIterator iterator;
47 
LookAheadIterator(DTMAxisIterator iterator)48         public LookAheadIterator(DTMAxisIterator iterator) {
49             super();
50             this.iterator = iterator;
51         }
52 
step()53         public int step() {
54             _node = iterator.next();
55             return _node;
56         }
57 
cloneHeapNode()58         public HeapNode cloneHeapNode() {
59             LookAheadIterator clone = (LookAheadIterator) super.cloneHeapNode();
60             clone.iterator = iterator.cloneIterator();
61             return clone;
62         }
63 
setMark()64         public void setMark() {
65             super.setMark();
66             iterator.setMark();
67         }
68 
gotoMark()69         public void gotoMark() {
70             super.gotoMark();
71             iterator.gotoMark();
72         }
73 
isLessThan(HeapNode heapNode)74         public boolean isLessThan(HeapNode heapNode) {
75             LookAheadIterator comparand = (LookAheadIterator) heapNode;
76             return _dom.lessThan(_node, heapNode._node);
77         }
78 
setStartNode(int node)79         public HeapNode setStartNode(int node) {
80             iterator.setStartNode(node);
81             return this;
82         }
83 
reset()84         public HeapNode reset() {
85             iterator.reset();
86             return this;
87         }
88     } // end of LookAheadIterator
89 
UnionIterator(DOM dom)90     public UnionIterator(DOM dom) {
91         _dom = dom;
92     }
93 
addIterator(DTMAxisIterator iterator)94     public UnionIterator addIterator(DTMAxisIterator iterator) {
95         addHeapNode(new LookAheadIterator(iterator));
96         return this;
97     }
98 }
99