Skip navigation

Lorsqu’on utilise Ecore et Accelo (possible avec d’autres frameworks de génération tels qu’openArchitectureWare), il est possible de générer des patrons de templates acceleo (ou ATL ou xTend ou … ?) à partir de fichiers ecore (ou UML ou …). C’est beau l’engeenering.

D’abord le modèle ecore d’exemple :

source_ecore_model_content

Ensuite le fichier EPackage.mt qui à la charge de lancer le script generate pour tous les EClass qu’il contient :

<%
metamodel http://www.eclipse.org/emf/2002/Ecore
import EClass
%>

<%script type= »ecore.EPackage » name= »generate »%>
<%for (filter(« EClass »)){%>
<%generate%>
<%}%>

Et le fichier EClass.mt :

[%
metamodel http://www.eclipse.org/emf/2002/Ecore
%]

[%script type= »ecore.EClassifier » name= »genHeader »%]
<%
metamodel [%genNSURI%]
%>

[%script type= »ecore.EClassifier » name= »genNSURI »%]
[%if (getProperty(« nsURI »).nSize() > 0){%][%getProperty(« nsURI »)%]
[%}else{%]
[%getRootContainer().filter(« EPackage »).nsURI%]
[%}%]

[%script type= »ecore.EClass » name= »genFilename »%]
[%ePackage.genName.replaceAll(« . »,getProperty(« directorySeparator ») ) + name%]

[%script type= »ecore.EClass » name= »generate » file= »[%genFilename%].mt »%]
[%genHeader%]
<%script type= »[%genNameType%] » name= »generate » file= »[%name%].mt »%>

[%script type= »ecore.EClass » name= »genNameType »%]
[%if (ePackage.nSize()>0){%][%ePackage.genName%].[%}%][%name%]

[%script type= »ecore.EPackage » name= »genName »%]
[%if (eSuperPackage.nSize()>0){%][%eSuperPackage.genName%].[%}%][%name%]

On créer une chaîne d’exécution à peu près comme celle-ci

chaine_epackage_as_root

Ensuite on l’exécute et on obtient ceci :

generated_files_are_generators

Et un générateur contient le contenu attendu :

class-generator-generated-content

Pour le développement sans registry (mon eclipse bug j’ai plus de model registry) j’ai du rajouté une propriété de génération (generator.properties) qui permet de définir manuellement le nsURI.

On peut bien sûr aller plus loins en se concentrant sur le modèle Ecore et l’instance qu’on développe pour pousser la génération de générateurs (faire abstraction etc, on the way to go).

A bientôt !

Laisser un commentaire

Choisissez une méthode de connexion pour poster votre commentaire:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :