Projet Geddoc

Projet de programmation orientée objet

Modalités

Le projet sera écrit en Java et sera réalisé par binômes (2 personnes). Un dossier comportant le rapport et un listing commenté des programmes écrits sera rendu au secrétariat de la licence avant le lundi 29 avril 2002.

L'objectif du projet est de mettre en œuvre les techniques de la programmation orientée objet. L'évaluation prendra très largement en compte l'utilisation de l'encapsulation, des interfaces, de l'héritage et de la redéfinition de méthodes. Tout projet ne respectant pas ces contraintes sera durement pénalisé. Il sera apporté un soin tout particulier à la lisibilité et à la clarté des programmes. Les programmes devront comporter des commentaires permettant de produire une documentation avec javadoc.

Objectif

L'objectif du projet est de réaliser une présentation HTML d'une base de données généalogiques. Le principe est semblable à celui du programme javadoc. Le programme lit une base de données généalogiques (au lieu de sources en Java pour javadoc) et génère des pages HTML pour présenter ces données. Pour simplifier, on suppose que la base de donnée est lue dans un seul fichier au format GEDCOM.

Description

Les bases de données généalogiques sont maintenant organisées selon un standard largement adopté qui s'appelle GEDCOM. Voici une description des points essentiels pour le projet.

Une généalogie est un graphe formé de deux espèces de sommets : les individus et les familles. Sur le dessin, les individus sont représentés par des rectangles horizontaux et l'unique famille par un rectangle vertical.

Un sommet individu contient les données relatives à l'individu, en particulier son nom, ses prénoms, son sexe. D'autres informations peuvent être sa date et son lieu de naissance, de décès, etc. On peut lui associer des références de données multi-média (photos etc).

Un sommet famille décrit une famille. Il contient peu d'informations (date du mariage s'il y a lieu, etc). Une famille est composée d'un père, d'une mère et d'un ensemble d'enfants.

Les arcs du graphe vont des individus vers les familles, et des familles vers les individus (graphe bipartite).

D'une famille partent trois types d'arcs: vers l'individu père, vers l'individu mère, et vers les individus enfants.

D'un individu partent deux types d'arcs: un arc vers la famille où il figure comme enfant, et un arc vers chacune des familles où il figure comme parent. Un individu peut bien sûr apparaître dans plusieurs familles comme parent.

Standard GEDCOM

Le standard GEDCOM est une description d'un format de transmission de fichiers. Les fichiers sont en ASCII ou Unicode. Voici quelques exemples de fichiers au format GEDCOM.

De manière purement syntaxique, le fichier est organisé ligne par ligne mais il décrit des données qui sont structurées de manière hiérarchique. Cette structure hiérarchique est décrite à travers les entiers qui apparaissent au début de chaque ligne du fichier. Les caractères blancs comme les espaces ou les tabulations servent uniquement de séparateurs. Les espaces en début de chaque ligne sont en particulier ignorés. Chaque ligne est constituée des trois éléments suivants

dans cet ordre. La valeur peut éventuellement être absente (vide). Une ligne typique a donc la forme
   1 NAME John /Begood/
où le niveau est 1, le tag est NAME et la valeur est John /Begood/. Certaines lignes particulières possèdent un identificateur qui est inséré entre le niveau et le tag. Un identificateur est une chaîne de caractères alphabétiques qui commence et se termine avec le caractère arrobas @. Une ligne avec un identificateur a donc la forme
0 @I23@ INDI
où le niveau est 0, l'indentificateur est @I23@, le tag est INDI et la valeur est absente.

Les données du fichier sont organisées en entrées. Chaque entrée possède un type, une valeur et des attributs qui sont eux-mêmes d'autres entrées. Une entrée est décrite sur plusieurs lignes. Elle commence sur une ligne dont le tag et la valeur donnent respectivement le type et la valeur de l'entrée. Les attributs sont décrits sur les lignes suivantes. Cette description comprend toutes les lignes suivantes qui ont un niveau strictement supérieur à celui de la première ligne. La description de l'entrée s'arrête donc à la première ligne qui a un niveau inférieur ou égal à celui de l'entrée. Par exemple le fragment de fichier

0 @I23@ INDI
  1 NAME John /Begood/
  1 BIRT
    2 DATE 12 nov 1966
    2 PLAC Paris
