• Nenhum resultado encontrado

3.3 Desenho

3.3.1 Back-end package

Neste pacote estão as classes que comunicam com o servidor, enviando e recebendo dados para as várias funcionalidades do Raccode, desde a autenticação até à submissão da solução e respetivo feedback. As comunicações com o servidor são feitas através da classe HttpsURLConnection que suporta as especificações do Hypertext Transfer Protocol Secure (HTTPS). Como o Mooshak 2.0 utiliza umaAPI RESTe as suas respostas são em formatoJSON, o package javax.json fornece uma API orientada a um modelo de objetos que processa oJSON. Desta forma conseguimos

26 Capítulo 3. Raccode ui ServerConnection JavaLanguageDefinition LoginPage requests Contests Languages Problems Questions Rankings Request Submission ProblemsPage QuestionsView RankView NewProblemWizard SubmitHandler <<interface>> LanguageDefinition

Figura 3.11: Diagrama de pacotes do Raccode

obter os valores associados a uma chave e guardá-los para serem tratados numa operação futura. De seguida apresentamos uma pequena descrição de cada classe apresentada na Figura3.12

para uma melhor compreensão das funcionalidades de cada uma delas:

• Auth: Esta classe trata da autenticação do utilizador. Essa autenticação consiste em três campos de preenchimento ou escolha, sendo eles a seleção de um concurso e o preenchimento dos campos username e password. Os valores destes campos são enviados ao servidor que, por sua vez, responde com o token que ficará associado ao utilizador durante a sessão atual. Este token tem uma validade de uma hora, sendo este atualizado automaticamente por mais uma hora após essa hora ter terminado, caso o utilizador permaneça na mesma sessão. Este procedimento evita que o utilizador se tenha de voltar a autenticar durante a submissão de uma solução, por exemplo. O logout é feito automaticamente no término da sessão, ou seja, quando o plugin for desligado.

• Contests: Classe que gere todos os concursos que estão disponíveis no servidor atual. A obtenção destes concursos é feita através de um pedido GET, cuja resposta está em formato

JSON. Após o seu processamento conseguimos saber as chaves e os seus valores, sendo os mais importantes o nome do concurso e o seu ID. Estes valores são armazenados em arrays para que possam ser reutilizados sempre que forem precisos sem ser necessário voltar a

3.3. Desenho 27 Request - url:str - token:str + sendGet():JsonReader + sendGetFile():InputStream + sendPost():JsonReader + sendPostFile():JsonReader + sendPut():JsonReader + sendDelete():JsonReader + sendPatch():JsonReader Contests - contests:str[] - contestsID:str[] - listContests():void Languages - languages:str[] - languagesID:str[] - token:str - listLanguages():void Auth - username:str - password:str - contest:str + isConnected():bool Problems - problems:str[] - problemsID:str[] - token:str - listProblems():void Questions - token:str - url:str + getListOfQuestions():void Rankings - token:str - url:str + getRankings():void ServerConnection - host:str - path:str - port:int + isConnected():bool Submission - token:str - url:str + submit():JsonObject SubmitHandler (from UI package) + execute():Object - submit():void - showFeedback():void

Figura 3.12: Diagrama de classes do pacote requests

pedi-los ao servidor.

• LanguageDefinition: Interface que define a verificação de uma instalação de uma linguagem, bem como a criação do projeto nessa mesma linguagem. Por outras palavras, quando o utilizador escolhe a linguagem na qual quer usar para implementar a sua solução, o projeto a ser criado terá que ter a "natureza"dessa linguagem, como as bibliotecas necessárias, as pastas de input e output, asJVMs para a execução do código, entre outras definições. Então, para ser possível criar o projeto, a linguagem tem de estar instalada na máquina do utilizador e é por essa razão que está definido nesta interface a verificação da instalação de uma linguagem. No momento da escrita da tese, o Raccode só é capaz de criar projetos em Java (ver a secção Dificuldades e Limitações 3.4.2).

