...
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.
...
| language | java |
|---|
| linenumbers | true |
|---|
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=
| Bloco de código |
|---|
| language | xml |
|---|
| title | 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>
|
...
...
...
...
<![CDATA[<?xml version="1.0"
|
...
...
...
...
<programa>POLITICA</programa>
<layout>Layout_POLITICA</layout>
<tipo>TIPO_POLITICA</tipo>
|
...
...
...
...
...
...
...
...
<VARIAVEL_ENTRADA_01>S</VARIAVEL_ENTRADA_01>
|
...
...
...
...
...
...
...
...
...
</soapenv:Body>
</soapenv:Envelope> |
- Execução de política batch (POST) -
...
...
<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>]]>
|
...
...
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
...
</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) -
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 |
|---|
| language | java |
|---|
| linenumbers | true |
|---|
|
// 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
O XML de entrada será composto pelas variáveis de entrada descritas em um layout de política e pelas demais informações:
Image 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 |
|---|
| language | html/xml |
|---|
| linenumbers | true |
|---|
|
<?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 |
|---|
| language | html/xml |
|---|
| linenumbers | true |
|---|
|
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:
| Bloco de código |
|---|
| language | html/xml |
|---|
| linenumbers | true |
|---|
|
<?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
...
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
O XML de entrada será composto pelas variáveis de entrada descritas em um layout de política e pelas demais informações:
...
Image 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 |
|---|
| language | html/xml |
|---|
| linenumbers | true |
|---|
|
<?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 |
|---|
| language | html/xml |
|---|
| linenumbers | true |
|---|
|
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:
| Bloco de código |
|---|
| language | html/xml |
|---|
| linenumbers | true |
|---|
|
<?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
| Bloco de código |
|---|
| language | java |
|---|
| linenumbers | true |
|---|
|
/**
* $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 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
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 |
|---|
| language | html/xml |
|---|
| linenumbers | true |
|---|
|
package br.com.toolstotvs.intellector.util;
import java.io.IOExceptionFile;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethodmethods.PostMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePairmethods.FileRequestEntity;
import org.apache.commons.httpclient.methods.GetMethodRequestEntity;
/**
* Uma classe generica, via linha de comando para enviar arquivos,
* e, a intencao
* eh enviar arquivos XML para testar oos wsdl/restservlets
* <p>
*
* @author claudio cardozo
ricart.monachesi
*
*/
public class PostWSDLPostXML {
// configura a url?wsdl
private static String url =
" /**
*
* Use: java PostXML [http://192.168.0.185localhost:8080/intellectoriw-editor/services/PolicyExecution/executePolicy";]
/**
* Chamada RESTful via httpClient
* @param args
*/
] c:\dummy_pol.xml
*
* @param args comando na linha de argumentos
* public static void main(String[] args) {
// instancia um HttpClient
Argumento 0 eh uma URL para um web server, servlet (wsdl?)
* HttpClient client = new HttpClient();
Argumento 1 eh arquivo local formato XML (pode ser qq arquivo!)
*
*/
public static void main(String[] args) throws Exception {
// instanciapassagem um GET HTTP methodde argumentos
HttpMethod method if (args.length != new GetMethod(url);
2) {
// configura name-value pairs da string para o metodo
System.out.println("Use: java -classpath <classpath> [-Dorg.apache.commons.logging.simplelog.defaultlog=<loglevel>] PostXML <url> <arquivo>]");
// definindo um xml com os dados a serem para um uma politica
System.out.println("<classpath> - deve conter commons-httpclient.jar e commons-logging.jar");
NameValuePair nvp1= new NameValuePair("xmlInputString",
System.out.println("<loglevel> - nivel de erro, warn, info, debug, trace");
"<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>");
System.out.println("<url> - a URL para postar o arquivo");
System.out.println("<arquivo> - arquivo para postar para a URL");
System.out.println();
// configura as partes de envio System.exit(1);
method.setQueryString(new NameValuePair[]{nvp1});
try{
// Pega a URL destino
intString statusCodestrURL = client.executeMethod(method);
args[0];
// Pega o System.out.println("QueryString>> " + method.getQueryString());
arquivo para ser postado
String strXMLFilename = args[1];
System.out.println("Status Text>> " + HttpStatus.getStatusText(statusCode)File input = new File(strXMLFilename);
// Prepara o post //HTTP
pega a resposta como String
PostMethod post = new PostMethod(strURL);
System.out.println("Response>> " + method.getResponseBodyAsString());
//release da conexao
// O conteudo do Request serah retirado diretamento do stream de entrada
RequestEntity entity = new FileRequestEntity(input, method.releaseConnection("text/xml; charset=UTF-8");
}post.setRequestEntity(entity);
catch(IOException e) {// Pega o HTTP client
HttpClient httpclient = e.printStackTrace();
}
}
} |
...
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.
| Bloco de código |
|---|
| language | java |
|---|
| theme | Eclipse |
|---|
| title | 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.
| Bloco de código |
|---|
| theme | Eclipse |
|---|
| title | Exemplo de retorno |
|---|
| linenumbers | true |
|---|
|
{"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)
...