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
Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.Refatoração Facade
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:
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> {
}
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:
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)ManagerA 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:
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 ActionAgora 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:
BancoListController.java:
package br.com.jarch.contas.web.banco;bancoList.xhtml:
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";
}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"BancoDataController.java:
"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>
package br.com.jarch.contas.web.banco;bancoData.xhtml:
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";
}
}
<!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:
Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.BancoService.java:
package br.com.jarch.contas.client.banco;
import br.com.jarch.crud.service.CrudService;
public class BancoService extends CrudService<BancoEntity, IBancoManager> {
}
Refatoração Classes Projeto Manager
Agora vou alterar as classes que estão com o nome Manager para Dao.
IBancoDao.java:
IBancoDao.java:
package br.com.jarch.contas.client.banco;BancoDao.java:
import br.com.jarch.crud.dao.ICrudDao;
public interface IBancoDao extends ICrudDao<BancoEntity> {
}
package br.com.jarch.contas.client.banco;Apesar de mostrar somente o Banco como exemplo a aplicação da alteração precisa ser em todo o projeto.
import br.com.jarch.crud.dao.CrudDao;
public class BancoDao extends CrudDao<BancoEntity> implements IBancoDao {
}
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,