Demoiselle Framework's Blog

08/10/2010

Liberada a versão 1.0.0 do componente demoiselle-crud

Ontem, dia 07/10/2010, foi liberada a primeira versão do componente demoiselle-crud. Este componente contém uma série de abstrações de telas, da camada de visão, da camada de negócio e da camada de persistência, para quem pretende fazer crud. Juntamente com o componente, foi liberada a primeira versão estável da aplicação Simplify (aplicação do sample que tem o objetivo de demonstrar o uso do demoiselle-crud) e a versão 1.2.0 do archetype-webapp-sample. Esse arquetipo já se encontra disponível no catálogo de arquetipos do demoiselle e ele pode ser usado para se criar uma aplicação já com as configurações básicas necessárias para a utilização do demoiselle-crud. É importante lembrar que quem usar esse arquétipo, estará utilizando a versão 1.2.0 do framework demoiselle.

A documentação de referência do demoiselle-crud pode ser vista aqui.

Está disponível também um passo a passo, mostrando como criar uma aplicação utilizando o demoiselle-crud. Para visualizá-lo, clique aqui

26/01/2010

SPIDER On Rails gerando código Demoiselle

Continuando minha busca por alternativas legais para geração automática de código usando templates encontrei na InfoQ o interessantíssimo projeto open source SPIDER On Rails, um plug-in Eclipse bastante customizável que possibilita a criação de aplicações completas em várias linguagens usando o Velocity (este vídeo mostra o SPIDER em ação).  Resolvi, então, tentar aproveitar os mesmos templates Groovy que eu havia criado quando testei o code2code (veja o post anterior) para gerar um CRUD completo e poder ter uma visão comparativa das vantagens e desvantagens de cada ferramenta. Durante o processo tive o apoio do líder do projeto, para nosso orgulho um brasileiro. Bruno Braga, a quem sinceramente agradeço, tem sido extremamente acessível e vem ajudando muito, tendo inclusive incorporado algumas sugestões de melhoria apontadas (por exemplo, na próxima versão – ou em uma nightly build – também será possível usar templates Groovy ou FreeMarker).

Neste post vou mostrar como gerar código padrão Demoiselle usando o template que criei. Ao final, farei alguns comentários sobre as facilidades/dificuldades encontradas, apontando algumas dicas de quando usar o SPIDER ou code2code.

Passo 1 – Preparando o Ambiente / Criando/configurando um projeto Demoiselle

Siga os procedimentos indicados nos Passos 1 e 2 do post anterior, só que utilizando a versão 1.0.3 no archetype-webapp-sample. Ao final você terá criado o projeto mystore (package com.mycompany.mystore) com o banco de dados HSQLDB mystore executando no modo Server.

Dica: Se desejar utilizar uma versão mais atual do HSQLDB (a última estável é a 1.8.1.1) basta alterar o respectivo número na dependencia do POM.xml. O Maven aumaticamente se encarregará de baixá-la.

Passo 2 – Instalando o SPIDER on Rails

No Eclipse (que dever ter o WTP instalado) vá ao menu Help -> Software Updates, aba Available Software, clique no botão Add Site e informe http://www.j2eespider.org/update (J2EE Spider é o antigo nome do projeto).  Marque a versão desejada (usei a 1.0.0.M4, a última informada) e escolha Install. Reinicie o Eclipse, caso solicitado. A partir daí, ao clicar com o botão direito no nome de qualquer projeto no seu Eclipse, aparecerá o menu SPIDER on Rails (Ctrl+Alt+E), que abrirá a tela do plugin.

Nota: A principal referencia que utilizei durante este trabalho (além do apoio de Bruno!) foi a seção Começando a Utilizar, no site do SPIDER. Existe também um vídeo que explica em detalhe o processo de instalação.

Passo 3 –  Criando as Tabela no Banco de Dados

Vamos fazer o caminho inverso utilizado na geração com code2code. Partiremos das tabelas já criadas no banco de dados para que o  SPIDER (na verdade, o HibernateTools integrado com ele) crie as classes de entidade já mapeadas. Para isso vamos usar o HSQL Database Manager, que vem no .jar do HSQLDB.

Execute o menu Run -> Run Configurations, clique com o botão direito em Java Application e escolha New. Em Name, coloque MyStoreDBConsole; em Main class, informe org.hsqldb.util.DatabaseManagerSwing. Na aba Arguments, campo Program arguments, informe: -driver org.hsqldb.jdbcDriver -url jdbc:hsqldb:hsql://localhost/mystore -user sa. Clique em Run e a janela do Database Manager será aberta.

Copie o comando SQL a seguir e clique em Executar (Ctrl+E). Observe no navegador do lado esquerdo que serão criadas as tabelas PRODUCT e CUSTOMER, cujas chaves primárias (ID) são geradas automaticamente.

CREATE TABLE PRODUCT
(ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
NAME VARCHAR(100),
PRICE DOUBLE,
QTY INTEGER);
CREATE TABLE CUSTOMER
(ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
NAME VARCHAR(100),
EMAIL VARCHAR(100));

Sua tela deverá estar como na figura abaixo:

HSQL Database Manager

Passo 4 –  Usando o Template SPIDER para Demoiselle

Curiosidades: O exemplo de uso do SPIDER mostrado no vídeo (não deixe de ver, insisto!) gera uma aplicação Java para Web usando o framework brasileiro Mentawai. Precisei criar um template gerador de código no padrão Demoiselle. Em mãos eu tinha  apenas os templates Groovy, criados para o code2code, que precisaria converter para Velocity (foi mais fácil do que imaginei!). Também usei como referência um Template Gerador de Código JSF criado pela Secretaria de Saúde do Ceará, me poupando de algumas dúvidas e problemas que eles passaram (essa é uma das maravilhas dos projetos de código aberto!). Em 2009, o projeto ganhou o 3o lugar no Prêmo Ceará de Cidadani@ Eletrônica, categoria Software Livre. Hoje o template foi doado ao projeto SPIDER On Rails e está no repositório com os devidos créditos aos autores.

Efetue o download do arquivo demoiselle-spider-template.zip e o descompacte em um diretório qualquer da sua máquina. Clique com o botão direito no projeto mystore e escolha a opção SPIDER On Rails. Sua tela aparecerá como na figura a seguir. Observe que você poderá utilizar os templates oficiais do SPIDER, atualizados automaticamente via web pelo plugin, ou escolher uma pasta específica. Ficaremos com a segunda opção, pelo menos até que o template Demoiselle também seja incorporado ao SPIDER! 😛

s3Captura_da_tela-Java - mystore-.spider - Eclipse Platform

Passo 5 – Configurações Iniciais

Na Aba Config é possível selecionar a linguagem e o template desejados. Hoje temos apenas um template para a versão 1.0.6, mas futuramente poderíamos ter um para cada versão do Demoiselle, ou então templates para aplicações com características específicas. O uso da linguagem tem uma serventia bem interessante. Desde que os templates estejam preparados, é possível indicar  por exemplo,  se nomes de classes, métodos ou atributos seriam gerados em inglês ou português. Muito interessante para criar templates geradores de código no padrão de frameworks utilizados internacionalmente. Por simplicidade, preferi gerar todo o código em inglês, mas seria muito bom adaptar o template para fazer uso da internacionalização. Pode-se ainda configurar uma ferramenta de Merge (para administração de eventuais conflitos, quando o template for aplicado em código pré-existente) e as informações do banco de dados. Preencha as informações como na figura.

Configurações Iniciais do Spider

Na aba Package, configure o nome do pacote padrão como com.mycompany.mystore.

A aba Tech é utilizada para que o usuário possa escolher as tecnologias a serem utilizadas no projeto, de forma que o SPIDER consiga gerar (seguindo regras especificas no template) a estrutura de diretórios e todas as dependencias necessárias. A rigor, poderíamos até omitir esta aba, pois no Demoiselle este trabalho é  feito  na criação do projeto Maven usando o arquétipo demoiselle-archetype-webapp-sample. Contudo, a aba Mapping (que veremos mais adiante) exige que selecionemos o tipo de banco de dados. Como estamos usando o HSQLDB, selecione HypersonicSQL no campo Database Type.

Nota: Este é um ponto bem interessante do SPIDER. Aqui poderíamos colocar opções de utilização de outros componentes Demoiselle (como Segurança, Relatórios, Agendador de Tarefas), de forma a facilitar a vida do usuário adicionando automaticamente as dependencias no POM.xml do projeto.

A Aba Layout também não será usada, pois faremos a geração seguindo um padrão fixo. Esta é outra funcionalidade bem legal, que permite ao usuário uma ótima flexibilidade na hora de gerar suas aplicações. Uma boa oportunidade aqui seria criar e disponibilizar layouts de acordo com Skins específicos, conceito implementado pelo componente demoiselle-jsf-ui (ver Módulo 05 do Tutorial Demoiselle).

Passo 6 – Gerando a aplicação

A primeira coisa aqui é gerar as classes de entidade a partir das tabelas do banco, criadas no passo 3. Neste ponto o SPIDER não reiventa a roda e utiliza uma integração com o Hibernate Tools.

Abra a aba Mapping e selecione o pacote com.mycompany.mystore.bean, onde as classes serão geradas. Clique no botão build e observe a criação da pasta mapping em seu projeto. Da primeira vez não vão funcionar, pois precisamos fazer 2 ajustes:

  1. Abra o arquivo hibernate.cfg.xml da pasta mapping e apague o valor “sa” da propriedade hibernate.connection.password (mesmo usando uma senha em branco, fomos obrigados a colocar um valor na aba Config. Na próxima versão do SPIDER esse valor será opcional). Faça o mesmo com /main/resources/hibernate.cfg.xml, pois você já terá um arquivo de configuração Hibernate pronto para a correta execução da aplicação.
  2. Será preciso incluir o .jar do HSQLDB na pasta mapping/lib. Você poderá encontrá-lo no seu repositório local Maven (pois ele automaticamente já baixou o .jar quando você colocou o HSQLDB nas dependencias do projeto, no passo 1), em USER_HOME/.m2/repository/hsqldb/hsqldb. Ne exemplo, usei o hsqldb-1.8.0.1.jar.

Clique novamente no botão build. O SPIDER observará que o hibernate.cfg.xml foi alterado (nas pastas mapping e main/resources) e perguntará se desejamos gerar novamente. Escolha “Don’t Generate” para ambos, pois a nossa modificação deve prevalecer. Note que foram criados dois arquivos de log (1 para cada build) na pasta mapping e também as classes Product.java e Customer. java no package com.mycompany.mystore.bean.

Mapeando classes de entidade a partir do banco de dados

Precisaremos ainda efetuar 3 alterações em cada uma das classes geradas. A primeira delas tirar o src.main.java do nome do package package src.main.java.com.mycompany.mystore.bean (não consegui resolver esse bug). Depois, é fazê-las implementar a interface IPojo, uma exigência da arquitetura do Demoiselle. Por fim, adicione a anotação @GeneratedValue em cada campo id, pois isto foi algo que o HibernateTools não conseguiu reconhecer automaticamente. Não se esqueça de resolver os Imports (Ctrls+Shift+O).

Nota: Pude notar que o HibernateTools bastante poderoso e customizável, portanto poderíamos tentar implementar um maior controle desta geraçaõ automática, por exemplo fazendo-o colocar as anotações antes de cada atributo e não antes de cada método Get, como você deve ter percebido que ele fez. Consulte a referencia da ferramenta para saber mais.

Passo 7 – Gerando CRUDs

Agora estamos pronto para gerar os CRUDs de Produto e Cliente. Acesse a aba CRUD by Mapping e selecione a classe Customer, que já deverá estar listada. Na direita selecione todos os atributos. Nos atributos, marque o id é uma chave (Key) e que é seu HTML Type é do tipo hidden. Os demais ficarão com tipo text. Abaixo, o campo CRUD Type só apresenta a opção default e o campo Module não está sendo utilizado. Fica tudo como está.

Observação: Não vamos escolher o tipo de CRUD, adicionar validadores nem mudar os tipos HTML dos campos, porque no momento o template que elaborei não dá suporte a essas ótimas funcionalidades. Esta é uma excelente oportunidade de contribuição!

Clique no botão build this crud e acompanhe a aplicação de todos os templates Velocity configurados. Serão gerados vários novos arquivos Java (DAO, Business Controler, Managed Beans, constantes de Navegação) e Web (páginas JSF para listagem, visualização e edição). Recomendo que você dê uma navegada pelas pastas e arquivos do projeto para melhor entendimento.

Vale destacar aqui uma funcionalidade muito interessante do SPIDER. O uso de incrementos com base em Expressões Regulares, permite incluir um pequeno trecho de código (incremento) em arquivos já existentes sem perder configurações e/ou customizações do desenvolvedor realizadas anteriormente. Isso permite, por exemplo, alterar conteúdo de classes, páginas e arquivos de propriedades, a cada geração de um novo CRUD (foi o que ocorreu com o main/resources/hibernate.cfg.xml, /main/webapp/WEB-INF/faces-config.xml e /main/webapp/public/templates/default.xhtml, dentre outros).

Exercício: Repita este passo se quiser gerar também o CRUD de Produtos. Seu projeto ficará como na figura:

Gerando CRUD com SPIDER On Rails

Passso 8 – Executando a Aplicação

