Páginas filhas
  • Intellector 9 - API - Executando Políticas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Como entry-point para execução de políticas, o TOTVS Intellector aceita chamadas via Servlets ou Web Service.

Executando via Servlets

Para executar uma política, basta submeter um post para o servlet runpolicy do TOTVS Intellector, passando o XML de entrada como conteúdo do request; veja abaixo um snippet em código Java.

Serviços
Execução de Políticas:
  • SOAP
    • WSDL - http://<SERVIDOR>:PORTA

...

languagejava
linenumberstrue

...

    • /iw-editor/services/PolicyExecution

...

    • ?wsdl
    • Execução de política (POST) - 
      • - http://<SERVIDOR>:PORTA/iw-editor/services/PolicyExecution/executePolicy?xmlInputString=
        Bloco de código
        languagexml
        titleExemplo XML
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsp="http://intellector.tools.com.br/services/WSPolicyExecution/">
           <soapenv:Header/>
           <soapenv:Body>
              <wsp:executePolicy>
               

...

      •  

...

      •  

...

      • <xmlInputString>
         

...

      •  

...

      •        

...

      • <![CDATA[<?xml version="1.0"
               

...

      •  

...

      •  encoding="UTF-8"?><raiz>
                 <programa>POLITICA</programa>
               

...

      •  

...

      •  <layout>Layout_POLITICA</layout>
               

...

      •   <tipo>TIPO_POLITICA</tipo>
             

...

      •  

...

      •  

...

      •  

...

      •  

...

      • <usuario>admin</usuario>
               

...

      •  

...

      •  

...

      • <senha>tools01</senha>
         

...

      •  

...

      •        

...

      • <VARIAVEL_ENTRADA_01>S</VARIAVEL_ENTRADA_01>
                 

...

      • </raiz>]]>
                 

...

      • </xmlInputString>
                 

...

      • 
        </wsp:executePolicy>
           </soapenv:Body>
        </soapenv:Envelope>
    • Execução de política batch (POST) - 
      • - http://<SERVIDOR>:PORTA/iw-editor/services/PolicyExecution/executePolicyBatch?xmlInputString=

        Bloco de código
        languagexml
        titleExemplo XML
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsp="http://intellector.tools.com.br/services/WSPolicyExecution/">
           <soapenv:Header/>
           <soapenv:Body>
              <wsp:executePolicyBatch>
                 

...

Dados de Entrada

O XML de entrada é composto pelas variáveis de entrada descritas em um layout de política e pelas seguintes informações:

  • Nome da política a ser executada; (*)
  • Layout utilizado na execução da política; (*)
  • Nome e senha do usuário;(*)
  • Tipo de política;(*)

 (*) - tags obrigatórias

...

      • <xmlInputString>
        <![CDATA[<?xml version="1.0" encoding="UTF-8"?>
        <lote>
        	<programa_lote>
        		<programa>POLITICA</programa>
        		<layout>layout_POLITICA</layout>
        		<tipo>TIPO_POLITICA</tipo>
        		<usuario>admin</usuario>
        		<senha>tools01</senha>
        	</programa_lote>
        	<lotes>
        		<raiz>
        			<VARIAVEL_ENTRADA_01>VALOR</VARIAVEL_ENTRADA_01>
        		</raiz>
        	</lotes>
        </lote>]]>
                 </xmlInputString>
                 
        </wsp:executePolicyBatch>
           </soapenv:Body>
        </soapenv:Envelope>
  • REST
    • Autenticação no Servidor: http://<SERVIDOR>:PORTA/iw-editor/services/login/perform
      • Authorization - "Basic Auth" - enviar "Username" e "Password"
    • Execução de política: http://<SERVIDOR>:PORTA/iw-editor/services/policy/execute
      • Efetuar primeiro a autenticação no servidor e enviar no Header a "Authorization":"Basic XXX", onde XXX é a tupla "usuario:senha" em Base64 (ver exemplo abaixo)
Consulta Execução de Plugins:
  • SOAP
    • WSDL - http://<SERVIDOR>:PORTA/iw-editor/services/ConsultarAuditoriaAcesso?wsdl
    • Consultar Auditoria de Plugin (POST) - 
      • - http://<SERVIDOR>:PORTA/iw-editor/services/ConsultarAuditoriaAcesso/ConsultaAuditoriaAcesso?XMLConsultaAuditoriaAcessoRequest=

        Bloco de código
        languagexml
        titleExemplo XML
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsp="http://intellector.totvs.com.br/services/WSPlugins/">
        <soapenv:Header/>
        <soapenv:Body>
        <wsp:ConsultaAuditoriaAcesso>
        <XMLConsultaAuditoriaAcessoRequest>
        <![CDATA[<?xml version="1.0"
        encoding="UTF-8"?>
        <consultaAcesso>
        <username>admin</username>
        <password>tools01</password>
        <codExecucao>698DF368-B946-43C5-9D55-F12E845117ED</codExecucao>
        </consultaAcesso>
        ]]>
        </XMLConsultaAuditoriaAcessoRequest>
        </wsp:ConsultaAuditoriaAcesso>
        </soapenv:Body>
        </soapenv:Envelope>
Executando via Servlets

Para executar uma política, basta submeter um post para o servlet runpolicy do TOTVS Intellector, passando o XML de entrada como conteúdo do request; veja abaixo um snippet em código Java.

Bloco de código
languagejava
linenumberstrue
// Pega a URL destino

...

