segunda-feira, setembro 05, 2005

Acabaram-se os caminhos tortuosos (pelo menos até agora...)

Pois é, consegui finalmente aquilo que tanto queria: gerar todo o código em JAVA necessário para a implementação do serviço e do cliente usando o utilitário WSDL2Java. Consegui finalmente acertar com o WSDL correcto para poder fazer com que o serviço fizesse a coisa mais simples que eu pretendia: descarregar um vector população simples em conjunto com o parâmetro que indica o número de iterações (e, como a partir de agora, como passei a usar frequências absolutas em vez de relativas, o tamanho da população). Antes, a única que estava a conseguir efectuar era apenas entregar o vector população sob a forma de uma string. Mas era uma coisa "feita em cima do joelho", para desenrascar, e sem usar o WSDL. A questão é que em vez de usar um dos tipos primitivos como int, float, boolean ou string, o Web Service devia devolver um objecto. E aqui a porca torce o rabo, como raio é que consigo transmitir um objecto complexo através do SOAP ? Graças ao código gerado pelo WSDL2JAVA, fica tudo muito simples, e agora que finalmente consegui perceber para que raio é que server cada um dos ficheiros que o WSDL2JAVA gera, consegui escrever um cliente em menos de nada. Afinal os ficheiros de código gerados automaticamente e agora só percebi isso, facilitam realmente a vida, porque uma pessoa não precisa de estar a perder-se com pormenores mesquinhos e permite concentrar no essencial. No cliente invoco o nome da função "downloadPopulationVector" como se estivesse a acedê-la directamente (a configuração dos parâmetros é idêntica!). Deixo aqui o extracto do código SOAP do Web Service que envia um vector população de 5 posições, com frequências iniciais ajustadas a 10, para correr inicialmente 10 iterações e com uma população de 20 indivíduos:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<response xmlns="">
<pv>
<array>
<array>10</array>
<array>10</array>
<array>10</array>
<array>10</array>
<array>10</array>
</array>
</pv>
<n>10</n>
<popsize>20</popsize>
</response>
</soapenv:Body>
</soapenv:Envelope>