/*
*
* Copyright (c) 2013 - 2014 INT - National Institute of Technology & COPPE - Alberto Luiz Coimbra Institute
- Graduate School and Research in Engineering.
* See the file license.txt for copyright permission.
*
*/
package DAO.controle;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import DAO.anotacao.RecuperaConjunto;
import DAO.anotacao.RecuperaLista;
import DAO.anotacao.RecuperaListaPaginada;
import DAO.anotacao.RecuperaObjeto;
import DAO.anotacao.RecuperaUltimoOuPrimeiro;
import DAO.exception.InfraestruturaException;
import DAO.generico.JPADaoGenerico;
public class InterceptadorDeDAO implements MethodInterceptor
{
/* Parametros:
*
* objeto - "this", o objeto "enhanced", isto �, o proxy.
*
* metodo - o m�todo interceptado, isto �, um m�todo da
* interface ProdutoDAO, LanceDAO, etc.
*
* args - um array de args; tipos primitivos s�o empacotados.
* Cont�m os argumentos que o m�todo interceptado
* recebeu.
*
* metodoProxy - utilizado para executar um m�todo super. Veja o
* coment�rio abaixo.
*
* MethodProxy - Classes geradas pela classe Enhancer passam
* este objeto para o objeto MethodInterceptor registrado quando
* um m�todo interceptado � executado. Ele pode ser utilizado
* para invocar o m�todo original, ou chamar o mesmo m�todo
* sobre um objeto diferente do mesmo tipo.
*
*/
public Object intercept (Object objeto,
Method metodo,
Object[] args,
MethodProxy metodoDoProxy)
throws Throwable
{
// O s�mbolo ? representa um tipo desconhecido.
JPADaoGenerico<?,?> jpaDaoGenerico = (JPADaoGenerico<?, ?>) objeto;
if(metodo.isAnnotationPresent(RecuperaObjeto.class))
{ // O m�todo busca() retorna um Objeto (Entidade)
return jpaDaoGenerico.busca(metodo, args);
}
else if(metodo.isAnnotationPresent(RecuperaLista.class))
{ // O m�todo buscaLista() retorna um List
return jpaDaoGenerico.buscaLista(metodo, args);
}
else if(metodo.isAnnotationPresent(RecuperaConjunto.class))
{ // O m�todo buscaConjunto() retorna um Set
return jpaDaoGenerico.buscaConjunto(metodo, args);
}
else if(metodo.isAnnotationPresent(RecuperaUltimoOuPrimeiro.class))
{ // O m�todo buscaUltimoOuPrimeiro() retorna um Objeto (Entidade)
return jpaDaoGenerico.buscaUltimoOuPrimeiro(metodo, args);
}
else if(metodo.isAnnotationPresent(RecuperaListaPaginada.class))
{ // O m�todo busca() retorna um Objeto (Entidade)
return jpaDaoGenerico.buscaListaPaginada(metodo, args, metodo.getAnnotation(RecuperaListaPaginada.class).tamanhoPagina());
}
else
{
throw new InfraestruturaException("Um m�todo n�o final deixou de ser anotado");
}
}
}