Exemplo

  • Nome da política: P_TST_01
  • Layout (será sempre a string "Layout_" concatenada com o nome da política): Layout_P_TST_01
  • Tipo de política: credito
  • Usuário: admin
  • Senha: tools01
  • Variáveis de entrada
    • CPF : 00000000191

O XML de entrada será composto pelas variáveis de entrada descritas em um layout de política e pelas demais informações:

...

advertenciaImage Removed IMPORTANTE! - não usar os caracteres & e < dentro das tags do XML de Entrada; use amp e lt, senão o mesmo não será interpretado, recebendo um simples retorno (-1) do servlet de execução de política.

Um XML de entrada de execução de política montado a para o layout acima:

Bloco de código
languagehtml/xml
linenumberstrue
<?xml version="1.0" encoding="ISO-8859-1"?> 
<raiz>
        <!-- nome da politica -->
	<programa>P_TST_01</programa>
        <!-- nome do usuário com permissão pra execucao -->
	<usuario>admin</usuario>
        <!-- senha do usuario -->
	<senha>senha_admin</senha>
        <!-- tipo de politica -->
	<tipo>credito</tipo>
       String <!-- layout strURL = "[http://localhost:8080/iw-editor/services/PolicyExecution";]
       // Pega o arquivo para ser usado -->
	<layout>Layout_P_TST_01</layout>
postado
       String strXMLFilename =  <!-- dados de entrada para a execução da politica -->
	<CPF>00000000191</CPF>
</raiz>
Dados de Saída
 
Bloco de código
languagehtml/xml
linenumberstrue
O XML de saída é composto pelas variáveis de saída descritas no layout de política utilizado na execução e, pelas seguintes variáveis de controle:
   <!-- UUID - identificador unico -->
   <LPT__CodExecucao>3176837B-00D1-4B50-8419-126650B0E114</LPT__CodExecucao>
   <LPT__iRetorno>0</LPT__iRetorno>
   <LPT__sAcao>APROVA</LPT__sAcao>
   <LPT__sMsgErro></LPT__sMsgErro>

Vamos explicitar cada uma das variáveis de retorno acima, exceto o código de execução.

  1. LPT__iRetorno

        1 = ConfigException - exceção de erro na configuração do acesso

        2 = LayoutException - exceção de erro na configuração do layout

        3 = InfraException - exceção de erro de infraestrutura, como unknown host, certificados errados, autorização, timeout, etc.

        4 = InstantiationException  - exceção ao instanciar o acesso; erro na reflection

        5 = IllegalAccessException  - exceção ao instanciar o acesso; erro na reflection por acesso ilegal

        6 = ClassNotFoundException -  classe do acesso para reflection não encontrada

        7 = Erro na política  - exceto retorno do acesso.

        8 = Erros inesperados, ocorridos durante a execução/tratamento do retorno dos acessos.

        9 = Exceção - durante preenchimento das variáveis de retorno da política

        10 = Exceção durante a execução da politica e não referente a acessos.

  2. T__sAcao - contém a ação que a política retornou; pode ser:

    APROVA

    MY_ACTION, YOUR_ACTION,... - uma ação qualquer definida pelo usuário.
     

  3. LPT__sMsgErro - contém uma mensagem de erro explicitada numa string
  4. LPT__CodExecucao - UUID - identificador único gerado a cada execução de política. Esse código pode ser utilizado posteriormente para consultar a execução da política.
  5. Também são retornadas as variáveis de saída definidas no layout de saída da política. No exemplo foi retornada a variável LIMITE com o valor 200.00.

Um XML de retorno de uma execução:

Bloco de código
languagehtml/xml
linenumberstrue
  <?xml version="1.0" encoding="UTF-8"?>
<raiz>
	<LPT__sAcao>APROVA</LPT__sAcao>
	<LPT__sMsgErro/>
	<MensagemRetorno/>
	<LPT__iRetorno>0</LPT__iRetorno>
	<LPT__CodExecucao>24cf514d-c56b-498b-93a5-f4686cea4484</LPT__CodExecucao>
	<LIMITE>200.0</LIMITE>
</raiz>
Linha de Comando - Executando uma Política no TOTVS Intellector

Abaixo, listamos alguns exemplos usando várias linguagens, para executar uma política no TOTVS Intellector. Lembramos que os exemplos necessitam de ajustes, mas a ideia central está disponibilizada.

Usando Java com API Apache commons-httpclient
args[1];
       File input = new File(strXMLFilename);
       // Prepara o post HTTP
       PostMethod post = new PostMethod(strURL);
       // O conteudo do Request serah retirado diretamento do stream de entrada
       RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=UTF-8");
       post.setRequestEntity(entity);
       // Pega o HTTP client
       HttpClient httpclient = new HttpClient();
       // Executa o request
       try {
           int result = httpclient.executeMethod(post);
           // Mostra o status code
           System.out.println("Response status code: " + result);
           // Mostra o response
           System.out.println("Response body: ");
           System.out.println(post.getResponseBodyAsString());
       } finally {
           // Release da conexao atual para o connection pool de conexoes, uma vez que jah foi feito
           post.releaseConnection();
       }


Dados de Entrada

O XML de entrada é composto pelas variáveis de entrada descritas em um layout de política e pelas seguintes informações:

  • Nome da política a ser executada; (*)
  • Layout utilizado na execução da política; (*)
  • Nome e senha do usuário;(*)
  • Tipo de política;(*)

 (*) - tags obrigatórias

  • As demais tags são as variáveis de entrada da política definidas no layout de entrada da política.
  • alguns dados, como:  Nome da Política, Nome do Layout, Nome e Senha do Usuário, Tipo, bem como as Variáveis necessárias ao acesso, são obrigatórias.

