package coreservlets.listeners;

import java.util.*;

import javax.servlet.*;

/** Proces nasłuchujący, który konfiguruje ustawienia
 *  dla mechanizmu śledzenia zamówień na oferty dnia.
 *  Proces odczytuje z parametrów inicjalizacyjnych 
 *  listę nazw atrybutów; odpowiadają one atrybutom sesji,
 *  za pomocą których rejestrowane są zamówienia.
 *  Proces odczytuje również listę nazw towarów; odpowiadają one
 *  nazwom towarów oferowanych w ramach oferty dnia. Pozostałe
 *  procesy nasłuchujące będą sprawdzać, czy wartości atrybutów,
 *  które zostały wskazane jako odpowiadające zamówieniom,
 *  wskazują towary będące ofertami dnia.
 *  <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 DailySpecialRegistrar
    implements ServletContextListener {

  /** W momencie ładowania aplikacji internetowej zapisywane są
   *  nazwy atrybutów odpowiadających zamówieniom 
   *  wartości atrybutów wskazujące oferty dnia.
   *  Ponadto licznikowi zamówień na oferty dnia
   *  przypisywana jest wartość zero.
   */
  public void contextInitialized(ServletContextEvent event) {
    ServletContext context = event.getServletContext();
    addContextEntry(context, "order-attribute-names");
    addContextEntry(context, "daily-special-item-names");
    context.setAttribute("dailySpecialCount", new Integer(0));
  }

  public void contextDestroyed(ServletContextEvent event) {}

  /** Odczytanie parametru inicjalizacyjnego kontekstu,
   *  umieszczenie wartości w ArrayList i zapisanie listy
   *  w kontekście serwletu ServletContext wraz z nazwą atrybutu,
   *  która jest identyczna jak nazwa parametru inicjalizacyjnego.
   */
  private void addContextEntry(ServletContext context,
                               String initParamName) {
    ArrayList<String> paramValues = new ArrayList<String>();
    String attributeNames =
      context.getInitParameter(initParamName);
    if (attributeNames != null) {
      String[] params = attributeNames.split("\\s++");
      for (String value : params) {
        paramValues.add(value);
      }
      context.setAttribute(initParamName, paramValues);
    }
  }

  /** Zwrócenie ciągu znaków zawierającego nazwy towarów
   *  będących ofertami dnia. Ciąg do wstawienia w kodzie 
   *  HTML strony.
   */
  public static String dailySpecials(ServletContext context) {
    String attributeName = "daily-special-item-names";
    ArrayList itemNames =
      (ArrayList)context.getAttribute(attributeName);
    String itemString = "";
    for(int i=0; i<itemNames.size(); i++) {
      itemString = itemString + (String)itemNames.get(i) + "\n";
    }
    return(itemString);
  }

  /** Zwrócenie listy zawierającej nazwy towarów-ofert dnia.
   *  Lista do wstawienia w treści strony JSP.
   */
  public static String specialsList(ServletContext context) {
    String attributeName = "daily-special-item-names";
    ArrayList itemNames =
      (ArrayList)context.getAttribute(attributeName);
    String itemString = "<UL>\n";
    for(int i=0; i<itemNames.size(); i++) {
      itemString = itemString + "<LI>" +
                   (String)itemNames.get(i) + "\n";
    }
    itemString = itemString + "</UL>";
    return(itemString);
  }
}
