Usage

authors : Tony Chemit
contact : chemit@codelutin.com
revision : $Revision$
date : $Date$

generate

Ce 'goal' permet de lancer une génération intelligente, en chaînant les différentes phases de génération.

En suivant les conventions de maven (et la configuration par défaut), il est conseillé de respecter au maximum les cnventions de plugin afin d'éviter de gros mals de crâne...

modelType

Propriété invariante du 'goal', modelType est le type de modèle à traiter.

Il y a actuellement deux types de modèles :

  • objectmmodel
  • statemodel

inputs

Pour définir ce qu'il faut générer, vous devez remplir la configuration des inputs.

Chaque entrée des 'inputs' est associée à une phase de génération (référez-vous à la section suivante pour en savoir plus sur les phases).

Une entrée des 'inputs' est définie par :

  • une phase (zargo, xmi ou model)
  • un répertoire contenant les fichiers à inclure
  • un 'pattern' d'inclusion

Example:

<execution>
    <configuration>
        <inputs>zargo</inputs>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>

Si vous souhaitez utiliser plusieurs entrées, vous pouvez aussi écrire :

<execution>
    <configuration>
        <inputs>
            <input>zargo</input>
            <input>xmi</input>
        </inputs>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>

Une entrée peut avoir cinq formes :

  • <input>XXX</input> : utilise la phase XXX avec sa configuration par défaut.
  • <input>dir:includes</input> : utilise le répertoire donné et utilise le 'pattern' d'exclusion pour définir la phase à utiliser.
  • <input>classpath:XXX:dir:includes</input> : utilise la phase XXX avec recherche dans le classpath à partir du répertoire et le 'pattern d'inclusion' donnés.
  • <input>dir:includes</input> : utilise le répertoire donné et utilise le 'pattern' d'exclusion pour définir la phase à utiliser.
  • <input>classpath:XXX:dir:includes</input> : utilise la phase XXX avec recherche dans le classpath et le 'pattern d'inclusion' donnés.

Example:

<execution>
    <configuration>
        <inputs>zargo</inputs>
        <inputs>src/main/myzargo:**/*.zargo</inputs>
        <inputs>classpath:/myzargo:.*\.zargo</inputs>
        <inputs>zargo:src/main/myzargo:**/*.zargo</inputs>
        <inputs>classpath:zargo:/myzargo:.*\.zargo</inputs>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>
Utilisation du classpath (depuis 2.2)

On autorise désormais la recherche de fichiers dans le classpath, cela est util par exemple, lorsque le modèle est dans différents modules d'un projet maven.

On distingue deux sortes de recherche dans le class-path :

  • Une recherche exacte on on donne directement le nom du fichier recherché.

    Dans l'exemple suivant, on recherche exactement le fichier /xmi/myModel.zargo dans le class-path :

<execution>
    <configuration>
        <inputs>
            <input>classpath:zargo:/xmi:myModel.zargo</input>
        </inputs>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>
  • Une recherche non exacte (avec des patterns), dans ce cas la pattern d'inclusion (contrairement au cas des fichiers) doit être un expression régulière :

    Dans l'exemple suivant, on veut traiter tous les fichiers zargo contenus dans le class-path :

<execution>
    <configuration>
        <inputs>
            <input>classpath:zargo:/:.*\.zargo</input>
        </inputs>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>

Techniquement le plugin va rechercher les fichiers à traiter dans le class-path et les extraire vers un répertoire précis (donné par le paramètre extractDirectory/inputType) du mojo.

En reprenant notre premier exemple, cela donnera :

