Este documento apresenta uma DSL para declarar a ordem de execução de aspectos. A DSL permite definir restrições sobre a execução de advices de aspectos que interceptam um mesmo join point. O documento descreve um estudo de caso em que dois aspectos interceptam o mesmo join point e a DSL é usada para declarar que o advice de compressão deve executar antes do de criptografia. A solução proposta permite também suportar versões antigas do sistema variando a regra de composição usada.
Uma DSL para declarar a Ordem de Execução de Aspectos
1. Universidade Federal de Viçosa
Centro de Ciências Exatas e Tecnológicas
Departamento de Informática
INF 442 – Programação Orientada a Aspectos e Padrões
de Projetos
Uma DSL para declarar a ordem
de execução de aspectos
“A DSL to declare aspect execution order”
Antoine Marot
Université Libre de Bruxelles (ULB)
Roel Wuyts
IMEC Leuven and KU Leuven
Apresentação: Giorgio Prímola F. G. Torres
Professor: Vladimir Oliveira Di Iorio
2. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Introdução – DSL
• Quando se trabalha com um conjunto de
operações que aparecem freqüentemente ao
lidar com um determinado problema (domínio),
surge a necessidade de abstrair essas operações
para torná-las mais práticas.
• Uma DSL trata da abstração de um conjunto de
operações complexas, ou apenas trabalhosas,
por um outro conjunto mais prático.
3. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Introdução – Ordem de execução entre
aspectos
• Quando dois ou mais aspectos executam em
um mesmo join point, pode ser necessário
especificar a ordem de execução entre eles.
• Tipo de problema semântico.
• Exemplo: aspectos VerificaPermissaoUsuario e
MonitoraAcoes.
4. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Estudo de caso
• Uma empresa desenvolveu uma aplicação do
tipo cliente-servidor para hospedagem de
arquivos, que é amplamente usada. O sevidor é
quem hospeda os arquivos. Os usuários utilizam
um aplicativo cliente para enviar arquivos
através do método send(). Quando o arquivo
está sendo enviado, primeiro ele é encriptado e
depois compactado, para acelerar o envio.
5. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Estudo de caso
• Porém, a companhia prevê que, em um futuro
próximo, terá que dar suporte a novas técnicas de
segurança e compactação, e também continuar a
atender aqueles que utilizam o modelo antigo.
• A empresa adotou uma nova técnica de primeiro
comprimir o arquivo e depois encriptá-lo, por causa
da adoção de um novo método de compactação.
6. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Estudo de caso
• Como a compressão e a encriptação são
funcionaliades transversais, foram identificados
dois aspectos:
• SecureUpload;
• CompressUpload.
• Ambos estão encarregados em fazer a
operação que cabe a eles, e desfazê-la, ao
chegar ao servidor.
7. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Estudo de caso
public aspect SecureUpload {
before(File f) :
call(* Client.send(..)) && args(f) {
encrypt(f);
}
before(File f) :
call(* Server.receive(..)) && args(f) {
decrypt(f);
}
}
8. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Estudo de caso
public aspect CompressUpload {
before(File f) :
call(* Client.send(..)) && args(f) {
zip(f);
}
before(File f) :
call(* Server.receive(..)) && args(f) {
unzip(f);
}
}
9. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Estudo de caso
• Os dois aspectos apresentados como solução
para o problema relatado, interceptam um
mesmo join point.
• Problema: Qual aspecto executará primeiro?
10. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Estudo de caso
• A ordem precisa ser de tal forma que:
• no envio do arquivo sejam feitas primeiro a operação
de compactação e depois a de criptografia;
• no recebimento do arquivo, primeiro decriptografa e
depois descompacta.
• A ordem estabelecida acima não diz respeito à
ordem dos aspectos, mas sim à ordem dos advices
dos aspectos.
11. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Estudo de caso
12. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Soluções
• O problema da ordem de execução de
aspectos não é um problema novo, ele já vem
sendo estudado, e já existem algumas técnicas
para esse problema:
• Ordenação dos Aspectos (ordering aspects);
• JAsCo;
• Composição declarativa de aspecto (declarative
aspect composition).
13. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Soluções
• Ordenação dos aspectos (ordering aspects):
solução implementada na própria AspectJ pelo
comando “declare precedence”.
• “Se um aspecto A deve preceder um aspecto B,
então todos os adendos de A devem preceder os de
B.”
• Problema: não é aplicável ao estudo de caso
apresentado, pois este requer ordem na execução
dos adendos.
14. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Soluções
• JAsCo: é uma linguagem orientada a aspectos
estendida de Java, onde o escopo do aspecto é
separado do seu comportamento. O
comportamento é descrito através de hooks,
presente na própria linguagem.
• É possível determinar ordem de execução entre os
adendos;
• É uma solução inviável para o problema
apresentado, pois o trata a um nível muito abaixo.
15. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Soluções
• Composição declarativa de aspecto: baseado
em declarações de restrições em um aspecto
separado.
• Restrição de ordenação: determina que um
adendo deve ser executado antes de um outro;
• Restrição de controle: determina que um advice
será executado somente se um outro foi executado
com sucesso.
16. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Solução proposta pelo artigo
• Abordagem declarativa de aspectos baseado em
regras de composição que declaram restrições. É a
solução apresentada em uma nova DSL por este
trabalho.
• O problema da ordem de execução de aspectos é
também um problema transversal. É interessante
então, criar um aspecto que lida com a ordenação
ao invés de definir a ordem de execução dentro dos
próprios aspectos que interceptam um mesmo join
point.
17. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Solução proposta pelo artigo
• Regras de composição são restrições que o
weaver leva em consideração enquanto tece os
adendos nos pontos de junção.
• São declaradas em aspectos separados e
descrevem o comportamento dos adendos dos
aspectos envolvidos.
• Especificam o contexto nos quais estarão
ativas. Se um join point atende ao contexto, a
regra é executada.
18. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Solução proposta pelo artigo
• Existem quatro tipos de restrições possíveis
para as regras:
1. Prec(a,b): especifica que o adendo ‘a’ tem que
ser executado antes do adendo ‘b’;
2. First(a): o adendo ‘a’ tem que ser o primeiro a
ser executado;
3. Last(a): o adendo ‘a’ tem que ser o último a ser
executado;
4. Ignore(a): o adendo ‘a’ não será executado.
19. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Solução proposta pelo artigo
• As quatro restrições podem ser aplicadas no
estudo de caso.
• Para isso, os adendos são nomeados da
seguinte forma: zipFile, unzipFile, encryptFile e
decryptFile.
20. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Solução proposta pelo artigo
• As restrições são montadas de acordo com os
nomes dos adendos:
• Prec(zipFile, encryptFile);
• Prec(decryptFile, unzipFile).
• Com estas restrições, a ordenação da execução
dos aspectos é definida.
• No entanto, os usuários antigos que utilizam o
sistema de encriptar primeiro e depois compactar,
não são mais atendidos pelo sistema.
21. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Solução proposta pelo artigo
• Para solucionar o problema de suporte a usuários
do sistema antigo, a DSL criada oferece a opção de
criar uma outra regra que será ativada num
contexto específico.
• A parametrização de regras por pointcuts, permite
que uma regra seja bem específica para aquele
ponto de junção.
• Uso do parâmetro advices(a1, a2, ..., an) identifica
o ponto de junção onde todos aqueles adendos
interagem.
22. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Solução proposta pelo artigo
public aspect AspectComposition {
public boolean isZipped(File f) {
return f.isZipped();
}
declare rule sendFile:
advices(zipFile, encryptFile) {
Prec(zipFile, encryptFile);
}
declare rule receiveFile:
advices(unzipFile, decryptFile) {
Prec(decryptFile, unzipFile);
}
declare rule oldVersion extends receiveFile:
advices(unzipFile, decryptFile)
&& if(isZipped(thisJoinPoint.getArgs()[0])) {
Prec(unzipFile, decryptFile);
}
}
23. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Solução proposta pelo artigo
• O mecanismo de extensão (extends), usado na
regra de recebimento do servidor para clientes
antigos, é necessário pois ele define uma
prioridade entre a regra nova de recebimento
com a do cliente antigo.
• Uma regra que extends uma outra regra, tem
prioridade sobre esta última, e pode ser vista
como um caso de excessão.
24. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Outros exemplos
public aspect ChooseVisualization {
public boolean otherVis = false;
before(String [] a) : execution(* Main.main(String[]))
&& args(a) {
if(a[0].equals(“otherVis”))
otherVis = true;
}
declare rule defaultVis : advices(VisAspect1.*, VisAspect2.*) &&
if(!otherVis) {
Ignore(VisAspect2.*);
}
declare rule otherVis : advices(VisAspect1.*, VisAspect2.*) &&
if(otherVis) {
Ignore(VisAspect1.*);
}
}
26. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Conclusões
• A ordem de execução de aspectos em um
pointcut é um problema transversal.
• A composição de aspectos é problemática a
partir de quando as interações entre aspectos
aparecem, pois estas podem levar a programas
“tecidos” erroneamente pelo weaver dos
aspectos.
27. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Dúvidas?
28. Introdução – Estudo de caso – Soluções – Solução proposta pelo artigo – Outros Exemplos – Conclusão – Dúvidas – Bibliografia
Bibliografia
Antoine Marot and Roel Wuyts. 2008. A DSL to declare aspect execution
order. In Proceedings of the 2008 AOSD workshop on Domain-specific
aspect languages (DSAL '08). ACM, New York, NY, USA, 2008. ACM
press.