/*** Copyright (c) 2013 Hércules S. S. José Este arquivo é parte do programa EncontreAquiPeças. EncontreAquiPeças é um software livre; você pode redistribui-lo e/ou modificá-lo dentro dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do Software Livre (FSF); na versão 2.1 da Licença. Este programa é distribuído na esperança que possa ser útil, mas SEM NENHUMA GARANTIA; sem uma garantia implícita de ADEQUAÇÂO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral Menor GNU em português para maiores detalhes. Você deve ter recebido uma cópia da Licença Pública Geral Menor GNU sob o nome de "LICENSE.TXT" junto com este programa, se não, acesse o site HSlife no endereco www.hslife.com.br ou escreva para a Fundação do Software Livre(FSF) Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. Para mais informações sobre o programa EncontreAquiPeças e seu autor acesse o endereço www.hslife.com.br, pelo e-mail contato@hslife.com.br ou escreva para Hércules S. S. José, Av. Ministro Lafaeyte de Andrade, 1683 - Bl. 3 Apt 404, Marco II - Nova Iguaçu, RJ, Brasil. */ package br.com.hslife.encontreaquipecas.aspect; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import br.com.hslife.encontreaquipecas.entity.Auditoria; import br.com.hslife.encontreaquipecas.entity.AuditoriaDados; import br.com.hslife.encontreaquipecas.entity.EntityPersistence; import br.com.hslife.encontreaquipecas.entity.Usuario; @Aspect @Component public class AuditoriaAspect { @Autowired private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @AfterReturning(pointcut="execution(public void br.com.hslife.encontreaquipecas.repository.IRepository.save(..)) && args(entity)") public void afterSave(EntityPersistence entity) { System.out.println("Salvamento detectado. Executando auditoria!"); System.out.println("Classe detectada: " + entity.getClass().getName()); Auditoria auditoria = new Auditoria(); auditoria.setClasse(entity.getClass().getSimpleName()); auditoria.setTransacao("INSERT"); //auditoria.setUsuario(((Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado")).getLogin()); /* * Mudança realizada em virtude do caso de uso de registro de usuário. Ainda é necessário pensar em uma forma de registrar * quem está efetuando o registro para gravar na auditoria. Por enquanto será gravado o mesmo IP do computador que efetuou * o registro */ if (FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado") == null) { auditoria.setUsuario(((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteAddr()); } else { auditoria.setUsuario(((Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado")).getLogin()); } auditoria.setIp(((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteAddr()); for (String s : entity.getFieldValues().keySet()) { auditoria.getDadosAuditoria().add(new AuditoriaDados(entity.getFieldValues().get(s), s, "AFTER")); } sessionFactory.getCurrentSession().persist(auditoria); System.out.println("Auditoria realizada!"); } @Around("execution(public void br.com.hslife.encontreaquipecas.repository.IRepository.update(..)) && args(entity)") public void afterUpdate(ProceedingJoinPoint executaMetodo, EntityPersistence entity) throws Throwable { System.out.println("Atualiza��o detectada. Auditoria executada!"); System.out.println("Classe detectada: " + entity.getClass().getName()); Auditoria auditoria = new Auditoria(); auditoria.setClasse(entity.getClass().getSimpleName()); auditoria.setTransacao("UPDATE"); //auditoria.setUsuario(((Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado")).getLogin()); /* * Mudança realizada em virtude do caso de uso de registro de usuário. Ainda é necessário pensar em uma forma de registrar * quem está efetuando o registro para gravar na auditoria. Por enquanto será gravado o mesmo IP do computador que efetuou * o registro */ if (FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado") == null) { auditoria.setUsuario(((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteAddr()); } else { auditoria.setUsuario(((Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado")).getLogin()); } auditoria.setIp(((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteAddr()); EntityPersistence entityBefore = (EntityPersistence) sessionFactory.getCurrentSession().get(entity.getClass(), entity.getId()); for (String s : entity.getFieldValues().keySet()) { auditoria.getDadosAuditoria().add(new AuditoriaDados(entityBefore.getFieldValues().get(s), s, "BEFORE")); } executaMetodo.proceed(); for (String s : entity.getFieldValues().keySet()) { auditoria.getDadosAuditoria().add(new AuditoriaDados(entity.getFieldValues().get(s), s, "AFTER")); } sessionFactory.getCurrentSession().persist(auditoria); System.out.println("Auditoria realizada!"); } @AfterReturning(pointcut="execution(public void br.com.hslife.encontreaquipecas.repository.IRepository.delete(..)) && args(entity)") public void afterDelete(EntityPersistence entity) { System.out.println("Exclus�o detectada. Executando auditoria!"); System.out.println("Classe detectada: " + entity.getClass().getName()); Auditoria auditoria = new Auditoria(); auditoria.setClasse(entity.getClass().getSimpleName()); auditoria.setTransacao("DELETE"); auditoria.setUsuario(((Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuarioLogado")).getLogin()); auditoria.setIp(((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRemoteAddr()); for (String s : entity.getFieldValues().keySet()) { auditoria.getDadosAuditoria().add(new AuditoriaDados(entity.getFieldValues().get(s), s, "BEFORE")); } sessionFactory.getCurrentSession().persist(auditoria); System.out.println("Auditoria realizada!"); } }