Histórico da Página
Informações | ||||
---|---|---|---|---|
| ||||
|
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:
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
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:
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
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:
Bloco de código | ||||
---|---|---|---|---|
| ||||
<?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.