Archive for the java Category

Em um dos clientes que eu estamos atendendo na empresa, um dos requisitos é autenticar no RACF, uma espécie de LDAP para o Mainframe. Nosso cliente, disponibilizou um WS que faz este trabalho "sujo". Nos resta então criar um LoginModule que suporte esta nova funcionalidade.

Quando você proteger Aplicações em Java é importante saber onde você pode se conectar, o JBoss oferece por padrão alguns LoginModules, entre eles:

-LoginModule baseado em arquivos properties
-LoginModule baseado em Banco de Dados
-LoginModule para LDAP

Em nossa solução, estaremos promovendo mais um LoginModule. O primeiro passo é alterar o login-config.xml dentro de /default/conf, no caso adicionamos mais um LoginModule, como a seguir:
Screenshot-*login-config.xml (-opt-java-jboss-as-jboss-4.2.2.GA-server-dev-conf) - gedit.png

Adicionamos até uma propriedade, que é o WSDL do Serviço, que pode variar dependendo do caso, e ai a configuração poderá ser feita no LoginModule, sem a necessidade de recompilação.

Estamos dizendo acima que a classe org.jboss.security.auth.api.JBossLoginModuleWS é a implementação deste mecanismo de Login. Veja o código-fonte de exemplo:

JAVA:
  1. <pre>package org.jboss.security.auth.api;
  2. import java.security.acl.Group;
  3. import java.util.Map;
  4. import javax.security.auth.Subject;
  5. import javax.security.auth.Subject;
  6. import javax.security.auth.callback.CallbackHandler;
  7. import javax.security.auth.login.LoginException;
  8. import org.jboss.security.SimpleGroup;
  9. import org.jboss.security.SimplePrincipal;
  10. import org.jboss.security.auth.spi.UsernamePasswordLoginModule;
  11. import org.jboss.security.auth.api.ws.client.*;
  12. import org.jboss.security.auth.ws.AutenticateProxy;
  13. /**
  14. *
  15. * @author Edgar Silva
  16. */
  17. public class JBossLoginModuleWS extends UsernamePasswordLoginModule {
  18. /**
  19. * WSDL address
  20. */
  21. private String wsdl;
  22. protected org.jboss.security.auth.ws.Principal p;
  23. public JBossLoginModuleWS() {
  24. super();
  25. }
  26. @Override
  27. public void initialize(Subject subject, CallbackHandler callbackHandler,
  28. Map sharedState, Map options) {
  29. super.initialize(subject, callbackHandler, sharedState, options);
  30. log.info("WebServices Login Module : initialize");
  31. }
  32. @Override
  33. protected String getUsersPassword() throws LoginException {
  34. return "";
  35. }
  36. @Override
  37. protected boolean validatePassword(String inputPassword, String expectedPassword) {
  38. boolean isValid = false;
  39. if (inputPassword != null) {
  40. try {
  41. log.info("Connecting via WS ..............");
  42. String username = getUsername();
  43. log.info("UserName: " + getUsername());
  44. log.info("Password: "+ inputPassword);
  45. p = new AutenticateProxy().autentica(username, inputPassword);
  46. log.info("Connected as: " + p.getUsuario());
  47. isValid = (p != null);
  48. } catch (Throwable e) {
  49. e.printStackTrace();
  50. super.setValidateError(e);
  51. }
  52. }
  53. return isValid;
  54. }
  55. @Override
  56. protected Group[] getRoleSets() throws LoginException {
  57. SimpleGroup userRoles = new SimpleGroup("Roles");
  58. userRoles.addMember(new SimplePrincipal(p.getGrupo()));
  59. Group[] roleSets = {userRoles};
  60. return roleSets;
  61. }
  62. public String getWsdl() {
  63. return wsdl;
  64. }
  65. public void setWsdl(String wsdl) {
  66. this.wsdl = wsdl;
  67. }
  68. }</pre>

