package coreservlets.filters;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/** Obiekt przechowujący odpowiedź, czyli wszystkie dane, które zwraca klient.
 *  Dane te zostają zapisane w jednym dużym ciągu znaków.
 *  <P>
 *  Taken from Core Servlets and JavaServer Pages Volume II
 *  from Prentice Hall and Sun Microsystems Press,
 *  http://volume2.coreservlets.com/.
 *  (C) 2007 Marty Hall, Larry Brown, and Yaakov Chaikin;
 *  may be freely used or adapted.
 */

public class StringWrapper
             extends HttpServletResponseWrapper {
  private StringWriter stringWriter;

  /** Inicjalizacja obiektu przechowującego.
   *  <P>
   *  Najpierw konstruktor wywołuje konstruktor rodzica.
   *  To wywołanie ma kluczowe znaczenie, by móc zapisać odpowiedź
   *  i setHeader, setStatus, addCookie i im podobne działały prawidłowo.
   *  <P>
   *  Następnie konstruktor tworzy obiekt StringWriter,
   *  który zostanie użyty do zbierania danych odpowiedzi.
   */

  public StringWrapper(HttpServletResponse response) {
    super(response);
    stringWriter = new StringWriter();
  }

  /** Gdy serwlety lub strony JSP zażądają obiektu Writer,
   *  nie otrzymają prawdziwego obiektu. W zamian zwrócona
   *  zostanie wersja zapisująca dane do bufora StringBuffer.
   *  Filtr musi przesłać zawartość bufora do klienta
   *  (zazwyczaj po wykonaniu w niej odpowiednich zmian).
   */

  public PrintWriter getWriter() {
    return(new PrintWriter(stringWriter));
  }

  /** Analogicznie, gdy zasoby wywołają getOutputStream,
    * zwrócimy im strumień danych
    * stanowiący bufor danych wynikowych.
    */

  public ServletOutputStream getOutputStream() {
    return(new StringOutputStream(stringWriter));
  }

  /** Pobranie całego bufora w postaci obiektu String.
   *  <P>
   *  <I>Nie należy</I> wywoływać tej metody więcej niż jeden raz
   *  na tym samym obiekcie przechowującym. API obiektu StringWriter
   *  nie gwarantuje, że poprzednia wartość będzie "pamiętana",
   *  dlatego przy każdym wywołaniu może być tworzony
   *  nowy obiekt String.
   */

  public String toString() {
    return(stringWriter.toString());
  }

  /** Pobranie obiektu StringBuffer. */

  public StringBuffer getBuffer() {
    return(stringWriter.getBuffer());
  }
}
