package coreservlets;

import javax.servlet.*;
import javax.servlet.http.*;

/** Kilka użytecznych dodatków. Większość z nich to metody statyczne.
 *  <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 ServletUtilities {
  public static final String DOCTYPE =
    "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
    "Transitional//EN\">";

  public static String headWithTitle(String title) {
    return(DOCTYPE + "\n" +
           "<HTML>\n" +
           "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n");
  }

  /** Odczytanie parametru o wskazanej nazwie, przekształcenie
   *  go do wartości typu int i zwrócenie. Jeżeli parametr nie istnieje
   *  albo ma format nieprawidłowy dla typu int, zwrócona
   *  zostaje z góry zdefiniowana wartość domyślna.
  */

  public static int getIntParameter(HttpServletRequest request,
                                    String paramName,
                                    int defaultValue) {
    String paramString = request.getParameter(paramName);
    int paramValue;
    try {
      paramValue = Integer.parseInt(paramString);
    } catch(NumberFormatException nfe) { // null albo zły format
      paramValue = defaultValue;
    }
    return(paramValue);
  }

  public static double getDoubleParameter
                                 (HttpServletRequest request,
                                  String paramName,
                                  double defaultValue) {
    String paramString = request.getParameter(paramName);
    double paramValue;
    try {
      paramValue = Double.parseDouble(paramString);
    } catch(NumberFormatException nfe) { // null or bad format
      paramValue = defaultValue;
    }
    return(paramValue);
  }

  /** Zastąpienie znaków, które mają w HTML-u specjalne znaczenie,
   *  odpowiadającymi im znakowymi elementami języka HTML.
   */

  // Javadoc nie jest używany do sporządzania bardziej szczegółowej
  // dokumentacji, ponieważ trudno jest uczynić znaki specjalne
  // czytelnymi zarówno w zwykłym tekście, jak i w HTML-u.
  //
  // W danym ciągu znaków poniższa metoda zastępuje wszystkie
  // wystąpienia '<' sekwencją '&lt;', wszystkie wystąpienia '>'
  // sekwencją '&gt;', wszystkie wystąpienia cudzysłowów sekwencją
  // '&quot;' (w celu obsłużenia wystąpień wewnątrz atrybutów)
  // oraz wszystkie wystąpienia '&' sekwencją '&amp;'.
  // Bez filtrowania w tak zdefiniowany sposób, ciągu znaków nie można by
  // bezpieczenie umieszczać w kodzie strony internetowej.

  public static String filter(String input) {
    if (!hasSpecialChars(input)) {
      return(input);
    }
    StringBuffer filtered = new StringBuffer(input.length());
    char c;
    for(int i=0; i<input.length(); i++) {
      c = input.charAt(i);
      switch(c) {
        case '<': filtered.append("&lt;"); break;
        case '>': filtered.append("&gt;"); break;
        case '"': filtered.append("&quot;"); break;
        case '&': filtered.append("&amp;"); break;
        default: filtered.append(c);
      }
    }
    return(filtered.toString());
  }

  private static boolean hasSpecialChars(String input) {
    boolean flag = false;
    if ((input != null) && (input.length() > 0)) {
      char c;
      for(int i=0; i<input.length(); i++) {
        c = input.charAt(i);
        switch(c) {
          case '<': flag = true; break;
          case '>': flag = true; break;
          case '"': flag = true; break;
          case '&': flag = true; break;
        }
      }
    }
    return(flag);
  }
}
