Objectivos
- Introdução à Fénix Framework para a modelação e geração automática de modelos de domínio persistentes e transaccionais
- Realização de uma aplicação que utiliza a Fénix Framework
Documentação adicional:
Fénix Framework [EN]:
- homepage
- Tutorial da Fénix Framework: The Fenix Framework Tutorial
Domain Modeling Language [EN]:
- documentação base
- excerto da Tese de Doutoramento que introduziu a DML
- documentação avançada (e novos aspectos)
Primeiro Exercício
Antes de realizar os exercícios propostos para este laboratório deve ler com atenção primeiro o tutorial da Fénix Framework (FF).O primeiro exercício corresponde a criar a aplicação PhoneBook. Para tal, primeiro deve criar o projecto Maven para esta aplicação:
- Crie o directório base deste projecto (phonebook, por exemplo);
- Coloque o seguinte ficheiro pom.xml neste directório. Este ficheiro está descrito no tutorial da FF referido em cima (The Fenix Framework Tutorial) e pode ser facilmente adaptado a qualquer aplicação a desenvolver que utiliza a Fénix Framework;
- Crie a estrutura de directórios standard de um projecto maven:
- src/main/java/pt/tecnico/phonebook/domain
- src/main/java/pt/tecnico/phonebook/exception
- src/main/dml
- src/main/resources
- src/test/java/pt/tecnico/phonebook
- Copie o ficheiro phonebook.dml para src/main/dml. Este ficheiro contém a descrição da estrutura de objectos do estado persistente da aplicação;
- Copie o ficheiro fenix-framework-jvstm-ojb.properties para src/main/resources. Este ficheiro contém a informação necessário para realizar a ligação ao sistema de bases de dados que vai guardar o estado persistente da aplicação;
- Copie o ficheiro log4j.properties para src/main/resources. Este ficheiro contém as especificação de propriedades a utilizar pela biblioteca de logging log4j utilizada pela Fénix Framework.
Depois de ter executado com sucesso a fase compile, acrescente as seguintes classes ao código da aplicação:
- Inicialização e execução: SetupDomain.java, PhoneBookApplication.java
- Excepções: PersonDoesNotExistException.java, ContactDoesNotExistException.java, NameAlreadyExistsException.java e PhoneBookException.java
- Domínio: PhoneBook.java, Person.java e Contact.java
Compile e corra a aplicação. Não se esqueça que para correr a aplicação é necessário que as tarefas de instrumentação do código e de processamento das anotações @Atomic sejam executadas antes da execução da aplicação. Sempre que há alteração das entidades do domínio é necessário que estas tarefas sejam executadas antes da execução da aplicação. Assim, deve executar o seguinte comando Maven: mvn test exec:java.
Acrescente as seguintes funcionalidades ao código da aplicação:
- Adicione alguns contactos no código de inicialização do estado inicial da aplicação e verifique que a execução do projecto (após re-popular o estado persistente da aplicação) mostra os novos contactos.
- Preencha o método searchContact da classe Person. Este método deve devolver a lista de contactos da pessoa cujo nome contém a string dada como argumento deste método.
- Adicione os métodos necessários às classes PhoneBook e Person por forma a garantir que não há duas pessoas com o mesmo nome ligadas à mesma instância de PhoneBook.
- Adicione o código necessário que remove um objecto do domínio do repositório persistente. Este código deverá ser invocado quando o objecto deixa de pertencer ao estado persistente da aplicação.
Solução do Primeiro Exercício
Depois de ter realizado a sua solução pode compará-la com a solução disponibilizada pelo corpo docente. Esta solução disponibilizada tem uma funcionalidade extra que é a exportação e importação do estado persistente da aplicação para um documento XML utilizando a biblioteca JDOM.Segundo Exercício
Antes de fazer este exercício, os alunos devem desenvovlver a aplicação PhoneBook dada no primeiro exercício deste laboratório.
Pretende-se desenvolver uma aplicação para a gestão de voos de companhias aéreas. Esta aplicação deve permitir a definição de companhias aéreas, de novos voos, operados por uma dada companhia aérea e guardar toda a informação em suporte persistente através da Fénix Framework.
Um voo tem sempre associado um número (único no contexto da companhia aérea que o gere), um aeroporto de origem e outro de destino, bem como a hora de partida (hh:mm). Existe ainda a restrição de os aeroportos de origem e destino terem de ser obrigatoriamente distintos.
Um aeroporto é identificado quer pelo seu código IATA, quer pelo seu código ICAO. O aeroporto está instalado numa dada cidade e tem associado um custo de utilização por voo. O código IATA e ICAO de um aeroporto são únicos dentro do contexto da aplicação de gestão de companhias aéreas, ou seja, não podem existir dois aeroportos com o mesmo código IATA ou ICAO dentro da mesma aplicação.
Por fim, uma companhia aérea tem um nome e um código IATA próprio, únicos na aplicação de gestão de companhias aéreas.
Desenvolva um protótipo de uma aplicação de consola que (1) cria a companhia aérea portuguesa "TAP Portugal", (2) define os seguintes voos, e (3) os apresenta na consola:
Número | Origem | Destino | Partida |
1951 | Porto | Lisboa | 06:50 |
1988 | Lisboa | Porto | 21:55 |
0651 | Amsterdão | Porto | 14:20 |
0660 | Lisboa | Amsterdão | 14:05 |
A apresentação de um voo deve obedecer ao seguinte formato:
<código companhia aérea> <número de voo> : <cidade origem> (<código IATA>), <cidade destino> (<código IATA>), <hora>
Para desenvolver esta aplicação, os alunos devem usar como ponto de partida o template de projecto Maven definido para a aplicação PhoneBook e realizar as alterações necessárias no ficheiro POM disponibilizado e construir a estrutura de directórios correspondentes a este novo projecto Maven.