package javacodebook.io.copydir;

import java.io.*;
import javacodebook.io.copyfile.CopyFile;

/**
 * Eine Implementierung von FileVisitor, mit der ganze Verzeichnisse
 * mitsamt Inhalt kopiert werden können. Es wird jeweils der
 * relative Pfad einer Datei oder eines Verzeichnisses zum
 * Quellverzeichnis ermittelt und im Zielverzeichnis entsprechend
 * verwendet, um dort die Datei oder das Verzeichnis anzulegen.
 *
 * @author  Dirk Brodersen
 */
public class CopyDirVisitor implements javacodebook.io.dirtree.FileVisitor {
    //Das Quellverzeichnis
    private File sourceDir;

    //Das Zielverzeichnis, in das kopiert werden soll
    private File targetDir;

    /** Erzeugt einen neuen CopyDirVisitor, mit dem Dateien aus
     *  einem Quellverzeichnis an die entsprechenden Stellen im
     *  Zielverzeichnis kopiert werden.
     */
    public CopyDirVisitor(File sourceDir, File targetDir) {
        if(!sourceDir.exists() || !sourceDir.isDirectory())
            throw new RuntimeException("Quellverzeichnis nicht gültig");
        if(targetDir.exists() && ! targetDir.isDirectory())
            throw new RuntimeException("Ziel ist kein Verzeichnis");
        else if(!targetDir.exists())
            targetDir.mkdirs();
        this.targetDir = targetDir;
        this.sourceDir = sourceDir;
    }

    /** Verarbeitet ein Verzeichnis  */
    public void visitDirectory(File f) throws IOException {
        if(!f.isDirectory())
            throw new RuntimeException("Kein Verzeichnis: " +
                f.getAbsolutePath());
        String relativePath = f.getAbsolutePath().substring(
            sourceDir.getAbsolutePath().length(),
            f.getAbsolutePath().length());
        System.out.println(relativePath);
        File createDir = new File(targetDir, relativePath);
        createDir.mkdirs();
    }

    /** Verarbeitet eine Datei  */
    public void visitFile(File f) throws IOException {
        String relativePath = f.getAbsolutePath().substring(
            sourceDir.getAbsolutePath().length(),
            f.getAbsolutePath().length());
        File targetFile = new File(targetDir, relativePath);
        copyFile(f, targetFile);
    }

    /** Kopiert eine Datei von source nach target */
    private void copyFile(File source, File target)
    throws IOException {
        //Zum Kopieren wird die copyFile-Methode aus dem
        //entsprechenden Rezept verwendet
        CopyFile.copyFile(source, target);
    }
    
    /** Verarbeitet ein Verzeichnis, wird hier nicht verwendet  */
    public void visitDirectory(File f, int mode) throws IOException {
    }
    
}
