Demoiselle Framework's Blog

10/12/2009

Gerando CRUD completo para Demoiselle com plugin code2code

Arquivado em: Code Generation — sergerehem @ 17:52
Tags: , , , , , , , , , , ,

Semana passada consegui um tempo para pesquisar sobre geração automática de código baseada em templates. Sabemos que o Demoiselle ainda tem muito a avançar nessa questão, seja através de melhorias no plugin Eclipse já existente (projeto Demoiselle-Wizard), seja utilizando novas ferramentas. Mesmo que neste momento ainda não estejamos atacando mais fortemente a geração a partir de modelos UML, com ferramentas MDA, observamos que várias delas (por exemplo, o AndroMDA) utilizam templates Velocity ou FreeMarker. Apesar de a segunda nos parecer mais atual (o NetBeans e vários dos seus plugins a utilizam), a primeira é mais conhecida e amplamente difundida. Começamos a pensar, então, que podemos refatorar nosso plugin para que ele gere código a partir de templates Velocity, de forma que possamos reaproveitar esses modelos quando nós, ou membros da comunidade, pudermos efetivamente trabalhar com MDA. O ideal seria, ainda, que a própria comunidade possa criar e compartilhar seus próprios modelos, reaproveitando outros já existentes, customizando a geração de código para suas necessidades específicas. Se essa idéia se propaga, todos ganham.

No processo de busca de ferramentas encontrei o artigo Quickly cruding with code2code plugin e VRaptor2. Pareceu tão simples que resolvi instalar e experimentar. Funcionou de primeira! O legal é que o plugin code2code é totalmente customizável, portanto parti para adaptar os templates Groovy utilizados no exemplo gerando código nos padrões Demoiselle. Com algumas horas não contínuas de trabalho, consegui gerar um CRUD simples, porém completo. Mesmo sabendo que certamente tem muito a evoluir, resolvi compartilhar de imediato (afinal esta é a filosofia do software livre!) o que já consegui produzir, para que outros tenham a possibilidade de ajudar a melhorar. A abordagem que vou usar aqui é um passo a passo sobre como criar um CRUD hipotético usando o Eclipse (usei a versão 3.4), o Demoiselle Wizard e o code2code. 

Passo 1 – Configurando o Ambiente

A configuração básica do ambiente para uso do Demoiselle está descrita no Laboratório do Módulo 1 – Arquitetura do Tutorial Demoiselle, então vou preferir não ser repetitivo. Siga as instruções sobre como configurar o repositório Maven para a criação de projetos Demoiselle usando arquétipo. IMPORTANTE: Coloque o valor 1.0.2 (a última versão estável do arquétipo, até o momento da escrita deste post) na tag <version> do arquivo archetype-catalog.xml, que você criará na sua pasta USER_HOME/.m2. No Eclipse, utilize o endereço http://srizzo.github.com/code2code/updatesite/ para instalar o plugin code2code via Update Site.

Passo 2 – Criando/configurando um projeto Demoiselle

No Eclipse, crie um novo projeto do tipo Maven (File -> New -> Other -> Maven Project) e selecione o arquétipo demoiselle-archetype-webapp-sample (um componente hospedado no projeto Demoiselle Component) que você já adicionou ao seu repositório Maven local. Configure a última tela de acordo com a figura a seguir.

Criando Projeto Demoiselle com o Maven

Clicando em Finish, o Maven se encarregará de criar seu projeto contendo a estrutura padrão de diretórios do Demoiselle, bem como todas as dependencias necessárias.

Em seguida, clique com o botão direito no nome do projeto (mystore) e escolha o menu Demoiselle / Adicionar/Remover Características Demoiselle.

Como precisaremos de um banco de dados, na pasta raiz do projeto abra o arquivo pom.xml e adicione o HSQLDB nas dependencias, acrescentando o seguinte trecho XML:

<dependency>
    <groupId>hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>1.8.0.1</version>
</dependency>

Vamos aproveitar para já deixar o HSQLDB executando em modo Servidor. Para isso execute o menu Run -> Run Configurations, clique com o botão direito em Java Application e escolha New. Em Name, coloque MyStoreDB, em Main class, informe org.hsqldb.Server. Na aba Arguments, campo Program arguments, informe: -dbname.0 mystore -database.0 mystore. Clique em Run e seu banco de dados começará a execução.

Executando o HSQLDB em modo Server

Passo 3 – Gerando templates para CRUD/Demoiselle

