package aop.example;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.LogRecord;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import aop.example.model.AlbumList;
import aop.example.model.AnonymousUser;
import aop.example.model.Album;
import aop.example.model.User;

/**
 * Фильтр воздан для удобства размещения аспектов, т.к. определяет некую начальную
 * точку во всех запросах.
 * Кроме того следит за тем, что бы данные всегда были в сесси
 * то есть пользователь был по крайней мере AnonymousUser
 * и объект AlbumList всё время присутствовал в сессии
 * @author Zubairov Renat
 */
public class EntranceFilter implements javax.servlet.Filter {
	
	/**
	 * Константа определяющая ключ значения в сессии
	 * под которым сохраняется пользователь
	 */
	public static final String USER_KEY = "CURRENT_USER";
	
	/**
	 * Конфигурация фильра, используется что бы получить ServletContext
	 * для доступа к RequestDispatcher
	 */
	private FilterConfig config = null;

	/**
	 * Empty constructor 
	 */
	public EntranceFilter() {
		super();
	}

	/**
	 * @see java.util.logging.Filter#isLoggable(java.util.logging.LogRecord)
	 */
	public boolean isLoggable(LogRecord record) {
		return false;
	}
	
	/**
	 * Обрабатываем запрос
	 * @see javax.servlet.Filter.doFilter(..)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
				   throws IOException, ServletException
	{
		if (request instanceof HttpServletRequest) {
			// получаем сессию
			HttpSession session = ((HttpServletRequest) request).getSession();
			if (session.getAttribute(USER_KEY) == null) {
				// если пользователь не установлен, то устанавливаем его в анонимный
				session.setAttribute(USER_KEY, new AnonymousUser());
			}
			if (session.getAttribute("albums") == null) {
				// если альбомы не найдены в сесси, то ложим туда
				// альбомы заполняются начальными значениями в конструкторе
				// класса AlbumList
				session.setAttribute("albums", new AlbumList());
			}
		}
		// пропускаем запрос дальше
		chain.doFilter(request, response);
	}
	
	/**
	 * @see javax.servlet.Filter#destroy()
	 */
	public void destroy() {
		config = null;
	}

	/**
	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
	 */
	public void init(FilterConfig aconfig) throws ServletException {
		config = aconfig;
	}

	

	/**
	 * Этот метод используется в аспекте для того
	 * что бы перенаправить пользователя на другую страницу
	 * @return
	 */
	public FilterConfig getConfig() {
		return config;
	}

}
