UNIVERSIDADE TÉCNICA DE LISBOA INSTITUTO SUPERIOR TÉCNICO Ano Lectivo de 2005/2006, 2o Ano, 1o Semestre Projecto de Programação com Objectos Gestão de Mediateca 09 de Novembro de 2005 INFORMAÇÕES IMPORTANTES O projecto não tem nota mı́nima e contribui com um máximo de 10 valores (50%) para a nota final. Fraudes na execução do projecto terão como resultado a classificação de 0 (zero) valores. Datas: 14 de Novembro de 2005 (entrega intermédia); 30 de Novembro de 2005 (entrega final); 13, 14 e 15 de Dezembro de 2005 (discussão e teste prático). Dúvidas que não possam ser esclarecidas presencialmente ou através do material no Fénix, devem ser colocadas através de correio electrónico (ver endereço no Fénix). Advertem-se os alunos contra a utilização de fontes de informação não oficialmente associadas ao corpo docente. 1 Introdu~ao O objectivo do projecto é desenvolver um sistema que auxilie o trabalho de um bibliotecário que tem a cargo a gestão do acervo de uma mediateca. O acervo contém à disposição dos utentes, entre outros tipos de obras, livros e DVDs. O sistema deverá permitir (i) fazer pesquisas de obras; (ii) registar dados de utentes; (iii) registar dados de obras; e (iv) registar requisições de obras para consulta domiciliária. 2 Desri~ao Esta secção descreve os conceitos e funcionalidade básica da mediateca sem considerar pormenores de interacção. 2.1 Obras As obras a considerar inicialmente são livros e DVDs. A mediateca pode manter vários exemplares de cada obra. A cada obra está associado um identificador único dentro do sistema, bem como o número de exemplares existentes no acervo. • Livros – O sistema deverá manter, para cada livro, a seguinte informação: tı́tulo, autor (apenas um, por simplicidade), preço, categoria e ISBN (International Standard Book Number) (cadeia com dez caracteres). • DVDs – Para cada DVD, o sistema deverá manter: tı́tulo, realizador (apenas um, por simplicidade), preço, categoria e o número de registo na IGAC (Inspecção-Geral das Actividades Culturais) (cadeia com dez caracteres). • Outros tipos de obras – Deve ser possı́vel criar novos tipos de obras. O impacto da introdução dos novos tipos na implementação desenvolvida deve ser mı́nimo. 2.2 Categorias Cada obra tem uma categoria, de acordo com o assunto nela tratado. Inicialmente, consideram-se as seguintes categorias: (i) obras de referência: onde se incluem dicionários, gramáticas, enciclopédias e documentários; (ii) obras de ficção; e (iii) obras técnicas e cientı́ficas. Deve ser possı́vel criar novas categorias, com um impacto mı́nimo sobre o sistema desenvolvido. 2.3 Utentes O sistema mantém um registo de utentes da mediateca. Cada utente é identificado por um número de utente. O sistema mantém ainda, para cada utente, o seu nome, endereço de correio electrónico e informação sobre a situação do utente perante a mediateca: (i) activo, i.e., o utente pode fazer requisições; (ii) suspenso, i.e., o utente não pode fazer novas requisições. Um utente é suspenso se não devolver uma obra requisitada dentro do prazo estipulado; permanece suspenso até devolver a obra e pagar a multa referente ao atraso na entrega. A mediateca distingue entre utentes que cumprem as regras de funcionamento e utentes que violam sistematicamente os compromissos. Existe ainda uma classificação intermédia para novos utentes ou para utentes com comportamento misto. Um utente que nas últimas 3 requisições não tenha cumprido os prazos de devolução, é classificado como faltoso. Um utente faltoso que proceda a 3 devoluções consecutivas dentro do prazo é considerado normal. Um cliente que tenha cumprido rigorosamente os prazos de entrega nas últimas 5 requisições é classificado como cumpridor. Em todos os outros casos, o utente não tem classificação especial e é considerado normal. Como se verá adiante, a classificação influencia a capacidade de requisição do utente. O comportamento (no que diz respeito a entrega, dentro ou fora do prazo, de obras requisitadas antes da suspensão) de um utente suspenso influencia a sua classificação após o pagamento da multa. Por exemplo, se antes de pagar a multa, o utente entregar 3 obras dentro do prazo e regularizar a sua situação então passará a ser um utente que pode efectuar requisições com a classificação de normal. Deve ser possı́vel discriminar os utentes quanto à sua conduta, considerando outros critérios ou novas classificações, com um impacto mı́nimo na implementação desenvolvida. 2.4 Requisições O sistema garante o cumprimento de regras para a requisição de obras. As regras dependem das caracterı́sticas da obra que se pretende requisitar e da conduta passada do utente. Utentes cumpridores estão sujeitos a regras permissivas enquanto que a utentes faltosos são aplicadas regras restritivas. Os restantes utentes seguem um conjunto de regras de base. As regras gerais a respeitar pelos utentes são: 0. Não pode requisitar obras um utente que esteja suspenso; 1. Não pode requisitar obras cujos exemplares tenham sido já todos requisitados; 2. Não pode ter mais que n obras requisitadas em cada momento (valor base: 3; utentes cumpridores: 5; utentes faltosos: 1); 3. Não pode requisitar obras de referência; 4. Não pode requisitar obras com um preço superior a e25,00 (não aplicável a utentes cumpridores); No caso de violação da regra 1, o utente pode pedir para ser notificado assim que algum exemplar seja devolvido. A notificação consiste, por omissão, no envio de uma mensagem por correio electrónico ao utente, indicando que a obra já se encontra disponı́vel (ver §4). Ao requisitar uma obra, o utente deve ser informado da data limite para a devolução. O tempo de requisição permitido para cada obra depende do número total de exemplares que constem do acervo da mediateca e da conduta do utente. Os prazos, em dias, são os seguintes: • Obras com apenas um exemplar – valor de base: 3; utentes cumpridores: 8; utentes faltosos: 2; • Obras com 5 exemplares ou menos – valor de base 8; utentes cumpridores: 15; utentes faltosos: 2; • Obras com mais de 5 exemplares – valor de base 15; utentes cumpridores: 30; utentes faltosos: 2. Se o utente não entregar as obras requisitadas no prazo devido fica imediatamente suspenso, não podendo requisitar mais obras até regularizar a situação. Por cada dia de atraso, o utente fica sujeito ao pagamento de uma multa de e5,00 (cinco euros). A situação só se considera regularizada após a devolução das obras em atraso e o pagamento da multa. Para efeitos de pagamento de multas, fracções de dia contam como um dia (a unidade de tempo do sistema é o dia). Deve ser possı́vel alterar ou acrescentar regras para a requisição de obras, bem como fazer alterações aos tempos de requisição permitidos. As alterações devem ter impacto mı́nimo na implementação desenvolvida. 2 2.5 Pesquisas no Acervo Para permitir que o bibliotecário ajude os utentes a determinar a existência de uma obra, o sistema deverá permitir efectuar pesquisas. As pesquisas consideram os campos relevantes das várias obras (ver §3.1.2). Deve ser possı́vel introduzir novos métodos de pesquisa de uma obra com um impacto mı́nimo na implementação desenvolvida. 2.6 Tempo A unidade de tempo do sistema é o dia. A data do sistema começa no dia 0 (zero), quando o sistema arranca sem recuperar estado anterior (ver §5). Sempre que a data é alterada, deve ser verificada a situação dos utentes. 3 Intera~ao om o Utilizador Nesta secção é descrita a funcionalidade máxima da mediateca, descrevendo-se a interacção com o utilizador. Nos exemplos de código apresentados, o tipo de letra fixo indica um literal; o sı́mbolo indica um espaço; e o tipo de letra itálico indica uma parte variável. Assume-se que as excepções documentadas nesta secção serão devidamente tratadas pela classe Menu. Todas as interacções com o utilizador (leitura e escrita), têm de ser realizadas através da classe InteraccaoUtilizador (semelhante à utilizada nas aulas práticas) utilizando as mensagens descritas abaixo. Uma lista completa das classes disponibilizadas pode ser obtida na documentação javadoc associada a este enunciado (disponı́vel através do Fénix). Utilizam-se mediateca.mensagens.Utente.pedidoDeNumero() e mediateca.mensagens.Obra.pedidoDeNumero(), nas opções abaixo, para pedir os identificadores de utentes ou obras (respectivamente). As excepções UtenteInexistente ou ObraInexistente devem ser lançadas pela mediateca quando se detectem identificadores inválidos para utentes ou obras (respectivamente). 3.1 Menu Principal O menu principal permite ver obras, efectuar pesquisas, aceder aos submenus de requisições e utentes, ver e avançar a data e sair da aplicação (as etiquetas das opções deste menu estão definidas em mediateca.mensagens.Menu). 3.1.1 Ver Obra Esta opção pede ao bibliotecário o identificador da obra a consultar. A informação resultante da consulta deve ser apresentada como se segue (os atributos estão em itálico), respectivamente, para livros e DVDs: id - Livro - titulo - autor - preco - categoria - isbn id - DVD - titulo - realizador - preco - categoria - numeroigac 3.1.2 Efectuar Pesquisa Esta opção realiza uma procura por termo: utilizando a mensagem mediateca.mensagens.Obra.pedidoDeTermo(), o sistema pede ao bibliotecário que introduza o termo (uma cadeia de caracteres). Como resultado, deve ser apresentada uma lista das obras encontradas pela pesquisa, ordenadas por ordem crescente do seu identificador. A apresentação de cada obra deve ser feita como descrito em §3.1.1. O termo de pesquisa deve ser comparado (sem distinção entre letras maiúsculas e minúsculas) com os campos relevantes de cada obra: para DVDs, o realizador e o tı́tulo; para livros, o autor e o tı́tulo. Só devem ser apresentadas obras que contenham o termo de pesquisa num dos campos relevantes. Assim, considerando as quatro obras abaixo, uma pesquisa pelo termo casa retornaria as obras com os identificadores 3, 4 e 5. 3 4 5 6 - Livro DVD Livro Livro - Casa Azul - Joao Fonseca - 15 - Ficcao - 1234567891 Casamento Real - Antonio Fonseca - 8 - Ficcao - 200400500 - Dicionario - Pedro Casanova - 45 - Referencia - 1234567893 - Enciclopedia - Ze Fonseca - 100 - Tecnica e Cientifica - 1234567894 Caso não sejam encontradas obras, não deve ser produzido qualquer resultado. 3 3.2 Menu Requisições O menu de requisições permite requisitar e devolver obras e regressar ao menu principal (as etiquetas das opções deste menu estão definidas em mediateca.mensagens.Menu). 3.2.1 Requisitar uma Obra No processo de requisição de uma obra, o sistema pede, primeiro, a identificação do utente e, de seguida, o identificador da obra a requisitar. Se o utente não puder requisitar a obra, o bibliotecário deverá ser avisado acerca do motivo (considerando-se as regras definidas em §2.4), utilizando a seguinte mensagem: mediateca.mensagens.Utente.violacaoRegra(idUtente, idObra, numeroRegra) Se a requisição não for possı́vel por falta de exemplares (violação da regra 1), deve-se perguntar ao utilizador, utilizando a mensagem mediateca.mensagens.Utente.desejaAvisoDevolucao(), se deseja ser notificado da devolução. Utiliza-se a mensagem mediateca.mensagens.Obra.devolucaoDia(idObra, numeroDias) para comunicar o prazo de devolução, em caso de requisição bem sucedida. 3.2.2 Devolver uma Obra No processo de devolução de uma obra, o sistema pede, primeiro, o identificador do utente e, de seguida, o da obra a devolver. Se a obra não tiver sido requisitada pelo utente indicado, deve-se lançar uma excepção ObraNaoRequisitada. Caso contrário, o sistema processa a entrega e o bibliotecário é notificado, caso haja lugar ao pagamento de multa, através da mensagem mediateca.mensagens.Obra.apresentarMulta(idUtente, euros). O utente pode entregar uma obra sem pagar a multa, continuando suspenso até regularizar a situação, sem prejuı́zo da obra ser assinalada como entregue. Antes liquidar a multa, o sistema interroga o utilizador sobre o desejo de pagamento, através da mensagem mediateca.mensagens.Obra.desejaPagarMulta(). Se a resposta for positiva, a multa é liquidada e o utente fica activo. 3.3 Menu Utentes Este menu permite gerir os utentes (criar, listar e saldar multas) da mediateca. Dispõe de uma opção para voltar ao menu principal (as etiquetas das opções deste menu estão definidas em mediateca.mensagens.Menu). 3.3.1 Criar Utente Na criação de utentes, o sistema pede o nome e endereço de correio electrónico do novo utente (respectivamente, através das mensagens mediateca.mensagens.Utente.pedidoDeNome() e mediateca.mensagens.Utente.pedidoDeEmail()). O sistema assinala o registo do novo utente através da mensagem mediateca.mensagens.Utente.criado(idUtente) (em que idUtente é o identificador do novo utente). 3.3.2 Listar Utentes Esta opção mostra a lista de todos os utentes, ordenados por ordem crescente do seu nome. Caso haja mais do que um utente com o mesmo nome, será listado primeiro o utente com menor número identificador. Cada utente deverá ser listado como indicado de seguida, respectivamente, para utentes activos e suspensos. A multa a apresentar, para utentes suspensos, é um valor inteiro. id - nome - email - ACTIVO id - nome - email - SUSPENSO - EUR valorMultaAPagar Por exemplo: 2 - Alberto Meireles - [email protected] - ACTIVO 1 - Fernando Meireles - [email protected] - SUSPENSO - EUR 10 3 - Fernando Meireles - [email protected] - ACTIVO 4 3.3.3 Saldar Multa Esta opção permite que um utente salde uma multa. Para tal, o sistema pede ao bibliotecário o identificador do utente. Se o utente estiver suspenso, a multa é saldada e o utente passa a poder requisitar obras, de acordo com as regras gerais (ver §2). Se o utente não estiver suspenso (i.e., não tem multas por saldar), deve lançar-se uma excepção UtenteActivo. 3.4 Ver e Avançar Data A data actual do sistema é apresentada através da mensagem mediateca.mensagens.Data.actual(dataActual). Para avançar a data do sistema, utiliza-se mediateca.mensagens.Data.pedidoDeDias() para pedir ao bibliotecário que indique o número de dias a adicionar à data actual. Além da data, o sistema deve actualizar, caso seja necessário, outros aspectos que dela dependam, designadamente, a situação dos utentes. 4 Notiao~es Para proceder a notificações, invoca-se o método enviar da classe CorreioElectronico. Deve ser possı́vel definir novas entidades a avisar em caso de devolução de obras (e.g. bibliotecários que estejam interessados no empréstimo, ou editoras interessadas em determinar perfis de leitura) com impacto mı́nimo na implementação desenvolvida. A mensagem e a forma de envio dependem da entidade em causa: deve ser possı́vel acrescentar novas formas de aviso (e.g. SMS) com um mı́nimo de alterações. 5 Iniializa~ao e Persist^enia As obras da mediateca são inicialmente lidas de um ficheiro, segundo o formato abaixo, respectivamente, para DVDs e livros (a categoria de uma obra é um número, tal como descrito em §2.2). Assume-se que os tı́tulos das obras não podem conter o carácter : e que o preço é um inteiro (sugere-se a utilização do método split da classe String). Não há entradas mal-formadas e entradas repetidas (linhas iguais) ao longo do ficheiro (independentemente de serem consecutivas ou não) correspondem a múltiplos exemplares da mesma obra. DVD:tituloDVD:realizadorDVD:preco:categoria:numeroIGAC Livro:tituloLivro:autorLivro:preco:categoria:ISBN Um exemplo de conteúdo do ficheiro inicial é como se segue: DVD:Era uma vez na Amadora:Fernando Fonseca:20:2:200505550 DVD:Lumiar Selvagem:Pedro Fonseca:20:2:200505551 Livro:A arte de sobreviver no 36:Joao Fonseca:20:2:1234567892 Livro:Bairro Alto e o Budismo Zen:Zun Tse Fonseca:20:2:1234567891 DVD:48 Horas para o Exame:Orlando Fonseca:12:2:200505553 Livro:Analise Matematica sem Mestre:Carlos Fonseca:20:2:1234567890 DVD:Lumiar Selvagem:Pedro Fonseca:20:2:200505551 DVD:Lumiar Selvagem:Pedro Fonseca:20:2:200505551 Execuções subsequentes do sistema já não utilizam o ficheiro inicial: os dados das obras carregadas na execução inicial deverão ser mantidos persistentemente usando a serialização do Java. Além da informação sobre as obras, os dados respeitantes aos utentes, requisições, histórico (devoluções efectuadas) e data do sistema deverão também ser mantidos persistentemente. Os ficheiros de serialização são definidos por duas propriedades: estadoEntrada (ficheiro para leitura dos dados serializados) e estadoSaida (ficheiro para escrita dos dados serializados). 6 Considerao~es 6.1 Introdução de Modificações Este projecto deve ser implementado de forma a possibilitar um conjunto de futuras extensões ou alterações de funcionalidade com um esforço mı́nimo de alteração do código pré-existente. Assim, deverá ser simples: 5 • Adicionar novos tipos (e.g., CDs ou VHS) e novas categorias de obras; • Definir novas entidades que desejem ser notificadas da requisição ou devolução de obras; • Introduzir alterações nas regras para requisição de obras ou nos prazos de requisição permitidos; • Permitir novas classificações para os utentes, para além de faltoso, cumpridor ou normal. 6.2 Excepções Note-se que, além das excepções descritas, é possı́vel a definição de outras. As novas excepções não devem, no entanto, substituir as fornecidas nos casos descritos por este enunciado. Por exemplo, a excepção a lançar quando não se encontra um utente é UtenteInexistente e não outra qualquer. 6.3 Identificação de Autoria Todas as classes implementadas devem possuir o método obtemAutoria, tal como habitualmente definido nos exercı́cios de avaliação. A ausência deste método conduz a uma penalização de 100%. 6.4 Execução Usando o ficheiro de obras obras.txt e os ficheiros ENTRADA.dat e SAIDA.dat (a disponibilizar) é possı́vel verificar automaticamente se o programa produz o resultado esperado para o exemplo. Em Unix, e supondo que os ficheiros ENTRADA.dat e SAIDA.dat estão no mesmo directório que o pacote mediateca, se for dado o comando abaixo, deve ser produzido um ficheiro de saı́da, chamado SAIDA1.dat, que deve ser igual ao ficheiro SAIDA.dat (o ponto de entrada da aplicação a desenvolver é o método main da classe mediateca.Mediateca). java -Dobras=obras.txt -DentradaDados=ENTRADA.dat -DsaidaDados=SAIDA1.dat mediateca.Mediateca Os ficheiros podem ser comparados com o comando diff -b SAIDA.dat SAIDA1.dat. Se forem iguais, este comando não deve produzir qualquer resultado. Note-se, contudo, que este teste não garante o correcto funcionamento do código desenvolvido, apenas verificando algumas funcionalidades. Após obter as classes que obedeçam às especificações fornecidas, crie um arquivo, denominado PROJ.jar, contendo apenas os ficheiros source (.java) de todas as classes concretizadas. O ficheiro PROJ.jar deve ser submetido para avaliação através da ligação apresentada no Fénix (utilizar a autenticação Fénix). São possı́veis múltiplas submissões até à data limite de entrega, mas será avaliada apenas a última versão. Não serão consideradas quaisquer alterações aos ficheiros disponibilizados: eventuais submissões desses ficheiros serão automaticamente substituı́das durante a avaliação da funcionalidade do código submetido. 6.5 Erratas Correções a este enunciado esteja sujeito serão devidamente anunciadas na página da disciplina e documentadas na secção Projecto. 7 Funionalidades neessarias para ada entrega A entrega intermédia pressupõe a definição de um diagrama UML com as classes da solução final, a correcta execução do processamento inicial das obras a partir do ficheiro de entrada, e a funcionalidade de procura e listagem de obras. Todos os menus devem estar implementados. Deve ser implementada uma classe de teste que verifica a se a procura de obras funciona correctamente. A entrega final pressupõe a correcta execução da restante funcionalidade, assim como a apresentação da versão final do diagrama UML. 6 7.1 Aspectos avaliados Os seguintes pontos influenciam a avaliação do projecto: • Avaliação intercalar: funcionalidade, correcta aplicação dos conceitos de programação com objectos (máximo: 4 valores). Esta nota é comunicada pelo docente das aulas práticas na primeira aula prática depois da data limite da entrega intermédia; • Correcta aplicação de padrões de desenho (máximo 4: valores); • Correcta aplicação de conceitos de programação com objectos (máximo: 6 valores); • Correcto funcionamento do programa (máximo 6 valores, a atribuir automaticamente através da execução de uma bateria de testes). É essencial que o código compile correctamente com as classes disponibilizadas. Quando submeter o trabalho, não serão executados testes de avaliação; • Se algum teste falhar, devido a não ter seguido a ordem na inserção de dados, especificada no ponto “Funcionalidade máxima da mediateca”, será atribuı́da a cotação de zero valores nesse teste. 7.2 Penalizações Alertam-se os alunos para as possı́veis penalizações abaixo descritas. • Qualidade dos comentários que acompanham classes e métodos alterados ou introduzidos para a resolução deste exercı́cio de programação: só é considerado o material correspondente à codificação da funcionalidade exigida para a entrega intercalar (máximo: 2 valores). • A não utilização da classe pt.utl.ist.po.ui.InteraccaoUtilizador conduz a uma classificação de 0 (zero) valores. • A não definição do método obtemAutoria conduz a uma classificação de 0 (zero) valores. • O uso de System.exit(), Runtime.getRuntime().exit() ou qualquer outro tipo de exit(), bem como o tratamento indiscriminado de excepções, e.g. uso de catch(Exception e) (ou hierarquicamente superiores) conduz a uma classificação de 0 (zero) valores. • A entrega de código não compilável conduz a uma classificação de 0 (zero) valores, na avaliação da funcionalidade do módulo correspondente. Não serão aceites quaisquer justificações. • O não cumprimento das convenções de codificação em Java implica uma penalização de 25%. • A entrega de ficheiros adicionais descrevendo o código conduz a uma classificação de 0 (zero) valores (toda a documentação, exceptuando diagramas UML, deve fazer parte dos comentários Javadoc). • A entrega fora do prazo corresponde à não avaliação do exercı́cio de programação, ou seja, conduz a uma classificação de 0 (zero) valores. A indisponibilidade temporária da página de submissão, desde que inferior a 24 horas, não justifica atrasos na submissão de um trabalho. Sugere-se que os alunos verifiquem, com antecedência, os requisitos exigidos pelo processo de submissão. • A submissão de um ficheiro pressupõe o compromisso de honra que o trabalho incluso foi realizado pelos alunos referenciados nos ficheiros submetidos para avaliação. A quebra deste compromisso, ou seja a tentativa de um grupo se apropriar de trabalho realizado por colegas, tem como consequência a reprovação de todos os alunos envolvidos (incluindo os que possibilitaram a ocorrência) neste ano lectivo. 7