Démarrer un projet ToPIA - Maven

Comment démarrer un projet à partir de rien.

Créer le projet

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
        └── resources

Dans 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>

Créer le modèle

Utiliser ArgoUML pour décrire le modèle

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.

Les données associées aux éléments du 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.

C'est prêt !

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.xmi

On 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 :

System Message: ERROR/3 (line 231)

Unexpected indentation.
  • 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)

    System Message: WARNING/2 (line 236)

    Inline emphasis start-string without end-string.

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.