Agora, a qualquer momento que você proteger uma Aplicação Web, ou quiser utilizar o Servidor de Aplicações para fazer isto, você deverá configurar o jboss-web.xml para apontar para o LoginModule que voce configurou no login-config.xml, veja o exemplo a seguir:
jboss-web.xml

Além desta configuração, você deverá proteger as páginas de uma Aplicação Web, por exemplo, sendo assim, você irá configurar o web.xml da sua aplicações para pedir o "Realm"(LoginModule) que vc configurou com o nome WSLoginModule, em nosso caso vamos liberar apenas o acesso as páginas .jsp caso o Login seja efetivado no WebServices de autenticação. Veja o web.xml:

web.xml

Esta é mais uma dica, que sei que posso precisar um dia novamente!

[]s
E

Ao deparar-se com o jBPM a primeira impressão sempre é meio confusa, mas depois que se passa do terceiro processo baseado em BPM e com a idéia de POG, e isto nada quer dizer a famosa "Programação Orientada a Gambiarra" e sim a Programação Orientada a Grafos , sim é isto mesmo: Graphos, ou quem sabe "desenhos", ou "caixinhas" ou o que sua imaginação preferir.

Este pequeno post mostra uma idéia de como você pode combinar a implementação EasyRest e o jBPM ambos membros do guarda-chuva de soluções JBoss, vamos começar com algumas considerações para quem for implementar algo no mundo real:

  • No Exemplo, o jbpmContext pode ser melhor aproveitado
  • O uso de TaskNodes (nós que suportam interação humanda) poderiam no caso abaixo serem simplesmente nodes do tipo State ou simples Nodes

Processo

O exemplo é simples, apenas trata que quando você quer licenciar um veiculo, você passa por: a) Um pagamento na Secretaria de Fazenda, b) Faz uma Vistoria do seu carro, c) o Detran lhe envia o documento e pronto.

processoLic

A idéia então é através de algumas URLs, poder te acessibilidade a navegar por n instancias deste processo, e a qualquer momento, saber em que passo seu veículo está, assim como o Detran também contabilizar informações para ele, gerando assim um dado que poderia ser registrado num dashboard de uma solução BAM.

As URLS de Exemplo

  1. /licencia/{placa}/{ano} - Para iniciar um processo e recebimento de guia de pagamento
  2. /realize/pagementosefa/{id da guia de pagamento} - Para movimentar o "Grafo" do Processo pra frente
  3. realize/vistoria/{id da guia de pagto}/{id confirmacao pagamento sefa} - Para movimentar para o nó "envia-documento"

Implementando Estes exemplos

1 - Temos que iniciar a nova instancia de um processo, para isto veja noss método que responde pela URL no nosso pojo de servico REST:

