package javacodebook.xml.transport.http.get;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

/**
 * Der XMLGetSender erweitert das HttpServlet und implementiert
 * die doGet-Methode.  Für jeden empfangenen Get-Request wird ein
 * http-Parameter namens 'fileName' ausgelesen, der den absoluten
 * Pfad zu einer XML-Datei beschreibt.  Im weiteren Verlauf der
 * doGet-Methode wird diese Datei gelesen und zum Client geschrieben.
 */
public class XMLGetSender
    extends HttpServlet {

  // Dadurch, dass die doGet-Methode überschrieben wird, unterstützt dass Servlet
  // die http-get-Methode.
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws
      ServletException, IOException {

    // Auslesen des Parameters 'fileName'.
    String fileName = request.getParameter("fileName");

    // Es wird ein Printwriter auf Basis eines Writer-Objektes von der HttpResponse
    // instanziiert über den die Antwort zurück zum Client geschrieben wird.
    PrintWriter pw = new PrintWriter(response.getWriter());

    // Die Antwort ist vom Content-Type "text/xml"
    response.setContentType("text/xml");

    try {
      // Es wird die entsprechende Datei im Dateisystem gesucht und ein BufferedReader-
      // Objekt zum lesen der Datei erzeugt.
      FileInputStream fis = new FileInputStream(fileName);
      BufferedReader br = new BufferedReader(new InputStreamReader(fis));

      System.out.println("Folgendes Dokument wird zum Client geschickt:\n");

      String line = null;

      // Nun wird der Inhalt der Datei zum Client und zur Kontrolle auch
      // in die Standardausgabe geschrieben.
      while ( (line = br.readLine()) != null) {
        pw.println(line);
        System.out.println(line);
      }
    }

    // Falls bei der Verarbeitung ein Ausnahmefall auftritt, wird eine
    // XML-Nachricht zum Client zurück geschrieben, wobei in
    // diesem Beispiel der Fehlercode -1 für den Ausnahmefall steht.
    // Innerhalb des message-Elements wird die Fehlermeldung eingefügt.
    catch (Exception e) {
      pw.println("<message code=\"-1\">" + e.toString() + "</message>");
    }
    System.out.println("\nhttp-get-Request bearbeitet\n\n");

  }

}