package javacodebook.xml.transport.http.post;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

/**
 * Der XMLPostReceiver erweitert das HttpServlet und implementiert
 * die doPost-Methode.  Für jeden empfangenen Post-Request wird der
 * empfangene Stream ausgelesen und der Inhalt in einem String abgelegt, der dann
 * als pseudo-Verarbeitung in die Standardausgabe geschrieben wird.
 */
public class XMLPostReceiver
    extends HttpServlet {

  public void doPost(HttpServletRequest request, HttpServletResponse response) throws
      ServletException, IOException {

    // Über ein Writer-Objekt von dem Response-Objekt wird ein
    // PrintWriter instanziiert, der benutzt wird, um eine Antwort
    // zum Client zu schreiben.
    PrintWriter pw = new PrintWriter(response.getWriter());

    try {
      // Es wird ein BufferedReader erzeugt, um den Stream auszulesen.
      InputStreamReader isr = new InputStreamReader(request.getInputStream());
      BufferedReader br = new BufferedReader(isr);

      // Inhalte des Streams werden in den String xmlDocument abgelegt.
      String xmlDocument = "";
      String line = br.readLine();
      while (line != null) {
        xmlDocument = xmlDocument + line;
        line = br.readLine();
      }

      // Weiterverarbeitung des empfangenen XML.
      System.out.println(xmlDocument);

      // Da die Verarbeitung erfolgreich war, schicke eine Bestätigung
      pw.println("<message code=\"0\">processed document</message>");
    }

    // 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>");
    }

    // Auf den PrintWriter müssen die flush-Methode und die close-Methode
    //aufgerufen werden, um keine Resourcen zu verschwenden.
    pw.flush();
    pw.close();
  }
}