JAVA:
  1. @Path("/")
  2. public class Service {
  3. ProcessDefinition processDefinition;
  4. @GET
  5. @Path("/licencia/{ano}/{placa}")
  6. @ProduceMime("text/plain")
  7. public String licenciar(@PathParam("ano")
  8. String ano, @PathParam("placa")
  9. String placa) {
  10.  
  11. JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
  12. try {
  13. ProcessInstance instance = ctx.newProcessInstance("licenciamento");
  14. instance.getContextInstance().setVariable("ano", ano);
  15. instance.getContextInstance().setVariable("placa", placa);
  16. Token t = instance.getRootToken();
  17. t.signal();
  18.  
  19. ctx.save(instance);
  20.  
  21. return new Long(instance.getId()).toString();
  22.  
  23. } finally {
  24. ctx.close();
  25. }
  26.  
  27. }

Observe que adicionamos algumas variáveis no contexto do jbpm, estas variáveis são armazenadas em memória ou persistidas no Banco de Dados, fazendo com que a qualquer momento você possa recuperá-las.

2 - Agora vamos recuperar uma instância de processo ativa, com base no id repassado na URL Rest.

JAVA:
  1. @GET
  2. @Path("/realize/pagementosefa/{id}")
  3. @ProduceMime("text/plain")
  4. public String doPagamentoSefa(@PathParam("id")
  5. String id) {
  6. JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
  7. try {
  8. GraphSession graphSession = ctx.getGraphSession();
  9. ProcessInstance processInstance = graphSession
  10. .loadProcessInstance(new Long(id));
  11. Collection taskList = null;
  12. taskList = (Collection) processInstance.getTaskMgmtInstance().getTaskInstances();
  13. ((TaskInstance)taskList.iterator().next()).end();
  14. processInstance.getContextInstance().setVariable("idsefa"System.currentTimeMillis()+1L );
  15. return processInstance.getContextInstance().getVariable("idsefa").toString() ;
  16. } finally {
  17. ctx.close();
  18. }
  19. }

3 - Continuando o Processo promovendo a navegação:

JAVA:
  1. @GET
  2. @Path("/realize/vistoria/{id}/{idsefa}")
  3. @ProduceMime("text/plain")
  4. public String doVistoria(@PathParam("id")
  5. String id, @PathParam("idsefa") String idSefa) {
  6.  
  7. JbpmContext ctx = JbpmConfiguration.getInstance().createJbpmContext();
  8. try {
  9. GraphSession graphSession = ctx.getGraphSession();
  10. ProcessInstance processInstance = graphSession
  11. .loadProcessInstance(new Long(id));
  12. if (processInstance.getContextInstance().getVariable("idsefa")==null) {
  13. return "POR FAVOR FACA A PAGAMENTO NA SEFA";
  14. }
  15. Collection taskList = null;
  16. taskList = (Collection) processInstance.getTaskMgmtInstance().getTaskInstances();
  17. taskList.iterator().next();
  18. ((TaskInstance)taskList.iterator().next()).end();
  19. processInstance.getContextInstance().setVariable("idvistoria"System.currentTimeMillis()+1L );
  20. return processInstance.getContextInstance().getVariable("idvistoria").toString() ;
  21.  
  22. } finally {
  23. ctx.close();
  24. }
  25. }

Considerações

O modelo de desenvolvimento desta solução muito mais que simples, torna-se divertido, claro que esta aplicação é uma demo, que é uma das coisas que vamos mostrar no JUGDAY dia 31 em Porto Alegre as 16:00, na palestra OpenSource SOA com JBoss . Vejo vocês por lá então "tché".

[]s

E

Falamos outro dia sobre REST aqui neste blog, estudei a implementação de referência do JAX-RS Jersey, funciona super bem, baixei os fontes, é de fato simples utilizá-la dentro do NetBeans, tive alguns problemas de classloader dentro do JBoss, mas nada que adaptar a forma de carregamento e procura dos resources do Jersey, não fizessem funcionar. Para estudos e quem sabe até algumas coisas em produção o recomendaria.

Edgar e Bill Burke numa festa do hotel W no JavaOne2007

Há um cara na JBoss que respeito muito que é o Bill Burke, e não por ele ter pagado várias Guiness para mim e outros amigos no JavaOne 2007, mas principalmente porque o cara é de fato um cara que onde ele se mete, as coisas acabam saindo do outro lado, sendo assim, mesmo com o jeitão dele meio "polemico" as vezes, lançou o projeto RestEasy, que é a implementação REST da JBoss.Pequeno Exemplo com EasyRest

O EasyRest suporta tanto os mecanimos de publicação, como os de clientes, e até mesmo os conceitos de Comet do Grizzlly, abaixo um pequeno exemplo :

JAVA:
  1. package rest;
  2.  
  3. import javax.ws.rs.GET;
  4. import javax.ws.rs.Path;
  5. import javax.ws.rs.ProduceMime;
  6. import javax.ws.rs.ext.Provider;
  7.  
  8. @Path("service")
  9. @ProduceMime("text/plain")
  10. public class Subscritption {
  11.  
  12. @GET
  13. public String status() {
  14.  
  15. return "JBoss REST Works!";
  16. }
  17.  
  18. }

Para acessar este seviço, basta digitar no browser o endereco:

http://localhost:8080/jboss-rest/service

Um outro exemplo seria por exemplo uma pesquisa de Voos para o dia de hoje para uma agencia de turismo:

JAVA:
  1. @ProduceMime("text/plain")
  2. @Path("/trip")
  3. public class TripService {
  4.  
  5. @GET
  6. @Path("/flight/today/{from}/{to}")
  7. public String getFlightsFromToday
  8. (@PathParam("from")String from,
  9. @PathParam("to")String to){
  10. //here you can perform your search and ruturn simple plain text as the return
  11. //but if you want, you can change to XML
  12.  
  13. return String.format
  14. ("Performing searching from %s to %s",
  15. from,
  16. to);
  17. }
  18. }

A url para chamar este serviço seria:

http://localhost:8080/restsample/trip/flight/today/gru/bel

Claro, este pode não ser dos melhores tutoriais, em breve algumas coisas mais interessantes por aqui.

[]s

E

Olá Pessoal, deveria ter feito este post no dia 17 de noite, mas não tive tempo, e com a chegada da minha noiva me visitando, não poderia deixar de dar atenção a ela =), sendo assim, para quem pôde ter ido as 19:00 da quinta 17/04 ir até a Sala Richard Stalmann meu muito obrigado.
Obrigado também as pessoas que fizeram perguntas, que pararam para conversar nos corredores, em geral a Organização do FISL que sempre dá um show. E ao Google por ter me pago um jantar no CTG35 de Porto Alegre, de fato é uma experiência que você que ainda foi, definitivamente deve ir. Infelizmente não pude ficar o resto do evento, mas tenho certeza que será ótimo. Até o próximo evento, no caso,o da minha agenda é em Recife no Forum de SL de lá na próxima quarta dia 24, e aguardem o JBoss 5.0 final, que a priori deve chegar em Julho/Ago 2008. Veja os slides aqui:

Clique aqui para fazer o download

Não sou tão monstro em comandos Linux quanto meu amigo Cláudio Miranda , mas um comandinho que vem me ajudado bastante é o :

ps aux | grep =run.sh | grep -v grep | awk '{ print $6 }'
Que imprime pra mim quanto o JBoss está gastando de memória residente, não é a única métrica importante, mas é um sinal importante para medir quanto que alguns tunnings estão ou não surtindo efeito.

Outra dica interessante é o comando:

watch -d2 "ps aux | grep =run.sh | grep -v grep | awk '{ print \$6 }'"

Que mostra a mudança do valor dinamicamente de 2 em 2 segundos.

Há 5 anos atrás tinhamos uma necessidade de integração em um cliente:

a) Usar Java na camada Servidora aproveitando a performance e suporte transacional dos EJBs

b) Usar Delphi como cliente

Eis então que durante alguns dias trabalhei na criação de um componente, o qual demos o nome de Jacode, não me pergunte a origem do nome, talvez eu estivesse bebado demais. Este projeto era embasado em vários conceitos de interoperabilidade, segurança e governança que hoje é bastante presente nas demandas de SOA de mercado. Vários outros desenvolvedores, da minha antiga empresa (Argos), contribuiram, estes caras, a maioria está hoje no Rio de Janeiro, São Paulo e Belo Horizonte, entre eles: Ricado Ferreira(Squadra), David Farias(Squadra) e Fábio Cabral(IBM). Este componente é usado até hoje pelo cliente, e o que pensavámos que fosse nos deixar pelo menos bem de vida 5 anos atrás, ficou para uso de somente um cliente, sendo assim, resolvi buscar os fontes de muitos anos atrás e tentar readaptá-lo para trabalhar em conjunto com o JBoss ESB, tive um tempo estes últimos dias e isto foi possível, apesar de que ainda há vários java.util.Vectors espalhados pelo código, e sem usar nada de Java 5.

Usando o Jacode com JBoss ESB

