1e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera/*
2e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
3e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *
5e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * This code is free software; you can redistribute it and/or modify it
6e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * under the terms of the GNU General Public License version 2 only, as
7e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * published by the Free Software Foundation.  Oracle designates this
8e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * particular file as subject to the "Classpath" exception as provided
9e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * by Oracle in the LICENSE file that accompanied this code.
10e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *
11e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * This code is distributed in the hope that it will be useful, but WITHOUT
12e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * version 2 for more details (a copy is included in the LICENSE file that
15e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * accompanied this code).
16e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *
17e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * You should have received a copy of the GNU General Public License version
18e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * 2 along with this work; if not, write to the Free Software Foundation,
19e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *
21e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * or visit www.oracle.com if you need additional information or have any
23e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * questions.
24e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera */
25e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
26e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmerapackage java.nio.file;
27e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
28e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.io.Closeable;
29e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.io.IOException;
30e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.io.UncheckedIOException;
31e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.util.Arrays;
32e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.util.Iterator;
33e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.util.NoSuchElementException;
34e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.util.Objects;
35e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraimport java.nio.file.FileTreeWalker.Event;
36e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
37e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera/**
38e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * An {@code Iterator to iterate over the nodes of a file tree.
39e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *
40e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * <pre>{@code
41e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *     try (FileTreeIterator iterator = new FileTreeIterator(start, maxDepth, options)) {
42e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *         while (iterator.hasNext()) {
43e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *             Event ev = iterator.next();
44e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *             Path path = ev.file();
45e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *             BasicFileAttributes attrs = ev.attributes();
46e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *         }
47e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera *     }
48e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera * }</pre>
49e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera */
50e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
51e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmeraclass FileTreeIterator implements Iterator<Event>, Closeable {
52e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    private final FileTreeWalker walker;
53e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    private Event next;
54e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
55e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    /**
56e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     * Creates a new iterator to walk the file tree starting at the given file.
57e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     *
58e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     * @throws  IllegalArgumentException
59e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     *          if {@code maxDepth} is negative
60e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     * @throws  IOException
61e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     *          if an I/O errors occurs opening the starting file
62e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     * @throws  SecurityException
63e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     *          if the security manager denies access to the starting file
64e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     * @throws  NullPointerException
65e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     *          if {@code start} or {@code options} is {@ocde null} or
66e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     *          the options array contains a {@code null} element
67e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera     */
68e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    FileTreeIterator(Path start, int maxDepth, FileVisitOption... options)
69e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        throws IOException
70e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    {
71e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        this.walker = new FileTreeWalker(Arrays.asList(options), maxDepth);
72e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        this.next = walker.walk(start);
73e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        assert next.type() == FileTreeWalker.EventType.ENTRY ||
74e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera               next.type() == FileTreeWalker.EventType.START_DIRECTORY;
75e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
76e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        // IOException if there a problem accessing the starting file
77e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        IOException ioe = next.ioeException();
78e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        if (ioe != null)
79e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera            throw ioe;
80e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    }
81e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
82e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    private void fetchNextIfNeeded() {
83e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        if (next == null) {
84e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera            FileTreeWalker.Event ev = walker.next();
85e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera            while (ev != null) {
86e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                IOException ioe = ev.ioeException();
87e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                if (ioe != null)
88e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                    throw new UncheckedIOException(ioe);
89e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
90e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                // END_DIRECTORY events are ignored
91e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                if (ev.type() != FileTreeWalker.EventType.END_DIRECTORY) {
92e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                    next = ev;
93e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                    return;
94e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                }
95e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera                ev = walker.next();
96e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera            }
97e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        }
98e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    }
99e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
100e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    @Override
101e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    public boolean hasNext() {
102e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        if (!walker.isOpen())
103e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera            throw new IllegalStateException();
104e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        fetchNextIfNeeded();
105e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        return next != null;
106e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    }
107e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
108e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    @Override
109e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    public Event next() {
110e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        if (!walker.isOpen())
111e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera            throw new IllegalStateException();
112e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        fetchNextIfNeeded();
113e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        if (next == null)
114e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera            throw new NoSuchElementException();
115e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        Event result = next;
116e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        next = null;
117e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        return result;
118e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    }
119e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera
120e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    @Override
121e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    public void close() {
122e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera        walker.close();
123e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera    }
124e6bac4bf9c85c2454ce22c91da6c654552c268e0Shubham Ajmera}
125