Skip to content

Primeira Aplicação com Prodígio

Vinícius Ferreira edited this page Jan 31, 2018 · 2 revisions

Introdução

Este tutorial tem como objetivo introduzir os conceitos iniciais e essenciais para o desenvolvimento de uma aplicação utilizando o Metaframework Prodigio.
Abordaremos como criar Entidades, Controllers, Interfaces e Regras de Negócio. Utilizaremos um caso de uso simples, que consiste apenas em uma entidade que registra tarefas, com descrição e datas.

Iniciando com o Projeto

Para iniciar com o desenvolvimento deste tutorial configure o ambiente de desenvolvimento e crie um novo projeto Prodigio.
Neste artigo nomearemos o projeto como tutorial.

Criando uma Entidade

Uma Entidade é a representação de uma classe do domínio. Normalmente é a classe que representa um objeto que sera persistido.
Nesta etapa iremos criar uma Entidade para "Tarefas".

Regras de Nomenclatura

As entidades devem iniciar com letra maiúscula e ter o sufixo VO.

Importante

As entidades devem ser obrigatoriamente criadas no domínio da aplicação, sendo assim, no diretório tutorial-domain.

Para criar uma entidade, clique com o botão direito sobre o diretório tutorial-domain, selecione New > Class e pressione Finish.
Certifique-se de que os campos estão preenchidos conforme ilustrado abaixo. Vale lembrar que a classe esta sendo criada dentro de um pacote que estamos nomeando como tarefa. Este pacote é um módulo do nosso projeto, o qual representa um subgrupo do modelo de domínio.

Entidade Tarefa

Nova Classe Entidade

NOTA O campo package deve ser preenchido como br.gov.prodemge.prodigio.tutorial.entidades.tarefa onde o próprio Eclipse irá criar um package com o sufixo tarefa, caso não exista.

Uma vez com a classe gerada, herde de ProVO e crie os atributos conforme o código abaixo.

package br.gov.prodemge.prodigio.tutorial.entidades.tarefa;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import br.gov.prodigio.entidades.ProVO;

@Entity
@Table(name="tarefa")
public class TarefaVO extends ProVO {

	private static final long serialVersionUID = -4314992947793025006L;

	private String descricao;
	private Date dataInicial;
	private Date dataFinal;
	
	@Override
	@Id
	@SequenceGenerator(name = "sq_tarefa", sequenceName = "sq_tarefa", allocationSize = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_tarefa")
	public Long getId() {
		return super.getId();
	}
	
	public String getDescricao() {
		return descricao;
	}
	
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	public Date getDataInicial() {
		return dataInicial;
	}
	
	public void setDataInicial(Date dataInicial) {
		this.dataInicial = dataInicial;
	}
	
	public Date getDataFinal() {
		return dataFinal;
	}
	
	public void setDataFinal(Date dataFinal) {
		this.dataFinal = dataFinal;
	}	
}

Ceritifique-se de que as classes estão sendo apropriadamente especificadas no arquivo de configuração do Hibernate para que o mesmo faça o mapeamento das entidades no banco de dados.
Para isso, pressione Ctrl + Shift + R, abra o arquivo persistence.xml e adicione entradas para a entidade TarefaVO, conforme o código abaixo.

...
<persistence-unit name="tutorial-ds" transaction-type="RESOURCE_LOCAL">
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	<non-jta-data-source>java:/tarefas-ds</non-jta-data-source>
		
	<!--ENTIDADES PRODIGIO-->
	<class>br.gov.prodemge.prodigio.tutorial.entidades.tarefa.TarefaVO</class>
	
	<!-- Demais tags ocultadas para brevidade do exemplo -->
...

Criando o Controller

Um Controller é uma classe de controle do padrão MVC relativo a um processo elementar (caso de uso ou conceito de domínio).
Tem a função de atualizar a interface gráfica e lidar com dados dos modelos.

Regras de Nomenclatura

Os controllers devem iniciar com letra maiúscula e ter o sufixo Ctr.

Importante

Os controllers devem ser obrigatoriamente criados no frontend da aplicação, sendo assim, no diretório tutorial-frontend.

Para criar um controller, clique com o botão direito sobre o diretório tutorial-frontend e pressione New > Class.
Em seguida preencha os campos conforme imagem abaixo.

Novo Controller

NOTA O campo package deve ser preenchido como br.gov.prodemge.prodigio.tutorial.controle.tarefa onde o próprio Eclipse irá criar um package com o sufixo tarefa, caso não exista.

Uma vez com a classe gerada, herde de ProCtr<TarefaVO> e sobrescreva o método doAfterCompose() conforme o código abaixo.

package br.gov.prodemge.prodigio.tutorial.controle.tarefa;

import org.zkoss.zk.ui.Component;

import br.gov.prodemge.prodigio.tutorial.entidades.tarefa.TarefaVO;
import br.gov.prodigio.controle.ProCtr;

public class TarefaCtr extends ProCtr<TarefaVO> {

