quarta-feira, 18 de novembro de 2020

Contas Pagar/Receber - Parte XXIX - Atualizando para Versão 20.11.0 do JARCH

Introdução

Nesse vigésimo nono post vou atualizar a versão do JARCH para 20.11.0. Essa versão mudou a nomenclatura de alguns classes base do JARCH.

Atualizando a Versão
A primeira alteração é ajustar o pom.xml e os persistence.xml para utilizar a versão 20.11.0, então no pom.xml do projeto:
pom.xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>br.com.jarch.contas</groupId>
<artifactId>contas</artifactId>
<version>1.0.0</version>
<name>contas</name>
<packaging>pom</packaging>

<properties>
<jarch-version>20.11.0-SNAPSHOT</jarch-version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
persistence.xml (módulo job)
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="contas-job-pu" transaction-type="JTA">
<jta-data-source>java:/ds/contas/job</jta-data-source>
<jar-file>lib/contas-client-1.0.0.jar</jar-file>
<jar-file>lib/jarch-core-20.11.0-SNAPSHOT.jar</jar-file>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.query.startup_check" value="false"/>
persistence.xml (módulo web)
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="contas-web-pu" transaction-type="JTA">
<jta-data-source>java:/ds/contas/web</jta-data-source>
<jar-file>lib/contas-client-1.0.0.jar</jar-file>
<jar-file>lib/jarch-core-20.11.0-SNAPSHOT.jar</jar-file>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
persistence.xml (módulo ws)
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="contas-ws-pu" transaction-type="JTA">
<jta-data-source>java:/ds/contas/ws</jta-data-source>
<jar-file>lib/contas-client-1.0.0.jar</jar-file>
<jar-file>lib/jarch-core-20.11.0-SNAPSHOT.jar</jar-file>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.query.startup_check" value="false"/>
Refatoração Action's
A nomenclatura Action era utilizada para referenciar o Controller da arquitetura MVC,  então todos as classes do JARCH que eram controllers foram alteradas de Action para Controller. Então vou alterar todas as actions que estendem de CrudListAction para CrudListController.
BancoListAction.java:
package br.com.jarch.contas.web.banco;

import br.com.jarch.annotation.JArchViewScoped;
import br.com.jarch.contas.client.banco.BancoEntity;
import br.com.jarch.contas.client.banco.BancoFacade;
import br.com.jarch.crud.controller.CrudListController;

@JArchViewScoped
public class BancoListAction extends CrudListController<BancoEntity, BancoFacade> {

@Override
public String getPageData() {
return "bancoData.jsf";
}
}
Agora vou alterar todas as actions que estendem de CrudDataAction para CrudDataController.
BancoDataAction.java:
package br.com.jarch.contas.web.banco;

import br.com.jarch.annotation.JArchViewScoped;
import br.com.jarch.contas.client.banco.BancoEntity;
import br.com.jarch.contas.client.banco.BancoFacade;
import br.com.jarch.crud.controller.CrudDataController;

@JArchViewScoped
public class BancoDataAction extends CrudDataController<BancoEntity, BancoFacade> {

@Override
public String getPageList() {
return "bancoList.jsf";
}

}
Agora vou alterar todas as actions que estendem de BaseFilterSelectAction para BaseFilterSelectController.
BancoFilterSelectAction.java:
package br.com.jarch.contas.web.banco;

import br.com.jarch.contas.client.banco.BancoEntity;
import br.com.jarch.annotation.JArchViewScoped;
import br.com.jarch.crud.controller.BaseFilterSelectController;
import javax.annotation.Generated;

@JArchViewScoped
@Generated(value = "br.com.jarch.apt.generate.implicit.EntityProcessor", date = "08/11/2020 19:54:59")
public class BancoFilterSelectAction extends BaseFilterSelectController<BancoEntity> {
}

Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.
Refatoração Facade
A nomenclatura Facade era utilizada para referenciar o Business Objeto (BO) não tem nada a ver com o design pattern Facade (GoF). Então a nomenclatura Facade passou a ser Service,  então todos as classes do JARCH que eram BO's foram alteradas de Facade para Service. Agora vou alterar todas as classes que estem de CrudFacade para CrudService.
BancoFacade.java:
package br.com.jarch.contas.client.banco;

import br.com.jarch.crud.service.CrudService;

