====== Como implementar uma nova Spec ====== Implementar uma nova Spec é um processo trabalhoso e por vezes demorado. Como trabalhamos há mais de dois anos com essa atividade, temos uma certa experiência no assunto, que está traduzida nesta dica. \\ Os passos são os seguintes: ===== 1. Ler a Spec ===== * Não tem como fugir, você precisa ler o texto da especificação, nem que seja a parte conceitual -> **para que serve isso?** * Nessa leitura, identifique os //key-methods// (para um serviço) ou as principais classes, para começar os testes. * Nesta fase e importante ver quem fez o quê. Muitas Specs já possuem implementações livre ou exemplos -> use-os para separar o essencial das firulas ===== 2. Mapear para conceitos TerraLib ===== * Uma vez identificados os métodos para um serviço, ou objetos para um formato, passe a mapear esses conceitos para o que existe na TerraLib. * Em princípio, a TerraLib dá suporte a **muita coisa** mesmo, nativamente. Outras só adaptando, mas mesmo assim possível * Nesta fase convém implementar esses conceitos em arquivos de testes simples, para identificar se a TerraLib pode ser usada * Só passe adiante se __confirmar que é possível__ implementar os conceitos da Spec na TerraLib ===== 3. Modelar as classes C++ ===== * Como praticamente TODAS as Specs usam XML Schema para modelar seus conceitos, e poder validar seus XMLs, realize a tradução desses Schemas para classes C++ usando UML * O [[http://jude.change-vision.com/jude-web/product/community.html|Jude]] é uma boa ferramenta para tal * Não confie em ferramentas que automatizem esse processo! Só a prática leva ao entendimento completo do problema e a modelagem correta dos conceitos. Existem **várias sutilezas** nos XML Schemas! Os próprios XSDs da Spec XSD são muito difíceis de entender * O diagrama de classes em UML vai ajudá-lo bastante na hora de implementar as classes em C++ \\ FIXME colocar exemplos ===== 4. Implementar a Spec ===== * A fase de implementação consiste em traduzir os diagramas UML para classes em C++ * Copie a documentação da Spec (no texto ou no Schema) para a documentação da classe -> esses dados passam a fazer parte da implementação * Implemente as classes se preocupando sempre com os métodos ''writeToXML'' e ''readFromXML'', que são o núcleo da Spec -> usar as classes e funções disponíveis no pacote ''xml'' do TerraOGC * Se for implementar um formato, faça os métodos de conversão de/para conceitos TerraLib (Exemplos: TeKMLPolygon <-> TePolygon, TeGMLPolygon <-> TePolygon) * Se for implementar um serviço, siga os passos seguintes: ==== 4.1 Classes comuns ==== * É a implementação constante do item 4, ou seja, implementar as classes comuns do serviço * ''writeToXML'' e ''readFromXML'' serão usados nas partes cliente e servidor ==== 4.2 Classes servidor ==== * É a implementação da interface do serviço como um servidor * Esta parte é necessária pois podemos construir várias **comunicações** do servidor, como CGI, ou até SOAP * É nesta fase que serão aplicados os conhecimentos da fase 2, que envolve fazer um mapeamento dos conceitos TerraLib para o serviço em questão * É nessa parte que realmente entra a TerraLib ==== 4.3 Servidor CGI ==== * Uma implementação bastante simples do servidor * É o único aplicativo em todo o processo, todos os demais são bibliotecas (SOs ou DLLs) * Usar as funções CGI disponíveis no pacote ''common'' do TerraOGC ==== 4.4. Classes cliente ==== * Também é interessante montar uma classe, similar ao que ocorre no servidor, para o cliente * Aqui são usadas algumas funções de conexão HTTP providas pela [[http://curl.haxx.se/libcurl/|libcURL]] * Seria interessante criar um pacote com essas classes comuns aos clientes -> será definido (TBD). Por enquanto usar os exemplos disponíveis nos pacotes ''wmsclient'' e ''wfsclient''