package javacodebook.io.dirtree;

import java.io.*;

public class FileTreeWalker {

    private File startDirectory;
    private FileVisitor visitor;
    private FilenameFilter filter;

    public FileTreeWalker(File startDirectory, FileVisitor visitor,
    FilenameFilter filter)
    throws IOException {
        if(!startDirectory.isDirectory())
            throw new IOException("Kein Verzeichnis zum Start angegeben");
        this.startDirectory = startDirectory;
        this.visitor = visitor;
        this.filter = filter;
    }

    public void start()
    throws IOException {
        start(startDirectory);
    }

    //Rekursiv durch alle Verzeichnisse laufen und alle Dateien an den
    //FileVisitor weitergeben, damit der seine Aktionen durchführen kann
    private void start(File startDir)
    throws IOException {
        File[] fileList = startDir.listFiles();
        for(int i = 0; i < fileList.length; i++) {
            if(fileList[i].isDirectory()) {
                visitor.visitDirectory(fileList[i], FileVisitor.ENTER);
                start(fileList[i]);
                visitor.visitDirectory(fileList[i], FileVisitor.EXIT);
            }
            else {
                //Wenn ein Filter angegeben wurde, dann wird er
                //angewendet, sonst wird der Visitor direkt aufgerufen
                if(filter != null) {
                    if(filter.accept(startDir, fileList[i].getName()))
                        visitor.visitFile(fileList[i]);
                }
                else
                    visitor.visitFile(fileList[i]);
            }
        }
    }
}