Webservice
Webservices no CITSmart
o web service é uma solução usada na integração de sistemas e comunicação entre diferentes aplicativos com essa tecnologia é possível que novas aplicações possam interagir com aquelas que já existem e que sistemas desenvolvidos em diferentes plataformas sejam compatíveis web services são componentes que permitem que os aplicativos enviem e recebam dados no formato xml cada aplicativo pode ter sua própria "linguagem", que é traduzida em uma linguagem universal, o formato xml este documento descreve a implementação do webservice no citsmart esp chamado citrest, o serviço da web usa a implementação resteasy do padrão restful através de exemplos práticos, os conceitos básicos, estruturas de dados e padrões a serem seguidos na implementação de novos serviços serão apresentados o padrão resteasy representational state transfer (rest) descreve as arquiteturas que usam o protocolo http ou protocolos semelhantes, restringindo a interface a um conjunto de operações http conhecidas get, post, put e delete o citrest usa o resteasy, que é uma implementação da especificação jax rs que fornece uma api java para serviços da web restful por meio do protocolo http este documento não tem a intenção de apresentar detalhes sobre a implementação restful ou resteasy, já que existe extensa documentação na internet sobre o assunto, como no site http //www jboss org/resteasy http //www jboss org/resteasy modelo de dados uma estrutura foi criada no banco de dados para armazenar os dados necessários para o funcionamento do citrest o modelo de dados rest v2 pdm está localizado no diretório citcorporeweb/model todas as tabelas mantidas no citrest possuem o prefixo rest e possuem relacionamento com outras tabelas no modelo citsmart objetonegocio, grupo, usuário e processamentobatch classes de recursos as classes de recursos são classes simples, pojo, contendo anotações jax rs para indicar mapeamentos e operações existentes as classes resources devem estar no pacote br com centralit citsmart rest resource e seguir o padrão de nomenclatura usado nas outras classes resources, rest \ \<nomedouc > resources java a classe de recurso que intercepta a chamada http para o webservice deve ser mapeada para o arquivo web xml por exemplo \<context param>\<param name>resteasy resources2\</param name>\<param value>br com centralit citsmart rest resource restoperationresources\</param value>\</context param> uma nova instância da classe de recurso é criada para cada solicitação do recurso cada método de recurso recebe como um parâmetro uma instância filho da classe ctmessage java e retorna um objeto do tipo ctmessageresp nesta instância é atribuído o valor do atributo messageid essa instância é passada como um parâmetro para o método execute da classe de utilitário restoperationutil java classes de utilidade a classe restoperationutil java é responsável por realizar as validações e o direcionamento da solicitação de recurso para a classe responsável pela operação o método execute (entrada ctmessage) é o método chamado pelas classes de recursos e recebe como parâmetro uma instância de ctmessage com o atributo messageid atribuído a classe restoperationutil obtém junto à classe restutil java uma instância de cada serviço e executa as seguintes verificações verifica se o sessionid existe e não está expirado retorna um objeto restsessiondto associado ao sessionid verifica se a operação existe na tabela rest operation e retorna o objeto restoperationdto verifica se algum grupo de usuários associado à sessão tem permissão na tabela rest permission depois que essas validações são feitas, a classe executa a inicialização da operação, registrando os atributos na tabela rest execution a tabela restexecution funciona como uma tabela de log de execução observe que a execução é criada com o status notinitiated, ou seja, a operação ainda não foi inicializada esse status será atualizado posteriormente de acordo com o resultado da execução da operação depois de executar o log de execução, a classe restoperationutil instancia a classe operation obtida do atributo javaclass da tabela rest operation e executa a chamada para o método execute o método execute é uma condição do contrato da interface irestoperation as classes que implementam essa interface precisam implementar o método de execução para cada messageid, é feita uma chamada para um método específico para tratamento cada um desses métodos pode fazer chamadas para o citsmart services layer para reutilização de serviços regras específicas todas as classes responsáveis pela operação do serviço da web devem ser registradas na tabela rest operation cada operação possui uma classe associada que obedece a uma interface padrão restoperation e é responsável por sua execução a classe que executa a operação pode ser do tipo java ou javascript (atributo classtype) atualmente, apenas o tipo java é suportado uma operação pode ser síncrona ou assíncrona (atributo operationtype) uma operação síncrona é executada imediatamente quando é chamada uma operação assíncrona aponta para o processamento em lote atualmente, somente operações síncronas são suportadas para que um determinado usuário possa executar uma operação, pelo menos um grupo de usuários deve estar associado à operação na tabela rest permission a tabela rest parameter armazena os parâmetros que podem ser usados para executar operações exemplos de parâmetros são idrestparameter identificador descrição 1 contract id contract id 2 origin id source id 3 request id demand type id for requests 4 incident id incident demand type id 5 default depto id unit default id cada operação pode ter um ou mais domínios de parâmetros na tabela rest domain idrestparameter idrestoperation valor 1 1 1 1 6 1 2 1 7 2 6 10 3 1 1 3 6 1 4 1 3 4 6 3 5 1 3 5 6 3 cada execução de uma operação específica é registrada na tabela rest execution essa tabela registra a data e a hora da solicitação, o id do usuário que está solicitando a execução, a classe de entrada, os dados de entrada e o status atual da execução cada resultado de uma execução é registrado na tabela rest log essa tabela registra a data e hora de execução, a classe de saída, os dados de saída e o status de execução para a criação de um novo recurso, o desenvolvedor deve seguir as seguintes etapas de parametrização registre uma operação na tabela rest operation e diga qual classe java irá executá la conceda permissões de execução de operação para um ou mais grupos na tabela rest permission registre os parâmetros na tabela rest parameter associe os domínios do parâmetro de operação na tabela rest domain estrutura de classe todas as classes usadas pelo citrest devem ser definidas por xsd específico a partir de xsd, as classes podem ser geradas automaticamente pelo plug in do eclipse ou pelo xjc jar, disponível na iniciativa 0015 no sharepoint para gerar as classes do xjc, você deve usar a seguinte linha de comando xjc "{path and name of xsd}" d "{absolute path to src} eg d \ambiente\jboss\server\default\deploy\citcorpore war\web inf\src}" p {pakage name} eg {br com centralit citsmart rest schema} o xsd deve estar no pacote br com centralit citsmart rest xsd e as classes geradas devem estar no pacote br com centralit citsmart rest schema nesses pacotes já existem várias classes xsd e várias usadas pelo mobile que podem ser usadas como exemplo classe cterror a classe cterror é referenciada pelas outras classes usadas para executar as operações do citrest classe ctlogin e ctloginresp toda operação em execução no citrest requer um sessionid retornado pelo login o login é implementado na classe br com centralit citsmart rest resource restoperationresources e tem como entrada um objeto da classe ctlogin como resultado do login, o objeto sessionid ou cterror é retornado pelo login por meio da classe ctloginresp tratamento de erro o tratamento de erros de qualquer método de execução deve obedecer ao padrão de encapsulamento do objeto cterror implementado na classe restoperationutil ctnotificationgetreasonsresp resp = new ctnotificationgetreasonsresp();ctnotificationgetreasons input = (ctnotificationgetreasons) message; if (input gettaskid() == null ) {resp seterror(restoperationutil builderror ( restenum input error , "id da tarefa não informado")); return resp;} } catch (exception e) {e printstacktrace();resp seterror(restoperationutil builderror (e)); return resp;} exemplo prático para facilitar a compreensão, esta seção detalha a implementação e a operação do serviço getbyuser usado no mobile é responsável por retornar a lista de requisições e incidentes no portfólio de trabalho de um determinado usuário as seguintes etapas foram seguidas para sua implementação o xsd das classes ctnotificationgetbyuser e ctnotificationgetbyuserresp foi definido no arquivo br com centralit citsmart rest xsd mobilenotification xsd as classes foram geradas no pacote br com centralit citsmart rest schema por xjc jar as entradas a seguir foram incluídas no arquivo web xml do projeto citsmart \<context param>\<param name>resteasy resources3\</param name>\<param value>br com centralit citsmart rest resource restmobileresources\</param value>\</context param>\<servlet mapping>\<servlet name>resteasy servlet\</servlet name>\<url pattern>/mobile/ \</url pattern>\</servlet mapping> essas entradas especificam que existe uma nova classe de recurso para o resteasy e qualquer url que contenha / mobile / será interceptada pelo servlet de serviço da web a classe restmobileresources foi criada da seguinte forma ""@path("/mobile") public class restmobileresources {@post\@path("/notification/getbyuser") public response getnotificationbyuser(ctnotificationgetbyuser input) {input setmessageid("notification getbyuser"); return restoperationutil execute (input);} a configuração e implementação web xml acima determinam que as chamadas http // /mobile/notification/getbyuser serão interceptadas pela classe restmobileresources a execução da classe restoperationutil direciona a execução para a classe restmobile porque é a classe associada à operação notification getbyuser na tabela rest operation na classe restmobile, existe o método execute que obedece à interface padrão ""public ctmessageresp execute(restsessiondto restsessiondto, restexecutiondto restexecutiondto, restoperationdto restoperationdto, ctmessage message) throws axbexception