Exemplo

  • Nome da política: P_TST_01
  • Layout (será sempre a string "Layout_" concatenada com o nome da política): Layout_P_TST_01
  • Tipo de política: credito
  • Usuário: admin
  • Senha: tools01
  • Variáveis de entrada
    • CPF : 00000000191

O XML de entrada será composto pelas variáveis de entrada descritas em um layout de política e pelas demais informações:

advertenciaImage Added IMPORTANTE! - não usar os caracteres & e < dentro das tags do XML de Entrada; use amp e lt, senão o mesmo não será interpretado, recebendo um simples retorno (-1) do servlet de execução de política.


Um XML de entrada de execução de política montado a para o layout acima:

Bloco de código
languagehtml/xml
linenumberstrue
<?xml version="1.0" encoding="ISO-8859-1"?> 
<raiz>
        <!-- nome da politica -->
	<programa>P_TST_01</programa>
        <!-- nome do usuário com permissão pra execucao -->
	<usuario>admin</usuario>
        <!-- senha do usuario -->
	<senha>senha_admin</senha>
        <!-- tipo de politica -->
	<tipo>credito</tipo>
        <!-- layout para ser usado -->
	<layout>Layout_P_TST_01</layout>
        <!-- dados de entrada para a execução da politica -->
	<CPF>00000000191</CPF>
</raiz>
Dados de Saída
Bloco de código
languagehtml/xml
linenumberstrue
O XML de saída é composto pelas variáveis de saída descritas no layout de política utilizado na execução e, pelas seguintes variáveis de controle:
   <!-- UUID - identificador unico -->
   <LPT__CodExecucao>3176837B-00D1-4B50-8419-126650B0E114</LPT__CodExecucao>
   <LPT__iRetorno>0</LPT__iRetorno>
   <LPT__sAcao>APROVA</LPT__sAcao>
   <LPT__sMsgErro></LPT__sMsgErro>

Vamos explicitar cada uma das variáveis de retorno acima, exceto o código de execução.

  1. LPT__iRetorno

        1 = ConfigException - exceção de erro na configuração do acesso

        2 = LayoutException - exceção de erro na configuração do layout

        3 = InfraException - exceção de erro de infraestrutura, como unknown host, certificados errados, autorização, timeout, etc.

        4 = InstantiationException  - exceção ao instanciar o acesso; erro na reflection

        5 = IllegalAccessException  - exceção ao instanciar o acesso; erro na reflection por acesso ilegal

        6 = ClassNotFoundException -  classe do acesso para reflection não encontrada

        7 = Erro na política  - exceto retorno do acesso.

        8 = Erros inesperados, ocorridos durante a execução/tratamento do retorno dos acessos.

        9 = Exceção - durante preenchimento das variáveis de retorno da política

        10 = Exceção durante a execução da politica e não referente a acessos.

  2. T__sAcao - contém a ação que a política retornou; pode ser:

    APROVA

    MY_ACTION, YOUR_ACTION,... - uma ação qualquer definida pelo usuário.
     

  3. LPT__sMsgErro - contém uma mensagem de erro explicitada numa string
  4. LPT__CodExecucao - UUID - identificador único gerado a cada execução de política. Esse código pode ser utilizado posteriormente para consultar a execução da política.
  5. Também são retornadas as variáveis de saída definidas no layout de saída da política. No exemplo foi retornada a variável LIMITE com o valor 200.00.

Um XML de retorno de uma execução:

Bloco de código
languagehtml/xml
linenumberstrue
  <?xml version="1.0" encoding="UTF-8"?>
<raiz>
	<LPT__sAcao>APROVA</LPT__sAcao>
	<LPT__sMsgErro/>
	<MensagemRetorno/>
	<LPT__iRetorno>0</LPT__iRetorno>
	<LPT__CodExecucao>24cf514d-c56b-498b-93a5-f4686cea4484</LPT__CodExecucao>
	<LIMITE>200.0</LIMITE>
</raiz>


Linha de Comando - Executando uma Política no TOTVS Intellector

Abaixo, listamos alguns exemplos usando várias linguagens, para executar uma política no TOTVS Intellector. Lembramos que os exemplos necessitam de ajustes, mas a ideia central está disponibilizada.

Usando Java com API Apache commons-httpclient - XML
Bloco de código
languagejava
titlePostXML
linenumberstrue
package br.com.totvs.intellector.util;

import java.io.File;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.FileRequestEntity;
import org.apache.commons.httpclient.methods.RequestEntity;

/**
 * Uma classe generica, via linha de comando para enviar arquivos, e, a intencao
 * eh enviar arquivos XML para testar os servlets
 * <p>
 * 
 * @author ricart.monachesi
 *
 */

public class PostXML {

