package javacodebook.xml.processing.sax.parse;

import org.w3c.dom.*;

import org.xml.sax.*;

import javacodebook.xml.processing.dom.parse.*;


/**
 * Die ValidatingSAXParseUtil benutzt einen SAX-Parser, die ErrorHandler-
 * Implementierung OurErrorHandler und die ContentHandler-Implementierung
 * StatefullContentHandler um ein XML-Dokument zu validieren, bestimmte
 * Elemente zu zählen und einige Elemente zu extrahieren.
 *
 * @author Christoph Leinemann
 */

public class ValidatingSAXParseUtil {

  private static final String USAGE =
      "\nBenutzerhinweis: javacodebook.xml.processing.sax.parse.ValidatingSAXParseUtil " +
      "<uri>\n\nwobei\n\n<uri>\n" +
      "die URI ist, unter der ein XML-Dokument zu finden ist das geparst und validiert werden soll.\n";

  /**
   * In der main-Methode wird der Kommandozeilen-Parameter ausgelesen, der beschreibt, welches
   * Dokument geparst werden soll.  Dann wird ein SAX-Parser instanziiert, bei dem
   * ein ErrorHandler und ein ContentHandler registriert werden.
   * Es wird das Dokument geparst und anschließend die Fehler vom
   * ErrorHandler und einige Daten vom ContentHandler abgefragt.
   *
   * @param args
   */
  public static void main(String[] args) {

    if (args.length != 1) {
      System.out.println(getUsage());
      System.exit(1);
    }

    String documentLocation = args[0];

    org.apache.xerces.parsers.SAXParser parser =
            new org.apache.xerces.parsers.SAXParser();

    // Es wird ein Objekt unserer ErrorHandler-Implementierung
    // aus dem Beispiel 'processing.dom.parse' instanziiert.
   javacodebook.xml.processing.dom.parse.ErrorCollector errorCollector = new javacodebook.xml.processing.dom.parse.ErrorCollector();

    // Zur Extraktion von Daten wird eine Instanz unseres StatefulContentHandlers
    // erzeugt.
    StatefullContentHandler statefullContentHandler = new StatefullContentHandler();

    // Das StatefullContentHandler-Objekt wird so konfiguriert, dass es die
    // Anzahl der Person-Elemente zählt.
    statefullContentHandler.countElements("person");

    // Außerdem sollen alle E-Mail-Adressen extrahiert werden.
    statefullContentHandler.extractValuesOfElements("email");

    try {
      // über die die setFeature-Methode des Parser-Objektes kann
      // die Validierung eingeschaltet werden.
      parser.setFeature("http://xml.org/sax/features/validation", true);

      // Das ErrorHandler-Objekt wird beim Parser als
      // ErrorHandler registriert.
      parser.setErrorHandler(errorCollector);

      // Das ContentHandler-Objekt wird beim Parser registriert.
      parser.setContentHandler(statefullContentHandler);

      // Das Dokument, dass als Kommandozeilenparameter übergeben
      // wurde wird geparst.
      parser.parse(documentLocation);

      // Falls Probleme aufgetreten sind, werden die entsprechenden
      // Meldungen in die Standardausgabe geschrieben.
      if (errorCollector.anyProblems()) {
        System.out.println(errorCollector.getWarningsMessagesAsText());
        System.out.println(errorCollector.getErrorMessagesAsText());
        System.out.println(errorCollector.getFatalErrorMessagesAsText());
      }
      else {
        System.out.println("Das Dokument entspricht Schema bzw. DTD");
      }

      // Nun können die Ergebnisse von unserem StatefullContentHandler erfragt und
      // in die Standardausgabe geschrieben werden.
      System.out.println("Anzahl der person Elemente : "+statefullContentHandler.getCountOfElement("person"));
      System.out.println("emails: "+statefullContentHandler.getValuesOfElement("email"));
    }
    catch (Exception e) {
      System.out.println("Dokument konnte nicht verarbeitet werden: " + e +
                         "\n" +
                         errorCollector.getFatalErrorMessagesAsText());
    }
  }

  public static String getUsage() {
    return USAGE;
  }
}