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:
Ilustração 8: Campo Gerado Usando o Comentário
Nenhum comentário:
Postar um comentário