Árvore de páginas

Í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.



Existem duas maneiras de enviar informações customizadas, que são pela BusinessMessage e pela ResponseMessage.

Exemplo:


<?xml version="1.0" encoding="UTF-8"?>
<TOTVSMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xmlschema/material/events/unitofmeasure_11_1_0.xsd">
  <MessageInformation version="11.1.0">
        <UUID>UnitOfMe-asur-eUps-ertE-vent00000000</UUID>
        <Type>BusinessMessage</Type>
        <Transaction>UnitOfMeasure</Transaction>
        <StandardVersion>1.0</StandardVersion>
        <SourceApplication>TestApplication</SourceApplication>
    	<Product name="ExternalApp" version="1.0"/>
    	<GeneratedOn>2001-12-31T12:00:00.000-03:00</GeneratedOn>
        <DeliveryType>Sync</DeliveryType>
  </MessageInformation>
  <BusinessMessage>
  	<BusinessEvent>
      	<Entity>UnitOfMeasure</Entity>
	    <Event>upsert</Event>
        <Identification>
      		<key name="code">UN</key>
        </Identification>
    </BusinessEvent>
    <BusinessContent>
        <Code>UN</Code>
        <Description>Unidade</Description>
    </BusinessContent>
    <CustomInformation>
             <Table name="labInfo">
                    <Record>
                           <Field name="quanticMass">120</Field>
                           <Field name="fusionMethod">Nuclear</Field>
                    </Record>
             </Table>
     </CustomInformation>
  </BusinessMessage>
</TOTVSMessage>

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.