package coreservlets.listeners;

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

/** Proces nasłuchujący, który śledzi zamówienia na jachty.
 *  W tym celu proces monitoruje wartości atrybutów sesji
 *  o nazwach orderedItem oraz purchasedItem.
 *  <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 YachtWatcher
    implements HttpSessionAttributeListener {
  private String orderAttributeName = "orderedItem";
  private String purchaseAttributeName = "purchasedItem";
  private String itemName = "jacht";

  /** Sprawdzenie początkowego zamówienia i ostateczbnego nabycia
   *  jachtu. Jeżeli atrybut orderedItem ma wartość "jacht",
   *  następuje zapisanie informacji o treści "Klient złożył zamówienie na jacht".
   *  Jeżeli atrybut purchasedItem ma wartość "jacht", następuje 
   *  zapisanie informacji o treści "Klient ostatecznie zakupił jacht".
   */
  public void attributeAdded(HttpSessionBindingEvent event) {
    checkAttribute(event, orderAttributeName, itemName,
                   " złożył zamówienie na ");
    checkAttribute(event, purchaseAttributeName, itemName,
                   " sfinalizował zakup ");
  }

  /** Sprawdza, czy zamówienie zostało anulowane: czy zamówienie na "jacht"
   *  zostało wycofane? Zapisuje informację o treści "Klient anulował zamówienie
   *  na jacht", jeśli atrybut orderedItem ma wartość "jacht".
   */
  public void attributeRemoved(HttpSessionBindingEvent event) {
    checkAttribute(event, orderAttributeName, itemName,
                   " anulował zamówienie na ");
  }

  /** Sprawdza, czy towar został zastąpiony: czy "jacht" został
   *  zastąpiony przez jakiś inny towar? Zapisuje informację o treści
   *  "Klient wybrał nowy towar, który zastąpił jacht",
   *  jeśli atrybut orderedItem ma wartość "jacht".
   */
  public void attributeReplaced(HttpSessionBindingEvent event) {
    checkAttribute(event, orderAttributeName, itemName,
                   " wybrał nowy towar, który zastąpił ");
  }

  private void checkAttribute(HttpSessionBindingEvent event,
                              String orderAttributeName,
                              String keyItemName,
                              String message) {
    String currentAttributeName = event.getName();
    String currentItemName = (String)event.getValue();
    if (currentAttributeName.equals(orderAttributeName) &&
        currentItemName.equals(keyItemName)) {
      ServletContext context =
        event.getSession().getServletContext();
      context.log("Klient" + message + keyItemName + ".");
    }
  }
}