A idéia é doar/integrar os códigos do Jacode no core do ESB, isto se os caras quiserem/deixare/estiverem de bom humor e etc, que basicamente são 2 classes. a principal: org.jboss.soa.esb.ext.transformers.jacode.Jacode possui um método chamado de : getData(java.sql.Connection conn, int xmlType, int maxResults, String sql); este por sua vez devolve dados através de qualquer camada do JBoss ESB, podendo ser um Socket, ou para facilitar a vida um WebService. Veja exemplo da chamada:

@WebMethod(operationName = "getData")
public String getData(@WebParam(name = "sql")
String sql) {
try {
jacode = new Jacode();
return jacode.getData(ConnectionFactory.getConnection(), Jacode.XMLDELPHI, 30, sql) ;
} catch (SQLException ex) {
Logger.getLogger(DelphiBridge.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(DelphiBridge.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

Na Cadama Delphi

Na camada Delphi, existe a classe da VCL TFieldDataLink que alimenta os DataControls através da referência a um DataSet, no caso este DataSet é um Stream que é o resultado String de nosso método, que é carregado para dentro de um componente TClientDataSet, que por sua vez possuirá o resultado em forma de um DataSet, exibindo os dados num DBGrid por exemplo, ou alguma ferramenta de Cubo de Decisão ou Relatório do Delphi. Veja o código de Exemplo na camada Delphi:

procedure TForm1.Button1Click(Sender: TObject);
var
service: DelphiBridge;
stream: TStringStream;
begin
service:= HTTPRIO1 as DelphiBridge;
ClientDataSet1.close;
stream:=TStringStream.create(service.getProductsSLAs);
ClientDataSet1.LoadFromStream(stream);
ClientDataSet1.open;
ShowMessage('Data Loaded');
end;

Integração é a Chave

Como você pode observar não há limites para as integrações no JBoss ESB, o que mais me chama a atenção é que estas são as realidades quando falamos de SOA no Brasil, os exemplos dos livros sempre falam de ERPs magnificos como PeopleSoft, SAP, mas quando pegamos algo em Delphi, VB, Clipper ou DataFlex, aí sim vem a pergunta se realmente sua ferramenta lhe ajuda a integrar sistemas de forma produtiva e realista, ou não!

Se você quiser assistir uma DEMO (meio complicada de criar pois o Wink no Linux é osso), clique aqui. 

[]s

Em Delphi(TM) havia alguns truques via RTTI(Run Time Type Information) que sem ser programadores paranormais com truques do tipo "limpe 50 TEdits com 3 linhas de código" animavamos todo o time de desenvolvimento. Com Java, RTTI tem um nome mais bonito Reflection.

O saudosismo deste post, deve-se a lembrança de práticas similares, no caso, eu precisava criar uma classe BeanToProperties e PropertiesToBean, para que fosse possível ler um properties e todas sua chaves fossem passadas para atributos de um bean, claro com atributos com memso nome (já que não há um decoador "de para"), e vice-versa. Acho que até pode existir isso num Apache Commons da vida, mas como eu estou passando grande parte dos meus dias em aeroportos e apertado nos assentos da Tam e Grande Onibus Lotado, onde há pouca internet disponível, então resolvi criar um recurso destes para finalizar uma atividade no projeto, veja então o resultado.

Primeiro, eu preciso saber se o atributo da Classe em questão é equivalente a uma chave do Properties que tenho carregado, veja então:


public static java.util.List getFieldsFromClass(
Properties props) {

java.lang.reflect.Field[] methods = new ClientProperties()
.getClass().getDeclaredFields();

ArrayList< ?> a = Collections.list(props.propertyNames());

java.util.ArrayList fieldList = new java.util.ArrayList();

for (java.lang.reflect.Field m : methods) {
if (a.contains(m.getName())) {
fieldList.add(m);
}
}

return fieldList;
}


Em seguida, preciso obter os dados das chaves e atribuir aos atributos usando os métodos gets, para isso, veja o método:


ClientProperties bean = new ClientProperties();

List fields = getFieldsFromClass(props);
for (Field f : fields) {
try {
String methodName = "set"
+ f.getName().substring(0, 1).toUpperCase()
+ f.getName().substring(1, f.getName().length());

Class[] params = new Class[] { String.class };

Method method = bean.getClass().getDeclaredMethod(methodName,
params);

method.invoke(bean, props.getProperty(f.getName()));


Com isso, o objeto "bean" irá executar para a propriedade core o mesmo que: bean.setCore(prop.getValue("core")); , só que se eu tiver 58 propriedades, este método me economiza um super tempo!

Espero que esta dica ajude, ela está aqui com certeza para me ajudar, caso amanha eu esqueça como já fiz isto, mais ou menos como quase tudo que há em nível de códigos nesse blog. Até a próxima.

[]

Edgar

JMX é de fato uma das APIs mais notáveis presentes em Java, alguns servidores de Aplicações comerciais só vieram a implementar tais recursos somente a poucas anos atrás. No caso do JBoss, todo o MicroKernel foi concebido em torno desta tecnologia, o que torna mais simples a criação de ferramentas de monitoração, controle, monitores transacionais e até os profilers.
Como exemplo de invocação de chamadas JMX diretamente via código Java, veja a seguinte porção de código:


Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
environment.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
environment.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); // remote machine IP
InitialContext ic = new InitialContext(environment);
RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/invoker/RMIAdaptor");
ObjectName name = new ObjectName("jboss.system:type=ServerConfig");
System.out.println("ServerTempDir="+server.getAttribute(name, "ServerTempDir"));


O código imprime o valor da propriedade ServerTemp que pode ser obtida facilmente através do JMX-Console num browser qualquer, qualquer outra propriedade do ServerConfig que está dentro do domínio jboss.system poderia ser obtida através do contexto JMX obtido via JNDI (RMIAdaptor) .

Alterações podem ser solicitadas também, isto também é possível também de forma programática.

Aguardem o que está por vim de interessante o novo JBoss Micro-Container.

JBossWorld

Minha correria de final quarter e ano fiscal na empresa, o meu provedor que dificulta manter meu site no ar, me impediram de blogar sobre o JBossWorld, evento que estive último fevereiro, mas há blogueiros como o Guilherme da Globo.COM, que fizeram uma cobertura fantástica em seu Blog, recomendo que todos leiam.

Bom, meu ano começa para valer agora, como alguns dos focos deste ano é consolidar as duas plataformas novas da JBoss: O SOA Platform, que está a um tempo sendo bastante divulgada aqui e em vários outros blogs, e o JBoss Communications Platform, este último deve dar o que falar para o nosso mercado que pede e exige bastante interatividade nas aplicações voltadas para o mercado de voz sobre IP e Telecom de modo geral. Logo, alguns posts sobre estas tecnologia que acima de qualquer outra coisas é: 100% Opensource, e claro, sua contribuição seria extremamente bem-vinda, veja mais em: http://labs.jboss.org/mobicents ou no site do projeto MobiCents, projeto adquirido ano passado pela Red Hat para fazer parte do leque de soluções JBoss.

Voltando a vida normal após o susto, e ter perdido várias implementações de ESB e de Seam, resolvi concentrar em algo novo para distrair, o esbgen module.

Quando você baixa o JBoss ESB, talvez pelos conceitos, ou por certa complexidade nas inúmeras possibilidades de protocolos, ações e etc, nos perdemos por onde começar quando queremos criar um projeto ESB. Sendo assim, inspirado em várias ferramentas similares, criei um módulo para o ESB que é um assistente para criação de projetos usando um utilitário de linha de comando. Veja os exemplos aqui:

esb1.png

Figura 1- Criando o Projeto inicial.

esb2.png

Projeto ESB com todos os arquivos necessários criados. Se você trabalhar com os QuickStarts, você terá toda a estrutura para deploy e testes de seus projetos.

Se você ficou curioso, veja o design e estágio atual da ferramenta clicando aqui.

Para ver em resoluções menores, clique aqui.

Abraços

Edgar

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()