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

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

Serviços
Execução de Políticas:
  • SOAP
    • WSDL - http://<SERVIDOR>:PORTA/iw-editor/services/PolicyExecution?wsdl
    • Execução de política (POST) - 
      • - http://<SERVIDOR>:PORTA/iw-editor/services/PolicyExecution/executePolicy?xmlInputString=
        Exemplo 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=

        Exemplo 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>
                 <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=

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

// Pega a URL destino
       String strURL = "[http://localhost:8080/iw-editor/services/PolicyExecution";]
       // 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=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:

advertencia 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:

<?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
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:

  <?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
PostXML
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) {
           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=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();
       }

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

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

Exemplo de retorno
{"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:


<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

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();
        }
    }
}
  • Sem rótulos