    /**
	*
	* Use: java PostXML [http://localhost:8080/iw-editor/services/PolicyExecution] c:\dummy_pol.xml
	*
	*  @param args comando na linha de argumentos
	*         Argumento 0 eh uma URL para um web server, servlet (wsdl?)
	*         Argumento 1 eh arquivo local formato XML (pode ser qq arquivo!)
	*
	*/
   public static void main(String[] args) throws Exception {
	   // passagem de argumentos
       if (args.length != 2) {
Bloco de código
languagejava
linenumberstrue
/**
* $Revision: 1.2 $
* $Date: 2008-11-13 20:26:51 $
*/
package br.com.tools.intellector.util;

import java.io.File;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.FileRequestEntity;
import org.apache.commons.httpclient.methods.RequestEntity;

/**
* Uma classe generica, via linha de comando para enviar arquivos,
* e, a intencao eh enviar arquivos XML para testar os servlets
* <p>
* @author claudio cardozo
*
*/
public class PostXML {
    /**
*
* Use: java PostXML [http://www.intellector.com.br:8080/intellector/runpolicy] c:\dummy_pol.xml
*
*  @param args comando na linha de argumentos
*         Argumento 0 eh uma URL para um web server, servlet (wsdl?)
*         Argumento 1 eh arquivo local formato XML (pode ser qq arquivo!)
*
*/
   public static void main(String[] args) throws Exception {
	   // passagem de argumentos
       if (args.length != 2) {
           System.out.println("Use: java -classpath <classpath> [-Dorg.apache.commons.logging.simplelog.defaultlog=<loglevel>] PostXML <url> <arquivo>]");
           System.out.println("<classpath> - deve conter commons-httpclient.jar e commons-logging.jar");
           System.out.println("<loglevel> - nivel de erro, warn, info, debug, trace");
           System.out.println("<url> - a URL para postar o arquivo");
           System.out.println("<arquivo> - arquivo para postar para a URL");
           System.out.println();
           System.exit(1);
       }
       // Pega a URL destino
       String strURL = args[0];
       // Pega o arquivo para ser postado
       String strXMLFilename = args[1];
       File input = new File(strXMLFilename);
       // Prepara o post HTTP
       PostMethod post = new PostMethod(strURL);
       // O conteudo do Request serah retirado diretamento do stream de entrada
       RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");
       post.setRequestEntity(entity);
       // Pega o HTTP client
       HttpClient httpclient = new HttpClient();
       // Executa o request
       try {
           int result = httpclient.executeMethod(post);
           // Mostra o status code
           System.out.println("Response status code: " + result);
           // Mostra o responseSystem.out.println("Use: java -classpath <classpath> [-Dorg.apache.commons.logging.simplelog.defaultlog=<loglevel>] PostXML <url> <arquivo>]");
           System.out.println("Response body: <classpath> - deve conter commons-httpclient.jar e commons-logging.jar");
           System.out.println(post.getResponseBodyAsString());
       } finally {"<loglevel> - nivel de erro, warn, info, debug, trace");
           // Release da conexao atual para o connection pool de conexoes, uma vez que jah foi feitoSystem.out.println("<url> - a URL para postar o arquivo");
           System.out.println("<arquivo> - arquivo para postar para a URL");
           postSystem.out.releaseConnectionprintln();
           }System.exit(1);
   }

}
Usando RESTful

Uma vez que os exemplos acima, via browser, esclareceram envelope/contrato, segue abaixo um exemplo de chamada via httpClient. REST é apenas um estilo de arquitetura, baseado em estados de transferência.

Bloco de código
languagehtml/xml
linenumberstrue
package br.com.tools.intellector.util;

import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;

/**
* Uma classe generica, via linha de comando para enviar arquivos,
* e, a intencao eh enviar arquivos XML para testar o wsdl/rest
* <p>
* @author claudio cardozo
*
*/
public class PostWSDL {

	// configura a url?wsdl
    private static String url =
        "[http://192.168.0.185:8080/intellector/services/PolicyExecution/executePolicy";]

    /**
* Chamada RESTful via httpClient
* @param args
*/
    public static void main(String[] args) {

    }
       // Pega a URL destino
       String strURL = args[0];
       // Pega o arquivo para ser postado
       String strXMLFilename = args[1];
       File input = new File(strXMLFilename);
       // Prepara o post HTTP
       PostMethod post = new PostMethod(strURL);
       // O conteudo do Request serah retirado diretamento do stream de entrada
       //RequestEntity instanciaentity um= HttpClient
   new FileRequestEntity(input, "text/xml; charset=UTF-8");
    HttpClient client = new HttpClient( post.setRequestEntity(entity);

       // instanciaPega umo GET HTTP methodclient
       HttpMethodHttpClient methodhttpclient = new GetMethodHttpClient(url);

       // configura name-value pairs da string para Executa o metodorequest
       //try definindo{
 um xml com os dados a serem para um uma politica
 int result = httpclient.executeMethod(post);
           NameValuePair// nvp1=Mostra new NameValuePair("xmlInputString", 
o status code
       		    "<raiz>System.out.println("Response status code: " +
				"<programa>politica_dummy</programa><usuario>admin</usuario>" +
				"<senha>tools01</senha>"+
				"<tipo>credito</tipo>"+
				"<layout>Layout_politica_dummy_credito</layout>"+
				"<CodCpf>21769796304</CodCpf>"+
				"<DataNascimento>30011966</DataNascimento>"+
				"<ValBem>101.34</ValBem>"+
				"<DataAberturaConta>23102008</DataAberturaConta>"+
				"</raiz>");

 result);
           // Mostra o response
           System.out.println("Response body: ");
           System.out.println(post.getResponseBodyAsString());
       } finally {
           // configuraRelease asda partesconexao deatual envio
para o connection pool de conexoes, uma method.setQueryString(new NameValuePair[]{nvp1});

       try{vez que jah foi feito
           int statusCode = client.executeMethod(methodpost.releaseConnection();

       }

    System.out.println("QueryString>> " + method.getQueryString());
           System.out.println("Status Text>> " + HttpStatus.getStatusText(statusCode));

           // pega a resposta como String
           System.out.println("Response>> " + method.getResponseBodyAsString());

           //release da conexao
           method.releaseConnection();
       }
       catch(IOException e) {
           e.printStackTrace();
       }
   }

}

