Templates

author : Florian Desbois
contact : eugene-devel@list.nuiton.org ou eugene-users@list.nuiton.org
revision : $Revision$
date : $Date$

Comme expliqué dans le chapitre précédent (Processus de generation ), il y a deux possibilités pour générer des fichiers :

  • Utilisation d'un Generator (template écrite en Java avec utilisation de Nuiton-processor)
  • Utilisation d'un Transformer (transformation de modèle écrite en Java)

EUGene considère les Generator et les Transformer comme tout deux des templates de génération avec comme point commun un modèle en entrée. La différence réside à la sortie, le Generator aura la charge d'écrire des fichiers tandis que le Transformer chargera un nouveau modèle de même type ou non.

EUGene manipule principalement l' ObjectModel , il y a donc un existant abstrait pour la manipulation de ce type de modèle : ObjectModelGenerator et ObjectModelTransformer.

EUGene implémente également une solution simple pour la génération de code Java. Ainsi un générateur et un transformeur java sont disponibles : JavaGenerator et ObjectModelTransformerToJava.

Voici la hiérarchie qui en résulte :

Nous allons commencer par décrire la syntaxe d'écriture d'un Generator avec l'utilisation de Nuiton-processor. Ensuite nous décrirons l'utilisation des Transformer pour finir sur la génération de code Java.

Syntaxe d'écriture d'un Generator

Pour créer un Generator il faut tout d'abord créer une nouvelle classe qui hérite de l'ObjectModelGenerator pour le cas d'une génération depuis un ObjectModel.

TODO

Generator disponibles

Note
Le plugin maven permet de connaître tous les transformers disponibles.

Implantation d'une transformation de modèle

Comme pour les Generator, les Transformer fonctionnent par héritage. Tout dépend des types de modèle en entrée et en sortie souhaités. Pour un ObjectModel en entrée, il faut hériter de l'ObjectModelTransformer.

Les étapes du transformer sont les suivantes :

  • initialisation des sorties
  • appel d'un transformer avant la présente transformation (utile pour certains chaînages)
  • transformation du modèle d'entrée
  • appel de la template de sortie avec pour entrée le modèle de sortie précédemment transformé.

Entrée du transformer

L'entrée du Transformer est un Model. Généralement il s'agit d'un ObjectModel mais il est possible de gérer d'autres types de modèle (comme StateModel par exemple).

Sortie du transformer

Il est nécessaire d'initialiser les sorties du Transformer :

  • Modèle de sortie : quelle est le type de modèle en sortie ?
  • Template de sortie : quelle est la template qui se chargera de manipuler le modèle de sortie ? Cela peut être soit un Generator, soit un autre Transformer.

ObjectModelTransformer

L'ObjectModelTransformer propose un pattern simple pour transformer les composantes du modèle. L'ensemble de l'ObjectModel va être parcouru et pour chaque type d'élément (Classifier, Class, Interface, Enumeration) une méthode associé permettra sa transformationn, le développeur aura la charge d'écraser ces méthodes pour faciliter la transformation

public void transformFromModel(ObjectModel model) {
}

public void transformFromInterface(ObjectModelInterface interfacez) {
}

public void transformFromClass(ObjectModelClass clazz) {
}

public void transformFromClassifier(ObjectModelClassifier clazz) {
}

public void transformFromEnumeration(ObjectModelEnumeration enumeration) {
}

L'ObjectModelTransformer est abstrait et nécessite un héritage pour spécifier le type de modèle en sortie (Pour le cas de la génération Java il s'agit également de l'ObjectModel).

ObjectModelBuilder

Ref ObjectModelBuilder

Cet outil permet de remplir un ObjectModel directement depuis un Transformer. Il s'agit bien évidemment du cas où le modèle de sortie du Transformer est un ObjectModel. Cette classe permet de faciliter l'écriture de l'ObjectModel, les interfaces de ce modèle étant dépourvus de setters.

Exemples de méthodes disponibles :

  • createClass : création d'un ObjectModelClass
  • createInterface : création d'un ObjectModelInterface
  • addOperation : ajout d'une méthode à un ObjectModelClassifier (ObjectModelClass ou ObjectModelInterface)
  • addAttribute : ajout d'un attribute à un ObjectModelClassifier
  • addParamater : ajout d'un paramètre à un ObjectModelOperation
  • ...

Transformer disponibles

Note
Le plugin maven permet de connaître tous les transformers disponibles.

Générateur de java

Tous les éléments de la chaîne de génération sont disponibles pour une génération de code Java à partir d'un modèle de données XMI (package org.nuiton.eugene.java) :

Pour chaque type de génération souhaité, il suffit donc d'hérité de ObjectModelTransformerToJava et d'utiliser les méthodes transformFrom pour enregistrer l'ObjectModel de sortie orienté Java qui sera automatiquement généré via le JavaGenerator. Le principe reste d'interpréter les spécificités UML du modèle d'entrée pour les transformer en Java selon les besoins techniques (technologie, framework, environnement, ...).

JavaBuilder

Ref JavaBuilder

Pour faciliter l'écriture de l'ObjectModel orienté Java, le JavaBuilder est utilisé de façon transparente car l'ObjectModelTransformerToJava propose l'ensemble de ses méthodes directement (délégation). Ainsi, la transformation se fait via le parcours du modèle d'entrée et l'utilisation de ces méthodes pour charger le modèle de sortie.

Exemples de méthodes :

  • createClass : création d'un ObjectModelClass
  • createInterface : création d'un ObjectModelInterface
  • addImport : ajout d'un import à un ObjectModelClassifier
  • addAnnotation : ajout d'une annotation à un ObjectModelElement
  • setSuperClass : ajoute une superclass à un ObjectModelClassifier (extends) avec ajout de l'import automatique sur le type de la superclass.
  • addConstant : ajoute une constante (static final) à un ObjectModelClassifier
  • addConstructor : ajoute un constructeur à une classe.
  • ...
Note
La gestion des imports est faite automatiquement sur les types manipulés (type d'attribut, de paramètre, retour de méthode, interface, ...). Cette gestion utilise l'extension ImportsManagerExtension qui gère un ImportsManager par classifier.