public class BancoFacade extends CrudService<BancoEntity, IBancoManager> {

}
Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.
Refatoração (I)Manager
A nomenclatura Manager era utilizada para referenciar o Repository (DAO). Então a nomenclatura Manager passou a ser Dao,  então todos as classes do JARCH que eram Repository's foram alteradas de Manager para Dao. Agora vou alterar todas as classes que estendem de Manager para Dao.
IBancoManager.java:
package br.com.jarch.contas.client.banco;

import br.com.jarch.crud.dao.ICrudDao;

public interface IBancoManager extends ICrudDao<BancoEntity> {

}
BancoManager.java:
package br.com.jarch.contas.client.banco;

import br.com.jarch.crud.dao.CrudDao;

public class BancoManager extends CrudDao<BancoEntity> implements IBancoManager {

}
Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.
Refatoração Classes Projeto Action
Agora que já acertei as estensões de todas classes vou ajustar as nomenclaturas do projeto. Primeiro vou alterar as classes que estão com o nome Action para Controller.
BancoListController.java:
package br.com.jarch.contas.web.banco;

import br.com.jarch.annotation.JArchViewScoped;
import br.com.jarch.contas.client.banco.BancoEntity;
import br.com.jarch.contas.client.banco.BancoFacade;
import br.com.jarch.crud.controller.CrudListController;

@JArchViewScoped
public class BancoListController extends CrudListController<BancoEntity, BancoFacade> {

@Override
public String getPageData() {
return "bancoData.jsf";
}
}
bancoList.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:e="http://jarch.com.br/ui/extension">
<ui:composition template="/paginas/templates/templateListaV2.xhtml">
<ui:define name="panelBodyTemplateLista">
<e:form>
<e:divTitle
title="#{e:bundle('label.lista')} - #{e:bundle('label.banco')}"
description="#{e:bundle('label.manter')} #{e:bundle('label.banco')}"/>
<e:divListFilter
title="#{e:bundle('label.filtro')} - #{e:bundle('label.banco')}"
actionList="#{bancoListController}"
update="@(.list-datatable)"/>
<e:divListDatatable id="listEntityDataTableBanco"
title="#{e:bundle('label.lista')} - #{e:bundle('label.banco')}"
actionList="#{bancoListController}" />
</e:form>
</ui:define>
</ui:composition>
</html>
BancoDataController.java:
package br.com.jarch.contas.web.banco;

import br.com.jarch.annotation.JArchViewScoped;
import br.com.jarch.contas.client.banco.BancoEntity;
import br.com.jarch.contas.client.banco.BancoFacade;
import br.com.jarch.crud.controller.CrudDataController;

@JArchViewScoped
public class BancoDataController extends CrudDataController<BancoEntity, BancoFacade> {

@Override
public String getPageList() {
return "bancoList.jsf";
}

}
bancoData.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:a="http://jarch.com.br/ui"
xmlns:e="http://jarch.com.br/ui/extension">
<ui:composition template="/paginas/templates/templateDadosV2.xhtml">
<ui:define name="panelBodyTemplateDados">
<e:form>
<e:divTitle
title="#{e:bundle('label.banco')} - #{bancoDataController.labelAction}"
description="#{e:bundle('label.manter')} #{e:bundle('label.banco')}"/>
<e:divDataMaster
title="#{e:bundle('label.banco')}"
actionData="#{bancoDataController}">
<a:panelGrid columns="1">
<h:panelGroup>
<a:outputLabel value="#{e:bundle('label.codigo')}" for="idBancoCodigo"/>
<br/>
<a:inputText id="idBancoCodigo" styleClass="input-code"
disabled="#{bancoDataController.blockedMaster}" label="#{e:bundle('label.codigo')}"
value="#{bancoDataController.entity.codigo}" required="true"/>
</h:panelGroup>
</a:panelGrid>
<a:panelGrid columns="1">
<h:panelGroup>
<a:outputLabel value="#{e:bundle('label.nome')}" for="idBancoNome"/>
<br/>
<a:inputText id="idBancoNome" styleClass="input-description-large"
disabled="#{bancoDataController.blockedMaster}" label="#{e:bundle('label.nome')}"
value="#{bancoDataController.entity.nome}" required="true"/>
</h:panelGroup>
</a:panelGrid>

