package javacodebook.xml.transformation.xslt.servlet;

import java.io.*;

// JAXP Interfaces importieren
import javax.xml.transform.*;
import javax.xml.transform.stream.*;

import javax.servlet.*;
import javax.servlet.http.*;

/**
 * Dieses Servlet unterstützt die http-Get-Methode und erwartet die 2
 * obligatorischen Prameter xml und xsl.  Sie müssen mit
 * Dateinamen auf Pfaden relativ zu dem
 * Home-Verzeichnis der Webapplikation belegt sein.  Es bedient sich der
 * JAXP-API, um das XML und das XSL zusammen zu führen und zum
 * Client zurück zu schreiben.
 * Desweiteren kann ein optionaler Parameter namens param übergeben werden
 * der an das Stylesheet weitergereicht wird.
 *
 * @author Christoph Leinemann
 */
public class XSLTServlet
    extends HttpServlet {

  public void doGet(HttpServletRequest req, HttpServletResponse res) throws
      ServletException, IOException {

      PrintWriter out = res.getWriter();
      String xslFile, xmlFile, xslParam;

      // die Parameter werden ausgelesen
      xslParam = req.getParameter("param");
      xmlFile = req.getParameter("xml");
      xslFile = req.getParameter("xsl");

      if (xmlFile == null || xslFile == null) {
        out.println(
            "<h1>Bitte die http-Parameter 'xml' und 'xsl' übergeben</h1>");
        return;
      }

      // Auslesen des Pfads zur Webapplikation
      String path = getServletContext().getRealPath("") + "/";
      try {

      // Es wird ein TransformerFactory-Objekt erzeugt
      TransformerFactory tFactory = TransformerFactory.newInstance();

      // Über das Transformer-Factory-Objekt wird ein Transformer-Objekt
      // auf Basis des StyleSheets bezogen.
      Transformer transformer = tFactory.newTransformer(new StreamSource(path+xslFile));

      // Setzen des Sylesheetparameters namens 'param'.
      // Dies ermöglicht, dass im Style-Sheet z.B. nach bestimmten
      // Kriterien gefiltert wird.  Wie so ein Parameter
      // im XSL wieder ausgelesen wird, zeigt das Beispiel showEmployee.xsl.
      if (xslParam != null) {
        transformer.setParameter("param", xslParam);
      }

      // Die Transformation wird durchgeführt und dabei das Resultat
      // in das StreamResult-Objekt geschrieben.
      transformer.transform(new StreamSource(path+xmlFile), new StreamResult(out));
    }
    catch (Exception e) {
      // Eine eventuelle Fehlermeldung wird zum Client geschrieben.
      out.println("<html><body><h2>Die Transformation konnte nicht durchgeführt werden: "+e+"</h2></body></html>");
    }
  }
} 
