2 * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
3 * Copyright (C) 2006, Shawn O. Pearce <spearce@spearce.org>
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
11 * - Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
14 * - Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
19 * - Neither the name of the Git Development Community nor the
20 * names of its contributors may be used to endorse or promote
21 * products derived from this software without specific prior
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
25 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
26 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
36 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 package org
.spearce
.jgit
.lib
;
41 import java
.io
.IOException
;
42 import java
.util
.Iterator
;
45 * A tree iterator iterates over a tree and all its members recursing into
46 * subtrees according to order.
48 * Default is to only visit leafs. An {@link Order} value can be supplied to
49 * make the iteration include Tree nodes as well either before or after the
50 * child nodes have been visited.
52 public class TreeIterator
implements Iterator
<TreeEntry
> {
58 private TreeIterator sub
;
62 private boolean visitTreeNodes
;
64 private boolean hasVisitedTree
;
71 * Visit node first, then leaves
76 * Visit leaves first, then node
82 * Construct a {@link TreeIterator} for visiting all non-tree nodes.
86 public TreeIterator(Tree start
) {
87 this(start
, Order
.PREORDER
, false);
91 * Construct a {@link TreeIterator} visiting all nodes in a tree in a given
94 * @param start Root node
95 * @param order {@link Order}
97 public TreeIterator(Tree start
, Order order
) {
98 this(start
, order
, true);
102 * Construct a {@link TreeIterator}
104 * @param start First node to visit
105 * @param order Visitation {@link Order}
106 * @param visitTreeNode True to include tree node
108 private TreeIterator(Tree start
, Order order
, boolean visitTreeNode
) {
110 this.visitTreeNodes
= visitTreeNode
;
114 this.hasVisitedTree
= true;
117 } catch (IOException e
) {
122 public TreeEntry
next() {
124 TreeEntry ret
= nextTreeEntry();
127 } catch (IOException e
) {
132 private TreeEntry
nextTreeEntry() throws IOException
{
135 ret
= sub
.nextTreeEntry();
137 if (index
< 0 && order
== Order
.PREORDER
) {
140 if (order
== Order
.POSTORDER
&& index
== tree
.memberCount()) {
143 ret
= tree
.members()[index
];
148 public boolean hasNext() {
150 return hasNextTreeEntry();
151 } catch (IOException e
) {
156 private boolean hasNextTreeEntry() throws IOException
{
160 || index
< tree
.memberCount()
161 || order
== Order
.POSTORDER
&& index
== tree
.memberCount();
164 private boolean step() throws IOException
{
174 if (index
< 0 && !hasVisitedTree
&& order
== Order
.PREORDER
) {
175 hasVisitedTree
= true;
179 while (++index
< tree
.memberCount()) {
180 TreeEntry e
= tree
.members()[index
];
181 if (e
instanceof Tree
) {
182 sub
= new TreeIterator((Tree
) e
, order
, visitTreeNodes
);
183 if (sub
.hasNextTreeEntry())
191 if (index
== tree
.memberCount() && !hasVisitedTree
192 && order
== Order
.POSTORDER
) {
193 hasVisitedTree
= true;
199 public void remove() {
200 throw new IllegalStateException(
201 "TreeIterator does not suppport remove()");