001: /*
002: * Author: Chris Seguin
003: *
004: * This software has been developed under the copyleft
005: * rules of the GNU General Public License. Please
006: * consult the GNU General Public License for more
007: * details about use and distribution of this software.
008: */
009: package org.acm.seguin.io;
010:
011: import java.io.*;
012:
013: /**
014: * Traverses a directory structure.
015: *
016: *@author Chris Seguin
017: *@date May 12, 1999
018: */
019: public abstract class DirectoryTreeTraversal implements Runnable {
020: // Instance Variables
021: private File startingPoint;
022:
023: /**
024: * Traverses a directory tree structure
025: *
026: *@param init the initial directory
027: */
028: public DirectoryTreeTraversal(String init) {
029: startingPoint = new File(init);
030: }
031:
032: /**
033: * Starts the tree traversal
034: */
035: public void run() {
036: if (startingPoint.exists()) {
037: traverse(startingPoint);
038: }
039: }
040:
041: /**
042: * Determines if this file should be handled by this traversal
043: *
044: *@param currentFile the current file
045: *@return true if the file should be handled
046: */
047: protected abstract boolean isTarget(File currentFile);
048:
049: /**
050: * Gets the Allowed attribute of the DirectoryTreeTraversal object
051: *
052: *@param currentDirectory Description of Parameter
053: *@return The Allowed value
054: */
055: protected boolean isAllowed(File currentDirectory) {
056: return true;
057: }
058:
059: /**
060: * Starts the tree traversal
061: *
062: *@param current Description of Parameter
063: */
064: protected void traverse(File current) {
065: if (current.isDirectory()) {
066: if (isAllowed(current)) {
067: arriveAtDir(current);
068: String[] list = current.list();
069: for (int ndx = 0; ndx < list.length; ndx++) {
070: traverse(new File(current, list[ndx]));
071: }
072: leaveDir(current);
073: }
074: } else if (isTarget(current)) {
075: visit(current);
076: }
077: }
078:
079: /**
080: * Visits the current file
081: *
082: *@param currentFile the current file
083: */
084: protected abstract void visit(File currentFile);
085:
086: /**
087: * Program called when we arrive at a directory
088: *
089: *@param currentFile the current file
090: */
091: protected void arriveAtDir(File currentFile) {
092: }
093:
094: /**
095: * Program called when we arrive at a directory
096: *
097: *@param currentFile the current file
098: */
099: protected void leaveDir(File currentFile) {
100: }
101: }
|