package javacodebook.regex.grep;

import java.util.regex.*;
import java.io.*;
import javacodebook.io.dirtree.FileVisitor;
/**
 * Abgewandeltes Grep. Die Klasse implementiert das Interface
 * FileVisitor aus dem Kapitel 4 und kann daher auf einem
 * Verzeichnisbaum angewendet werden.
 * @author Mark Donnermeyer
 */
public class Grep implements FileVisitor {

    Pattern pattern;
    boolean lineNumbers = false;
    boolean fileOnly = false;

    /**
     * Erzeugt ein neues Grep-Objekt zum zeilenweisen Suchen
     * von Mustern in Texten
     * @param search Der zu suchende reguläre Ausdruck
     * @param ignoreCase soll die Suche case-sensitiv erfolgen?
     * @param lineNumber Gebe die Zeilennummer der gefundenen Zeile aus
     * @param fileOnly Gefundene Zeilen werden gar nicht ausgegeben, sondern nur
     * die Dateien, in denen das Muster erkannt wurde.
     */
    public Grep(String search, boolean ignoreCase, boolean lineNumbers, boolean fileOnly) {
        if (ignoreCase == true)
            pattern = Pattern.compile(search, Pattern.CASE_INSENSITIVE);
        else
            pattern = Pattern.compile(search);

        this.lineNumbers = lineNumbers;
        this.fileOnly = fileOnly;
    }

    /**
     * Die eigentliche Suche. Sie kann auch mehrfach mit
     * verschiedenen Dateien erfolgen
     */
    public void visitFile(File f) throws IOException {
        boolean found = false;

        // Reader zum zeilenweisen Lesen der Datei erzeugen.
        BufferedReader in = new BufferedReader(
        new FileReader(f));

        String inputLine;
        Matcher matcher;
        int lineNumber = 0;
        // Datei zeilenweise auslesen
        while ((inputLine = in.readLine()) != null) {
            // Zeilennummer tracken
            lineNumber++;
            // Enthält die Zeile das Suchmuster?
            if (pattern.matcher(inputLine).find()) {
                // Je nach Konfiguration das Ergebnis ausgeben.
                if (!found)
                    System.out.println(f.toString());
                found = true;
                if (lineNumbers && !fileOnly)
                    System.out.print(lineNumber + " ");
                if (!fileOnly)
                    System.out.println(inputLine);
            }
        }
        in.close();
    }

    public void visitDirectory(File f) throws IOException {
    }

}
