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>
- - http://<SERVIDOR>:PORTA/iw-editor/services/PolicyExecution/executePolicy?xmlInputString=
- 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)
- Autenticação no Servidor: http://<SERVIDOR>:PORTA/iw-editor/services/login/perform
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:
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.
- 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.
- 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.
- LPT__sMsgErro - contém uma mensagem de erro explicitada numa string
- 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.
- 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
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.
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.
{"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:
- Nome de Usuário cadastrado no TOTVS Intellector
- 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.
- retorno pode ser 0 (sucesso) ou -1 (erro)
- msgerro contém uma mensagem determinada pela operação.
<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(); } } }