AOP - Checar permissão

8 respostas
R

Olá,

tenho o seguinte aspecto:

package br.com.ampix.cliente.permissoes;

import br.com.ampix.cliente.Cliente;

public aspect Permissoes {

    public pointcut inserir() : call (void *.inserir());

    before() : inserir() {
        if (!Cliente.getUsuario().isInserivel(getClass().getSimpleName()))
            System.out.println("Não pode inserir.");
    }
}

O método “isInserivel” do usuário, pesquisa nas permissões que ele tem se ele pode inserir nesta ‘tela’ (JInternalFrame). O problema é que preciso pegar o nome da classe (isso seria a chave da permissão num Map) mas não consigo, pois o

getClass().getSimpleName()) retorna o nome do meu aspecto.

Alguem sabe como fazer isto? ou alguma outra sugestão?

Att, Rodrigo

8 Respostas

velo

Usa a palavra reservada:

thisJoinPointStaticPart

Ela tem uns get… não toh com o meu Eclipse bombado aqui, mas deve ter um get q te salva o dia.

VELO

R

Ops,

consegui com ele, mas ele esta retornando o nome da minha classe abstrata, e não a que herda… :shock:

não to entendendo… :roll:

heheh

Será que existe alguma outra forma de eu fazer? tipo, receber algum parametro?

Mauricio_Linhares

Ele está pegando a “primeira opção”, pra pegar a classe que herda você vai ter que fazer o pointcut mais restritivo pra pegar só as que herdam.

R

Bah, blz…

tipo colocar no pointcut a classe AbstractClasse+ ???

Rodrigo

R

Mauricio,

eu coloquei assim:
public pointcut excluir() : call (void br.com.ampix.adm.gui.FAdmMPai.inserir());

    /**
     * <b>Advice</b> para realizar a verificação da Permissão antes de realizar a operação de inserir.
     */
    before() : inserir() {
        if (!Cliente.getUsuario().isInserivel(thisJoinPointStaticPart))
            System.out.println("Não pode inserir.");
    }

Mas ele continua enviando a classe ApxInternalFrame (que extende de JInternalFrame, e é abstrata). Então não sei qual a classe (tela) que testa a permissão do Usuário.

Tens alguma indéia?

Rodrigo

Mauricio_Linhares

Esse método é implementado em ApxInternalFrame ou na classe filha?

R

Ops,

o método inserir() é abstrato na classe ApxInternalFrame (que também é asbtrata :wink: ), então todas nossas ‘telas’ implementam esse método.

alias, existem os métodos:

inserir;

alterar;

excluir;

consultar;

Pensei em tratar eles com AOP para justamente verificar se o usuário logado tem permissão de fazer alguma dessas ações…

Rodrigo

R

Mauricio,

descobri uma outra coisa. O advice() before não serve para meu caso… eu tenho que usar o around(). Fiz uns testes assim:

/**
     * <b>Pointcut</b> para reconhecer o <b>Join Point</b> <code>inserir()</code> br.com.ampix.adm.gui.FAdmMPai
     */
    pointcut inserir() : call (void *.inserir());

    /**
     * <b>Pointcut</b> para reconhecer o <b>Join Point</b> <code>excluir()</code>
     */
    // public pointcut excluir() : call (public void br.com.ampix.adm.gui.FAdmMPai.excluir());
    /**
     * <b>Advice</b> para realizar a verificação da Permissão antes de realizar a operação de inserir.
     */
    void around() : inserir() {
        if (Cliente.getUsuario().isInserivel("FADMMPAI")) {
            proceed();
        }
        else {
            ApxDialog.abreDialog(ApxDialog.ICON_ERRO, ApxDialog.BUTTON_OK, "Usuário sem permissão para a Incluir");

        }
    }

Agora deu certo, mas ainda tenho dificuldade em descobrir o que realmente preciso: a classe que ele esta usando… acho que qdo entrar vou guardar esta informação em algum lugar :roll: … depois vejo se acho alguma coisa…

Obrigado,

Rodrigo

Criado 30 de março de 2006
Ultima resposta 31 de mar. de 2006
Respostas 8
Participantes 3