Nota: Saiba mais sobre REST

 Consultando Políticas via Web Service (WSDL)

A Consulta de Políticas é um serviço de obtenção de nome, layout e tipo de todas as politicas cadastradas na base, via um XML. Deverão ser passados ao serviço 2 parâmetros:

    1. Nome de Usuário cadastrado no TOTVS Intellector
    2. Senha do Usuário criptografada usando algoritmo de criptografia AES.

Este XML pode ser convertido para um arraylist de hashmap( ) com o uso de da API XStream. O XML de retorno terá na primeira posição do arraylist um hashpmap com as seguintes chaves: retorno e msgerro.

...

Bloco de código
languagehtml/xml
linenumberstrue
<list>
  <map>
     <entry>
        <string>retorno</string>
        <string>0</string>
     </entry>
     <entry>
        <string>msgerro</string>
        <string></string>
     </entry>
  </map>
  <map>
     <entry>
        <string>layout</string>
        <string>Layout_politica_dummy</string>
     </entry>
     <entry>
       <string>cod_programa</string>
       <string>politica_dummy</string>
     </entry>
     <entry>
      <string>policyType</string>
      <string>defaulttype</string>
    </entry>
  </map>
  <map>
    <entry>
       <string>layout</string>
       <string>Layout_politica_dummy1</string>
    </entry>
    <entry>
      <string>cod_programa</string>
      <string>politica_dummy1</string>
    </entry>
    <entry>
      <string>policyType</string>
      <string>defaulttype</string>
    </entry>
  </map>
  <map>
    <entry>
      <string>layout</string>
      <string>Layout_politica_dummy2</string>
    </entry>
    <entry>
      <string>cod_programa</string>
      <string>politica_dummy2</string>
    </entry>
    <entry>
      <string>policyType</string>
      <string>defaulttype</string>
    </entry>
  </map>
</list>

Exemplo de código cliente WSDL usando Java para chamada do Web Service

Bloco de código
languagejava
linenumberstrue
package br.com.tools.executaWebService;

import java.net.URL;
import javax.xml.namespace.QName;
import br.com.tools.acessos.cipher.CipherVO;
import br.com.tools.acessos.cipher.Ciphering;

public class testeWebService {

    // definicao do serviço
    private static final QName SERVICE = new QName("[http://intellector.tools.com.br/services/WSPolicyExecution/",] "PolicyExecutionService");

    public static void main(String args[]) {

        try {
            // definindo a url do web service
            URL wsdlURL = new URL("[http://192.168.0.59:8080/intellector/services/PolicyExecution?wsdl");]
            // definindo um xml com os dados a serem para um uma politica
            String sUsuario = "admin";
            String sSenha = "tools01";

            System.out.println("wsdl url: " + wsdlURL);
            // instanciando o servico
            PolicyExecutionService ss = new PolicyExecutionService( wsdlURL, SERVICE);
            // pegando o port type
            ListLayoutsPortType port = ss.getListPolicyLayouts();
            // definindo uma string para receber o retorno do soap/wsdl
            String resp = null;

            //criptografo a senha
            Ciphering cipher = new Ciphering();
            CipherVO passciphered =  cipher.encript(sSenha);

            System.out.println("Invoking executePolicy()...");
            resp = port.listPolicyLayouts(sUsuario, passciphered.getPassword());
            System.out.println("TOTVS Intellector respondeu:\n" + resp);
            System.out.println();

            System.exit(0);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Desenvolvendo um Acesso Externo

Para obter exemplos de como construir usando a Intellector API, favor contactar a equipe TOTVS Financial.

Nem preciso explicar que esse framework nasceu da necessidade de padronizar o desenvolvimento dos primeiros plugins de acessos e execuções de políticas, embora essa característica fosse evidente desde o princípio. Na realidade, queríamos "forçar" qualquer desenvolvedor de plugins de acesso para o TOTVS Intellector a seguir o pattern que fosse operacional na chamada da política ao acesso desenvolvido, como exceções lançadas, etc., e tivesse uma luz no fim do túnel, com algumas artifícios que ajudassem, pois quanto problemas e dúvidas melhor. Ele é um framework de abstração para operações como chamadas HTTPS com certificados, as vezes bem complexas, e, acreditem, não é tão trivial lidar com sopa de letrinhas esquisitas. Mas nada de ficar assustado, abaixo veremos cada característica desse framework.

  • Interface Acesso - Interface de acessos externos. Arremessa as exceções 'InfraException' para problemas de infraestrutura, como unknown host (conexões e suas configurações, erros de autenticação, logins e passwords, jks, etc);'LayoutException' para problemas relacionados aos layouts, registros e tipos do acesso e, 'ConfigException' se for detectado qualquer anomalia na configuração do acesso. Atualmente um único método precisa ser implementado, oexecute(). É interessante observar as HashMap de entrada/saída:
Bloco de código
languagejava
linenumberstrue
public interface Acesso {
	/**
	 * Executa um acesso externo; interface
	 * <p>
	 * @param hashIn
	 * @throws InfraException
	 * @throws LayoutException
	 * @throws ConfigException
	 */
	public HashMap<String, Object> execute( HashMap<String, Object> hashIn) 
		throws InfraException, LayoutException, ConfigException;
}

Exceptions throwable - O intellector-api disponibiliza algumas exceções para serem utilizadas pelos plugins de acessos, interpretados e tratados por qualquer política compilada pelo TOTVS Intellector Server, são elas:

...

}
		
}
Usando RESTful - Json

