001: /*
002: * Distributed as part of debuggen v.0.1.0
003: *
004: * Copyright (C) 2005 Machinery For Change, Inc.
005: *
006: * Author: Steve Waldman <swaldman@mchange.com>
007: *
008: * This library is free software; you can redistribute it and/or modify
009: * it under the terms of the GNU Lesser General Public License version 2.1, as
010: * published by the Free Software Foundation.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public License
018: * along with this software; see the file LICENSE. If not, write to the
019: * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: */
022:
023: package com.mchange.v2.io;
024:
025: import java.io.*;
026: import java.util.*;
027:
028: public final class DirectoryDescentUtils {
029: /**
030: * @return FileIterator over all files and dierctories beneath root
031: */
032: public static FileIterator depthFirstEagerDescent(File root)
033: throws IOException {
034: return depthFirstEagerDescent(root, null, false);
035: }
036:
037: /**
038: * @return FileIterator over all files and directories beneath root that
039: * match filter.
040: *
041: * @param canonical file paths will be canonicalized if true
042: */
043: public static FileIterator depthFirstEagerDescent(File root,
044: FileFilter filter, boolean canonical) throws IOException {
045: List list = new LinkedList();
046: Set seenDirex = new HashSet();
047: depthFirstEagerDescend(root, filter, canonical, list, seenDirex);
048: return new IteratorFileIterator(list.iterator());
049: }
050:
051: public static void addSubtree(File root, FileFilter filter,
052: boolean canonical, Collection addToMe) throws IOException {
053: Set seenDirex = new HashSet();
054: depthFirstEagerDescend(root, filter, canonical, addToMe,
055: seenDirex);
056: }
057:
058: private static void depthFirstEagerDescend(File dir,
059: FileFilter filter, boolean canonical, Collection addToMe,
060: Set seenDirex) throws IOException {
061: String canonicalPath = dir.getCanonicalPath();
062: if (!seenDirex.contains(canonicalPath)) {
063: if (filter == null || filter.accept(dir))
064: addToMe.add(canonical ? new File(canonicalPath) : dir);
065: seenDirex.add(canonicalPath);
066: String[] babies = dir.list();
067: for (int i = 0, len = babies.length; i < len; ++i) {
068: File baby = new File(dir, babies[i]);
069: if (baby.isDirectory())
070: depthFirstEagerDescend(baby, filter, canonical,
071: addToMe, seenDirex);
072: else if (filter == null || filter.accept(baby))
073: addToMe.add(canonical ? baby.getCanonicalFile()
074: : baby);
075: }
076: }
077: }
078:
079: private static class IteratorFileIterator implements FileIterator {
080: Iterator ii;
081: Object last;
082:
083: IteratorFileIterator(Iterator ii) {
084: this .ii = ii;
085: }
086:
087: public File nextFile() throws IOException {
088: return (File) next();
089: }
090:
091: public boolean hasNext() throws IOException {
092: return ii.hasNext();
093: }
094:
095: public Object next() throws IOException {
096: return (last = ii.next());
097: }
098:
099: public void remove() throws IOException {
100: if (last != null) {
101: ((File) last).delete();
102: last = null;
103: } else
104: throw new IllegalStateException();
105: }
106:
107: public void close() throws IOException {
108: }
109: }
110:
111: private DirectoryDescentUtils() {
112: }
113:
114: public static void main(String[] argv) {
115: try {
116: FileIterator fii = depthFirstEagerDescent(new File(argv[0]));
117: while (fii.hasNext())
118: System.err.println(fii.nextFile().getPath());
119: } catch (Exception e) {
120: e.printStackTrace();
121: }
122: }
123: }
|