AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos.

Post on 17-Apr-2015

112 views 6 download

Transcript of AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos.

AspectJAspectJ

Modularização de interesses Modularização de interesses ortogonaisortogonais

Heliomar Kann da Rocha Santos

SumárioSumário IntroduçãoIntrodução

O que é POAO que é POA HistóriaHistória TerminologiasTerminologias ConstruçõesConstruções ModelagemModelagem

AplicaçãoAplicação Controle TransacionalControle Transacional Execução de Buscas genéricas em DAOExecução de Buscas genéricas em DAO Padrões de projeto com aspectjPadrões de projeto com aspectj Auditoria e log de eventosAuditoria e log de eventos Outras aplicaçõesOutras aplicações

Tratamento de ExceçõesTratamento de Exceções Declaração de erros e warningsDeclaração de erros e warnings Implementação default de interfacesImplementação default de interfaces

ConclusãoConclusão Conclusão e trabalhos futurosConclusão e trabalhos futuros

Introdução – O que é POAIntrodução – O que é POA

Introdução – Composição POAIntrodução – Composição POA

Linguagem de componentes: Java, C++.. Programas escritos em linguagem de componentes

Linguagem de aspectos: AspectJ.. Programas escritos em linguagem de aspectos

Combinador de aspectos: aspect weaver

Introdução - HistóriaIntrodução - História

Criada em Criada em 19971997

Xerox Palo Alto Research Center PARCXerox Palo Alto Research Center PARC

Atualmente é um projeto EclipseAtualmente é um projeto Eclipse

Modularização de interesses difíceis em POOModularização de interesses difíceis em POO

Introdução - TerminologiaIntrodução - Terminologia

Interesses OrtogonaisInteresses Ortogonais

Introdução - TerminologiaIntrodução - Terminologia

Interesses OrtogonaisInteresses Ortogonais

Interesses

Introdução - ConstruçõesIntrodução - Construções

AspectAspect Abstração criada para conter o código de interesses Abstração criada para conter o código de interesses

ortogonais em um local separadoortogonais em um local separado Semelhança com o “class”, porém não é Semelhança com o “class”, porém não é

instanciávelinstanciável Composto por :Composto por :

Join PointsJoin Points PointcutsPointcuts Advices, Advices,

Introdução - ConstruçõesIntrodução - Construções

Join Points (Ponto de Junção)Join Points (Ponto de Junção) Pontos bem definidos do códigoPontos bem definidos do código

Chamadas a métodos, construtoresChamadas a métodos, construtores Execuções de métodosExecuções de métodos Inicialização e pré-inicialização de ClassesInicialização e pré-inicialização de Classes AtribuiçõesAtribuições

Introdução - ConstruçõesIntrodução - Construções

Pointcut (Ponto de atuação)Pointcut (Ponto de atuação) Delimita pontos de junção aos quais algum aspecto Delimita pontos de junção aos quais algum aspecto

provavelmente será aplicadoprovavelmente será aplicado

EstruturaEstrutura pointcut nomePointcut(ListaParametros) : ListaDesignadorespointcut nomePointcut(ListaParametros) : ListaDesignadores Ex.: Ex.:

pointcut construtores() : call(* *.new(..));pointcut construtores() : call(* *.new(..)); pointcut construtores2() : construtores()pointcut construtores2() : construtores()

&& !&& !within(Pessoa) ; within(Pessoa) ;

Introdução - ConstruçõesIntrodução - Construções

Pointcut (Ponto de atuação)Pointcut (Ponto de atuação) Designadores de pointcutDesignadores de pointcut

call(Assinatura) – métodos e construtorescall(Assinatura) – métodos e construtores

execution(Assinatura) – métodos e construtoresexecution(Assinatura) – métodos e construtores

within(Padrão Tipo) – Classe ou tipo em tempo de compilaçãowithin(Padrão Tipo) – Classe ou tipo em tempo de compilação

withincode(Padrão Tipo) – Interno a um método em tempo de withincode(Padrão Tipo) – Interno a um método em tempo de compilaçãocompilação

args(Padrão Tipo) – Argumentos descritos em “Padrão Tipo”args(Padrão Tipo) – Argumentos descritos em “Padrão Tipo”

Introdução - ConstruçõesIntrodução - Construções

