Le langage de génération par template (GTL, Generation Template Language) PowerAMC est un langage de génération de texte basé sur des templates qui est utilisé pour générer du texte pour les métaclasses définies dans le métamodèle PowerAMC, ainsi que sur toutes les extensions définies dans le profil du modèle.
Chaque template est associé à une métaclasse donnée (par exemple, un attribut d'entité de MCD, une table de MPD ou une opération de MOO). Vous pouvez définir autant de templates que vous le souhaitez pour chaque métaclasse, et ils seront disponibles pour tous les objets (instances) de la métaclasse.
Lorsque vous générez un modèle, PowerAMC détermine pour quelles métaclasses des fichiers doivent être générés, et crée un fichier pour chaque instance de la métaclasse, en appliquant les templates appropriés et en résolvant les variables.
Le langage de génération par template est un langage orienté objet, et il prend en charge l'héritage et le polymorphisme afin de permettre que le code soit réutilisable et modifiable. Les macros fournissent les structures de programmation génériques permettant de tester des variables et de procéder à l'itération dans les collections, etc.
Pour examiner le jeu de templates utilisés afin de générer du code pour les opérations dans un MOO Java, ouvrez le langage objet Java dans l'éditeur de ressources et développez la catégorie Profile\Operation\Templates.
Un template de GTL peut contenir du texte, des macros et des variables, et il peut référencer :
Les templates de GTL peuvent être simples ou complexes
Un template simple peut contenir du texte, des variables et des blocs conditionnels, mais ne peut pas contenir de macros. Par exemple :
%Visibility% %DataType% %Code%
Lorsque ce template est évalué, les trois variables Visibility, DataType, et Code sont résolues aux valeurs de ces propriétés pour l'objet.
Un template complexe peut contenir n'importe quel élément d'un template simple, ainsi que des macros. Par exemple :
.if (%isInner% == false) and ((%Visibility% == +) or (%Visibility% == *)) [%sourceHeader%\n\n]\ [%definition%\n\n] .foreach_item(ChildDependencies) [%isSameFile%?%InfluentObject.definition%\n\n] .next [%sourceFooter%\n] .endif
Ce template commence par une macro .if qui teste les valeurs des propriétés isInner et Visibility. Plusieurs variables sont encadrées par des crochets, qui font en sorte que le texte qu'ils encadrent (dans le cas présent, les caractères de passage à la ligne) ne sera pas généré si la variable est évaluée à void. La macro .foreach_item boucle sur tous les membres de la collection ChildDependencies.