Antes de rodar, precisaremos alterar os arquivos /main/webapp/WEB-INF/faces-config.xml e /main/webapp/public/templates/default.xhtml gerados originalmente pelo arquétipo do Demoiselle, pois os incrementos a cada CRUD foram feitos corretamente, mas dentro de tags comentadas. Seu faces-config.xml deverá ficar assim:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:xi="http://www.w3.org/2001/XInclude"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
	version="1.2">
	<!-- Facelets Configuration-->
	<application>
		<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
	</application>

	<managed-bean>
		<managed-bean-name>customerMB</managed-bean-name>
		<managed-bean-class>com.mycompany.mystore.view.managedbean.CustomerMB</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

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

	<managed-bean>
		<managed-bean-name>customerMB</managed-bean-name>
		<managed-bean-class>com.mycompany.mystore.view.managedbean.CustomerMB</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>

	<navigation-rule>
		<navigation-case>
			<from-outcome>customer_list</from-outcome>
			<to-view-id>/private/pages/customer_list.xhtml</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>customer_edit</from-outcome>
			<to-view-id>/private/pages/customer_edit.xhtml</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>customer_view</from-outcome>
			<to-view-id>/private/pages/customer_view.xhtml</to-view-id>
		</navigation-case>
		<navigation-case>
			<from-outcome>customer_insert</from-outcome>
			<to-view-id>/private/pages/customer_edit.xhtml</to-view-id>
		</navigation-case>
	</navigation-rule>

	<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>
</faces-config>

O /main/webapp/public/templates/default.xhtml não precisaria ser alterado, mas a aplicação mostraria dois itens de menu (Menu_01 e Menu_02) sem a menor necessidade. Abra-o e exclua o trecho abaixo, deixando apenas os links para os menus Product e Customer.

<rich:toolBarGroup>
    <h:commandLink value="Menu_01" title="Menu_01" onclick="javascript:alert('Menu_01')" />
</rich:toolBarGroup>
<rich:toolBarGroup>
    <h:commandLink value="Menu_02" title="Menu_02" onclick="javascript:alert('Menu_02')" />
</rich:toolBarGroup>

Pronto, agora é só rodar a aplicação. Você pode fazer isso dentro do próprio eclipse, clicando com o botão direito no nome do projeto e escolhendo Run As -> Run On Server, ou então fazendo o deploy pelo Maven com Run As -> Maven Install, abrindo o browser  e digitando http://localhost:8080/mystore. Navegue pela a aplicação, inclua, exclua e altere alguns registros para ver o funcionamento.

Aplicação Demoiselle gerada pelo SPIDER on Rails

Considerações Finais

O SPIDER On Rails é um projeto relativamente maduro e em constante evolução. Seu líder, Bruno Braga, é bastante acessível e aceita muito bem as sugestões de melhoria. A criação de templates não é tão difícil, principalmente se partimos de algo já pronto. O mais complicado para mim foi aprender a usar corretamente as expressões regulares para promover os incrementos em arquivos existentes, mas aos poucos a gente vai pegando o jeito e fica mais fácil. Creio que o processo de escrever templates para o SPIDER mereça um post exclusivo uma hora dessas.

A geração automática de código costuma ser bastante criticada pela impossibilidade em se controlar a qualidade do que é produzido. O SPIDER permite uma grande flexibilidade para que deixemos o código do “nosso jeito” ou do “jeito da nossa organização”. Em comparação com o code2code, o SPIDER On Rails é mais completo e profissional, por isso também leva um pouco mais de tempo para aprender a criar/utilizar os templates. Ambos tem sua serventia; O desenvolvedor pode inclusive utilzá-los em conjunto, deixando para o SPIDER as tarefas mais rebuscadas, ficando o code2code com os templates mais simples. Acredito fielmente que vale o investimento em produzir templates que possam ser reutilizados e que aumentem signficativamente a produtividade do desenvolvedor.

Se você está usando (ou pretende usar) o Demoiselle, temos aqui um ponto de partida. Procurei indicar pontos de melhoria no decorrer do texto (e existem outros, como tipos de CRUD Mestre Detalhe, criação automática de Classes de Testes, uso de recursos Web 2.0/Ajax, e por aí vai). Sinta-se livre para criticar, propor, sugerir, usar e alterar o template aqui disponibilizado conforme a  sua conveniência. Gostaria muito de obter feedback, portanto os comentários são muito bem-vindos. Até a próxima!

10/12/2009

Gerando CRUD completo para Demoiselle com plugin code2code

Filed under: 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!

Crie um website ou blog gratuito no WordPress.com.