
package projetofinal;

import java.util.logging.*;
import java.io.*;


public aspect TraceAspect {
	
	private static Logger log = Logger.getLogger("projetofinal.TraceAspect");
	private static FileHandler fileH = null;
	
	static{
		try{
			fileH = new FileHandler("trace.log");
			fileH.setFormatter(new SimpleFormatter());
			log.addHandler(fileH);
			log.setLevel(Level.FINEST);
		}catch(IOException _ioex){
			System.out.println(_ioex.getMessage());
		}catch(SecurityException _sex){
			System.out.println(_sex.getMessage());
		}
	}

	pointcut chegada(Item evento) : execution( void projetofinal.Simulator.chegada(Item)) && args(evento);
	
	pointcut saida(Item evento) : execution( void projetofinal.Simulator.saida(Item)) && args(evento);

	pointcut termino(Item evento) : execution( void projetofinal.Simulator.termino(Item)) && args(evento);

	pointcut falha(Item evento) : execution( void projetofinal.Simulator.falha(Item)) && args(evento);

	pointcut retornofalha(Item evento) : execution( void projetofinal.Simulator.retornoFalha(Item)) && args(evento);

	pointcut eventos(Item evento) : chegada(evento)||saida(evento)||falha(evento)||retornofalha(evento)||termino(evento);
	
	pointcut execucao() : execution(public void projetofinal.Simulator.run(..));
	
	before(): execucao(){
		log.warning("Vai iniciar "+Thread.currentThread().getName()+"\n");
	}

	after(): execucao(){
		log.warning("Finalizou "+Thread.currentThread().getName()+"\n");
	}
	
	before(Item evento) : eventos(evento) {
		log.info("Entrando "+thisJoinPoint.toString()+" arg: "+evento+" na thread:"+Thread.currentThread().getName()+"\n");		
	}	

	after(Item evento) : eventos(evento) {
		log.info("Saindo "+thisJoinPoint.toString()+" arg: "+evento+" na thread:"+Thread.currentThread().getName()+"\n");		
	}	
}
