Archive for January, 2008

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

Desculpem os RSS Readers! Desculpem a revolta, mas é revoltante algumas coisas em nossas vidas. Vocês que estudaram como desgraçados, comeram em bandeijão, pegaram onibus lotados, daqueles que é tanta gente que você pode dormir em pé que as Leis de Newton não farão efeito!

Você orgulha seus pais e a si mesmo, vai, estuda engenharia, estuda seja lá o que ou até onde for, e nesse caso, não adianta nada, você ainda vai ganhar mal, e você sabe o por quê? Porque você é um burro e honesto, que ao invés de roubar, você resolveu estudar…. Você é um burro!

Quanto é sua hora de trabalho? 100, 200, 300 reais? E você se acha o cara?! Você é um bosta, assim como eu, pois veja: Em 1 minuto eu fui assaltado, e me levaram:

  • Meu laptop (DELL, Duo Core 2 GB , 15.5 wide): 6.500
  • Nextel Motorola: 550,00
  • TIM Motorola : 650,00
  • IPod: 500,00
  • Pen-Drive: 100,00
  • Mochila com vários acessórios(do JavaOne para os nerds de plantão): 200,00

Isto totaliza cerca de 8.500 Reais, em cerca de 1 minuto de trabalho por parte dos grandes profissionais de mercado de São Paulo, se você multiplicar por 60(1 hora), a hora deles então custa: 510.000 Reais. E você se achando seu bosta!

O pior, é você ir fazer um BO (Boletim de Otário), e os servidores públicos no momento da sua descrição do fato, vê a funcionária fumar a merda de um FREE vagabundo, e entre uma pergunta e outra, baforar uma nuvem de fumaça na sua cara! E no final, depois de várias piadinhas, do tipo: “Os caras fizeram a feira com você”, tu pegas seus míseros papéis e começa a rezar para o próximo dia no PoupaTempo, onde 2 horas na fila consegue-se apenas comprando lugares na mesma…

Este é um desabafo de um otário como eu, que ama a merda desse país, que desde 1999 morando em São Paulo, nunca havia presenciado nada de violento, e eis que tudo veio num pacote único, o que nos deixa apenas revoltados, frustrados, sem ação….

E ai como descedente de Judeus que droga eu fui fazer na vida… Estudar, os caras ganham mais que os bostas da TV Brasileira! Tá vendo? Somos uns bostas! E eles são os Mickeys, só nos resta ser os “patetas”.

Desculpem o desabafo!

Edgar

ps- Local do Assalto: Vila Olimpia, em frente ao Ceasar Park. Atenção: Roubos na Berrini são frequentes em São Paulo, como as empresas de TI ficam grande parte nessa região cuidado nunca é pouco.

Calma, isso nada tem a ver com a linguagem Ruby, uma linguagem que respeito, mas que pouco usei na vida, e sim apenas fazer uma pequena homenagem a este rítimo que quem vai a Belém e não faz questão de ser fechado e se permite apreciar o que é local acaba no mínimo respeitando. Eu como um paraense apaixonado e saudoso da minha terra, tinha que aproveitar esse tema da minha área para fazer essa “brincadeira”. Ora, o Rio tem funk, vários lugares do interior de SP, Goiás, Minas tem o Sertanejo, o sul tem o vanerão, o nordeste tem o forró, o Amazonas tem o Boi, o Maranhão tem Reggae da jamaica brasileira, o Pará tem o que é conhecido como Techno brega, um ritimo engraçado, mas que mobiliza pessoas humildes, de posses, cultas outras sem tantas oportunidades, mas que se tornam comum numa festa onde o rítimo seja este, apenas uma homenagem, fruto das mini-férias que tive passando com a minha familia e mulher em Belém :) .



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. ...

Neste site de TopLink da Oracle há uma ótima documentação de referencia para as anotações do JPA (Java Persistence API).

Recomendo ainda fortemente a leitura também deste artigo do TheServerSide, com eles algumas dúvidas de JPA tornam-se bem mais bobas.

Bons Estudos!