Para que o code2code reconheça seus templates,bastar criar uma pasta generators na raiz do seu projeto. Feito isto você pode baixar o arquivo demoiselle-crud-generator.zip e descompactá-lo dentro desta pasta. Neste ponto, a estrutura do seu projeto deverá estar como na seguinte figura.

Estrutura do projeto criada pelo Maven

Passo 4 – Executando o code2code para gerar código Demoiselle

Clique com o botão direito no nome do projeto e escolha o menu Generate. Selecione Demoiselle/CRUD e informe os parâmetros (originários do arquivo params.txt) como na figura. Vamos criar um CRUD de Produtos com os atributos Nome (name), Preço (price) e Quantidade (qty).

Configurando os Parâmetros para Geração de CRUD

Clicando em Next você poderá conferir a lista de todos os modelos (arquivos templates.groovy) que serão aplicados, tendo a chance de efetuar alguma modificação (o que não faremos neste caso).

Customizando a Geração de Código

Escolha Finish e observe o Console do Eclipse para acompanhar a geração de código. Alguns trechos de código serão mostrados na tela e devem ser copiados.

Passo 5 – Ajustando e Executando a aplicação

Abra o arquivo faces-config.xml (em src/main/webapp/WEB-INF) e copie para ele os trechos de código exibidos no passo anterior, relativos ao Managed Bean (ProductMB) e às regras de navegação (navigation-rules).

  <!-- Managed Beans -->
  <managed-bean>
    <managed-bean-name>productMB</managed-bean-name>
    <managed-bean-class>com.mycompany.mystore.view.managedbean.ProductMB</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
  <!-- Rules -->
  <navigation-rule>
    <navigation-case>
      <from-outcome>product_list</from-outcome>
      <to-view-id>/private/pages/product_list.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
      <from-outcome>product_edit</from-outcome>
      <to-view-id>/private/pages/product_edit.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
      <from-outcome>product_view</from-outcome>
      <to-view-id>/private/pages/product_view.xhtml</to-view-id>
    </navigation-case>
    <navigation-case>
      <from-outcome>product_insert</from-outcome>
      <to-view-id>/private/pages/product_edit.xhtml</to-view-id>
    </navigation-case>
  </navigation-rule>

Será preciso também informar ao Hibernate que um novo Pojo será mapeado. Isso poderia ser feito copiando do Console para o arquivo hibernate-cfg.xml o trecho <mapping class=”com.mycompany.mystore.model.Product” />, mas vamos fazê-lo através do Plug-In Demoiselle. Clique com o botão direito no nome do projeto e escolha Demoiselle -> Configurar projeto, aba Hibernate. Adicione o POJO Product e configure as demais opções como na figura abaixo.

Configurando o Hibernate pelo Demoiselle Wizard

Agora precisamos alterar a página principal para chamar novo CRUD de produtos. Para isso vamos copiar do Console para o arquivo src/main/webapp/public/templates/default.xtml o trecho abaixo, substituindo Menu 01 e Menu 02, adicionados na criação do projeto pelo Maven:

<rich:toolBarGroup>
    <h:commandLink value="Product" action="#{productMB.listAll}" title="Product" id="product" />
</rich:toolBarGroup>

Por fim, vamos avisar ao Eclipse que nossa aplicação vai executar num servidor Tomcat. Para isso já existe um perfil tomcat padrão, clique com o botão direito no nome do projeto, Properties, aba Maven, informando tomcat no campo Active Maven Profiles.

Para executar dentro do próprio Eclipse, clique com o botão direito no nome do projeto e escolha Run on Server. Escolha o Tomcat (usei a versão 6.0.18), que você deve já ter configurado no Passo 1. Ao aparecer a tela inicial, informe usuário admin e senha admin. Insira alguns itens e navegue no sistema para vê-lo funcionando.

CRUD completo gerado pelo code2code para Demoiselle

Considerações Finais

O código gerado pelos templates Groovy que criei a partir do exemplo do VRaptor foi baseado na aplicação Escola disponível no projeto Demoiselle Sample. Tenho plena convicção que gerar código baseado em modelos pode alavancar muito o reuso dentro da organizações e por tabela ajudar a aumentar a comunidade Demoiselle. O tempo que investi tentando criar templates me ajudou muito a entender melhor o funcionamento do Demoiselle. O próximo passo, acredito, seria gerar telas mais complexas (Mestre/Detalhe, recursos Ajax) e completas (com melhor tratamento de mensagens, validação, casos de testes JUnit), utilizando Velocity ou FreeMarker, para aumentar as possibilidades. A imaginação é o limite!

Tema: Rubric. Blog no WordPress.com.

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 462 outros seguidores

%d bloggers like this: