Gestão de Projectos de Software Licenciatura em Engenharia Informática e Computação Faculdade de Engenharia da Universidade do Porto Projecto SAPIENS Sistema de Avaliação Assistida por Computador RELATÓRIO DE ESPECIFICAÇÃO DE TRABALHO PARA FORA 2000/11/06 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora GRUPO DE PROJECTO Chefe (Gestor de Projecto) Rui Pereira Secretária Sandra Oliveira Controlo da Qualidade/Auditor Miguel Teixeira Analistas/Arquitectos Artur Matos Nuno Costa Programadores João Pires Luís Almeida GPS 2000/2001 2 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora ÍNDICE 1. INTRODUÇÃO 5 2. O PROJECTO 6 2.1. Descrição geral 6 2.2. Tecnologia 7 2.3. Arquitectura física 8 3. ESPECIFICAÇÃO 4. CONCLUSÃO 10 5. BIBLIOGRAFIA 11 6. APÊNDICES 12 6.1. 9 Vocabulário do sistema 12 6.2. Casos de uso relevantes 6.2.1. Gerir Disciplinas 6.2.2. Gerir assuntos 14 14 24 6.3. Modelo de objectos 6.3.1. Pacote Admin (camada de interface) 6.3.2. Pacote Docente (camada de interface) 6.3.3. Pacote Disciplinas (camada de middle-tier) 29 29 32 34 6.4. Enterprise Java Beans (Exemplo) 6.4.1. Disciplina.java 6.4.2. DisciplinaBean.java 6.4.3. DisciplinaHome.java 6.4.4. DisciplinaPK.java 6.4.5. DisciplinaServlet.java 35 36 37 38 39 40 GPS 2000/2001 3 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Resumo Este relatório contém a expecificação do trabalho a desenvolver do exterior do projecto SAPIENS, bem como uma apresentação geral do projecto de modo a conseguir enquadrar o grupo responsável pela implementação. Este implementação consiste no desenvolvimento de parte da camada superior (interface HTML) para assuntos, utilizadores e disciplinas. Um pequeno conjunto de páginas HTML do que é pretendido e uma camada middle-tier mínima para testes é fornecida adicionalmente a este relatório. Do trabalho subcontratado é esperado conformidade com o comportamento dos casos de uso implicados e estima-se um esforço de implementação na ordem das 25 horas. Fornece-se em apêndice excertos dos casos de uso, classes e vocabulário relevantes para a implementação, retirados dos relatórios produzidos anteriormente para o projecto. Um pequeno exemplo de como usar Enterprise Java Beans (exemplo de disciplinas) também está incluido. GPS 2000/2001 4 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 1. Introdução Este relatório corresponde à especificação do trabalho a desenvolver exteriormente ao projecto SAPIENS. O objectivo geral deste relatório é apresentar de uma forma integral toda a informação necessária a um leitor externo ao projecto, de modo a permitir a este implementar sem ambiguidades o pretendido. Para isso este relatório contém partes integrais de outros anteriores, nomeadamente o de especificação de requisitos e o de projecto de alto nível. As partes relevantes para o trabalho pretendido estão incluídas integralmente neste relatório, no entanto consideram-se referências obrigatórias em caso de qualquer dúvida de implementação. Nas secções seguintes irá-se primeiramente detalhar o projecto em causa, de modo a permitir ao leitor ter uma ideia geral de onde a sua implementação se insere. Considera-se por ordem, a arquitectura lógica, tecnologia usada e a arquitectura física do projecto. Depois de detalhado o projecto, será considerada a implementação exterior em causa, e descrita explicitamente o que é pretendido implementar. Em apêndices encontram-se excertos relevantes dos outros relatórios anteriores, e um pequeno exemplo de como usar Enterprise Java Beans (a tecnologia de componentes usada neste trabalho). GPS 2000/2001 5 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 2. O projecto 2.1. DESCRIÇÃO GERAL O projecto SAPIENS consiste num programa para auto-avaliação assistida por computador através de WWW. Permite manter questionários com perguntas de vários tipos (escolha múltipla, resposta em campo, etc...), avaliar e manter históricos de avaliações anteriores. Este projecto é baseado num anterior designado WebQuiz, desenvolvido em PHP com PostgresSQL como base de dados. No entanto, apenas algum do design anterior é aproveitado, e nomeadamente nenhuma implementação do projecto anterior é usada. O sistema está organizado em torno de 3 níveis distintos de utilizadores: alunos, docentes e admnistrador. O docente está encarregado de inserir questionários e perguntas no sistema, que posteriormente serão respondidas pelos alunos. O administrador gere o restante do sistema. Existem vários tipos de questionários e perguntas possíveis no sistema, os quais não iremos detalhar aqui. As perguntas estão adicionalmente agrupadas em assuntos, que por sua vez estão agrupadas em disciplinas (ver diagrama de classes referente ao pacote disciplinas, nos apêndices). 2.2. ARQUITECTURA LÓGICA Este projecto segue uma arquitectura tipicamente denominada three-tier, ou seja organizada em 3 camadas : uma camada de dados, uma de negócio, e uma camada de apresentação. Todas estas camadas estão construidas baseadas umas sobre as outras, e cada uma só dialoga com a sua imediatamente anterior. A camada de dados é responsável por manter a persistência da aplicação e portanto só contém os dados em cru. Tipicamente, e no nosso caso, essa camada é implementada através de uma base de dados relacional. A camada de middle-tier funciona como uma ponte entre a camada inferior e a de apresentação. Construída sobre a a camada de dados, esta camada contém a lógica da aplicação e fornece um meio de acesso à informação persistente presente na camada anterior, bem como alguma eventual informação transiente. Por fim a camada de apresentação contém a interface do programa. GPS 2000/2001 6 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Base de dados Middle-tier Interface HTML 2.3. TECNOLOGIA O projecto está todo assente na linguagem Java para as duas camadas superiores, enquanto, que tal como no projecto anterior, a persistência da aplicação é obtida através de PostgresSQL. O comportamento dinâmico da camada de interface é implementado através de servlets. Cada servlet traduz os pedidos dos utilizadores e comunica com a camada de middle-tier de acordo com a arquitectura.A escolha do servidor HTTP para correr as servlets recaiu no servidor java Tomcat. A camada de middle-tier está baseada numa arquitectura de componentes Java, denominada Enterprise Java Beans (mais vulgarmente conhecida por EJB). Esta arquitectura foi desenvolvida para facilitar o desenvolvimento de componentes facilmente reutilizáveis e para implementar lógica de aplicações. A implementação de um bean envolve escrever duas interfaces e uma classe: a interface remota, com a declaração dos métodos que o bean fornece; a interface Home, com os métodos para criar, remover e encontrar uma determinada instância do bean; a classe de implementação, onde a lógica é implementada. Para usar EJBs é necessário um servidor de aplicações que implemente o standard de EJBs. No nosso caso o servidor usado é um software open-source denominado JBoss. Nenhum conhecimento para construir EJBs será necessário ao grupo encarregado deste trabalho externo. No entanto, algum conhecimento para lidar com EJBs será preciso; Em princípio, os exemplos contidos neste relatório serão suficientes para a realização do trabalho. GPS 2000/2001 7 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 2.4. ARQUITECTURA FÍSICA Cliente HTML Servidor HTTP Servidor Aplicações Servidor Base de dados Dispositivo WAP T omcat JBoss PostgreSQL Gateway WAP A arquitectura apresentada está de acordo com a escolha realizada em termos tecnológicos, e é completamente suportada pela combinação escolhida: Cliente HTML: representa um cliente que se liga ao sistema através de uma rede. O cliente HTML é representado como um processador, visto que lhe é exigida alguma capacidade de execução, por forma a suportar applets, ou mesmo algumas validações, conforme apresentado na apresentação da tecnologia. De notar que a ligação do cliente HTML ao sistema é simplesmente ao servidor de HTTP, não interagindo com qualquer outra camada. Servidor HTTP: trata-se da máquina onde será executado o servidor Tomcat, para fornecer o serviço HTTP aos clientes. Em relação ao sistema operativo a utilizar, deixámos grande liberdade ao administrador, visto que se trata de um servidor inteiramente escrito em Java. No entanto, por motivos de custos, aconselhámos o uso do Linux. É neste nodo que será colocado o componente sapiens.war, com todas as classes e recursos necessários ao funcionamento da interface gráfica. Servidor de Aplicações: máquina onde é executado o servidor jBoss, encarregue de disponibilizar o serviço de EJB, bem como os componentes com a lógica de negócio do sistema. As mesmas considerações quanto ao sistema operativo são igualmente válidas, pelo que aconselhámos o Linux pelos mesmo motivo. Neste nodo será colocado um componente sapiens.jar, com todos os componentes EJB implementando o middle-tier. Servidor de Base de Dados: máquina onde se executa a base de dados relacional, como o PostgreSQL. Neste caso, é aconselhável o uso do sistema operativo Linux. Conforme já indicado, o sistema final é muito flexível. Pode ir de uma configuração tão complexa como a apresentada, para uma instalação em que todos os processos servidores se encontram configurados na mesma máquina: esta solução é especialmente indicada por permitir uma redução no custo de hardware necessário, bem como uma redução nos custos de administração. GPS 2000/2001 8 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 3. Especificação Todo o trabalho a ser desenvolvido para o exterior corresponde a componentes da camada superior, isto é, à interface HTML. Concretamente pretende-se que o grupo responsável implemente as interfaces completas para manipulação de algumas entidades do sistema, nomeadamente assuntos, disciplinas e utilizadores . Adicionalmente a este relatório, irá ser fornecido os seguintes auxiliares para o grupo encarregue da implementação: Um conjunto de componentes EJBs necessários para implementar a interface activa. Estes incluem os componentes directamente dependentes da implementação exterior, como disciplinas, assuntos e utilizadores, além de outros componentes eventualmente necessários. Código adicional utilitário, por exemplo, código para lidar com logins e determinar o utilizador corrente. Este código pode estar eventualmente vazio, servindo apenas para definir a interface a usar. Independentemente do contéudo do código, a implementação deve ser rigorosamente testada. Um conjunto de páginas HTML representando o conteúdo estático da interface. Estas páginas definem rigorosamente a colocação dos botões, controles, etc.., e contém exemplos do comportamento dinâmico esperado. Este conteúdo estático deve ser duplicado no código da servlet correspondente. Este conjunto indicado em cima, aliado a este relatório e definição de casos de uso em apêndice, são suficientes para definir univocamente o pretendido a implementar. Estima-se o esforço total de implementação em 25 horas, tempo que incluí a instalação e configuração do testbed (JDK+JBoss+Tomcat+Postgres), programação e teste. Esta estimativa têm em conta eventuais dificuldades e atrasos de configuração e utilização do testbed, o e uso dos componentes EJB. As servlets implementadas devem estar de acordo com os casos de uso em apêndice e devem ser rigorosamente verificadas contra eles. As servlets devem ser também testadas extensivamente contra erros, quer erros de interface com os componentes EJB, quer erros de lógica inerentes às próprias. As servlets devem ser entregadas em código fonte, compilável sem erros e devidamente comentadas e identadas. GPS 2000/2001 9 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 4. Conclusão Com este relatório está completamente especificado o trabalho a desenvolver no exterior. Cremos que a parte mais complexa desta especificação consiste em instalar e configurar a tecnologia necessária para testar a implementação. Inclusive, essa parte pode exceder em tempo útil o tempo de implementação concreta. GPS 2000/2001 10 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 5. Bibliografia “Relatório de análise de requisitos”, Projecto Sapiens, 2000 “Relatório de projecto de alto nível”, Projecto Sapiens, 2000 GPS 2000/2001 11 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 6. Apêndices 6.1. VOCABULÁRIO DO SISTEMA login: Acto de autenticação perante o sistema, onde o utilizador deverá indicar o seu nome e password para ter acesso às suas funcionalidades inerentes. assunto: Entidade classificadora de perguntas. Todas as perguntas estão agrupadas por assuntos. disciplina: Unidade agregadora de assuntos .Uma disciplina pode conter vários assuntos. utilizador: qualquer entidade que possa utilizar o sistema (aluno, docente ou administrador). aluno: Utilizador encarregado principalmente de responder a inquéritos. docente: Utilizador encarregue principalmente de construir questionários para os alunos. administrador: Entidade com maior poder no sistema. Encarregado de gerir o sistema. GPS 2000/2001 12 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora questionário: Um conjunto de perguntas para serem respondidas por alunos. Os questionários são construídos pelos professores. identificador: Uma cadeia de caracteres alfanumérica que identifica unicamente uma entidade de um tipo presente no sistema. Normalmente uma pequena descrição que aparece em listas quando é necessário para o utilizador escolher uma entidade. pergunta: Unidade básica do sistema, agregados em questionários. pergunta de escolha múltipla: Pergunta onde existem 2 ou mais escolhas para resposta. Apenas uma delas está correcta. pergunta de selecção múltipla: Pergunta onde existem 2 ou mais escolhas para resposta, mais do que uma eventualmente correcta. É necessário para o aluno indicar todas as que estão correctas. pergunta com resposta em campo: Pergunta onde é necessário ao aluno responder textualmente numa caixa de texto. pergunta com avaliação definida pelo utilizador: Pergunta que contém associada código (um programa) de avaliação fornecida pelo docente. grau de dificuldade: Escala numérica usada para classificar as perguntas de acordo com a sua dificuldade relativa. É uma escala logarítmica, de 1 a 5, onde 5 corresponde à dificuldade mais alta (por exemplo uma pergunta de dificuldade 2 equivale a 2 de dificuldade 1 para o sistema). questionário corrido: Questionário onde as perguntas são todas respondidas de seguida, com os resultados mostrados apenas no fim. Oposto do questionário tipo concurso. questionário tipo concurso: Questionário onde não é possível passar à próxima pergunta sem ter respondido correctamente à corrente. questionário com perguntas fixas: Questionário onde as perguntas são previamente escolhidas pelo docente. questionário com perguntas aleatórias: Questionário onde as perguntas são escolhidas aleatoriamente pelo sistema questionário com perguntas agrupadas por classificação: Questionário onde as perguntas são agrupadas de acordo com o seu grau de dificuldade, e onde é atribuído uma classificação a cada grau. GPS 2000/2001 13 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 6.2. CASOS DE USO RELEVANTES Projecto Sapiens Gerir Disciplinas Gerir Historico Gerir Utilizadores Administrador Responder a Questionários Gerir Assuntos Aluno Gerir perguntas Docente 6 .2 .1 . Gerir questionários GERIR DISCIPLINAS Optámos por representar a gestão de disciplinas como um pacote em separado dos restantes, por representar uma unidade funcional distinta. Em geral, todos os módulos envolvendo operações típicas de gestão em torno de uma entidade (criar, modificar, apagar), receberam o mesmo tratamento, sendo representados por um pacote em separado. O administrador é o único actor que interage com esta parte do sistema. É da responsabilidade deste indicar quais as disciplinas a disponibilizar, eliminando-as sempre que não são mais necessárias. 6.2.1.1 Criar Disciplina Este caso de uso corresponde à criação no sistema de uma disciplina. A criação da disciplina corresponde a um processo sensivelmente standard: o administrador deve realizar login, que o sistema irá validar. A partir deste ponto, este deverá apresentar a intenção de criar uma nova disciplina. GPS 2000/2001 14 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Adicionalmente, introduzirá o nome e o departamento da disciplina. Como resposta, o sistema será actualizado, sendo apresentada uma confirmação do mesmo ao utilizador. Nesta situação, deverá ser verificado pelo sistema a existência de uma disciplina com o mesmo nome e o mesmo departamento, sendo a inserção de duplicados proibida. Este caso de uso não foi previsto no projecto anterior, por não preverem a existência de administrador e de funções de administração. Sistema : Administrador Pedido de Login e Password Inserir Login e Password Valida Login e Validar Login e Password Inserir Nova Disciplina Inserir Nome Inserir Departamento Actualizar Confirmação da Inserção 6.2.1.2 Apagar Disciplina No situação de uma disciplina não ser mais necessária, o administrador deverá apagá-la. Este deverá também inicialmente autenticar-se no sistema, com o recurso ao login e password. Se válidos, o sistema apresentará a confirmação da validade destas, e o utilizador irá indicar que pretende apagar uma disciplina. Após a apresentação de uma lista com as disciplinas disponíveis, o administrador seleccionará a disciplina a apagar. Por ser uma operação sem retorno, o sistema deverá requerer a confirmação; após a mesma ser enviada, a disciplina será eliminada, e o utilizador será informado deste facto. No caso da disciplina ter associadas perguntas, estas serão também eliminadas. Este caso de uso não foi previsto no projecto anterior, por não preverem a existência de administrador e de funções de administração. GPS 2000/2001 15 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Sistema : Administrador Pedido de Login e Password Inserir Login e Password Valida Login e Validar Login e Password Apagar Disciplina Lista de Disciplinas Seleccionar Disciplina Pedido Confirmação Confirmar Eliminação Actualizar Confirmação da Eliminação 6.2.1.3 Modificar Disciplina O caso de uso modificar disciplina permite ao utilizador a modificar a informação introduzida anteriormente. Conforme iremos apresentar nos requisitos não-funcionais, corresponde à implementação de alguns destes, sobretudo os relacionados com a usabilidade. Neste caso de uso, o utilizador, após autenticação e correspondente validação pelo sistema, requer a modificação de uma disciplina, seleccionando-a a partir de uma lista apresentada pelo sistema. O utilizador deve depois inserir o nome e o departamento ao qual esta pertence. O sistema deve apenas permitir a alteração se não existir outra disciplina com o mesmo nome, e pertencendo ao mesmo departamento. Se este conflito não se verificar, a disciplina será modificada, e o administrador receberá uma confirmação deste facto. A acção de modificar uma disciplina não deve interferir com a restante informação presente no sistema, isto é, não deve alterar as perguntas, questionários, professores ou alunos. Este caso de uso não foi previsto no projecto anterior, por não preverem a existência de administrador e de funções de administração. GPS 2000/2001 16 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Sistema : Administrador Pedido de Login e Password Inserir Login e Password Valida Login e Validar Login e Password Modificar Disciplina Lista de Disciplinas Seleccionar Disciplina Inserir Nome Inserir Departamento Actualizar Confirmação da Modificação 6.2.1.4 Gerir Utilizadores A gestão de utilizadores é uma parte importante de qualquer sistema não trivial. Por constituir um módulo separado em relação ao restante sistema, optámos por dividi-lo num módulo, à semelhança da gestão de disciplinas. O projecto Webquiz não tomou conta da necessidade de funções de administração durante a fase de especificação de requisitos, pelo que, à semelhança da gestão de disciplinas, não apresentarem nada comparável a este pacote de casos de uso. Ao contrário da gestão de disciplinas, o administrador não é o único que interage com esta secção do sistema, sendo alguns casos de uso também utilizados por alunos e professores. GPS 2000/2001 17 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Apagar Utilizador Registar Professores Administrador (from Use Case View) Associar Professor a Disciplina Alterar Password <<include>> Registar Aluno Modificar Informação Utilizador Aluno (from Use Case View) 6.2.1.5 Registar Aluno O caso de uso registar aluno é executado pelos alunos, que pretendem utilizar o sistema. Em geral, qualquer utilizador que pretenda utilizar o sistema, pode utilizar o registo de alunos, criar um login válido e utilizar o sistema de seguida. Este caso de uso, ao contrário da totalidade dos anteriores, não necessita de autenticação perante o sistema. No entanto, visto que apenas os utilizadores registados podem utilizar o sistema, todos terão que recorrer a esta funcionalidade. Inicialmente, o utilizador deve indicar ao sistema que pretende registar-se como aluno. O aluno deve depois introduzir o login, nome, email, password (com confirmação), e departamento. A password não será visível, sendo este repetida e inserida como confirmação. Após a introdução na totalidade destes campos, o sistema deve verificar se toda informação foi inserida, se o login ainda não existe, e se as passwords inseridas são idênticas. Na situação de tudo estar correctamente inserido, é apresentada uma confirmação ao utilizador. Este caso de uso foi previsto no projecto anterior. É apresentado no diagrama de casos de uso, com o nome registo de utilizadores. Quanto aos requisitos, foi enumerado como “O sistema deve suportar o registo de utilizadores”. No entanto, neste ponto apenas é referido a criação de um login e uma password de acesso. GPS 2000/2001 18 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Sistema : Aluno Pedir Registo Sistema Inserir Login Inserir Nome Inserir Email Inserir Password Inserir Password Novamente Inserir Departamento Actualizar Confirmação da Inserção 6.2.1.6 Registar Professor O registo de professores não é executado pelos próprios professores, conforme enunciado na versão inicial da especificação de requisitos do projecto Webquiz. Em vez disso, o professor deve enviar um email ao administrador, que procede depois ao registo do professor no sistema. Esta interacção entre actores, sob a forma de email, é externa ao sistema, pelo que não é por nós considerada enquanto caso de uso. Em vez disso, devemos especificar correctamente a utilização do registo de professores por parte do administrador. O registo de professores é semelhante ao registo de alunos. No entanto, porque apenas pode ser realizado pelo administrador, requer a autenticação prévia deste perante o sistema. Assim, após a inserção do login e password, e respectiva validação, o administrador deve requerer o registo de um novo professor. Deve depois inserir o login pretendido, o nome, o email e o departamento ao qual pertence. Após validação desta informação (deve estar completamente preenchida, e o login não pode já existir), o sistema é actualizado, uma confirmação da operação é GPS 2000/2001 19 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora apresentada ao administrador, e um email é enviado ao professor, com a informação do seu registo e com a password gerada automáticamente pelo sistema. Este caso de uso não foi previsto pelo projecto anterior, na fase de especificação de requisitos inicial, tendo sido depois apresentado como alteração. Sistema : Administrador : Professor Pedido de Password Pedido de Logi n e Password Inserir Logi n e Password Valida Login e Validar Logi n e Password Inserir Utilizador Inserir Login Inserir Nome Inserir Email Inserir Departamento Inserir Tipo Uti lização como Professor Actualizar Confirmação da Inserção Confirmação de Criação por email 6.2.1.7 Modificar Informação Utilizador Por forma a permitir correcções às informações pessoais inseridas por utilizador, o sistema deve suportar a modificação das mesmas. Isto é permitido através do caso de uso “Modificar Informação Utilizador”, permitido a cada um dos utilizadores no sistema (administrador, professor e aluno). Por se tratar da gestão de informação pessoal, o caso de uso necessita da autenticação inicial do utilizador perante o sistema, com a introdução do login e da password. Após validação por parte do sistema, o utilizador pede para modificar a informação associada a si próprio. Como resposta, o sistema apresentará a informação anteriormente inserida para o utilizador, à excepção da password. O utilizador irá alterar a informação pretendida, à excepção do login. No caso da informação ser válida (todos os campos preenchidos), o sistema irá ser actualizado. GPS 2000/2001 20 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Esta situação foi prevista pelo projecto Webquiz, ao enunciar que “um utilizador pode em qualquer altura alterar os seus dados pessoais na BD”. Alternativamente, o administrador poderá alterar a informação para um determinado utilizador. Neste caso, há lugar a uma fase intermédia de selecção do utilizador a modificar. O administrador deverá escolher o utilizador a modificar a partir de uma lista de todos os utilizadores registados. Esta situação não foi prevista pelo projecto Webquiz. Sistema : Aluno Pedido de Login e Inserir Login e Valida Login e Validar Login e Modificar Informação Informação Inserir Inserir Inserir Inserir Inserir Password Inserir Inserir Actualizar Confirmação da 6.2.1.8 Alterar Password A alteração de informação pessoal não permite a alteração da password, que optámos por representar como um caso de uso em separado. Esta foi a opção também tomada pelo projecto Webquiz, sendo a alteração da password um processo separado da alteração da informação pessoal. Neste caso, a alteração da password foi representada como sendo um caso de uso incluído na alteração de informação pessoal. GPS 2000/2001 21 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Na primeira situação, o utilizador opta por alterar a sua própria palavra chave. Neste caso, deve primeiro autenticar-se, através do login e password. Após validados, deve indicar a intenção de alterar informação pessoal. Após este ponto, indica a intenção de alterar a palavra chave, introduzindo depois a nova password juntamente com a confirmação. Nenhum dos dois campos será visível, e ambos deverão ser idênticos. Caso assim seja, o sistema confirma a alteração realizada. Esta situação encontra-se prevista na especificação de requisitos do projecto Webquiz. De forma alternativa, o administrador pode realizar ele mesmo a alteração da password para um utilizador em concreto. Esta situação é útil sempre que este perca a password, podendo assim requisitar uma nova para utilização do sistema. Após a autenticação como administrador, o utilizador deve proceder de forma semelhante à alteração de informações pessoais: seleccionar o utilizador a partir de uma lista apresentada pelo sistema, introduzir a password e confirmação. Após a alteração do sistema, o utilizador verá uma confirmação da operação realizada. Esta situação não foi prevista no projecto Webquiz. Sistema : Aluno Pedido de Login e Inserir Login e Valida Login e Validar Login e Alterar Informações Alterar Nova Password Confirmação Actualizar Confirmação da GPS 2000/2001 22 Projecto SAPIENS 6.2.1.9 Relatório de Especificação do Trabalho para Fora Associar Professor a Disciplina Este caso de uso permite associar professores a disciplinas: desta forma um professor pode estar encarregue de muitas disciplinas, ao mesmo tempo que uma disciplina pode ser responsabilidade de vários professores. Apenas os profes sores associados a uma disciplina poderão realizar alterações sobre a mesma. Após a inserção do login e password, e correspondente validação dos mesmos pelo sistema, o utilizar deve indicar a atenção de associar um professor a uma disciplina. Após a apresentação de duas listas com as disciplinas e os professores disponíveis, o administrador deverá seleccionar um elemento de cada uma destas. O sistema irá validar a informação introduzida, e verificar se é válida: um par (professor, disciplina) idêntico não pode já existir. Assim, ao professor será apresentado uma confirmação da informação introduzida. Este caso de uso não foi modelado pelo projecto anterior, pois não reconheciam a necessidade de existência de um administrador. GPS 2000/2001 23 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Sistema : Administrador Pedido de Login e Password Inserir Login e Password Valida Login e Validar Login e Password Modificar Utilizador Lista de Utilizadores Seleccionar Utilizador a Modificar Alterar Password Nova Password Confirmação Actualizar Confirmação da Alteração 6 .2 .2 . GERIR ASSUNTOS Os assuntos constituem as entidades organizadoras das perguntas a seguir às disciplinas. Ao contrário destas, os assuntos podem ser geridos livremente pelos docentes (ver entrada relativa a assunto no glossário). Similarmente ao que foi feito anteriormente, a sua gestão está contida num pacote separado. GPS 2000/2001 24 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Gerir assuntos Criar assunto Modificar assunto Docente (from Use Case View) Retirar assunto 6.2.2.1 Criar assunto Insere um novo assunto no sistema. O procedimento é análogo aos outros casos de uso de tipo criar: O utilizador faz login, indica o nome e a disciplina em que o novo assunto pertence. O sistema fornece o feedback apropriado de acordo se a inserção foi feita com sucesso ou não. Inserções de assuntos duplicados não são permitidas pelo sistema. GPS 2000/2001 25 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Sistema : Docente Pedido de Login e Password Inserir Login e Password Valida Login e Validar Login e Password Inserir novo assunto Inserir Nome Escolher disciplina a que pertence Actualizar Confirmação da Inserção 6.2.2.2 Modificar assunto A partir deste caso de uso é possível alterar os parâmetros associados a um dado assunto – o seu nome e disciplina associada. Inicialmente o utilizador deverá fazer login no sistema, escolher o assunto pretendido (através da disciplina e do nome). De seguida, o utilizador indica os novos parâmetros e o assunto é modificado após a confirmação do sistema. As alterações efectuadas nos assuntos não interferem com qualquer das entidades associadas a esta, nomeadamente perguntas e disciplinas. GPS 2000/2001 26 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Sistema : Administrador Pedido de Login e Password Inserir Login e Password Valida Login e Validar Login e Password Modificar Disciplina Lista de Disciplinas Seleccionar Disciplina Inserir Nome Inserir Departamento Actualizar Confirmação da Modificação 6.2.2.3 apagar assunto Retira um determinado assunto no sistema. O utilizador deve indicar a partir da lista de assuntos, e após o login, qual o assunto que pretende apagar. No entanto, só o permite retirar se o assunto se encontrar isolado, isto é, se não existirem perguntas desse assunto nos questionários do sistema. Caso não existam, todas as perguntas associadas a esse assunto serão também retiradas. O actor será avisado adequadamente em cada caso antes de ser permitido prosseguir. GPS 2000/2001 27 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora Sistema : Docente Pedido de Login e Password Inserir Login e Password Valida Login e Password Validar Login e Password Apagar assunto Lista de assuntos Seleccionar assunto Pedido Confirmação Confirmar Eliminação Actualizar Sistema Confirmação da Eliminação GPS 2000/2001 28 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 6.3. MODELO DE OBJECTOS 6 .3 .1 . PACOTE ADMIN (CAMADA DE INTERFACE) O pacote admin é definido dentro de interface, e representa as classes necessárias para a implementação do serviço de administração. Este pacote irá conter servlets, também organizadas uma por cada serviço de administração disponiblizado: gestão de disciplinas, de utilizadores e de histórico. Apesar destas classes se encontrarem neste pacote, serão acedidas por todos os utilizadores, e não apenas pelo administrador. Por exemplo, a servlet GerirUtilizadores também será acedida pelos alunos e docentes para a modificação dos seus dados pessoais. 6.3.1.1 GerirUtilizador A servlet GerirUtilizador fornece o serviço de gestão de utilizadores. Em geral, será invocada principamente como resposta a funções de administração, mas não só, como apresentado na introdução do presente pacote. 6.3.1.1.1 Atributos home: referência para a interface Home do componente Utilizador. Serve para evitar uma operação de naming sempre que seja necessário aceder aos utilizadores. GPS 2000/2001 29 Projecto SAPIENS 6.3.1.1.2 Relatório de Especificação do Trabalho para Fora Operações init(): Inicializa o estado da servlet, obtendo a referência para a interface Home de Utilizador, armazenando a mesma no atributo home. doPost(request : HttpServletRequest, response : HttpServletResponse): executa o serviço de gestão de utilizadores. Trata-se apenas de um ponto de entrada para as diferentes hipóteses. Um parâmetro de HTTP, com a chave “action”, deverá indicar o tipo de serviço a realizar. Se action for “listar”, será executado o método listar(). Se for “apagar”, será executado apagar(), com os parâmetros preenchidos pelo correspondentes parâmetros HTTP. Formas de proceder semelhantes são executadas para os restantes métodos da classe. O parâmetro writer, presente em todos os métodos deverá ser preenchido com o resultado de response.getWriter(): representa a stream para onde será escrito o HTML gerado automáticamente. O método doPost também tem a responsabilidade de verificar os níveis de acesso dos utilizadores. Por exemplo, apenas um administrador terá acesso a listar, apagar e adicionar um professor. O caso de action ser “alterar” ou “alterarPassword” é permitido apenas para o próprio utilizador (ou no caso de um administrador). “adicionar”, apenas pode adicionar professores no caso do utilizador actual ser um administrador. listar(writer : PrintWriter): gera uma lista dos utilizadores registados, sendo o resultado do HTML enviado para o stream dado como parâmetro em writer. A lista gerada deverá conter uma tabela com os utilizadores existentes: hipótese de selecção como uma checkbox; nome do utilizador, sendo este um link para a edição dos seus dados (link deverá ser para GerirUtilizadores, com o parâmetro action=”ver”); email (com um link para o envio de email para o utilizador). apagar(writer : PrintWriter,login : String): elimina um utilizador do sistema, escrevendo uma confirmação sob a forma de HTML para a stream writer. O utilizador a eliminar tem o login igual ao parâmetro login. adicionar(writer : PrintWriter, login : String, nome : String, email : String, password : String, departamento : String, aluno : boolean): cria um utilizador no sistema, sendo este um aluno se o parâmetro aluno for verdadeiro, ou um professor, na situação contrária. Este método deverá criar uma nova instância de Utilizador, preenchendo este com os parâmetros. No caso de password ser null, significa que a password não foi indicada, pelo que deverá ser gerada uma password, e enviada ao utilizador utilizando o endereço de email indicado. alterar(writer : PrintWriter, login : String, nome : String, email : String, departamento : String): altera a informação associada a um utilizador. Só pode ser invocada pelo próprio utilizador, ou no caso deste ser um administrador. Deve escrever na stream writer uma confirmação da alteração alterarPassword(writer : PrintStream, String login, String password): altera a password para um determinado utilizador. Só pode ser invocada pelo próprio utilizador, ou no caso deste ser um administrador. Deve escrever na stream writer uma confirmação da alteração. ver(writer : PrintWriter, login : String): gera um documento HTML para alterar a informação de um utilizador. Este deve ser enviado para a stream writer. O documento a gerar contem um form com a informação do utilizador, previamente preenchida com os valores actuais. No caso de login ser null, a referida form deve ser preenchida a branco, representado a inserção de um utilizador. GPS 2000/2001 30 Projecto SAPIENS 6.3.1.2 Relatório de Especificação do Trabalho para Fora GerirDisciplina A servlet GerirDisciplina corresponde à implementação do módulo de gestão de disciplinas. Apenas os administradores deverão utilizar a gestão de disciplinas, pelo que todos os restantes utilizadores estarão à partida proibidos da sua utilização. 6.3.1.2.1 Atributos home: referência para a interface Home do componente Disciplina. Serve para evitar uma operação de naming sempre que seja necessário aceder às disciplinas. 6.3.1.2.2 Operações doPost(request : HttpServletRequest, response : HttpServletResponse): executa o serviço da servlet, separando convenientemente os parâmetros HTTP, e direccionando a execução para os restantes métodos. O parâmetro que indica o serviço a executar será “action”, à semelhança do que já sucedia com a servlet GerirUtilizadores. Ao contrário desta, apenas o administrador terá acesso a partir deste método. init(): inicializa a servlet. Obtem uma referência para a interface Home de Disciplina, e armazena essa referência em home. Desta forma, evitam-se operações de naming demasiado frequentes. listar(writer : PrintWriter): lista as disciplinas existentes no sistema, para a stream de output definida pelo parâmetro writer. As disciplinas deverão ser apresentadas como uma tabela, com uma coluna com uma checkbox para selecção, uma coluna com o código como um link (este deverá estar ligado à edição da respectiva disciplina), e uma coluna com o nome da disciplina. apagar(writer : PrintWriter, codigo : String): elimina a disciplina com o código indicado do sistema. Para a stream writer deve ser escrita uma confirmação sob a forma de um documento HTML. adicionar(writer : PrintWriter, codigo : String, nome : String): adiciona uma disciplina ao sistema, com o código e nome indicados pelo parâmetros respectivos. Deve escrever uma confirmação na stream writer. alterar(writer : PrintWriter, codigo : String, nome : String): altera o nome definido para disciplina. Uma conversão deverá ser escrita na stream writer, sob o formato HTML. ver(writer : PrintWriter, codigo : String): escreve uma representação HTML para a stream writer com a informação da disciplina. Este deve ser um form, com os campos preenchidos com os valores actuais. No caso de codigo ser null, apresenta um documento para a inserção de uma nova disciplina, com os campos vazios. 6.3.1.3 GerirProfessorDisciplina Esta classe é uma servlet que fornece o serviço de associação de professores a disciplinas. Apenas os professores associados a uma determinada disciplina podem editar a informação relativa a essa disciplina: criar questionários, lançar perguntas, etc. GPS 2000/2001 31 Projecto SAPIENS 6.3.1.3.1 Relatório de Especificação do Trabalho para Fora Atributos home: referência para a interface Home do componente disciplina. Destina-se a evitar a realização de operações naming sempre que é necessário utilizar as disciplinas. 6.3.1.3.2 Operações doPost(request : HttpServletRequest, response : HttpServletResponse): executa o serviço da servlet, realizando a separação do serviço a executar pelos restantes métodos da servlet. A separação é realizada através do parâmetro “action”, que deverá ter uma string idêntica ao método a invocar. Por outro lado, todos os parâmetros para a respectiva operação vão ser também obtidos a partir dos parâmetros de HTTP. Apenas ao administrador deverá ser permitido o acesso a esta servlet. init(): inicializa a referência remota para o a interface Home do componente Disciplina. associar(writer : PrintWriter , loginProfessor : String , codigoDisciplina : String): associa o professor à disciplina. Inicialmente, obtém a disciplina para codigoDisciplina. Seguidamente, deve associar a esta o professor correspondente a loginProfessor. 6 .3 .2 . PACOTE DOCENTE (CAMADA DE INTERFACE) O pacote docente, integrado na interface, agrupa as funções que um professor executa perante um sistema. Assim, é da sua responsabilidade a criação de assuntos, perguntas e de questionários, tudo sempre relativamente a uma pergunta em concreto. GPS 2000/2001 32 Projecto SAPIENS 6.3.2.1 Relatório de Especificação do Trabalho para Fora GerirAssuntos A servlet GerirAssuntos permite a gestão dos assuntos definidos no sistema. Os assuntos serão uma divisão atribuída às perguntas, de acordo com a disciplina a que pertencem. 6.3.2.1.1 Atributos home: referência para a interface Home do componente Assunto. Serve para evitar uma operação de naming sempre que seja necessário aceder aos Assuntos. 6.3.2.1.2 Operações doPost(request : HttpServletRequest, response : HttpServletResponse): executa o serviço da servlet, separando convenientemente os parâmetros HTTP, e redireccionando a execução para os restantes métodos. O parâmetro indicador do serviço a executar será “action”, à semelhança das anteriores servlets. Apenas os professores terão acesso à servlet. init(): inicializa a servlet. Obtem uma referência para a interface Home de Assunto, e armazena essa referência em home. Desta forma, evitam-se operações de naming demasiado frequentes. listar(writer : PrintWriter, codigoDisciplina : String): lista os assuntos existentes no sistema, para a stream de output definida pelo parâmetro writer. Os assuntos deverão ser apresentados como uma tabela, com uma coluna com uma checkbox para selecção, uma coluna com o código como um link (este deverá estar ligado à edição da respectiva disciplina), e uma coluna com o nome. apagar(writer : PrintWriter, codigo : String): elimina o assunto com o respectivo código do sistema. Para a stream writer deve ser escrita uma confirmação sob a forma de um documento HTML. adicionar(writer : PrintWriter, codigo : String, nome : String, codigoDisciplina : String): adiciona um assunto ao sistema, com o código e nome indicados pelo parâmetros respectivos, e associado à disciplina indicada. Deve escrever uma confirmação na stream writer. alterar(writer : PrintWriter, codigo : String, nome : String): altera o nome definido para o assunto. Uma confirmação deverá ser escrita na stream writer, sob o formato HTML. ver(writer : PrintWriter, codigo : String): escreve uma representação HTML para a stream writer com a informação da disciplina. Este deve ser um form, com os campos preenchidos com os valores actuais. No caso de codigo ser null, apresenta um documento para a inserção de uma nova disciplina, com os campos vazios. GPS 2000/2001 33 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 6.3.3. PACOTE DISCIPLINAS (CAMADA DE MIDDLE-TIER) O pacote disciplinas contém as classes ligadas disciplinas, assuntos e utilizadores. Cada uma destas entidades é demasiado simples para estar organizada em pacotes separados, por isso estão todas contidas neste pacote. Qualquer uma destas estruturas é de fácil compreensão mediante o diagrama apresentado. GPS 2000/2001 34 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora 6.4. ENTERPRISE JAVA BEANS (EXEMPLO) Esta secção contém um pequeno exemplo de definição e uso de EJBs, para o caso das disciplinas. O código é praticamente autoexplicativo por si, por isso só iremos descrever o exemplo em geral. DisciplinaHome.java contém a interface home para o componente Disciplina, enquanto que a remote está definida em Disciplina.java. O exemplo essencial do uso destas duas interfaces está contido em DisciplinaServlet.java. Em princípio, as classes a implementar seguem uma estrutura semelhante a esse exemplo para aceder ao componente. GPS 2000/2001 35 Projecto SAPIENS 6 .4 .1 . Relatório de Especificação do Trabalho para Fora DISCIPLINA.JAVA import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Disciplina extends EJBObject { public String getCodigo() throws RemoteException; public String getNome() throws RemoteException; public void setNome(String newValue) throws RemoteException; } GPS 2000/2001 36 Projecto SAPIENS 6 .4 .2 . import import import import Relatório de Especificação do Trabalho para Fora DISCIPLINABEAN.JAVA javax.ejb.*; java.rmi.RemoteException; javax.naming.Context; javax.rmi.PortableRemoteObject; public class DisciplinaBean implements EntityBean { public String codigo; public String nome; public DisciplinaPK ejbCreate(String newCodigo) { codigo=newCodigo; return null; } public void ejbPostCreate(String CodigoMoeda) throws CreateException { } // Keep the reference on the EntityContext protected EntityContext entityContext; protected Context namingContext=null; public void ejbActivate() { // Nothing to be done for this simple example. } public void ejbLoad() { // Nothing to be done for this simple example, in implicit persistance. } public void ejbPassivate() { // Nothing to be done for this simple example. } public void ejbRemove() throws RemoveException { // Nothing to be done for this simple example, in implicit persistance. } public void ejbStore() { // Nothing to be done for this simple example, in implicit persistance. } public void setEntityContext(EntityContext ctx) { // Keep the entity context in object entityContext = ctx; } public void unsetEntityContext() { entityContext = null; } public String getCodigo() { return codigo; } public void setCodigo(String newValue) { codigo=newValue; } public String getNome() { return nome; } public void setNome(String newValue) { nome=newValue; } } GPS 2000/2001 37 Projecto SAPIENS 6 .4 .3 . import import import import Relatório de Especificação do Trabalho para Fora DISCIPLINAHOME.JAVA javax.ejb.*; java.rmi.RemoteException; javax.ejb.FinderException; javax.ejb.CreateException; public interface DisciplinaHome extends EJBHome { public Disciplina RemoteException; create(String codigo) throws CreateException, public Disciplina findByPrimaryKey(DisciplinaPK FinderException, RemoteException; public java.util.Enumeration javax.ejb.FinderException, RemoteException; } GPS 2000/2001 findAll() key) throws throws 38 Projecto SAPIENS 6 .4 .4 . Relatório de Especificação do Trabalho para Fora DISCIPLINAPK.JAVA public class DisciplinaPK implements java.io.Serializable { public DisciplinaPK() { } public DisciplinaPK(String codigo) { this.codigo=codigo; } public String codigo; public int hashCode() { return codigo.hashCode(); } //Metodo equals public boolean equals(Object obj) { DisciplinaPK other=(DisciplinaPK)obj; return other.codigo.equals(codigo); } } GPS 2000/2001 39 Projecto SAPIENS 6 .4 .5 . import import import import import import import import import Relatório de Especificação do Trabalho para Fora DISCIPLINASERVLET.JAVA java.io.IOException; java.io.PrintWriter; java.util.Enumeration; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.naming.*; javax.rmi.*; /** * Simple servlet to validate that the Hello, World example can * execute servlets. In the web application deployment descriptor, * this servlet must be mapped to correspond to the link in the * "index.html" file. * * @author Craig R. McClanahan <[email protected]> */ public final class DisciplinaServlet extends HttpServlet { DisciplinaHome home; public void init() { try { System.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); System.setProperty("java.naming.provider.url", "localhost:1099"); InitialContext initial=new InitialContext(); home=(DisciplinaHome)PortableRemoteObject.narrow(initial.lookup("DisciplinaHome"),Discip linaHome.class); } catch (Exception e) { e.printStackTrace(); } } protected void ver(PrintWriter writer) { writer.println("<html>"); writer.println("<head>"); writer.println("<title>Sample Application Servlet Page</title>"); writer.println("</head>"); writer.println("<body bgcolor=white>"); writer.println("<table border=\"0\">"); writer.println("<tr>"); writer.println("<td>"); writer.println("<img src=\"images/tomcat.gif\">"); writer.println("</td>"); writer.println("<td>"); writer.println("<h1>Lista de disciplinas</h1>"); writer.println("</td>"); writer.println("</tr>"); writer.println("</table>"); writer.println("<table border=\"0\" width=\"100%\">"); try { Enumeration discs = home.findAll(); while (discs.hasMoreElements()) { Disciplina d = (Disciplina) discs.nextElement(); writer.println("<tr>"); writer.println(" <th align=\"right\">" + d.getCodigo() + ":</th>"); writer.println(" <td>" + d.getNome() + "</td>"); writer.println("</tr>"); } GPS 2000/2001 40 Projecto SAPIENS Relatório de Especificação do Trabalho para Fora writer.println("</table>"); } catch (Exception e) { e.printStackTrace(writer); } writer.println("</body>"); writer.println("</html>"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); String action=request.getParameter("action"); if (action==null || action.equals("ver")) { ver(writer); } } } GPS 2000/2001 41