package org.hibernate.auction.persistence;

import org.apache.commons.logging.*;

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

/**
 * Filtr serwletowy otwierający i zamykający sesję Hibernate.
 * <p>
 * Filtr gwarantuje poprawny stan, zatiwrdzając wszystkie transakcje bazodanowe
 * po wykonaniu wszystkich innych filtrów i serwletów. Zapewnia również
 * zamknięcie oniektu <tt>Session</tt> aktualnego wątku przed wysłaniem
 * odpowiedzi do klienta.
 * <p>
 * Używaj filtru we wzorcu <b>sesja na każde żądanie</b> lub gdy używasz
 * <i>obiektów odłączonych</i>.
 *
 * @see HibernateUtil
 * @author Christian Bauer <christian@hibernate.org>
 */
public class HibernateFilter implements Filter {

	private static Log log = LogFactory.getLog(HibernateFilter.class);

	public void init(FilterConfig filterConfig) throws ServletException {
		log.info("Inicjalizacja filtru serwletu, otwiera i zamyka sesję dla każdego żądania.");
	}

	public void doFilter(ServletRequest request,
						 ServletResponse response,
						 FilterChain chain)
			throws IOException, ServletException {

		// W zasadzie nie ma jawnego otwarcia sesji. Pierwsze wywołanie
		// HibernateUtil.beginTransaction() z logiki sterującej
		// utworzy nowy obiekt sesji.
		try {
			chain.doFilter(request, response);

			// Zatwierdź oczekującą transakcję bazodanową.
			HibernateUtil.commitTransaction();

		} finally {

			// Niezależnie od tego, co się stanie, zamknij sesję.
			HibernateUtil.closeSession();

		}
	}

	public void destroy() {}

}
