package javacodebook.xml.transport.http.get;

import java.net.*;
import java.io.*;

/**
 * Die XMLGetter-Klasse benutzt ein URL-Objekt um XML-Dokumente von beliebigen Urls, die z.B.
 * über die Kommandozeile übergebenen werden, abzurufen.  Dabei wird die http-get-Methode verwendet.
 */
public class XMLGetter {
  private static final String USAGE =
      "\nBenutzerhinweis: javacodebook.xml.transport.http.get.XMLGetter " +
      "<url> <dateiName> [<dateiName> ...]\n\nwobei \n\n<url>\n" +
      "die URL ist, von der die XML-Dokumente geholt werden sollen und\n\n<dateiName> [<dateiName> ...]\n" +
      "ein oder mehrere durch Leerzeichen getrennte Namen von XML-Dateien sind, die \n" +
      "per get von der URL geholt werden sollen";

  /**
   * An die main-Methode müssen die Parameter <url> und eine durch Leerzeichen getrennte Folge von
   * Dateinamen <dateiName> [<dateiName> ...] übergeben werden.  Es wird ein Objekt vom Typ XMLGetter instanziiert.
   * Der erste Parameter wird als URL ausgelesen.  Für jeden weiteren Paramter wird versucht, eine entsprechende
   * Datei von der zuvor ausgelesenen URL zu holen.
   */
  public static void main(String args[]) {
    if (args.length < 2) {
      System.out.println(getUsage());
      System.exit(1);
    }
    else {
      String urlString = args[0];
      XMLGetter xMLGetter = new XMLGetter();
      for (int i = 1; i < args.length; i++) {
        String fileName = args[i];
        try {
          String xml = xMLGetter.getXMLFromURL(fileName, urlString);
        }
        catch (Exception e) {
          System.out.println("Probleme bei der Ausführung: " + e);
        }
      }
    }
  }

  private String getXMLFromURL(String fileName, String urlString) throws
      Exception {
    String documentReceived = "";
    try {
      // Instanziierung eines URL-Objektes nach RFC 2396: Uniform Resource Identifiers (URI): 'Generic Syntax'
      // nachgebessert durch RFC 2732: 'Format for Literal IPv6 Addresses in URLs'.
      // Der Datei-Name wird dabei als HTTP-Parameter namens 'fileName' übergeben.
      URL url = new URL(urlString + "?fileName=" + fileName);

      // Durch das Aufrufen, der openStream-Methode auf das URL-Objekt wird der
      // HTTP-Request beim Server abgesetzt und ein InputStream erzeugt, der die
      // Antwort kapselt.
      InputStream is = url.openStream();

      // Nun wird die Antwort ausgelesen
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);
      String line = null;
      while ( (line = br.readLine()) != null) {
        documentReceived = documentReceived + line;
      }
      // Auch hier muss der InputStreamReader und somit der InputStream wieder geschlossen werden, da es sonst
      // zu Resourcenverschwendung kommt.  Besonders auf Solaris-Systemen kann das fatale Folgen haben, da für jeden
      // nicht geschlossenen InputStream ein File-Descriptor offen gehalten wird und die Zahl der erlaubten offenen
      // File-Descriptoren oft relativ eingeschränkt ist.
      isr.close();

      // Nun kann das empfangene Dokument verarbeitet werden
      System.out.println(
          "\n\nFolgendes Dokument wurde vom Server empfangen:\n " +
          documentReceived);
    }
    catch (Exception e) {
      throw new Exception("Probleme beim aufrufen der URL '" + urlString +
                          "' mit: " + e);
    }
    return documentReceived;
  }

  public static String getUsage() {
    return USAGE;
  }
}
