[Duvida]Alocação de memória ou Loops fors varias vezes?

5 respostas
R

Boa tarde,

estou com uma dúvida referente à uma certa lógica.
O negócio é o seguinte:
Tenho uma página onde vários elementos dessa página serão mostrados somente se o usuario tiver permissão para viasualizar aquele elemento.
Essa permissão é previamente cadastrada em banco de acordo com o perfil do usuario. Até aí tudo bem…Eu coloco as permissões daquele perfil
em uma ArrayList, e faço a comparação: se o usuário tem a permissão, mostra, senão…não mostra (a vá).

O problema é: em vários momentos dessa página, eu terei que verificar se o usuário possui permissão para tal conteúdo, como por exemplo:
O usuário possui permissão para listar todos aqueles elementos, porém, não possui permissão para excluir nenhum elemento, logo, a coluna de
exclusão da tabela, não deverá ser impressa para ele. Logo depois, vem a coluna de alteração, e não são todos os usuários que podem alterar,
e lá vai o java ver se o manolo tem permissão pra isso.

Quais as possibilidades em que eu pensei?

1º - Eu poderia fazer um loop for para percorrer a minha arraylist que tem todas as minhas permissões, toda vez que eu precisasse imprimir um
elemento que não é comum à todos os usuários. Logo, seria um loop for para ver se o usuario pode listar os elementos, outro pra ver se ele pode
excluir esses elementos, e outro pra ver se ele pode alterá-los. Me pareceu trabalhoso demais e não segue nem um pouco o principio de reutilização
de código.

2º - Eu poderia criar uma variável do tipo boolean para cada elemento que eu precisasse de permissão, como por exemplo: boolean editar, boolean excluir,
boolean listar, boolean incluir. E em 1 só loop for, eu iria definir cada uma. Na hora de imprimir o elemento, eu iria verificar somente se sua respectiva variavel
é true ou false. Me pareceu um outro gato (gambiarra). Eu iria alocar espaço na memória, sem ter a real necessidade, afinal, só quero saber se o cara pode ver
o elemento ou não.

3º - Eu trabalhei o dia todo, não aguento mais programar, e eu não estou vendo uma solução muito mais simples do que alocar memoria desnecessariamente, ou
fazer multiplos loops for para uma coisa tão básica.

Enfim, como não achei nenhuma solução além dessas 2, eu fiquei me perguntando qual seria menos agressiva ao processamento do sistema: alocar memoria ou
multiplos processamentos de for?

Logo abaixo vai o código, meio que resumido:

<%
    ArrayList permissoes = (ArrayList)session.getAttribute("permissoes");
    boolean permissao = true; //Provavelmente vocês irão me ajudar à acabar com essa variavel tambem...
    if(permissoes==null){
        
    }else{
        for (Iterator iterator = permissoes.iterator(); iterator.hasNext(); ) {
            Permissoes perm = (Permissoes) iterator.next();
            if(perm.getIdAtividade()==27){ //Aqui, 27 é o id da permissão cadastrada no banco, que no caso é listar os usuarios.
                permissao = true;
                break;
            }else{
                permissao = false;
            }
        }
    }
    if(permissao==true){
%>
<br>
<table>
    <tr>
        <th>Nome</th>
        <th>Login</th>
        <th>Perfil</th>
        <th>Editar</th>     <!--Esse elemento não pode ser mostrado à todos-->
    </tr>
<%
        UsuarioDAO udao = new UsuarioDAO();
        PerfilDAO pdao = new PerfilDAO();
        ResultSet rs = null;
        ResultSet rs2 = null;
        int linha = 0;		
        try{
            rs = udao.listar();
            while(rs.next()){
                if(linha==0){		//Isso aqui é firula, só pra tabela ficar mais bacaninha...=D
                    out.print("<tr bgcolor='white'>");
                    linha = 1;
                }else{
                    out.print("<tr>");
                    linha = 0;
                }
                pdao.setIdPerfil(rs.getInt("id_perfil"));
                rs2 = pdao.listar(1);
%>
        <td><%=rs.getString("nome_usuario")%></td>
        <td><%=rs.getString("login_usuario")%></td>
<%
                while(rs2.next()){
%>
        <td><%=rs2.getString("nome_perfil")%></td>
<%
                }
%>
        <td></td>
<%
                out.print("</tr>");
            }
        }catch(SQLException e){
            out.print(e.getMessage());
        }
%>
</table>
<%
    }else{
%>
<br>
<center>
    Voc&ecirc; n&atilde;o possui privilegios para acessar esta area.
</center>
<%
    }
%>

5 Respostas

nel

Oi!

Antes de mais nada, não li o seu post completo, é grandinho né? :slight_smile:
Cara, por favor, não me programe na sua página JSP, não dessa forma. Use o coceito de MVC, nem que seja um pouco.
Tira esse DAO da sua página e joga tudo dentro de uma Servlet.