• Languages: Esta classe pede ao servidor todas as linguagens de programação que estão disponíveis no concurso atual e guarda-as num array. Isto é o mesmo que dizer que o motor de avaliação consegue executar as soluções submetidas nestas linguagens e avaliá-las. O processo de obtenção das linguagens é semelhante ao descrito no ponto Contests, em que é enviado um pedido GET, juntamente com o token, e a resposta obtida contém os dados sobre as linguagens. Por outro lado, conforme já foi dito no ponto anterior, o Raccode só aceita a criação de projetos em Java no momento da escrita deste documento (ver a Secção

28 Capítulo 3. Raccode

• Problems: Classe que gere os problemas associados ao concurso atual. Mais uma vez, o método para obter a informação dos problemas é semelhante aos já mencionados. No entanto, esta classe tem a particularidade de ordenar os problemas por ordem alfabética antes de os armazenar num array. Esta ordenação é feita puramente para efeitos visuais, como será devidamente justificada na Secção3.3.2.

• Questions: As questões submetidas durante o decorrer do concurso são obtidas nesta classe. Neste caso, no processamento da resposta obtida após realizado o pedido (que é feito da mesma forma que os anteriores) é armazenado todo o JsonArray, ao invés de serem só guardados os valores mais importantes, pois um determinado par chave/valor pode conter mais do que um valor para essa chave. Então, como existem muitos pares importantes neste caso, como a pergunta em si, o ID e o nome do problema ao qual a pergunta se refere, o ID da pergunta, o assunto da pergunta, a equipa ou utilizador que a submeteu, se já foi ou não respondida, a resposta no caso de já ter sido respondida, entre outros, o seu processamento será feito apenas no front-end (Secção3.3.2).

• Rankings: Algumas estatísticas referentes às submissões de cada equipa ou utilizador em cada problema do concurso corrente são obtidas através desta classe, como a pontuação, o número de submissões em cada problema e o número de problemas resolvidos com sucesso. Pelo mesmo motivo que os dados das questões foram armazenados no seu todo ao invés de retirar apenas a informação importante, aqui também temos um conjunto grande de dados importante, pelo que faz também sentido manter o JsonReader com todos os dados. O seu processamento é feito aquando da exposição dos mesmos (Secção 3.3.2).

• Request: Esta classe pode ser vista como o motor das restantes, pois é a classe que estabelece as comunicações ao servidor. Para enviar um pedido, seja GET, POST, PATCH, DELETE ou PUT, apenas é necessário o caminho (path) do URL e o token associado ao utilizador, visto que existem ações que requerem autenticação. Para passar o token no cabeçalho do pedido é adicionado uma propriedade com a chave Authorization, sendo o token precedido de Bearer o valor que completa este par. De salientar que se o pedido contiver conteúdo, como por exemplo, o envio de um programa para avaliação, foi necessário adicionar outra propriedade, em que a chave é Content-Type e o seu valor multipart/form-data; boundary= seguido de uma String com o boundary. No caso do envio de ficheiros para submissão, o ficheiro é processado nesta classe, ou seja, um dos parâmetros a ser passado é o próprio ficheiro.

• ServerConnection: Esta classe tem simplesmente duas funções, verificar se é possível estabelecer uma conexão ao servidor e fazer parser ao URL, obtendo assim o host, o caminho (path) e a porta.

• Submission: Por fim, a classe de submissão de ficheiros, que obtém o ficheiro pretendido para avaliação e envia-o ao motor de avaliação. Depois de este o avaliar, é retornado o feedback com a avaliação da solução para que o utilizador possa saber se foi ou não aceite e em quantos testes falhou no caso de insucesso, entre outros eventuais comentários.

3.3. Desenho 29 Estas são as classes que constroem o back-end do Raccode, bastando, assim, ao front-end invocar os vários métodos e atributos para obter os recursos necessários ao funcionamento do plugin. Obviamente, esses métodos e atributos são públicos, pelo que o acesso de outras classes é possível. Teremos oportunidade de também conhecer as classes constituintes do front-end na Secção 3.3.2, bem como uma descrição de cada uma delas, à semelhança do que foi feito nesta secção.

Documentos relacionados