Pointcut (Ponto de atuação)Pointcut (Ponto de atuação) Designadores de pointcutDesignadores de pointcut

target(Padrão Tipo) – Objeto na qual se encontra a target(Padrão Tipo) – Objeto na qual se encontra a implementação do ponto de junção em tempo de execuçãoimplementação do ponto de junção em tempo de execução

Ex: pointcut abc() : execution(* getPessoa*(..)) Ex: pointcut abc() : execution(* getPessoa*(..)) && target(PessoaService)&& target(PessoaService)

this(Padrão Tipo) - Objeto na qual se encontra o ponto de this(Padrão Tipo) - Objeto na qual se encontra o ponto de junção em tempo de execuçãojunção em tempo de execução

Ex: pointcut abc() : execution(* getPessoa*(..)) Ex: pointcut abc() : execution(* getPessoa*(..)) && this(PessoaService) || this(FuncionarioService)&& this(PessoaService) || this(FuncionarioService)

Introdução - ConstruçõesIntrodução - Construções

Wildcards (Caracteres curingas)Wildcards (Caracteres curingas) ““*” *”

Qualquer seqüência de caracteres não contendo pontosQualquer seqüência de caracteres não contendo pontos

““..” ..” Qualquer seqüência de caracteres, inclusive contendo pontosQualquer seqüência de caracteres, inclusive contendo pontos

““+” +” Qualquer subclasse da classe em questãoQualquer subclasse da classe em questão

Introdução - ConstruçõesIntrodução - Construções

Pointcuts genéricosPointcuts genéricos

callcall (* set*(..)) (* set*(..))

execution(execution(publicpublic * Pessoa.*(..) * Pessoa.*(..)))

call(* dao..*(..))call(* dao..*(..))

call(PessoaDAO+.new(..))

Introdução - ConstruçõesIntrodução - Construções

Advices (Adendos)Advices (Adendos) Três tipos:Três tipos:

BeforeBefore Mais simplesMais simples

AfterAfter After - Sempre depois do ponto de junçãoAfter - Sempre depois do ponto de junção After Returning – Somente se o método não lançar exceçõesAfter Returning – Somente se o método não lançar exceções After Throwing – Somente se o método ter lançado uma exceçãoAfter Throwing – Somente se o método ter lançado uma exceção

Around (entorno de)Around (entorno de) Mais poderosoMais poderoso Pode escolher entre executar o método originalPode escolher entre executar o método original Execução do método através da construção Execução do método através da construção proceedproceed()()

Introdução - ConstruçõesIntrodução - Construções

Advices (Adendos)Advices (Adendos) EstruturaEstrutura

tipoAdvice(ListaParametros) : ListaPointCut(){corpo}tipoAdvice(ListaParametros) : ListaPointCut(){corpo} Ex1: Ex1:

before() : call( String *.toString()){ before() : call( String *.toString()){ imprime(“Antes de entrar no método toString”); imprime(“Antes de entrar no método toString”); } }

Ex2:Ex2: pointcut metodosToString() : call(String *.toString());pointcut metodosToString() : call(String *.toString()); String around() : String around() : metodosToString() metodosToString() {{

return proceed().toUpperCase();return proceed().toUpperCase();

}}

Introdução - ModelagemIntrodução - Modelagem

Aplicação - Controle TransacionalAplicação - Controle Transacional

TransaçãoTransação

Controle TransacionalControle Transacional

Aplicação - Controle TransacionalAplicação - Controle Transacional

Controle de Transação com ProxyControle de Transação com Proxy

Aplicação - Controle TransacionalAplicação - Controle Transacional

Controle de Transação com AspectJControle de Transação com AspectJ

Aplicação - Controle TransacionalAplicação - Controle Transacional

Controle de Transação com AspectJControle de Transação com AspectJ

pointcut transacao(): (@Transacional * *.*(..));

before() : transacao(){ JPAUtil.beginTransaction(); }

after()returning : transacao() { JPAUtil.commitTransaction(); JPAUtil.closeEntityManager(); } after() throwing : transacao() { JPAUtil.rollbackTransaction(); }

Aplicação – Buscas GenéricasAplicação – Buscas Genéricas• Anotações CriadasAnotações Criadas

• @MetodoRecuperaLista@MetodoRecuperaLista

