Index: topia-service/src/site/fr/rst/Migration.rst diff -u /dev/null topia-service/src/site/fr/rst/Migration.rst:1.1 --- /dev/null Wed Apr 18 08:47:40 2007 +++ topia-service/src/site/fr/rst/Migration.rst Wed Apr 18 08:47:35 2007 @@ -0,0 +1,157 @@ +ToPIA Migration Service +======================= + +ToPIA Migration Service est un module ToPIA chargé d'effectuer la migration +d'une base de données existante sans perte de données. + +Configuration +------------- +Ce service doit disposer de quelques proprietés de configuration pour effectuer +la migration d'une base de données. + +Ces proprietés sont fournit au service via un TopiaContext et font donc partie +de la configuration de l'application. + + +Configuration de la base de données +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +:: + + hibernate.dialect=org.hibernate.dialect.HSQLDialect + hibernate.connection.username=sa + hibernate.connection.password= + hibernate.connection.driver_class=org.h2.Driver + + topia.persistence.directories=directory1,directory2 + topia.persistence.classes=classImpl1,classImpl2 + topia.persistence.properties.file=??? + +Ces informations servent à créer une configuration hibernate (qui contient les +informations de connexion et les mappings de l'application). + +Les lignes commencant par "hibernate" sont spécifiques à hibernate et au type de +base de données utilisé. Les lignes suivantes sont spécifiques à ToPIA mais +contiennent les mappings indispensable pour créer le schéma de la base de +données après migration. + + +Configuration des mappings +~~~~~~~~~~~~~~~~~~~~~~~~~~ +La configuration doit contenir une propriété : + +:: + + topia.service.migration.mappingsdir=oldmappings + +qui spécifie le répertoire de recherche des anciens mappings. + +Ce dossier contient ensuite un sous dossier par version (nommé VX, *X* étant la +version), avec pour chaque dossier, l'ensemble des mappings hibernate de cette +version. + +Exemple ::: + + oldmappings/ + V1/ + Class1.hbm.xml + Class2.hbm.xml + Class3.hbm.xml + V2/ + Class1.hbm.xml + Class2New.hbm.xml + Class3.hbm.xml + V2.2/ + Class2.hbm.xml + Class3.hbm.xml + Class4New.hbm.xml + + +Configuration de la version +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +La configuration doit contenir une propriete : + +:: + + topia.service.migration.version=3.5.1 (example) + +Cette proprietés renseigne la version *courante* de l'application. + + +Utilisation +----------- +Ce module étant un service ToPIA, il doit être activé pour pouvoir s'exécuter. + +Il se commence par se connecter au SGBD, vérifie si les versions diffèrent, et +effectue la migration si besoin. + +Classes de migration +~~~~~~~~~~~~~~~~~~~~ +Pour savoir comment migrer le données, le développeur utilisant le module de +migration doit produire des classes Java de migration (une par classe nécéssitant +une modification et par version). + +Ces classes doivent : + +- hériter de la classe ``AbstractMigration`` ou de l'interface ``Migration`` +- se trouver dans le même package que les classes d'implémentation référencées + par les mappings +- respecter une convention de nommage de la forme + MigrationClassVnVm où: + + - *Class* est le nom de l'entité devant être migrée + - *n* est la version de départ de migration + - *m* la version d'arrivée + + Exemple, pour migrer une Personne d'une version 2 à 2.1: + ``MigratePersonneV2V2_1.java`` + + Note: les "." étant interdits dans le nom de fichier, ils sont remplacés par le + caractère "_". + +Ensuite, chaque classe doit : + +- implémenter au moins la méthode ``migrate(MapAdapter, MapHelper)`` + cette méthode prend une MapAdapter en paramètre, pour modifier un tuple et un + MapHelper pouvant servir à retrouver des informations sur le reste des tuples + de la base +- surcharger (si besoin) la méthode ``public ProxyClass migrateFrom()`` dans le cas + où les tuples à modifier proviennent d'une classe différente de la classe courante. + +Exemple : + +Ici, la modification porte sur la transformation de l'attribut ``timestampNaissance`` +de la classe ``domaine.Personne`` en une nouvelle table ``domaine.Naissance``, effectée +dans le changement de la version 1 à la version 2 : + +:: + + // migrateFrom() + public ProxyClass migrateFrom() { + return new SimpleProxyClass("domaine.Personne"); + } + + // migrate(MapAdapter, MapHelper) + public void migrate(MapAdapter map, MapHelper helper) { + + // map d'entree vide, conversion du timestamp + // en jour, mois, annee + try { + Long timestamp = (Long) map.getOldValue("timestampNaissance"); + Calendar c = Calendar.getInstance(); + c.setTimeInMillis(timestamp); + map.setValue("jour", c.get(Calendar.DAY_OF_MONTH)); + map.setValue("mois", c.get(Calendar.MONTH)); + map.setValue("annee", c.get(Calendar.YEAR)); + } catch (ExceptionAttributeUndefined e) { + e.printStackTrace(); + } + } + +Donc cette classe : + +- doit se nommer ``MigrateNaissanceV1V2.java`` et se trouver dans le package ``domaine`` +- redéfinit la methode migrateFrom() pour indiquer que les donnees proviennent de + ``domaine.Personne`` +- implémente ``migrate()`` pour produire des tuples de type ``domaine.Naissance`` à partir + de tuples ``domaine.Personne`` Index: topia-service/src/site/fr/rst/Migration.html diff -u /dev/null topia-service/src/site/fr/rst/Migration.html:1.1 --- /dev/null Wed Apr 18 08:47:40 2007 +++ topia-service/src/site/fr/rst/Migration.html Wed Apr 18 08:47:35 2007 @@ -0,0 +1,154 @@ + + + +
+ + +ToPIA Migration Service est un module ToPIA chargé d'effectuer la migration +d'une base de données existante sans perte de données.
+Ce service doit disposer de quelques proprietés de configuration pour effectuer +la migration d'une base de données.
+Ces proprietés sont fournit au service via un TopiaContext et font donc partie +de la configuration de l'application.
++hibernate.dialect=org.hibernate.dialect.HSQLDialect +hibernate.connection.username=sa +hibernate.connection.password= +hibernate.connection.driver_class=org.h2.Driver + +topia.persistence.directories=directory1,directory2 +topia.persistence.classes=classImpl1,classImpl2 +topia.persistence.properties.file=??? ++
Ces informations servent à créer une configuration hibernate (qui contient les +informations de connexion et les mappings de l'application).
+Les lignes commencant par "hibernate" sont spécifiques à hibernate et au type de +base de données utilisé. Les lignes suivantes sont spécifiques à ToPIA mais +contiennent les mappings indispensable pour créer le schéma de la base de +données après migration.
+La configuration doit contenir une propriété :
++topia.service.migration.mappingsdir=oldmappings ++
qui spécifie le répertoire de recherche des anciens mappings.
+Ce dossier contient ensuite un sous dossier par version (nommé VX, X étant la +version), avec pour chaque dossier, l'ensemble des mappings hibernate de cette +version.
+Exemple ::
++oldmappings/ + V1/ + Class1.hbm.xml + Class2.hbm.xml + Class3.hbm.xml + V2/ + Class1.hbm.xml + Class2New.hbm.xml + Class3.hbm.xml + V2.2/ + Class2.hbm.xml + Class3.hbm.xml + Class4New.hbm.xml ++
La configuration doit contenir une propriete :
++topia.service.migration.version=3.5.1 (example) ++
Cette proprietés renseigne la version courante de l'application.
+Ce module étant un service ToPIA, il doit être activé pour pouvoir s'exécuter.
+Il se commence par se connecter au SGBD, vérifie si les versions diffèrent, et +effectue la migration si besoin.
+Pour savoir comment migrer le données, le développeur utilisant le module de +migration doit produire des classes Java de migration (une par classe nécéssitant +une modification et par version).
+Ces classes doivent :
+hériter de la classe AbstractMigration ou de l'interface Migration
+se trouver dans le même package que les classes d'implémentation référencées +par les mappings
+respecter une convention de nommage de la forme +MigrationClassVnVm où:
+Exemple, pour migrer une Personne d'une version 2 Ã 2.1: +MigratePersonneV2V2_1.java
+Note: les "." étant interdits dans le nom de fichier, ils sont remplacés par le +caractère "_".
+Ensuite, chaque classe doit :
+Exemple :
+Ici, la modification porte sur la transformation de l'attribut timestampNaissance +de la classe domaine.Personne en une nouvelle table domaine.Naissance, effectée +dans le changement de la version 1 à la version 2 :
+
+// migrateFrom()
+public ProxyClass migrateFrom() {
+ return new SimpleProxyClass("domaine.Personne");
+}
+
+// migrate(MapAdapter, MapHelper)
+public void migrate(MapAdapter map, MapHelper helper) {
+
+ // map d'entree vide, conversion du timestamp
+ // en jour, mois, annee
+ try {
+ Long timestamp = (Long) map.getOldValue("timestampNaissance");
+ Calendar c = Calendar.getInstance();
+ c.setTimeInMillis(timestamp);
+ map.setValue("jour", c.get(Calendar.DAY_OF_MONTH));
+ map.setValue("mois", c.get(Calendar.MONTH));
+ map.setValue("annee", c.get(Calendar.YEAR));
+ } catch (ExceptionAttributeUndefined e) {
+ e.printStackTrace();
+ }
+}
+
+Donc cette classe :
+