Abaixo um exemplo de execução de política usando como entrada um arquivo JSON com os dados de entrada. O retorno também será um JSON.

Bloco de código
languagejava
themeEclipse
titlePostJSON
package br.com.totvs.intellector.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

/**
 * Uma classe generica, via linha de comando para enviar arquivos, e, a intencao
 * eh enviar arquivos JSON para testar os servlets
 * <p>
 * 
 * @author ricart.monachesi
 *
 */

public class PostJSON {

	/**
	 *
	 * Use: java PostJSON
	 * http://localhost:8080/iw-editor/services/policy/execute http://localhost:8080/iw-editor/services/login/perform admin tools01 C:\temp\ent.json
	 * @param args
	 *
	 */
	public static void main(String[] args) throws Exception {
		// passagem de argumentos
		if (args.length != 5) {
			System.out.println(
					"Use: java -classpath <classpath> [-Dorg.apache.commons.logging.simplelog.defaultlog=<loglevel>] PostXML <url> <urlAuth> <usuario> <senha> <arquivo>]");
			System.out.println("<classpath> - deve conter commons-httpclient.jar e commons-logging.jar");
			System.out.println("<loglevel> - nivel de erro, warn, info, debug, trace");
			System.out.println("<url> - a URL para postar o arquivo");
			System.out.println("<urlAuth> - a URL para postar a autenticação");
			System.out.println("<usuario> - usuario");
			System.out.println("<senha> - senha");
			System.out.println("<arquivo> - arquivo para postar para a URL");
			System.out.println();
			System.exit(1);
		}

		// Pega a URL destino
		String strURL = args[0];

		// Pega a URL autenticação
		String strURLAuth = args[1];

		// Pega o usuário autenticação
		String usuario = args[2];

		// Pega a senha autenticação
		String senha = args[3];

		// Pega o arquivo para ser postado
		String strXMLFilename = args[4];
		File input = new File(strXMLFilename);
		String envio = "";
		try (FileReader reader = new FileReader(strXMLFilename); BufferedReader br = new BufferedReader(reader)) {

			// read line by line
			String line;
			while ((line = br.readLine()) != null) {
				envio = envio.concat(line);
			}

		} catch (IOException e) {
			System.err.format("IOException: %s%n", e);
		}

		HttpResponse httpResponse = null;
		DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
		BufferedReader bufferedReader = null;
		HttpEntity httpEntity = null;
		StringEntity stringEntity = new StringEntity(envio);

		// Autenticar no Intellector
		HttpGet httpGet = new HttpGet(strURLAuth);
		String credential = Base64.encodeBase64String((usuario.concat(":").concat(senha)).getBytes("UTF-8"));
		httpGet.setHeader("Authorization", "Basic " + credential.substring(0, credential.length()));
		httpGet.setHeader("Accept", "application/json");
		httpGet.setHeader("Connection", "close");
		httpEntity = (httpResponse = defaultHttpClient.execute(httpGet)).getEntity();
		httpGet.completed();
		EntityUtils.consume(httpEntity);

		// Enviar os dados para a execução da política
		stringEntity.setContentType("application/json");
		HttpPost httpPost = new HttpPost(strURL);
		httpPost.setHeader("Authorization", "Basic " + credential.substring(0, credential.length()));
		httpPost.setEntity(stringEntity);
		httpEntity = (httpResponse = defaultHttpClient.execute(httpPost)).getEntity();
		if (null != httpEntity) {
			bufferedReader = new BufferedReader(new InputStreamReader(httpEntity.getContent()));
			String output;
			String json;
			for (json = ""; (output = bufferedReader.readLine()) != null; json = (new StringBuilder()).append(json)
					.append(output).toString())
				;
			defaultHttpClient.getConnectionManager().shutdown();
			System.out.println(json);
		} else {
			System.out.println("Execução retornou null");
		}

	}

}


Exemplo de retorno de execução de uma política pelo método REST.

Bloco de código
themeEclipse
titleExemplo de retorno
linenumberstrue
{"data":{"message":"{\"LPT__sAcao\":\"APROVA\",\"LPT__sMsgErro\":\"\",\"LIMITE\":\"200.0\",\"MensagemRetorno\":\"\",\"LPT__iRetorno\":\"0\",\"LPT__CodExecucao\":\"dd66926e-51bd-47ce-9759-ac7e3bdd16c1\"}"}}

Nota: Saiba mais sobre REST
 Consultando Políticas via Web Service (WSDL)

A Consulta de Políticas é um serviço de obtenção de nome, layout e tipo de todas as politicas cadastradas na base, via um XML. Deverão ser passados ao serviço 2 parâmetros:

    1. Nome de Usuário cadastrado no TOTVS Intellector
    2. Senha do Usuário criptografada usando algoritmo de criptografia AES.

Este XML pode ser convertido para um arraylist de hashmap( ) com o uso de da API XStream. O XML de retorno terá na primeira posição do arraylist um hashpmap com as seguintes chaves: retorno e msgerro.

    1. retorno pode ser 0 (sucesso) ou -1 (erro)
    2. msgerro contém uma mensagem determinada pela operação.

Exemplo do XML de retorno:


Bloco de código
languagehtml/xml
linenumberstrue
<list>
  <map>
     <entry>
        <string>retorno</string>
        <string>0</string>
     </entry>
     <entry>
        <string>msgerro</string>
        <string></string>
     </entry>
  </map>
  <map>
     <entry>
        <string>layout</string>
        <string>Layout_politica_dummy</string>
     </entry>
     <entry>
       <string>cod_programa</string>
       <string>politica_dummy</string>
     </entry>
     <entry>
      <string>policyType</string>
      <string>defaulttype</string>
    </entry>
  </map>
  <map>
    <entry>
       <string>layout</string>
       <string>Layout_politica_dummy1</string>
    </entry>
    <entry>
      <string>cod_programa</string>
      <string>politica_dummy1</string>
    </entry>
    <entry>
      <string>policyType</string>
      <string>defaulttype</string>
    </entry>
  </map>
  <map>
    <entry>
      <string>layout</string>
      <string>Layout_politica_dummy2</string>
    </entry>
    <entry>
      <string>cod_programa</string>
      <string>politica_dummy2</string>
    </entry>
    <entry>
      <string>policyType</string>
      <string>defaulttype</string>
    </entry>
  </map>
</list>


Exemplo de código cliente WSDL usando Java para chamada do Web Service

Bloco de código
languagejava
linenumberstrue
package br.com.tools.executaWebService;

import java.net.URL;
import javax.xml.namespace.QName;
import br.com.tools.acessos.cipher.CipherVO;
import br.com.tools.acessos.cipher.Ciphering;

public class testeWebService {

