Definição de Conjuntos de
Junção Robustos usando
Aspect-Aware Interfaces e
Aspectos Anotadores
Leonardo Humberto Guimarães Silva
Orientador:
Marco Túlio de Oliveira Valente
Programa de Pós-graduação em Informática
Pontifícia Universidade Católica de Minas Gerais
{leonardosilva,mtov}@pucminas.br
Objetivo
Apresentar uma proposta para atenuar o
problema dos conjuntos de junção frágeis
de AspectJ baseada na combinação de
aspect-aware interfaces (AAIs) e aspectos
Tópicos
Problema dos conjuntos de junção frágeis
Geração de aspect-aware interfaces
Aspectos anotadores
Conclusão
Exemplo motivador
aspect UpdateSignaling {
pointcut change() :
execution(void Figure+.set*(..))
|| execution(void Figure+.moveBy(..));
after() returning: change() {
Display.update();
}
Conjuntos de junção frágeis
Conjuntos de junção são definidos por
nomes e expressões regulares
Manutenções no sistema podem causar
Captura acidental de pontos de junção
Ex: inclusão de Point.setDate()
Falha na captura de pontos de junção
Aspect-aware interfaces (AAIs)
Propostas originalmente em:
Gregor Kiczales and Mira Mezini. Aspect-oriented
programming and modular reasoning. In 27th International
Conference on Software Engineering (ICSE), pages 49–58,
2005
Apóiam raciocínio modular na presença de
aspectos
Definidas para classes e interfaces
Associam métodos com os adendos que os
Exemplos de AAIs
Primeira contribuição
Uso de AAIs para controlar a evolução de
sistemas orientados por aspectos
Alteração no processo de weaving para
geração automática e incremental de AAIs
por meio de uma ferramenta
Registro das alterações feitas nas AAIs
em um arquivo de log
Geração de AAIs
Plug-in para o ambiente Eclipse
Utiliza classes e interfaces exportadas
pelo pacote AJDT
Registra um listener que é acionado
sempre que um projeto é compilado
Armazena AAIs em uma estrutura de
dados própria
Geração de AAIs
Manutenções realizadas sobre a classe
Point do programa exemplo:
1.
Acrescenta-se o método setDate (Date)
2.
Renomeia-se o método setX (int)
3.
Acrescenta-se o método setColor (Color)
4.
Remove-se o método setColor (Color)
5.
Acrescenta-se o método changeColor
(Color)
Não detecta Captura pendente 5) + changeColor Detecta Eliminação de captura 4) – setColor Detecta Captura adicional 3) + setColor Detecta Falha captura 2) setX -> changeX Detecta Captura acidental 1) + setDate Ferramenta Situação Manutenção
Exemplos de manutenção no código base e comportamento da solução proposta
Avaliação
O log gerado auxilia na detecção de
capturas acidentais e falhas na captura
A solução é compatível com AspectJ
A solução inclui uma ferramenta para
geração automática de AAIs
A solução não detecta pontos de junção
que não seguem as convenções de nome
esperadas
Utilização de anotações para classificar pontos
de junção
Vantagem
Anotações denotam propriedades semânticas de
elementos do programa base
Problemas
Anotações representam interesses transversais
Conjuntos de junção baseados em anotações são
frágeis
Uma ferramenta identifica elementos
candidatos a serem anotados
Desenvolvedores confirmam elementos que
devem ser anotados
Geração semi-automática de aspectos
anotadores
Introdução de anotações de forma
não-invasiva
Solução proposta: aspectos
anotadores
Linguagem para declaração de
anotações
AnnotationDeclarationFile ::=
{ annotation AnnotationSection end } AnnotationSection ::=
name = String
target = fields | methods [&& [!] MethQualifiers] | classes [&& [!] ClassQualifiers]
scope = Type | Package question = String
MethQualifier ::=
getters | setters | call(Method) | declare(Type) | catch(Type)
ClassQualifier ::=
Exemplo de declaração de anotação
annotation
name = @DisplayStateChange
question = Does method %target change the state
of the display?
target = methods && (! getters)
scope = Figure
end
Exemplos de uso
HealthWatcher
Persistência
Controle de transações
JAccounting
Controle de transações
HealthWatcher (persistência)
Implementação original:
pointcut remoteUpdate(PersistentObject o):
this(HttpServlet) && target(o) && call(* set*(..)); declare parents: Complaint implements PersistentObject;
Solução proposta:
annotation
name = @Persistent
question = Is class %target persistent? target = classes && usedAs(param)
HealthWatcher (transações)
Implementação original:
pointcut transactionalMethods(): execution(* ITransactionalMethods.*(..));Solução proposta:
annotation name = @Transactionalquestion = Is method %target transactional? target = methods
scope = HealthWatcherFacade end
pointcut transactionalMethods():
JAccounting (transações) 1/2
Implementação original:
aspect Transaction { Transaction tx; pointcut p_0():
call(Session SessionFactory.openSession() && (( withincode(String ProductsPage.perform2()) || withincode(String InvoicePage.perform2()) || withincode(String RecurrencePage.perform2()) || withincode(String PaymentPage.perform2()) || withincode(String CustomerDetails.perform2()) || withincode(String CustomerForm.perform2()) || withincode(Account createInternalAccount(
Session, Integer, int));
JAccounting (transações) 2/2
Solução proposta:
annotation
name = @Transactional
question = Is method %target transactional? target = methods && call(Session.save)
scope = com end
pointcut p_0():
call(Session SessionFactory.openSession()) && (withincode(@Transactional * * (..));
Análise de robustez
1/4
Realizada sobre o Editor de Figuras
Utiliza os cenários de mudanças propostos em:
Klaus Ostermann, Mira Mezini, and Christoph
Bockisch. Expressive pointcuts for increased
modularity. In 19th European Conference on
Object-Oriented Programming (ECOOP), volume
3586 of Lecture Notes in Computer Science, pages
214–240. Springer-Verlag, 2005.
Alternativas de implementação utilizadas
Expressões regulares
Exemplo:
Figure+.set*(..)
Enumerações
Exemplo:
Point.setX(..) || Point.setY(..)
Anotações convencionais
Anotações introduzidas pelo Annotator
Análise de robustez
3/4
+/
-
+/-Incluir classe Pair para
armazenar campos de Point C6
-+
-Renomear Figure para FigureElements C5
+
-
+/-Incluir Circle na hierarquia de Figure C4
+
+
-Renomear setX da classe Point para changeX
C3
+
+
+
-Incluir campo Date e método setDate em Point C2
+
-+
Incluir campo Color e método setColor em Point C1
Annotator
Anotações
Enum
ER
Alteração
Análise de robustez
4/4
2
1
4
Annotator
4
0
3
Anotações
6
0
1
Enumerações
4
2
1
Expressões regulares
-
+/-+
Conjunto de junção
A solução é recomendada quando:
É possível associar anotações com propriedades de
elementos do programa base
É possível restringir o escopo e/ou o alvo de uma
anotação
A solução é compatível com AspectJ
A ferramenta Annotator gera aspectos
anotadores de forma semi-automática
A solução proposta não resolve todos os casos
Contribuições
1/2
Apresentação de uma proposta para
atenuar o problema de fragilidade dos
conjuntos de junção em AspectJ
Implementação de uma ferramenta para
geração de AAIs e aspectos anotadores
Uso de anotações, introduzidas de forma
não-invasiva, para definição de conjuntos
de junção
Contribuições
2/2
Demonstração do uso da solução nos
sistemas HealthWatcher e JAccounting
Realização de um estudo de robustez
Publicações
Publicação do artigo “Controlando a Evolução
de Sistemas Orientados por Aspectos por meio
de Aspect-Aware Interfaces” no LA-WASP 2007