myProject
.
`-- target
    `-- extracted-sources
        `-- zargo
            `-- xmi
                |-- myModel.properties
                `-- myModel.zargo

Une fois ces données extrait, le plugin utilisera ces données comme un input classique sur fichiers :

<input>zargo:target/extracted-sources/zargo:xmi/myModel.zargo</input>

Note:

On notera que les répertoires dont viennent les données du class-path sont
conservés pour éviter toute collision.

phases

Une phase (aussi appellée un 'writer' a pour but de générer quelque chose avec la possibilité de déclencher la phase chaînée suivante.

Pour le moment, nous avons défini quelques phases de génération :

  • zargo
  • xmi
  • model

Chaque phase a un protocole d'entrée et un protocole de sortie :

zargo --> xmi
xmi   --> model
model --> no output protocol (at the moment)

Donc si vous donnez la phase zargo, le plugin essaiera de chaîner zargo --> xmi --> model.

Il est possible de ne pas effectuer une phase en utilisant la propriété skipInputs.

Example:

<execution>
    <configuration>
        <inputs>zargo</inputs>
        <skipInputs>model</skipInputs>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>

lancera les phases zargo et xmi mais pas la phase model.

Il y a aussi quelques propriété spécifiques à chaque phase.

Phase zargo

Cette phase permet de prendre des fichiers zargo pour en extraire les fichiers xmi.

Example:

<execution>
    <configuration>
        <inputs>zargo</inputs>
        <skipInputs>xmi,model</skipInputs>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>

détectera tous les fichiers zargo (en utilisant la configuration par défaut de la phase zargo) et extraira les fichiers xmi.

La configuration par défaut de la phase zargo est :

  • répertoire source : src/main/xmi
  • 'pattern' d'inclusion : **/*.zargo

    System Message: WARNING/2 (line 267)

    Inline strong start-string without end-string.

    System Message: WARNING/2 (line 267)

    Inline emphasis start-string without end-string.
  • répertoire de sortie : target/generated-sources/xmi

Cette phase n'a pas de configuration spécifique.

Phase xmi

Cette phase permet de prendre des fichiers xmi pour construire des fichiers objectmodel (ou statemodel).

Example:

<execution>
    <configuration>
        <inputs>xmi</inputs>
        <resolver>org.nuiton.util.FasterCachedResourceResolver</resolver>
        <skipInputs>model</skipInputs>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>

détectera tous les fichiers xmi (en utilisant la configuration par défaut de la phase xmi) et créera des fichiers model.

La configuration pour la phase xmi est :

  • répertoire source : src/main/xmi
  • 'pattern' d'inclusion : **/*.xmi

    System Message: WARNING/2 (line 299)

    Inline strong start-string without end-string.

    System Message: WARNING/2 (line 299)

    Inline emphasis start-string without end-string.
  • répertoire de sortie : target/generated-sources/modles

Cette phase défini quelques propriétés spécifiques :

  • fullPackagePath : le package généré.
  • resolver : le resolver de ressource à utiliser.
Phase model

Cette phase permet de prendre des fichiers model pour générer des fichiers (java ou autre) en utilisant des templates.

Example:

<execution>
    <configuration>
        <inputs>model:target/generated-sources/models:observe.objectmodel</inputs>
        <templates>
            org.nuiton.topia.generator.TopiaMetaTransformer,
            org.nuiton.topia.generator.InterfaceTransformer
        </templates>
    </configuration>
    <goals>
        <goal>generate</goal>
    </goals>
</execution>

La configuration par défaut pour la phase model est :

  • répertoire source : src/main/models
  • 'pattern' d'inclusion : **/*.objectmodel

    System Message: WARNING/2 (line 333)

    Inline strong start-string without end-string.

    System Message: WARNING/2 (line 333)

    Inline emphasis start-string without end-string.
  • répertoire de sortie : target/generated-sources/java

Cette phase défini des propriétés spécifiques :

  • defaultPackage : package par défaut
  • templates : templates à utiliser
  • excludeTemplates : templates à exclure
  • generatedPackages : packages à générer

available-data

Ce 'goal' aide les utilisateurs à déterminer quel type de donnée peut-être utilisé avec la configuration actuelle du plugin.

Ce 'goal' ne peut être utilisé que par invocation directe en console et non dans votre pom car son objectif est d'afficher des informations dans la console.

Lancez seulement

::xmi

mvn eugene:available-data

pour obtenir toutes les informations disponibles.

Example:

[INFO] [eugene:available-data {execution: default-cli}]
[INFO] Get datas for data types : [modeltype, writer, modelreader, modeltemplate]
Found 2 modeltypes :
 [statemodel] with implementation 'org.nuiton.eugene.models.state.xml.StateModelImpl'
 [objectmodel] with implementation 'org.nuiton.eugene.models.object.xml.ObjectModelImpl'
Found 3 writers :
 [xmi] with implementation 'org.nuiton.eugene.plugin.writer.XmiChainedFileWriter
  inputProtocol             : xmi
  outputProtocol            : model
  defaultIncludes           : **/*.xmi
  defaultInputDirectory     : src/main/xmi
  defaultTestInputDirectory : src/test/xmi'
 [model2Java] with implementation 'org.nuiton.eugene.plugin.writer.ModelChainedFileWriter
  inputProtocol             : model
  outputProtocol            : null
  defaultIncludes           : **/*.*model
  defaultInputDirectory     : src/main/models
  defaultTestInputDirectory : src/test/models'
 [zargo2xmi] with implementation 'org.nuiton.eugene.plugin.writer.ZargoChainedFileWriter
  inputProtocol             : zargo
  outputProtocol            : xmi
  defaultIncludes           : **/*.zargo
  defaultInputDirectory     : src/main/xmi
  defaultTestInputDirectory : src/test/xmi'
Found 2 modelreaders :
 [statemodel] with implementation 'org.nuiton.eugene.models.state.StateModelReader'
 [objectmodel] with implementation 'org.nuiton.eugene.models.object.ObjectModelReader'
Found one modeltemplate :
 [org.nuiton.eugene.java.JavaGenerator] with implementation 'org.nuiton.eugene.java.JavaGenerator'

transform-flat-properties-to-compact

Ce 'goal' transforme des fichiers d'exention du modèle au format properties vers un format plus compact (objectmodel-ext).

Exemple de fichier sous ce format :

[model]
modeTagValue value
modelStereotype

[package]
fr.ird.observe.entities
  packageTagValue value
  packageStereotype
[class]
fr.ird.observe.entities.CommentableEntity
  classTagValue value
  classStereotype
  attribute.attributeTagValue value
  attribute.attributeStereotype

transform-compact-to-flat-properties

Ce 'goal' transforme des fichiers d'extension du modèle au compact vers le format classique de fichier de properties.