domingo, 5 de janeiro de 2014

Geradores de Código em Java - Otimize seu tempo, Economize Dinheiro e Melhore sua Qualidade - Parte 4

 Ilustração 5: Diagrama de Classes do Gerador

Neste momento, o velocity combina os objetos com os templates e gera um texto, que é a armazenado em forma de arquivo obedecendo a estrutura de pacotes. Se for necessário a inclusão de mais arquivos gerados, basta criar o template e defini-lo dentro da pasta correspondente a sua equipe. A atual estrutura gera os seguintes arquivos:
  • Entidade – classe de negócios;
  • DAO – interface da classe de persistência;
  • DAOImpl – implementação da classe de persistência;
  • Service – interface da classe de serviço;
  • ServiceImpl – implementação da classe de serviço;
  • Form – classe que representa os campos do formulário da interface web do struts;
  • Action – classe do struts que recebe a submissão de formulários da web, ou funcionalidades acionadas;
  • Cadastro JSP – tela de cadastro usando Java Server Pages;
  • Pesquisa JSP – tela de pesquisa em Java Server Pages;
  • Pesquisa Popup JSP – tela de pesquisa popup em Java Server Pages;
  • Tela de Detalhe Consulta – tela de consulta sem alteração em Java Server Pages;
  • Arquivo de Configuração - um arquivo com todas as alterações dos arquivos de configuração: applicationContext.xml, validation.xml, struts-config.xml, tiles-definitions.xml, ApplicationResources.properties, menu.jsp, report-views-xml.
  • Relatório – o relatório da classe padrão
 Ilustração 6: Saída do Gerador
Como observado no exemplo, foi gerado para uma única tabela, 5265 linhas de código ou 189925 caracteres sem erros de compilação e execução. Mesmo para estruturas mais complexas o tempo de implementação se torna muito menor.

Template de Geração


Após definido o padrão para todos os artefatos de codificação da equipe/empresa, é necessário trocar valores variáveis para a linguagem do velocity. No exemplo abaixo, o nome do sistema foi substituído por ${entity.getSystem()}, através da biblioteca do velocity esta variável será substituída pelo nome do sistema, neste caso, por evep. Com esta tecnologia também é possível fazer laços. Um exemplo de laço é $foreach ($attribute in ${entity.getAttributeList()}) que irá percorrer e gerar todos os atributos da classe de negócios do sistema. 

package gov.tjpr.${entity.getSystem()}.entity;

import gov.tjpr.entity.PersistableEntity;
import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name="${entity.getTableName()}", schema="${entity.getSchema()}")

#foreach ($attributePk in ${entity.getPrimaryKey().getPkAttributeList()})
#if (${attributePk.getType().equals("Integer")})
@SequenceGenerator(name = "SEQUENCE", sequenceName="${entity.getSchema()}.${entity.getTableName().toLowerCase()}_${attributePk.getColumnName().toLowerCase()}_seq", allocationSize=1)
#end
#end
public class ${entity.getClassName()} implements PersistableEntity#foreach($attributePk in ${entity.getPrimaryKey().getPkAttributeList()})<${attributePk.getType()}>#end
{
  private static final long serialVersionUID = ${pSerialEntidade};
#foreach ($attribute in ${entity.getAttributeList()})
#if (${attribute.isPrimaryKey()})
@Id
#if (${attribute.getType().equals("Integer")})
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQUENCE")
#end
@Column(name="${attribute.getColumnName()}")
  private ${attribute.getType()} ${attribute.getName()};
#elseif (${attribute.isForeignKey()})
@ManyToOne
@JoinColumn(name = "${attribute.getColumnName()}")
  private ${attribute.getForeignKey().getEntityPk().getClassName()} ${attribute.getName()};
#else
  @Column(name="${attribute.getColumnName()}")
  private ${attribute.getType()} ${attribute.getName()};
#end
#end
// GETTERS AND SETTERS
...
}

Quadro 2: Template para Geração de Classe do Padrão Modelo

METAINFORMAÇÃO DAS TABELAS


Para enriquecer a geração de códigos, são colocadas informações adicionais nas tabelas, colunas que são chave estrangeiras e colunas que não são chaves estrageiras.

Comentários em nível de tabela


O comentário em nível de tabela obedece a seguinte estrutura <NOME_CLASSE_JAVA>:<NOME_NA_TELA>:<PROPRIEDADE_MOSTRADA_COMBO>, em que:
  • NOME_TABELA - é o nome da tabela no banco de dados;
  • NOME_CLASSE_JAVA - é o nome da classe referente a esta tabela que será criada no Java;
  • NOME_NA_TELA- é o nome que irá ser mostrado nas telas do Sistema;
  • PROPRIEDADE_MOSTRADA_COMBO - é o campo que será utilizado por todas as demais tabelas (em formato de combo ou lupa) que estiverem relacionadas a esta. No exemplo abaixo a entidade Atividade possui uma combo “Nome do Recurso” onde é apresentada a lista de Recursos representados pelo seu nome.

Exemplo:
Recurso:Recurso:nome

 Ilustração 7: Uso do Comentário na Tabela

Comentários para Coluna que não é Chave Estrangeira


O comentário para coluna não chave estrangeira obedece a seguinte estrutura <NOME_ATRIBUTO_JAVA>:<NOME_NA_TELA>:<OPERADOR_PESQUISA>:<OPCOES>:<SEM_ACENTO>:<REPORT>:<TABELA_AUTOCOMPLETE>, em que:
  • NOME_TABELA - é o nome da tabela no banco de dados;
  • NOME_COLUNA - é o nome da coluna;
  • NOME_ATRIBUTO_JAVA - é o nome que será usado como atributo no Java;
  • NOME_NA_TELA - é o nome que será apresentado nas telas do Sistema;
  • OPERADOR_PESQUISA - é o operador de pesquisa desejado
  • OPCOES - deve ser criado no formato <CHAVE1=VALOR1>;<CHAVE2=VALOR2>. É utilizado para combo quando a mesma não estiver vinculada a uma tabela e possui valores fixos. Aplicado somente a campos dos tipos VARCHAR e CHAR.
  • TABELA_AUTOCOMPLETE - é o nome da tabela onde serão buscados os dados para autocomplete.
Usando o seguinte comentário “sexo:Sexo:=:F=Feminino;M=Masculino” para o campo sexo o gerador constrói a combo mostrado no exemplo abaixo:


Nenhum comentário:

Postar um comentário