segunda-feira, 28 de setembro de 2009

Expressões de ligação - validações customizadas em banco

segunda-feira, 28 de setembro de 2009
Hoje, me deparei com um problema interessante e a sua solução foi realmente muito simples.

Eis o problema os campos de uma determinada tela seriam construídos dinâmicamente, e cada campo tinha as suas peculiaridades de validação, a idéia que tivemos foi então efetuar também a validação de forma dinâmica, veja o exemplo, temos um formulário dinâmico com um campo chamado telefone e o campo telefone é de preenchimento obrigatório se fosse feito em código, você escreveria algo parecido com isto:
"".equals(telefone);
caso o código acima tenha um retorno verdadeiro, o campo não foi preenchido, mas ai vem o problema, não dá para implementar isto de forma dinâmica, onde apenas uma alteração no banco já mudaria as regras de validação, pensei em usar o drools, mas a solução do drools parecia complexa demais para resolver apenas um simples problema de validação. Assim cheguei a solução descrita aqui, basicamente usei algo que todo projeto web tem, o EL (Expressions Language), esta linguagem de expressões foi usada de forma realmente interessante com o uso do SEAM, o SEAM contém uma classe chamada Expressions que cria MethodExpressions e ValueExpressions, no caso o que queria saber é se um VALOR era verdadeiro ou não, portanto usei o ValueExpressions, fiz a seguinte prova conceito.

Em um managedBean coloquei o seguinte código:
Object retorno = Expressions.instance().createValueExpression("#{1<2}").getValue();
System.out.println(retorno);
O interessante deste código foi que ele retornou corretamente o valor true, visto que 1 é menor que 2, portanto percebi que podemos validar assim agora o problema era como validar o formulário, bem foi usado outro objeto do seam chamado Contexts, este objeto permite acesso aos contextos do seam, Contexts.getSessionContext() por exemplo retorna um Context que contém os objeto colocado em sessão, o código ficou assim:
Contexts.getEventContext().set("a", 1);
Contexts.getEventContext().set("b", 2);
Object retorno = Expressions.instance().createValueExpression("#{a<b}").getvalue(); 
Contexts.getEventContext().remove("a");
Contexts.getEventContext().remove("b");
System.out.println(retorno);
Agora ele avaliou o valor de a e b e retornou true, reparem que os valores 1 e 2 não estão mais na expressão, mas sim no contexto de evento, que é o primeiro a ser consultado pelo seam usei ele para evitar conflito de nomes nos outros contextos sendo que logo após a execução o contexto foi limpo, de posse do retorno da expressão podemos agora validar o campo de forma dinâmica, realmente interessante a solução e muito simples de ser usada visto que reutiliza o conhecimento que o programador já possui ao criar as expressões de valor EL.


Nenhum comentário :