package aop.example;

import org.aspectj.lang.*;
import javax.servlet.http.*;

/**
 * Аспект обеспечивающий аудит
 * @author Zubairov Renat
 */
public aspect AuditAspect {

	/**
	 * Все методы которые необходимо заносить в журнал
	 * Так же собираем запрос для извлечения от туда сесии
	 */
	public pointcut controllerMethods(HttpServletRequest request) :
		// Выполнение всех методов параметрами которых являются HttpServletRequest и HttpServletResponse
		// для всех классов наследников HttpServlet
		execution(* javax.servlet.http.HttpServlet+.*(HttpServletRequest, HttpServletResponse)) && args(request, HttpServletResponse);


	/**
	 * Advice который обеспечивает печать на стандартный вывод
	 * информации какой метод будет выполнен и пользователь
	 * который выполняет метод 
	 */
	before(HttpServletRequest request) : controllerMethods(request) {
		// Собираем статическую информацию о точке вплетения
		Signature sig = thisJoinPointStaticPart.getSignature();
		// Выводим доступную информацию
		System.out.println("User " + 
			request.getSession().getAttribute(EntranceFilter.USER_KEY).toString() + 
			" executing " + sig.getDeclaringType().getName() + 
			"." + sig.getName());
	}

}
