• Aucun résultat trouvé

5.3.3 Funcionalidades

De maneira a construir páginas Web responsivas recorreu-se à framework front-end mais popular do mundo, o Bootstrap. Toda a interface foi implementada através dos componentes presentes nesta framework.

Os mapas presentes ao longo da aplicação web foram implementados através de uma biblioteca JavaScript open-source Leaflet. Leaflet permite criar mapas interativos através de um API simples, onde são fornecidas as ferramentas necessárias para as tarefas a executar num mapa com um elevado nível de desempenho. Permite exibir mapas que estão presentes num servidor público,

5.3. Servidor 75 permitindo a sobreposição de várias camadas interativas (e.g., pontos, polígonos, popups) [41].

Relativamente ao login, após preenchidos os campos de email e senha, se os dados forem confirmados através de um pedido POST ao servidor, é utilizada a interface Java HttpSession

de maneira a guardar atributos que persistem na sessão entre o cliente e o servidor. Para isto foi necessário criar duas classes que estendem HttpServlet, que são responsáveis por atribuir ou remover a atribuição de um valor na sessão, sendo armazenado o email do utilizador com a sessão iniciada. Depois de obtida a sessão, através do método getSession (), este parâmetro pode ser atribuído ou obtido através dos respetivos métodos setAttribute () e getAttribute (), sendo através deste último parâmetro que o conteúdo das diferentes páginas é adequado ao tipo de utilizador com sessão iniciada.

5.3.4 Atribuição do concelho e distrito

Quando um avistamento chega pela primeira vez ao servidor é atribuído automaticamente o Concelho e respetivo Distrito onde este está inserido. Para possibilitar este comportamento foi descarregada a Carta Administrativa de Portugal (CAOP) do ano de 2018 onde se encontra o registo da delimitação e demarcação das circunscrições administrativas de Portugal. Esta informação é disponibilizada pela Direção-Geral do Território [47]. De forma a visualizar e editar esta informação, foi utilizado um software open-souce QGIS que permite a manipulação de dados geoespaciais [42].

Inicialmente importou-se oCAOP ao adicionar uma nova camada vetorial, com o sistema de coordenadas (ETRS89 / Portugal TM06). Foi necessário filtrar por cada um dos 278 concelhos existentes e exportar cada uma destas camadas vetoriais para SQLite com o sistema de referências de coordenadas utilizada pelo OpenStreetMaps (EPSG:4326 – WGS 84). Todas estas camadas foram juntas numa só e extraídos os vértices que marcam o perímetro de todos os concelhos, tal como representado na Figura 5.4a. Estes valores representam cada um dos vértices e foram introduzidos com uma precisão de 5 casas decimais. O ficheiro gerado tem um total 1262994 vértices e um tamanho de 55MB. Feitos alguns testes na identificação do Concelho e respetivo Distrito, embora fosse exato na identificação, este era um processo demorado. Para melhorar este processo, em cada um dos concelhos foi utilizada uma ferramenta de geometria chamada centroides. Como podemos verificar através da Figura5.4b, contrariamente ao método anterior os concelhos estão representados de uma forma mais relaxada. O que faz com que um determinado ponto possa pretencer a mais do que um Concelho. O ficheiro com esta informação tem apenas 10651 vértices e um tamanho de aproximadamente 500KB.

Concluindo, quando um avistamento chega ao servidor é obtida a localização deste e caso se trate de uma área é determinado o centro desta. Depois de identificado o ponto que contém a latitude e longitude, é feita uma pesquisa nesta última base da dados que contém os concelhos identificados através de polígonos convexos o que resulta numa lista de possíveis concelhos. Caso a lista de concelhos tenha apenas um elemento, está identificado o Concelho. Por outro lado, se na lista estiver mais do um elemento, desta vez pesquisa é feita na base de dados de maior dimensão

76 Capítulo 5. Desenho e Desenvolvimento

mas apenas nos possíveis concelhos anteriormente identificados. Sendo assim identificados os concelhos e distritos de cada avistamento.

(a) Concelhos de Portugal. (b) Concelhos de Portugal con- vexos.

Figura 5.4: Mapa da distribuição dos concelhos de Portugal.

5.3.5 Comunicação

Inicialmente a comunicação entre os dispositivos móveis e o servidor era feita através de HyperText Transfer Protocol (HTTP), mas o facto de estarem a ser transmitidos dados privados, fez com que houvesse a necessidade de utilizar o protocolo Hypertext Transfer Protocol Secure (HTTPS). A utilização deste protocolo faz com que os dados transmitidos entre os dispositivos e o servidor sejam encriptados. Este protocolo necessita de um certificado confiável pelo servidor que é disponibilizado no sistema. A comunicação entre o servidor e os dispositivos móveis é feita

utilizando o protocoloHTTPS através dos métodos GET/POST daRESTAPI. O método GET

permite obter um recurso do servidor, já o método POST permite criar um novo recurso no servidor.