• @MetodoRecuperaUltimo

• @MetodoRecuperaPrimeiro

• @MetodoRecuperaConjunto

• @MetodoResultadoUnico

Aplicação – Buscas GenéricasAplicação – Buscas Genéricas

• Buscas genéricas com ProxyBuscas genéricas com Proxy

Aplicação – Buscas GenéricasAplicação – Buscas Genéricas

• Buscas genéricas com AspectJBuscas genéricas com AspectJ

Aplicação – Buscas GenéricasAplicação – Buscas Genéricas

• Mudanças NecessáriasMudanças Necessárias• DAOImpl deixa de ser AbstrataDAOImpl deixa de ser Abstrata

• public Pessoa getByLogin(String login) { public Pessoa getByLogin(String login) { throw new MetodoInterceptadoException(throw new MetodoInterceptadoException( "Esse método deve ser implementado via aspecto"); "Esse método deve ser implementado via aspecto"); }}

Aplicação – Buscas GenéricasAplicação – Buscas Genéricas

pointcut buscaLista(JPADaoGenerico dao) :pointcut buscaLista(JPADaoGenerico dao) :

call(@MetodoRecuperaLista * *.*(..)) && target(dao);call(@MetodoRecuperaLista * *.*(..)) && target(dao);

Object around(JPADaoGenerico dao): buscaLista(dao){Object around(JPADaoGenerico dao): buscaLista(dao){

Signature sig = thisJoinPointStaticPart.getSignature();Signature sig = thisJoinPointStaticPart.getSignature();

Method metodo = ((MethodSignature)sig).getMethod();Method metodo = ((MethodSignature)sig).getMethod();

return dao.buscaLista(return dao.buscaLista(

metodo, metodo,

thisJoinPoint.getArgs(), thisJoinPoint.getArgs(),

metodo.getAnnotation(metodo.getAnnotation(

MetodoRecuperaLista.class)MetodoRecuperaLista.class)

.namedQuery());.namedQuery());

}}

Aplicação – Padrão de ProjetoAplicação – Padrão de Projeto

• Singleton

• Anotação criada - @Singleton

• ... private Map singletons = new Hashtable();

Object around() : call( (@Singleton+ *).new(..) ) {

Class singleton = thisJoinPoint.getSignature().getDeclaringType();

if(singletons.get(singleton)==null){

singletons.put(singleton, proceed());

}

return singletons.get(singleton);

}

Aplicação – Padrão de ProjetoAplicação – Padrão de Projeto

…@Singletonpublic class PessoaService {… public PessoaService(){ … }…}

Aplicação – Aplicação – Auditoria e Log de Eventos

• Auditoria e Log de Eventos

pointcut services():

execution (public * br.uff.iduff2.service..*.*(..))

&& !execution(* ..service.controletransacao..*.*(..))

&& !execution(List br.uff.iduff2.service..*.*(..))

&&!execution(* IdentificacaoService.autenticar(..));

pointcut autenticar():

execution(* IdentificacaoService.autenticar(..));

Aplicação – Aplicação – Outras aplicações

• Tratamento de ExceçõesTratamento de Exceções1________________________________________________________

before(): handler(RuntimeException){

System.out.println("Exceção="+thisJoinPoint.getArgs()[0]);

}

2________________________________________________________

declare soft : InterruptedException : withincode(* Principal.main(..));

3________________________________________________________

after() throwing(Throwable t) throws InfraestruturaException:

execution(* dao..*.*(..)){

throw new InfraestruturaException(t);

}

Aplicação – Aplicação – Outras aplicações

• Declaração de erros e warningsDeclaração de erros e warnings

• Erros

declare error: call( java.util.*.new(..) ):

"Não é permitido instanciar objetos da biblioteca [java.util] ";

• Warnings

declare warning: call( dao..*.new(..) ) && !within(service..*):

"Essa construção deve ocorrer em um Server";

Aplicação – Aplicação – Conclusão

• SimplicidadeSimplicidade• Evitar uso excessivoEvitar uso excessivo• Necessidade de manutençãoNecessidade de manutenção• CompetitividadeCompetitividade

• Trabalhos futuros• Plugin perfeitamente integrado com IDEs• Identificação de interesses ortogonais com IA

Dúvidas?Dúvidas?