aspectj modularização de interesses ortogonais heliomar kann da rocha santos

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

Upload: internet

Post on 17-Apr-2015

112 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: 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

Page 2: AspectJ Modularização de interesses ortogonais 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

Page 3: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

Page 4: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

Page 5: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

Page 6: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

Introdução - TerminologiaIntrodução - Terminologia

Interesses OrtogonaisInteresses Ortogonais

Page 7: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

Introdução - TerminologiaIntrodução - Terminologia

Interesses OrtogonaisInteresses Ortogonais

Interesses

Page 8: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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,

Page 9: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

Page 10: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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) ;

Page 11: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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”

Page 12: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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)

Page 13: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

Page 14: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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(..))

Page 15: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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()()

Page 16: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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();

}}

Page 17: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

Introdução - ModelagemIntrodução - Modelagem

Page 18: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

TransaçãoTransação

Controle TransacionalControle Transacional

Page 19: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

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

Page 20: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

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

Page 21: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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(); }

Page 22: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

• @MetodoRecuperaLista@MetodoRecuperaLista

• @MetodoRecuperaUltimo

• @MetodoRecuperaPrimeiro

• @MetodoRecuperaConjunto

• @MetodoResultadoUnico

Page 23: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

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

Page 24: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

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

Page 25: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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"); }}

Page 26: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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());

}}

Page 27: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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);

}

Page 28: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

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

Page 29: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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(..));

Page 30: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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);

}

Page 31: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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";

Page 32: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

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

Page 33: AspectJ Modularização de interesses ortogonais Heliomar Kann da Rocha Santos

Dúvidas?Dúvidas?