E outro detalhe, se tu quer fazer esse tipo de controle, o JSTL vai lhe suprir de modo fácil sua necessidade.
Abraços.

FernandoFranzini

1º - Eu poderia fazer um loop for para percorrer a minha arraylist que tem todas as minhas permissões, toda vez que eu precisasse imprimir um
elemento que não é comum à todos os usuários. Logo, seria um loop for para ver se o usuario pode listar os elementos, outro pra ver se ele pode
excluir esses elementos, e outro pra ver se ele pode alterá-los. Me pareceu trabalhoso demais e não segue nem um pouco o principio de reutilização
de código.

Eu não vejo trabalho de mais não…desde que vc implemente 1 vez, encapsulando isso em um lugar unico no sistema como uma classe de “Permissao”…poderia reutilizado como agregação em qualquer caso em qualquer GUI. Tenho sistemas grandes, com + de 500 sessões por minutos rodando ha anos sem problemas.

2º - Eu poderia criar uma variável do tipo boolean para cada elemento que eu precisasse de permissão, como por exemplo: boolean editar, boolean excluir,
boolean listar, boolean incluir. E em 1 só loop for, eu iria definir cada uma. Na hora de imprimir o elemento, eu iria verificar somente se sua respectiva variavel
é true ou false. Me pareceu um outro gato (gambiarra). Eu iria alocar espaço na memória, sem ter a real necessidade, afinal, só quero saber se o cara pode ver
o elemento ou não.

Esse opção é muito bacana em casos que a solução fica repetitivamente avaliando mesmas estruturas de permissão em varias GUI’s diferentes com divisão de permissão baseada em funções. Vc pode fazer isso sim e guardar na sessão do usuario tranquilo. Matematicamente existe um gasto maior, mas não vai afetar seu HEAP
em nada ! algumas centenas de booleanos não vão nem fazer cosegas kkkkkk
Eu tb tenho soluções assim…muito legal. Quando o usuário loga no sistema, vc carrega estas flags boleanas que evitam ficar validando em loop repetitivo em varios GUI diferentes…

Eu concordo com vc! Vc tem 3 soluções:

  1. Usar modelo de Container Autentication com JAAS (verifique as opções com seu provedor de container).
  2. Usar framework proprietários SpringSecurity, JGuard etc…
  3. Criar um framework próprio JEE reutilizavel.
    Eu como projetista, costuma avaliar os requisitos da solução para decidir…Mas resumidamente uso a opção 1 para projetos rapidos e pequenos e a opção 3 para projeto grandes e continuo.
R

Então cara, eu meio que joguei tudo dentro da jsp pra poder ficar menor o post, senão eu teria que dar o quote na jsp e no servlet. =S

Na verdade, eu acredito que mesmo não estando desse jeito aí o meu código original, ainda possuo muitos problemas de padronização
e organização do código, porém, esse não é meu foco agora, já que tenho prazo pra entrega. =S

Mas de qualquer forma, brigadão pela dica, enquanto não me respondem, vou dar uma pesquisada nesse lance de JSTL.

FernandoFranzini

renangd:
Então cara, eu meio que joguei tudo dentro da jsp pra poder ficar menor o post, senão eu teria que dar o quote na jsp e no servlet. =S

Na verdade, eu acredito que mesmo não estando desse jeito aí o meu código original, ainda possuo muitos problemas de padronização
e organização do código, porém, esse não é meu foco agora, já que tenho prazo pra entrega. =S

Mas de qualquer forma, brigadão pela dica, enquanto não me respondem, vou dar uma pesquisada nesse lance de JSTL.


Pois é, esta bem ruim mesmo…existe varias ferramentas como criar tags personalizadas ou usar JSTL if para fazer tudo isso com 80% menos de código, deixando mais fácil, legível e manutenível.
De uma boa estudada em outros exemplos para ver uma forma ideal que se enquadre com seu caso - http://fernandofranzini.wordpress.com/2009/09/09/autenticacao-e-autorizacao/.

R

Wow, agora eu senti firmeza Fernando.

Antes de mais nada, brigadão pela ajuda! =D

Bom, suas palavras me tranquilizaram, eu to ruim, mas não to morto.

Acredito que por hora vou encapsular aquele loop for, e toda vez que precisar dele, vou chamá-lo.

Eu tenho um sério problema ainda pra entender o que fica na jsp e o que fica no servlet, mas enfim…isso são outros 500.

Brigadão galera. =D

Se alguem tiver uma solução melhor, agradeço desde ja!

Criado 15 de agosto de 2011
Ultima resposta 15 de ago. de 2011
Respostas 5
Participantes 3