0 ...
décrit une entrée de type INDI. Cette entrée n'a pas de valeur mais elle a deux attributs qui sont des entrées de type NAME et BIRT. L'entrée de type NAME a une valeur qui est John /Begood/ mais n'a pas d'attribut. L'entrée de type BIRT n'a pas de valeur mais elle a deux attributs qui sont des entrées de type DATE et PLAC. Ces deux entrées ont chacune une valeur mais pas d'attribut.

Le format GEDCOM impose que le niveau d'un attribut soit égal au niveau de son entrée augmenté d'une unité. Les entrées de niveau 0 sont appelées enregistrements. Seuls, les enregistrements ne sont pas attribut d'une autre entrée.

Un fichier est une séquence d'enregistrements. Chaque enregistrement représente un sommet, c'est-à-dire un individu ou une famille. Il a un identificateur qui est donné sur sa première ligne entre le niveau et le tag. Cet identificateur doit être unique dans toute la base. Le tag est INDI pour les individus et FAM pour les familles. Aucun ordre sur les enregistrements dans le fichier n'est imposé. Les individus et les familles peuvent apparaître n'importe quel ordre.

Les informations relatives à un sommet sont représentées par des attributs de niveau 1. Pour les individus, il y a

Pour les familles, il y a

Une entrée peut avoir plusieurs plusieurs attributs de même type. Une famille a par exemple plusieurs attributs de type CHIL si plusieurs individus sont enfants de cette famille. Par contre certains attributs comme ceux de type FAMC ne peuvent être présent qu'une seule dans une entrée. Un individu n'est, bien entendu, issu que d'une seule famille.

La norme GEDCOM est prévue pour des données qui sont souvent partielles. Aucun attribut n'est obligatoire dans une entrée. Par exemple, un enregistrement de type INDI peut très bien ne pas avoir d'attribut de type SEX ou même de type NAME si le sexe ou le nom de l'individu ne sont pas connus.

L'information est bien entendue redondante, dans la mesure où un individu qui est enfant dans une famille a un attribut de type FAMC qui pointe en retour sur cette famille. De même pour les parents.

Le standard GEDCOM permet d'associer à un individu ou à une famille un document multimédia dans un fichier externe. Pour cela, l'enregistrement de l'individu ou de la famille contient un attribut de type OBJE. Cette entrée contient alors elle-même trois attributs de type FORM, TITL et FILE dont les valeurs donnent respectivement le format du document multimédia, son titre et l'adresse du fichier (URL par exemple).

Travail demandé

L'objectif du projet consiste à écrire un programme en langage Java permettant de traiter une base de données généalogiques au format GEDCOM. Le programme doit être capable d'effectuer les opérations suivantes.

Lecture d'un fichier au format GEDCOM

Il n'est bien sûr pas demandé que le programme traite tous les tags prévus dans la norme GEDCOM. Il devra seulement prendre en compte

Le programme peut éventuellement prendre en compte d'autres tags. Les tags BIRT, DEAT, DATE et PLAC qui permettent de donner les dates et lieux de naissance et de décès sont des candidats mais d'autres sont aussi possibles.

Par contre le programme doit être capable de lire des bases généalogiques contenant tous les tags de la norme. Une ligne avec un tag non traité et toutes les lignes suivantes qui lui sont attachées sont simplement ignorées.

Cohérence

On suppose que la base de données est syntaxiquement correcte. Cela n'empêche pas qu'il puisse exister des incohérences de natures diverses.

La génération de la représentation HTML

Une base de données est faite pour que l'on puisse y naviguer. Le programme doit générer des pages HTML présentant les individus et les familles avec des liens. On peut concevoir un fichier avec tous les individus ou un fichier par individu et par famille. Voici un exemple de présentation HTML très sommaire de la base de données généalogiques de la famille Begood.

Pour des bases plus importantes, un index alphabétique de tous les personnages présents, triés par ordre alphabétique des noms de famille, est précieux. On peut aussi proposer un arbre généalogique. Il est aussi possible de créer pour chaque individu une page avec la liste de tous ses descendants (enfants, petits-enfants, petits-petits-enfants, etc.) et une page avec la liste de tous ses ascendants (parents, grands-parents, grands-grands-parents, etc.).

Les classes

Il est demandé que chaque type de tag autre que les liens de parentés (FAMS, FAMC, HUSB, WIFE et CHIL) soit représenté par une classe. Chaque classe sera responsable du parsing et du traitement propre à ces objets. Ces nombreuses classes devront bien sûr être organisées en hiérarchie de manière à éviter les redondances dans le code et à favoriser l'utilisation du polymorphisme.