Definiram-se os serviços que o servidor deve ser capaz de cumprir. Serviços como a interação e submissão de avistamentos, associação de ações e ainda criação e acesso a informação de cada utilizador registado eram imprescindíveis. Depois de definidos os modelos, projetou-se a forma de como cada um destes iria responder aos pedidos através do serviço web RESTFul implementado. Através de pedidos HTTP, foram criados vários REST endpoints de forma a cumprirem os

5.3. Servidor 77 Tabela 5.1: Endpoints

Método

HTTP URL Parâmetros Descrição

POST /avistamento_plus

nome, descricao, data, localizacao, tipo, fotos, email

Criação de um novo avistamento com a informação recebida do dispositivo móvel

POST /image file

Responsável pelo armazenamento das fotos associadas a cada avistamento

POST /update_avistamento

avistId, nome, data, descricao, tipo, validada

Quando um administrador modifica a informação de um avistamento e esta é alterada na tabela

POST /update_validado avistId, validada Alterar apenas a validade do

avistamento.

POST /create_accao avistId, tipoAccao,

data, administrador

Criação de ações associadas a cada evento. Existem três tipos de ações: “entrada”,

“verificada” e “removida”

POST /register firstName, lastName,

email, password

Criação de um novo utilizador não administrador

POST /register_admin firstName, lastName,

email, password

Criação de um novo utilizador com permissões de administrador

POST /login Email, password Iniciar de sessão

POST /changePassword

Email,

previous_password, new_password

Alterar a senha de um utilizador já registado. É criado um novo salt e hash para a codificação da nova senha

POST /setAdmin userEmail Atribuir permissão de

"administrador"

GET /getAvistamentos

Obter a lista de todos os avistamentos considerados válidos depois de uma avaliação por parte de um administrador

GET /getUsers Obter lista de utilizadores

registados na aplicação

GET /getAPK Descarregar a aplicação móvel

DELETE /delete_avistamento avistId Remover avistamento da tabela

78 Capítulo 5. Desenho e Desenvolvimento

a informação ao servidor através de um pedido POST, no próximo Bloco de Código 5.11temos o

endpoint que vai receber essa informação e a vai adicionar à base de dados do servidor com a

informação adicional necessária.



@POST

@Path (" / a v i s t a m e n t o _ p l u s ")

@Consumes ( { MediaType . MULTIPART_FORM_DATA} ) @ P r o d u c e s ( MediaType . TEXT_PLAIN ) p u b l i c R e s p o n s e u p l o a d A v i s t a m e n t o ( @FormDataParam (" nome ") S t r i n g n o m e _ e s p e c i e , @FormDataParam (" d e s c r i c a o ") S t r i n g d e s c r i c a o , @FormDataParam (" d a t a ") S t r i n g d a t a , @FormDataParam (" l o c a l i z a c a o ") S t r i n g l o c a l i z a c a o , @FormDataParam (" t i p o ") S t r i n g t i p o , @FormDataParam (" f o t o s ") S t r i n g f o t o s , @FormDataParam (" e m a i l ") S t r i n g e m a i l ) t h r o w s E x c e p t i o n { . . . // O b t e r o c o n c e l h o onde o a v i s t a m e n t o e s t a i n s e r i d o S t r i n g c o n c e l h o = ConcelhosDAO . f i n d C o n c e l h o C o n v e x o ( c o n c e l h o s P a t h , c o n c e l h o s C o n v e x o P a t h , l o c a l i z a c a o ) ; // O b t e r o d i s t r i t o S t r i n g d i s t r i t o = ConcelhosDAO . f i n d D i s t r i t o ( c o n c e l h o s C o n v e x o P a t h , c o n c e l h o ) ; // A d i c i o n a r a v i s t a m e n t o A v i s t a m e n t o a v i s t a m e n t o = new A v i s t a m e n t o ( n o m e _ e s p e c i e , d e s c r i c a o , d a t a , l o c a l i z a c a o , c o n c e l h o , d i s t r i t o , e m a i l , f o t o s , t i p o , f a l s e) ; AvistamentoDAO . a d d A v i s t a m e n t o ( a v i s t a m e n t o ) ; // A d i c i o n a r a c c a o S i m p l e D a t e F o r m a t f o r m a t t e r = new S i m p l e D a t e F o r m a t (" dd /MM/ y y y y ") ; Date d a t e = new Date ( System . c u r r e n t T i m e M i l l i s ( ) )

Accao a c c a o = new Accao ( a v i s t a m e n t o . g e t I d ( ) , " E n t r a d a " , f o r m a t t e r . f o r m a t ( d a t e ) , e m a i l ) ; AvistamentoDAO . addAccao ( a c c a o ) ; r e t u r n R e s p o n s e . ok (" A v i s t a m e n t o g u a r d a d o ( PLUS ) : " + a v i s t a m e n t o . t o S t r i n g ( ) ) . b u i l d ( ) ; }  

Documents relatifs