Archive for January 4th, 2008

Lyoto Machida, filho do lendário e respeitado mundialmente professor de Karatê Machida de Belém, é um paraense que vai longe veja a última luta dele no UFC.

Quando ele fala de Belém, claro que o orgulho vem todo a tona. Parabéns Lyoto!


O JBoss Seam de fato é um framework que enche os olhos de qualquer um, mesmo tendo trabalhando em geradores de códigos/aplicações, me rendi ao JBoss Seam desde a primeira vez que o vi, mais precisamente no final de 2006, de lá pra cá, os projetos que trabalhei usavam muito mais questões de integrações do que aplicações de usuários finais. Porém, desde que comecei a avaliar o Seam com um maior cuidado para utilizá-lo como framework JSF por trás do Console do novo JBoss Profiler, percebi que realmente o framework vale muito a pena.Não é pra menos, um time de talentosos desenvolvedores está por trás do Seam, logo, tal resultado já era esperado. Mas chega de papo, e vamos a algumas dicas interessantes:

Forçando o Login para Determinadas Páginas JSF

Muitas vezes você quer que determinadas Páginas sejam protegidas por Login, para resolver isso, o Seam possui todo um framework de segurança baseado em JAAS, e para ativar tal requisito para uma determinada página, basta adicionar a seguinte string no arquivo pages.xml :

XML:
  1. <page view-id="/travel*" login-required="true"/>

Adicionando novas Consultas baseadas na Extensão do EntityQuery

Quando você extende a classe EntityQuery você tem acesso a vários componentens que o Seam injeta dinamicamente para nós, entre eles o EntityManager do JPA, que pemite que criemos Queries dinamicas, veja no exemplo o método que adicionei em uma das classes que extende o EntityQuery:

JAVA:
  1. public Employee getUserByEmail(String email) {
  2.        
  3.         return (Employee) this.getEntityManager().createQuery
  4.         ("from Employee where email=:email")
  5.         .setParameter("email", email)
  6.         .getSingleResult();
  7.        
  8.     }

Implementando uma Autenticação no Seam e salvando dados no Contexto

Imagine que seus dados de usuários serão buscados via JPA, o exemplo a seguir mostra o Autenticator em ação, que é um SessionBean que o Seam executa toda a vez que a Aplicação precisa autenticar alguém. O Autenticator é um recurso que também faz parte do Seam. (No exemplo abaixo não há encriptação de senha, por favor leve isso em consideração no mundo real):

JAVA:
  1. @Name("authenticator")
  2. public class Authenticator
  3. {
  4.     @Logger Log log;
  5.    
  6.     @In Identity identity;
  7.    
  8.     @In FacesMessages facesMessages;
  9.    
  10.     public boolean authenticate()
  11.     {
  12.         log.info("authenticating #0", identity.getUsername());
  13.  
  14.         identity.addRole("admin");
  15.        
  16.         Employee employee = new
  17.         EmployeeList().getUserByEmail
  18.         (identity.getUsername());
  19.        
  20.        
  21.         boolean ok = employee.getPassword().
  22.         equalsIgnoreCase(identity.getPassword());
  23.  
  24.         if (ok) {
  25.            
  26.             Contexts.getSessionContext().set("employee",
  27.                                              employee);
  28.            
  29.             identity.addRole(employee.getPositionEmployee());
  30.            
  31.             facesMessages.add
  32.             (String.format("We allow the user %s request a Travel",
  33.                     employee.getName()));
  34.         }
  35.        
  36.         return ok;
  37.  
  38.     }
  39. }

EntityListeners nossos! E por que não?

Mesmo com o suporte a Inteceptors do Seam, não faz mal criarmos os nossos algumas vezes, eis então um exemplo de inteceptação de eventos
na EntityClass: TravelRequest, onde antes de persistirmos uma informação, podemos promover uma avaliação e tomar alguma ação antes da ação ser executada,
os famosos Eventos, presentes em frameworks de persistências muito antigos como o TFieldDataLink no Borland Delphi desde 1995. Veja o exemplo:

EntityListener:

JAVA:
  1. import javax.persistence.PrePersist;
  2.  
  3. public class TravelRequestListener {
  4.    
  5.     @PrePersist
  6.     public void beforePost(TravelRequest request) {
  7.        
  8.         if (request.getStatus()!=null &&
  9.                 request.getStatus().equalsIgnoreCase("")) {
  10.            
  11.             request.setStatus("NEW");
  12.            
  13.         }
  14.     }
  15.  
  16. }

Registro do EntityListener:

JAVA:
  1. @EntityListeners({TravelRequestListener.class})
  2. public class TravelRequest implements Serializable {
  3. ...