    // definicao do serviço
    private static final QName SERVICE = new QName("[http://intellector.tools.com.br/services/WSPolicyExecution/",] "PolicyExecutionService");

    public static void main(String args[]) {

        try {
            // definindo a url do web service
            URL wsdlURL = new URL("[http://192.168.0.59:8080/intellector/services/PolicyExecution?wsdl");]
            // definindo um xml com os dados a serem para um uma politica
            String sUsuario = "admin";
            String sSenha = "tools01";

            System.out.println("wsdl url: " + wsdlURL);
            // instanciando o servico
            PolicyExecutionService ss = new PolicyExecutionService( wsdlURL, SERVICE);
            // pegando o port type
 

...

Todas as exceções tem overload como no exemplo abaixo, permitindo lançar o throwable da causa junto.

Bloco de código
languagehtml/xml
linenumberstrue
public class CipheringException extends Exception {
	/** 
	 * Excecao relativa a problemas de criptografia
	 * <p>
	 * @param msg mensagem para ser mostrada pela excecao
	 */
	public CipheringException(String msg) {
		super(msg);
	}

	/**
	 * Constrói uma nova exceção especificando a mensagem detalhada e a causa.
	 * Note que a mensagem detalhada associada a causa não são incorporadas
	 * automaticamente na mensagem desta exceção.
	 * <p>
	 * @param message
	 *           ListLayoutsPortType Mensagemport detalhada= (que é armazenada para posterior obtenção
	 *ss.getListPolicyLayouts();
            // definindo uma string para receber peloo métodoretorno {@link #getMessage()})
	 * @param cause
	 *do soap/wsdl
            String resp = null;

 Causa (que é guardada para posterior recuperação pelo método
	 *  //criptografo a senha
        {@link #getCause()}) (Um valor nulo éCiphering permitida,cipher e= indica que
	 *new Ciphering();
            CipherVO apassciphered causa= é inexistente ou desconhecida.)
	 */
	public CipheringException(String message, Throwable cause) {
		super(message, cause);
	}
}
Considerações sobre o arquivo XML para ser importado pelo Compilador

Criar manualmente o arquivo com o layout do acesso externo. Um template para a criação desse arquivo se encontra no dummyaccess para facilitar a vida do desenvolvedor e, tenha em mente, ele será validado pelo Compilador (Intellector Cliente). Esse XML deverá conter o nome do acesso externo e a sua classe de implementação em Java, lista das variáveis de entrada e outra de saída com o nome, tipo Java de cada uma, formato e descrição, e.g. abaixo para o nosso accessdummy:

Bloco de código
languagehtml/xml
linenumberstrue
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- $Revision: 1.1.2.7 $ 						-->
<!-- $Date: 2008-11-05 21:02:55 $					-->
<!-- @Author claudio cardozo						-->
<dummy>
	<!-- metodo de acesso para ser carregado no acesso 		-->
	<code name="br.com.tools.acessos.DummyAccess"/>

	<!-- esse deverah ser sufixo para ser acrescentado ao nome 	-->
	<!-- vindo da politica, entao irei buscar na hash da politica	-->
	<!-- hash.getKey(cpf_dummy); um de/para para os elementos 	-->
	<nome_acesso>dummy</nome_acesso>

	<!-- contem os dados necessarios para entrada no Dummy  	-->
	<entrada>
		<!-- posso testar pelo valor obrigatorio dentro de cada -->
		<!-- acesso,  ele dever ser "CPF" 			-->
		<field description="cpf requerente" type="String" format="">CPF</field>
		<field description="Data de Nascimento" type="Date" format="ddmmyyyy">DT_NASC</field>
	   	<field description="Tem seguro" type="Boolean" format="">TEM_SEGURO</field>
	   	<field description="Valor do salario" type="Double" format="">VAL_SALARIO</field>
	   	<field description="Idade do requerente" type="Integer" format="">IDADE</field>
	</entrada>

	<!-- contem todas as saidas disponiveis pelo Dummy		-->
	<!-- Obs.: quando counter=alguma_coisa, entao todo o bloco 	-->
	<!-- abaixo sofrerah um looping baseado nesse counter		-->   	
	<saida id="DUMMY" counter="" >
	   	<register description="Teste de boolean" type="Boolean" format="">BOOLEAN_VALUE</register>
	   	<register description="Teste pra tipo Data" type="Date" format="">DATE_VALUE</register>
	   	<register description="Teste pra tipo Double" type="Double" format="">DOUBLE_VALUE</register>
	   	<register description="Teste pra tipo Integer" type="Integer" format="">INTEGER_VALUE</register>
	   	<register description="Teste pra tipo String" type="String" format="">STRING_VALUE</register>
	</saida>
   	<saida id="D100" counter="" >
		<register description="Um Nome qualquer" type="String" format="">D100_NOME</register>
		<register description="Uma data de Nascimento" type="Date" format="ddmmyyyy">D100_DTNASCIMENTO</register>
		<register description="Mostra o diretorio" type="String" format="">D100_MYDIR</register>
		<register description="Qualquer string" type="String" format="">D100_OUTRO</register>
	</saida>
	<saida id="D200" counter="D200_NUMCONSULTAS" >
		<register description="Simula String com contador" type="String" format="">D200_TIPO_</register>
		<register description="Simula Date com contador" type="Date" format="yyyyddmm">D200_DATA_</register>
		<register description="Simula String com contador" type="String" format="">D200_HORA_</register>
		<register description="Simula String com contador" type="String" format="">D200_MOEDA_</register>
		<register description="Simula Double com contador" type="Double" format="">D200_VALOR_</register>
   	</saida>
</dummy>
E o dummyaccess não é tão dummy assim...

O acesso dummy estará sempre sendo submetido a melhorias, por isso, procure sempre por uma versão atualizada, pois ele terá várias versões, que ao longo do nosso desenvolvimento são taggeds. Talvez exista uma que seja mais adequado a sua necessidade.

Desenvolvendo...

...

    1. Arquivo de propriedades com os dados de configuração do acesso externo, caso existam. Como não se sabe inicialmente quais são esses dados, criar um arquivo de exemplo com as propriedades mais comuns: protocolo (HTTP, HTTPS, TCP, etc), host, porta e objeto no servidor; atualmente só http/servlet é suportado;
    2. Artefatos necessários para a criação de uma funcionalidade no site do Intellector Server que permitirá a configuração do arquivo de propriedades pelo administrador do sistema;
    3. As estruturas das classes Java que deverão ser programadas para cada acesso externo:
    4. As classes, se for o caso, de implementação do acesso externo, para que o desenvolvedor possa programar o acesso externo propriamente dito;
    5. Um XML com os dados de entrada para chamada do acesso de acordo com o layout pré estabelecido pelo órgão e, que receberá o layout montado pela classe anterior e fará o acesso e retornará a classe com o layout de saída;
    6. Uma classe que fará o parser do retorno do órgão externo e montará o VO com as variáveis de resposta, que será chamada pela classe que efetuou o acesso;
    7. Colocar todos os arquivos de propriedades e layouts dentro de uma pasta, para que seja retirado do JAR depois. Essa lista deve ficar no arquivo de manifesto, i.e. META-INF/MANIFEST.MF com uma tag específica (Implementation-FileList - veja exemplo); os arquivos importados ficarão no diretório apontado pela variável de ambiente descrita pela tag 'Implementation-Datadir' no MANIFEST.MF e, esse local deve ter permissão de escrita para o owner do application server;
    8. Para configuração do plugin de acesso no "Intellector Data Dir", deverá ser informado no arquivo de manifesto, i.e. META-INF/MANIFEST.MF, o nome do acesso, na tag 'Implementation-Plugin'. Na Instalação do plugin, no Intellector, será criada um diretório com esse nome no "Intellector Data Dir".
    9. Para consultar o plugin de acesso é necessário determinar as chaves primárias para que futuramente o plugin de acesos seja armazenado em uma base de dados, portanto as variáveis primarykey e pkdescription deverão ser informados no arquivo de manifesto, i.e. META-INF/MANIFEST.MF, sendo o campo primarykey as chaves no HashMap de entrada do acesso mais importantes da consulta separados por ',' para que sejam consultados na funcionalidade Consultar Resultados de Plugin de Acesso e o campo pkdescription um nome mais amigável para que seja listado na funcionalidade também separado por ',' na mesma sequência descrita no campo primarykey;
    10. Criar um novo projeto no Eclipse, tendo como base/exemplo o acessodummy no diretório base de onde os artefatos foram gerados.

Exemplo do MANIFEST.MF (nesse caso, um do SERASA): 

Bloco de código
languagehtml/xml
linenumberstrue
Manifest-Version: 1.0
 Main-Class: br.com.tools.acessos.serasa.SerasaPF
 Class-Path: .
 Version-Info: teste-10
 Implementation-Vendor: Tools Servicos
 Implementation-Plugin: serasapf
 Implementation-Layout: serasapf
 Implementation-Datadir: serasapf.datadir
 Implementation-FileList: 
  resources/https.properties,
  resources/layout_p002.xml,
  resources/layout_p006.xml,
  resources/layoutPF_b49c.xml,
  resources/layoutPJ_b49c.xml,
  resources/serasa.properties,
  resources/serasapf.xml,
  resources/serasapj.xml
 primarykey: CPF, DTNASCIMENTO,
 pkdescription: CPF, Data de Nascimento,
Downloads

...

cipher.encript(sSenha);

            System.out.println("Invoking executePolicy()...");
            resp = port.listPolicyLayouts(sUsuario, passciphered.getPassword());
            System.out.println("TOTVS Intellector respondeu:\n" + resp);
            System.out.println();

            System.exit(0);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}