O Eclipse em termos de mercado ainda é a  IDE Java mais usada

Esse foi um dos argumentos para o JBoss Studio ser baseado nele. Não cabe a mim maiores argumentações, até porque ainda uso NetBeans, e para quem pretende extender uma IDE, (in)felizmente o NetBeans ainda é extremamente mais simples.

Perdendo algum tempo tentando fazer as coisas de forma "correta", usando as Interfaces: ICompilationUnit, IType, IJavaModel, IJavaElement e todos os "I's" que você puder imaginar, resolvi usar a famosa POW (Programação Orientada a Workarouds). Workaround é uma forma bonita que foi cirada para camuflar o que conhecemos como : Gambiarra!

No JBoss Studio, para quem desenvolve com o JBoss Seam, quando você gera um Entity, o SeamGen gera uma página JSP com tags JSF para Listagem e Edição, a itenção desta extensão que estou trabalhando nas horas vagas (pouquissimas recentemente), visa atualizar via o DiffEditor do eclipse os campos do formulário e da listagem com base em novos atributos da sua Entity Class. Sendo assim, você irá clicar com o botão direita no Package Explorer e ai você terá a opção "Update JSPs based on this Entity...".

Basicamente este plugin é um PopupAction que trata as invocação do popup sobre um .java da seguinte forma:

Método run:

JAVA:
  1. public void run(IAction action) {
  2.  
  3. ISelection sel = targetPart.getSite().getSelectionProvider()
  4. .getSelection();
  5.  
  6. if (sel instanceof IStructuredSelection) {
  7.  
  8. IProject project = getProject((IStructuredSelection) sel);
  9. if (project != null) {
  10. IJavaProject java = JavaCore.create(project);
  11.  
  12. try {
  13. System.out.println("Project Path: "
  14. + project.getLocationURI().toURL().toString());
  15.  
  16. msgBox(this.getClassFileName(project.getLocationURI()
  17. .toURL().toString(), project.getName(),
  18. fullJavaSourcePath, java.getOutputLocation()
  19. .toOSString()));
  20.  
  21. } catch (MalformedURLException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. } catch (JavaModelException e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28.  
  29. }
  30. }

Método getProject():

JAVA:
  1. private IProject getProject(final IStructuredSelection selection) {
  2. IProject project = null;
  3. Object object = selection.getFirstElement();
  4.  
  5. if ((object != null) && (object instanceof IAdaptable)) {
  6. IResource resource = (IResource) ((IAdaptable) object)
  7. .getAdapter(IResource.class);
  8.  
  9. if (resource != null) {
  10.  
  11. fullJavaSourcePath = resource.getFullPath().toOSString();
  12. project = resource.getProject();
  13. javaSourceSelected = resource.getName();
  14.  
  15. }
  16. }
  17.  
  18. return project;
  19. }

E eu confesso que tentei usar vários recursos, entre eles: IType para capturar o IClassFile , para saber qual o .class respectivo daquele respectivo .java...E desisti de tanto NPEs (NullPointerExceptions) que levei na cara, e ai veio o seguinte "gambiarratico", todavia funcional método tabajara:

JAVA:
  1. protected String getClassFileName(String projectHome, String projectName,
  2. String javaSource, String output) {
  3.  
  4. String fullOutputFolder = projectHome.substring(0, projectHome
  5. .lastIndexOf('/'))
  6. + output;
  7.  
  8. String newSource = javaSource.substring(projectName.length() + 2,
  9. javaSource.length());
  10.  
  11. return fullOutputFolder
  12. + newSource.substring(newSource.indexOf('/'),
  13. newSource.length()).replaceAll(".java", ".class");
  14. }

Eu tenho certeza que isso é quase um assassinato ao modelo RCP, JDT do Eclipse, porém, para o que eu precisava, que é a droga do .class, isso funcionou bem mais simples e melhor que as tão belas e "fundamentadas" classes do Eclipse. É por essas e outras, que ainda tenho falta do NetBeans.

Abraços e aproveitando: Feliz 2008 :D , Saúde! O resto é todo lucro.

Edgar