Comment démarrer un projet à partir de rien.
Pour commencer, il faut créer un projet maven en respectant les conventions habituelles. Partons d'un projet maven vide :
mvn archetype:generate -DgroupId=com.masociete -DartifactId=monapplication -DarchetypeArtifactId=maven-archetype-archetype
Ajoutez un dossier src/main/xmi, c'est ici que nous allons placer le modèle.
topia-tutorial
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── org
│ │ └── nuiton
│ │ └── topia
│ │ └── tutorial
│ │ └── library
│ ├── resources
│ │ ├── library-config.properties
│ │ └── log4j.properties
│ └── xmi
│ ├── library.properties
│ └── library.zargo
└── test
├── java
└── resourcesDans le pom, on ajoute ToPIA en dépendance, et on configure la génération :
<properties>
<topiaVersion>2.8</topiaVersion>
<eugeneVersion>2.6.3</eugeneVersion>
</properties>
<dependencies>
<dependency>
<groupId>org.nuiton.topia</groupId>
<artifactId>topia-persistence</artifactId>
<version>${topiaVersion}</version>
</dependency>
</dependencies>
<plugins>
<!-- ... -->
<plugin>
<groupId>org.nuiton.eugene</groupId>
<artifactId>eugene-maven-plugin</artifactId>
<version>2.6.3</version>
<configuration>
<inputs>zargo</inputs>
<resolver>org.nuiton.util.FasterCachedResourceResolver</resolver>
</configuration>
<executions>
<execution>
<id>generate-entities</id>
<phase>generate-sources</phase>
<configuration>
<!-- Corresponding to extracted package from zargo file -->
<fullPackagePath>org.nuiton.topia.tutorial.library</fullPackagePath>
<!-- DefaultPackage used for DAOHelper generation -->
<defaultPackage>org.nuiton.topia.tutorial.library.model</defaultPackage>
<templates>
org.nuiton.topia.generator.TopiaMetaTransformer
</templates>
</configuration>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>Avec ArgoUML, créez un nouveau modèle et enregistrez-le dans xmi. Nous allons créer un modèle simplifié pour une application de gestion de bibliothèque.
Nous avons modélisé les entités Book et Author avec les champs appropriés. Faites attention à bien placer les entités dans le bon package, sinon elles ne seront pas générées. Pour que ToPIA sache que ces classes décrivent des entités qui ont vocation à être sauvées en base, il faut leur ajouter le stéréotype entity.
N'oubliez pas de donner un nom et une version au modèle.
Le modeleur n'est pas suffisant pour décrire toute les subtilités du modèle. Le modèle se voulant indépendant de la plate-forme cible, on ne peut y inclure directement des notions spécifiques à ToPIA. C'est pourquoi nous allons pouvoir ajouter ces informations spécifiques via le fichier library-config.properties.
Il suffit de construire l'application avec maven.
mvn compile
La compilation va provoquer la phase de génération. Si on examine le contenu de notre dossier target :
topia-tutorial
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── org
│ │ │ └── nuiton
│ │ │ └── topia
│ │ │ └── tutorial
│ │ │ └── library
│ │ ├── resources
│ │ │ ├── library-config.properties
│ │ │ └── log4j.properties
│ │ └── xmi
│ │ ├── library.properties
│ │ └── library.zargo
│ └── test
│ ├── java
│ └── resources
└── target
├── classes
│ ├── library-config.properties
│ ├── log4j.properties
│ └── org
│ └── nuiton
│ └── topia
│ └── tutorial
│ └── library
│ ├── LibraryConfig.class
│ └── model
│ ├── AuthorAbstract.class
│ ├── Author.class
│ ├── AuthorDAOAbstract.class
│ .
│ .
│ .
└── generated-sources
├── annotations
├── java
│ └── org
│ └── nuiton
│ └── topia
│ └── tutorial
│ └── library
│ └── model
│ ├── AuthorAbstract.java
│ ├── AuthorDAOAbstract.java
│ ├── AuthorDAOImpl.java
│ ├── AuthorDAO.java
│ ├── AuthorImpl.hbm.xml
│ ├── Author.java
│ ├── BookAbstract.java
│ ├── BookDAOAbstract.java
│ ├── BookDAOImpl.java
│ ├── BookDAO.java
│ ├── BookImpl.hbm.xml
│ ├── BookImpl.java
│ ├── Book.java
│ └── LibraryDAOHelper.java
├── models
│ ├── library.objectmodel
│ └── library.properties
└── xmi
├── library.properties
└── library.xmiOn peut voir que ToPIA a généré LibraryDAOHelper qui va nous permettre de récupérer les différents DAO et, pour chaque entité de notre modèle :
Une interface
Une classe abstraite, qui implémente déjà tout le contrat
Une implantation (vide, seulement les constructeurs)
Un DAO abstrait
Une implantation du DAO
Un fichier de mapping hibernate (*.hbm.xml)
Comme il s'agit d'une phase de compilation, maven va ajouter tout le code généré aux classpath le code généré sera compilé et lié en même temps que le reste de votre application. Tous les fichiers .class se retrouveront dans target/classes, dans la suite du processus, on ne distingue plus le code généré du code utilisateur.
Par la suite, si vous changez le modèle, tout sera re-généré. À chaque clean via maven, tout ce qui a été généré est effacé. Vous pouvez donc re-généré autant de fois que nécessaire. Attention, Maven ne détecte pas le changement du modèle si le fichier .zargo a été modifié : il faut donc faire un clean à chaque fois afin de forcer le re-génération du modèle dans sa dernière version.