</e:divDataMaster>
</e:form>
</ui:define>
</ui:composition>
</html>
BancoFilterSelectAction.java:
@JArchViewScoped
@Generated(value = "br.com.jarch.apt.generate.implicit.EntityProcessor", date = "08/11/2020 19:54:59")
public class BancoFilterSelectController extends BaseFilterSelectController<BancoEntity> {
}
Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.
Refatoração Classes Projeto Facade
Agora vou alterar as classes que estão com o nome Facade para Service.
BancoService.java:
package br.com.jarch.contas.client.banco;

import br.com.jarch.crud.service.CrudService;

public class BancoService extends CrudService<BancoEntity, IBancoManager> {

}
Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.
Refatoração Classes Projeto Manager
Agora vou alterar as classes que estão com o nome Manager para Dao.
IBancoDao.java:
package br.com.jarch.contas.client.banco;

import br.com.jarch.crud.dao.ICrudDao;

public interface IBancoDao extends ICrudDao<BancoEntity> {

}
BancoDao.java:
package br.com.jarch.contas.client.banco;

import br.com.jarch.crud.dao.CrudDao;

public class BancoDao extends CrudDao<BancoEntity> implements IBancoDao {

}
Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.

Demais Alterações
1. As classes de parâmetros precisam ser ajustadas para apontar para a nomenclatura nova (Action para Controller, Facade para Service e Manager para Dao).
2. Vou extrair os Controller's (antigo Action's) do BPM que estão no módulo client para o módulo web. Vou criar um pacote chamado br.com.jarch.contas.web.bpmn dentro do módulo web e mover o AutorizacaoLancamentoListTaskController.java e BpmListController.java do módulo client para o módulo web.
3. Alterar o método getFilterSelection() das classes ParametroBancoDefault, ParametroCategoriaDefault, ParametroCentroCustoDefault e ParametroPessoaDefault alterando o Action para Controller na string de retorno.
4. Ajustar todas as classes JpqlBuilder para utilizar o ClientJpql e ClientJpqlBuilder no lugar do ClientJpaql e ClientJpaqlBuilder (Remover o "a" no nome da classe).
5. Refatorar a chamada de clientJpaql() para getClientJpql().
6. Refatorar a chamada de ComunicationFacade para ComunicationService.

Conclusão
Nesse post fiz a atualização do projeto para a versão mais atual do JARCH (na publicação desse Post), e algumas melhorias no código. Melhorias no código devem ser frequentemente aplicadas, principamente quando o código sofre constantes alterações ou implementações. Uma boa prática de programação é sempre manter o código mais simples possível, ser auto documentado, utilização de boas práticas de programação orientada a objetos, buscando sempre a coesão e desacoplamento.

Segue o link dessa video aula: https://youtu.be/xA3alw6_2UQ
Até mais,


quarta-feira, 4 de novembro de 2020

Versão 20.10.0-Final

 

Introdução

Nesse post vou mostrar as principais novidades da versão 20.10.0, algumas correções e pequenas alterações.

Implementações

Segue abaixo as implementações dessa versão:
- Adicionado método isSession() no JsfUtils
- Adicionado evento change no e:inputTextCpfCnpj
- Adicionado os atributos showDiagram e showClaim no BaseTaskBean para possibilitar esconder os botões de Fluxo e Assumir no card de tarefas
- Adicionado método formatHHmm no DateUtils  para formatar hora e minuto
- Implementado no gerador de código para gerar script de criação de tabela, sequence, foreign key e índice para o Oracle, PostgreSQL, MySQL, SQL Server e DB2 
- Adicionado login.css para estilização da página de login

Alterações

Além das implementações descritas acima foram feitas algumas alterações:
- Diversas refatorações sugeridas pela SonarLint
- Depreciados todos os métodos de buscas da camada de Facade e Manager, utilizar o Jpql em seu lugar

Correções

Além das alterações descritas acima esta versão contempla algumas correções:
- Correção na verificação do @JArchValidExclusive para tratar campos nulos
- Corrigido a atualização dos parâmetros que estava duplicando o conteúdo entre os componentes na mudança de aba
- Correção nas actions base para não ocorrer NullPointerException no @PostConstruct (ocorria quando estava expirado a sessão)
- Ajuste no CrudManager para somente criticar o Id preenchido na inclusão quando existir as anotações @SequenceGenerator e @GeneratedValue

Conclusão

Essa versão contempla algumas melhorias e correções. É recomendável a atualização para essa nova versão.

Até mais,

Versão 23.3.0-Final

      Introdução Nesse post vou mostrar as principais novidades da versão 23.3.0, algumas correções e pequenas alterações. Alterações Além d...