Índice
Objetivo
Durante a criação das funcionalidades do Adapter, pode ser necessária a utilização de campos específicos para algumas integrações. Assim, criou-se o conceito de CustomInformation, onde é possível enviar informações customizadas a partir de demandas como regras específicas para clientes, regras específicas para determinados aplicativos ou regras específicas entre aplicativos.
Como construir
Incluir a interface ICustomization na definição da classe.
Definir objetos da classe DefaultDataTable para receber os dados (apenas Java).
Implementar os métodos addCustomInformation(BusinessMessage msg) e addCustomInformation(ResponseMessage response), preenchendo os objetos DefaultDataTable com dados, pelos métodos addRow(HashMap<String,Object> rowData) e updateRow(int rowNumber, HashMap<String,Object> rowData).
Ainda nos métodos addCustomInformation, adicionar a tabela preenchida na mensagem utilizando o método addCustomTable(String tableName, IDataTable table) do objeto CustomInformation que pode ser obtido dos objetos representando as mensagens (msg e response) usando getCustomInformation().
Exemplo em Java:
public class CustomUnitOfMeasure implements ICustomization { DefaultDataTable labInfo = new DefaultDataTable(); DefaultDataTable labInfo2 = new DefaultDataTable(); public CustomUnitOfMeasure() { labInfo.addColumn("lab_id"); labInfo2.addColumn("quanticMass"); labInfo2.addColumn("fusionMethod"); } public void addCustomInformation(BusinessMessage businessMessage) { Map<String, Object> row = new HashMap<String, Object>(); row.put("quanticMass", 120); row.put("fusionMethod", "Nuclear1"); labInfo2.addRow((HashMap<String, Object>) row); businessMessage.getCustomInformation().addCustomTable("labInfo", labInfo2); /* chamar duas vezes para verificar se duplica a linha */ row.put("fusionMethod", "Nuclear"); labInfo2.updateRow(0, (HashMap<String, Object>) row); businessMessage.getCustomInformation().addCustomTable("labInfo", labInfo2); } public void addCustomInformation(ResponseMessage responseMessage) { if (responseMessage.getStatus() == "ERROR") return; Map<String, Object> row = new HashMap<String, Object>(); row.put("lab_id", "05"); labInfo.addRow((HashMap<String, Object>) row); responseMessage.getCustomInformation().addCustomTable("lab_info", labInfo); /* chamar duas vezes para verificar se duplica a linha */ row.put("lab_id", "10"); labInfo.updateRow(0, (HashMap<String, Object>) row); responseMessage.getCustomInformation().addCustomTable("lab_info", labInfo); } }
Exemplos em Progress:
CLASS com.totvs.datasul.eai.test.CustomUnitOfMeasure IMPLEMENTS ICustomization: DEFINE TEMP-TABLE ttLabInfo FIELD lab_id AS CHARACTER. DEFINE TEMP-TABLE ttLabInfo2 FIELD quanticMass AS INTEGER FIELD fusionMethod AS CHARACTER. METHOD VOID addCustomInformation(oMsg AS BusinessMessage): CREATE ttLabInfo2. ASSIGN ttLabInfo2.quanticMass = 120 ttLabInfo2.fusionMethod = "Nuclear1". oMsg:CustomInformation:addCustomTable ("labInfo", INPUT TABLE ttLabInfo2). /* Repetindo para testar a validação se os dados serão duplicados ou não */ ttLabInfo2.fusionMethod = "Nuclear". oMsg:CustomInformation:addCustomTable ("labInfo", INPUT TABLE ttLabInfo2). END. METHOD VOID addCustomInformation(oMsg AS ResponseMessage): CREATE ttLabInfo. ttLabInfo.lab_id = "05". oMsg:CustomInformation:addCustomTable ("lab_info", INPUT TABLE ttLabInfo). /* Repetindo para testar a validação se os dados serão duplicados ou não */ ttLabInfo.lab_id = "10". oMsg:CustomInformation:addCustomTable ("lab_info", INPUT TABLE ttLabInfo). END. END.
Como utilizar uma classe de customização?
A classe de customização deve ser vinculada a uma transação, para ser utilizada. Este vínculo deve ser feito no momento em que se carrega a transação no aplicativo interno.
No EAI2 Java, as transações são carregadas no método construtor da classe que implementa o HostApplication. No EAI2 RI, as transações e suas respectivas classes de customização são referenciadas em um arquivo de configuração – eai2-config.properties.
No EAI2 Progress, as customizações de transações são carregadas através do arquivo adapters/custom-adapters.xml. Este arquivo deve estar em uma das pastas do PROPATH do AppServer e da sessão DI do Datasul.
O exemplo abaixo mostra a classe de customização CityCustomizer sendo associada ao adapter CityAdapter:
<?xml version="1.0"?> <custom-adapters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <custom-adaptersRow> <class>com.totvs.datasul.crm.CityAdapter</class> <customClass>com.totvs.datasul.crm.CityCustomizer</customClass> </custom-adaptersRow> </custom-adapters>
Na tag <class> deve-se informar a classe do adapter. Na tag <customClass> deve-se informar a classe de customização. A tag <custom-adaptersRow> agrupa as duas tags anteriores. É permitido mais de um agrupamento (multiplas tags <custom-adaptersRow>) por arquivo.
Atribuição e Leitura
Para atribuição e leitura dos valores de campos customizados na mensagem é necessária uma classe específica para customização que possuirá os atributos com os valores para o envio. Essa classe se relacionará com o Adapter da mensagem.
Fluxo da Atribuição dos Valores
No Adapter é montada a mensagem de negócio (BusinessMessage) ou a mensagem de retorno (ResponseMessage).
O método prepareMessage() chamará a classe de customização vinculada ao Adapter.
A classe de customização adicionará os dados customizados na BusinessMessage, na tag <CustomInformation> e retornará a mensagem tratada para o Engine.
Ao chamar o método dispatchMessage() a mensagem será enviada com as informações customizadas.
Fluxo da Leitura dos Atributos
Os dados customizados estarão na mensagem de negócio (BusinessMessage) ou na mensagem de retorno (ResponseMessage), e podem ser acessados pelo método getCustomInformation() (Java) ou pela propriedade CustomInformation (Progress).
No próprio método processMessage() do Adapter existe a possibilidade de inserir a lógica para recuperar os dados customizados e gravá-los conforme a necessidade. Ou então, a classe de customização pode ser preparada para processar estes dados, sendo chamada de dentro do método processMessage() do Adapter.