	@Override
	public void doAfterCompose(Component componente) throws Exception {
		super.doAfterCompose(componente);
		pesquisar();
	}
	
}

NOTA O método sobrescrito doAfterCompose() é invocado após renderizar os componentes na página.


Criando a Zul

Os arquivos com extensão .zul são as telas da aplicação, que utilizam as tecnologias do ZK, que é um framework para criação de interfaces gráficas baseadas em componentes.

Regras de Nomenclatura

As interfaces devem iniciar com letra maiúscula.

Importante

As zuls devem ser criadas no frontend da aplicação, sendo assim, no diretório tutorial-frontend. Os arquivos são criados em pastas específicas com nomenclatura respectivas às entidade ao qual a interface faz referencia, no diretório visao.

Para criar uma zul, clique com o botão direito sobre o diretório /tutorial-frontend/src/main/webapp/br/gov/prodemge/prodigio/tutorial/visao e selecione New > Folder e então crie uma subpasta com o nome da nossa entidade tarefa.

Criando a pasta da Zul

Uma vez com o diretório criado, clique com o botão direito sobre o mesmo, selecione New > File, nomeie o novo arquivo como Tarefa.zul e clique em Finish.

Criando a Zul

Um arquivo .zul em branco será gerado, nele insira o código a seguir.

<window id="tarefa_window"
	apply="br.gov.prodemge.prodigio.tutorial.controle.tarefa.TarefaCtr"
	sizable="true" title="Tarefa">
	<div id="barradebotoes" align="right" />

	<selecaobox>
		<sylistbox id="listaSelecao">
			<auxhead class="cabecalhoPesquisa">
				<auxheader>
					<label value="ID:" />
					<intboxarg id="idArg"></intboxarg>
				</auxheader>
			</auxhead>

			<listhead id="cabecalho">
				<listheadersort label="ID" value="id" />
				<listheadersort label="Descricao" value="descricao" />
				<listheadersort label="Data Inicial" value="dataInicial" />
				<listheadersort label="Data Final" value="dataFinal" />
			</listhead>

			<listitem height="25px">
				<listcellbind label="id"></listcellbind>
				<listcellbind label="descricao"></listcellbind>
				<listcellbind label="dataInicial"></listcellbind>
				<listcellbind label="dataFinal"></listcellbind>
			</listitem>

		</sylistbox>
	</selecaobox>

	<manutencaobox>
		<tablelayout>
			<tablechildren>
				<vbox>
					<label value="Id" />
					<label value="@{classecontrole.objetoAtual.id}" />

					<label value="Descrição " />
					<textboxbind
						nomeDoObjeto="classecontrole.objetoAtual.descricao">
					</textboxbind>

					<label value="Data Inicial " />
					<dateboxbind
						nomeDoObjeto="classecontrole.objetoAtual.dataInicial">
					</dateboxbind>

					<label value="Data Final " />
					<dateboxbind
						nomeDoObjeto="classecontrole.objetoAtual.dataFinal">
					</dateboxbind>
					
				</vbox>
			</tablechildren>
		</tablelayout>
	</manutencaobox>

</window>

Neste artigo não entraremos em detalhes sobre a criação de interfaces. Acesse a documentação dos componentes para aprofundar no assunto.

Criando Regras de Negócio

As Regras de Negócio...

Regras de Nomenclatura

As regras de negócio devem iniciar com letra maiúscula e ter o sufixo RN. Por exemplo, uma classe com regras de negócio para uma entidade que representa um "funcionáio" deve ser ser nomeada FuncionarioRN.

Importante

As regras de negócio devem ser obrigatoriamente criadas no backend da aplicação, sendo assim, no diretório nomeaplicacao-backend.

Para criar uma classe para regras de negócio, clique com o botão direito sobre o diretório /tutorial-backend, selecione New > Class e preecha os campos conforme imagem abaixo.

Regra de Negocio

No exemplo a seguir definimos duas regras de negócio para o domínio "Tarefas".
No primeiro método regraDescricao definimos que o campo descrição não pode ser nulo e nem ter menos de 3 caracteres.
No segundo método regraDatas definimos que a Data Inicial não pode ser posterior a Data Final.

public class TarefaRN extends TutorialBaseRN {
	@RegraDeNegocio(autor = "Autor", codigo = "SEUCODIGO01", ordem = 1, fluxo = Constantes.FLUXO.GRAVAR, momentoDeExecucao = MomentoDeExecucao.ANTES)
	public void regraDescricao(TarefaVO tarefa) {

		Map<String, String> erros = new LinkedHashMap<String, String>();

		if (tarefa.getDescricao().length() < 3)
			erros.put("descricao",
					"A descrição deve conter no minímo 3 caracteres!");

		if (!erros.isEmpty())
			throw new ViolacaoDeRegraEx(erros);

	}

	@RegraDeNegocio(autor = "Autor", codigo = "SEUCODIGO02", ordem = 1, fluxo = Constantes.FLUXO.GRAVAR, momentoDeExecucao = MomentoDeExecucao.ANTES)
	public void regraDatas(TarefaVO tarefa) {

		Map<String, String> erros = new LinkedHashMap<String, String>();

		if (tarefa.getDataInicial() == null || tarefa.getDataInicial() == null)
			throw new ViolacaoDeRegraEx("Os campos não podem ser nulos!");
		
		else if (tarefa.getDataInicial().compareTo(tarefa.getDataFinal()) > 0) {
			erros.put("dataInicial",
					"A data inicial não pode ser maior que a data final!");
			erros.put("dataFinal", "A data final não pode ser menor que a data inicial!");
		}

		if (!erros.isEmpty())
			throw new ViolacaoDeRegraEx(erros);

	}
}

Utilizamos a [anotação @RegraDeNegocio](regra-de-negocios] para definir que o método seguinte é uma regra e para setar algumas configurações de como e quando a regra vai ser aplicada.