Como entry-point para execução de políticas, o TOTVS Intellector aceita chamadas via Servlets ou Web Service.
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:
(*) - tags obrigatórias
Exemplo
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> |
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 = 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.
APROVA
MY_ACTION, YOUR_ACTION,... - uma ação qualquer definida pelo usuário.
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> |
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.
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();
}
}
} |
====
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");
}
}
}
|
{"data":{"message":"{\"LPT__sAcao\":\"APROVA\",\"LPT__sMsgErro\":\"\",\"LIMITE\":\"200.0\",\"MensagemRetorno\":\"\",\"LPT__iRetorno\":\"0\",\"LPT__CodExecucao\":\"dd66926e-51bd-47ce-9759-ac7e3bdd16c1\"}"}} |
====
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.
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) {
// instancia um HttpClient
HttpClient client = new HttpClient();
// instancia um GET HTTP method
HttpMethod method = new GetMethod(url);
// configura name-value pairs da string para o metodo
// definindo um xml com os dados a serem para um uma politica
NameValuePair nvp1= new NameValuePair("xmlInputString",
"<raiz>" +
"<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>");
// configura as partes de envio
method.setQueryString(new NameValuePair[]{nvp1});
try{
int statusCode = client.executeMethod(method);
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
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:
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.
<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();
}
}
} |