Histórico da Página
...
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
...
language | java |
---|---|
linenumbers | true |
...
- /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>
- - http://<SERVIDOR>:PORTA/iw-editor/services/PolicyExecution/executePolicy?xmlInputString=
...
<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 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: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)
- 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=
Bloco de código language xml title 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[
...
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:
...
language | html/xml |
---|---|
linenumbers | true |
<?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 | ||||
---|---|---|---|---|
| ||||
// Pega a URL destino <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> String <!-- tipo de politica --> <tipo>credito</tipo> strURL = "[http://localhost:8080/iw-editor/services/PolicyExecution";] // Pega <!-- layouto arquivo para ser usado --> <layout>Layout_P_TST_01</layout> postado String strXMLFilename = args[1]; File input <!-- dados de entrada para a execução da politica --> <CPF>00000000191</CPF> </raiz> |
Dados de Saída
Bloco de código | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
<?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
= 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:
Bloco de código | ||||
---|---|---|---|---|
| ||||
<?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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
<?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 | ||||||
---|---|---|---|---|---|---|
| ||||||
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"); | ||||||
Bloco de código | ||||||
| ||||||
/** * $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 postSystem.out.releaseConnection(); } } } |
Usando PL/SQL
Aqui um pequeno exemplo de chamada usando os utilities do PLSQL do Oracle.
Bloco de código | ||||
---|---|---|---|---|
| ||||
create or replace FUNCTION sp_solicitahttp ( szXmlEntrada IN VARCHAR2, lenXmlEntrada IN BINARY_INTEGER, szXmlSaida IN OUT VARCHAR2, lenXmlSaida IN OUT BINARY_INTEGER ) RETURN BINARY_INTEGER IS /*------------------------------------------------------------------------------------------------ DATA : 02/12/2008 AUTOR : LUIZ LIMA PRODUTO : SCE MODULO : BATCH SGBD : ORACLE -------------------------------------------------------------------------------------------------*/ o_return_code INTEGER; i_urltext VARCHAR2(32767); i_timeout INTEGER DEFAULT 60; sslreq UTL_HTTP.req; rsp UTL_HTTP.resp; replymessage VARCHAR2(32767); replyline VARCHAR2(32767); BEGIN -- Maquina de Teste i_urltext := 'http://192.168.0.172:8080/intellector/runpolicy'; i_timeout := 50; -- Iniciando o Banco sslreq := UTL_HTTP.BEGIN_REQUEST(i_urltext,'POST','HTTP/1.0'); UTL_HTTP.SET_HEADER(sslreq,'Content-Type','text/xml;charset=ISO-8859-1'); UTL_HTTP.SET_HEADER(sslreq,'Content-Length',lenXmlEntrada); UTL_HTTP.SET_TRANSFER_TIMEOUT(i_timeout); /* Write information over secure connection */ /*MyXML := '<?xml version="1.0" encoding="UTF-8"?>' || '<raiz>' || '<programa>politica_dummy</programa>' ||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 '<usuario>admin</usuario>' || '<senha>tools</senha>' ||conexao atual para o connection pool de conexoes, uma vez que jah foi feito '<tipo>credito</tipo>' ||post.releaseConnection(); } '<layout>Layout_politica_dummy</layout>' || '<CodCpf>21769796304</CodCpf>' || '<DataNascimento>30011966</DataNascimento>' || '</raiz>'; */ UTL_HTTP.WRITE_TEXT(sslreq, szXmlEntrada); --UTL_HTTP.WRITE_TEXT( sslreq, MyXML); /* Initialize Response */ rsp:=UTL_HTTP.GET_RESPONSE(sslreq); replymessage := ''; /* Retrieve response */ BEGIN LOOP UTL_HTTP.READ_LINE(rsp, replyline, TRUE); replymessage := replymessage || replyline; END LOOP; UTL_HTTP.END_RESPONSE(rsp); EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(rsp); END; /* Set output information */ szXmlSaida := replymessage; lenXmlSaida := length(szXmlSaida); o_return_code := 1; RETURN o_return_code; EXCEPTION WHEN OTHERS THEN o_return_code := -1; szXmlSaida := replymessage || ' erro ' || SQLERRM; lenXmlSaida := length(szXmlSaida); return o_return_code; END; |
Usando Active X (VB/ASP)
Aqui um pequeno trecho de código para uma chamada simples ao TOTVS Intellector usando VB/ASP.
Bloco de código | ||||
---|---|---|---|---|
| ||||
'-----------------------------------------------------------------
'-- Função que executa o Intellector via HTTP
'-----------------------------------------------------------------
Function SolicitaHTTP( byval asXmlEntrada )
Dim Url
Dim objXMLReceive
Dim objXMLSend
Dim objSrvHTTP
'Pego o Host e o path do servelet do intellector para formar a url
Url = "[http://www.intellector.com.br:8080/intellector/runpolicy"]
Set objSrvHTTP = CreateObject("Msxml2.ServerXMLHTTP.3.0")
Set objXMLSend = CreateObject("Msxml2.DOMDocument.3.0")
Set objXMLReceive = CreateObject("Msxml2.DOMDocument.3.0")
objXMLSend.async = false
if not( asXmlEntrada = "" or isnull( asXmlEntrada ) or isempty( asXmlEntrada ) ) then
'Carrego XML de entrada
objXMLSend.loadXML asXmlEntrada
'Seto os Timeouts
'objXMLSend.setTimeouts(resolveTimeout, connectTimeout, sendTimeout, receiveTimeout)
'Valores No timeout , 90 seg , 2 min , 5 min
objSrvHTTP.setTimeouts 0 , 90000 , 120000, 3000000
'Configuro o endereço
objSrvHTTP.open "POST", Url, false
'Envio o xml para o servidor
objSrvHTTP.send objXMLSend
Response.ContentType = "text/html;charset=ISO-8859-1"
'Busco o XML de retorno
objXMLReceive = objSrvHTTP.responseText
SolicitaHTTP = objXMLReceive
end if
End Function |
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 | ||||
---|---|---|---|---|
| ||||
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
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.
...
Bloco de código | ||||
---|---|---|---|---|
| ||||
<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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
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:
...
Todas as exceções tem overload como no exemplo abaixo, permitindo lançar o throwable da causa junto.
Bloco de código | ||||
---|---|---|---|---|
| ||||
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
* Mensagem detalhada (que é armazenada para posterior obtenção
* pelo método {@link #getMessage()})
* @param cause
* Causa (que é guardada para posterior recuperação pelo método
* {@link #getCause()}) (Um valor nulo é permitida, e indica que
* a causa é inexistente ou desconhecida.)
*/
public CipheringException(String message, Throwable cause) {
super(message, cause);
}
} |
Considerações sobre o arquivo XML para ser importado pelo Compilador
...
}
} |
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
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 | ||||||
---|---|---|---|---|---|---|
| ||||||
{"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.
...
Bloco de código | ||||
---|---|---|---|---|
|
...
<?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...
...
<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 | ||||
---|---|---|---|---|
| ||||
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();
}
}
} |
- 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;
- 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;
- As estruturas das classes Java que deverão ser programadas para cada acesso externo:
- As classes, se for o caso, de implementação do acesso externo, para que o desenvolvedor possa programar o acesso externo propriamente dito;
- 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;
- 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;
- 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;
- 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".
- 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;
- 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 | ||||
---|---|---|---|---|
| ||||
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
...