Einführung in die Modelltransformation mit Xtend 12. Dezember 2012 Taentzer Modellgetriebene Softwareentwicklung 297
Überblick Xtend: Eine statisch getypte Sprache, die zur Modellzu-Text-Transformation eingesetzt werden kann Xtend ist Java-ähnlich, mit teilweise neuer Syntax Xtend interagiert nahtlos mit Java Xtend enthält einen Template-basierten Ansatz zur Modell-zu-Code-Transformation Open Source-Projekt im Eclipse Modeling Projekt: http://eclipse.org/xtend Taentzer Modellgetriebene Softwareentwicklung 298
Ein erstes Beispiel Taentzer Modellgetriebene Softwareentwicklung 299
Ein Codegenerator mit Xtend Im Paket org.xtext.example.mycm.generator Taentzer Modellgetriebene Softwareentwicklung 300
Start der Codegenerierung Resource nach Einstiegspunkt(en) für die Codegenerierung filtern Im Beispiel: Entity Name der Java-klasse festlegen, in die generiert wird Im Beispiel: e.fullyqualifiedname.tostring("/") + ".java Um fullyqualifiedname benutzen zu können, ist ein spezieller Service nötig, der über Dependency Injection mittels Google Guice bereitgestellt wird: import com.google.inject.inject in der Methode: @Inject extension IQualifiedNameProvider Taentzer Modellgetriebene Softwareentwicklung 301
Beispiel: Zwei Templates In MyClassModelgenerator.xtend: Guillements: Ctrl + < und Ctrl + > Syntaxvervollständigung: Ctrl + Space Taentzer Modellgetriebene Softwareentwicklung 302
Codegenerierungsprozess MWE2 Workflow: Grammatik in grammaruri Dateiendung in file.extensions Infrastrukturprojektname in projectname, Projekt in runtimeproject In Java geschriebener Generatorcode im Ordner xtend-gen: Codegenerierung im Anwendungsprojekt: Im Anwendungsprojekt: Erzeuge einen Source- Ordner src-gen Der generierte Code wird in diesen Ordner geschrieben. Taentzer Modellgetriebene Softwareentwicklung 303
Ein größeres Beispiel Code-Generierung aus einfachen Klassenmodellen Weitere Konzepte: Eine compile-methode pro Modellelementtyp Behandlung von Optionen Behandlung von Typvererbung im Modell Benutzung von Aufzählungen Erzeugung von Listen, z.b. Parameterlisten Navigation durch das Modell, um weitere Informationen zu sammeln Gut lesbaren Code erzeugen Taentzer Modellgetriebene Softwareentwicklung 304
Beispiel: Behandlung von Entity-Vererbung Da extends ein Java-Schlüsselwort ist, Umbenennung dieser Entity- Eigenschaft in supertype. Taentzer Modellgetriebene Softwareentwicklung 305
Beispiel: Behandlung von Aufzählungen Das Template: und seine Verwendung: Taentzer Modellgetriebene Softwareentwicklung 306
Generierung von Listen mit speziellen Formaten FOR-Schleifen können speziell konfiguriert werden: BEFORE fügt Text vor einer Iteration ein. AFTER fügt Text nach einer Iteration ein. SEPARATOR fügt Text zwischen Iterationen ein. BEFORE und AFTER werden für mind. eine Iteration ausgeführt, SEPARATOR für mind. zwei. Beispiel für BEFORE u. AFTER: Öffnende und schließende Klammern um jede Iteration Taentzer Modellgetriebene Softwareentwicklung 307
Behandlung von Zwischenräumen in der Ausgabe Der generierte Code soll gut lesbar sein. Deshalb werden Zwischenräume mitgeneriert. Es soll möglich sein, gut lesbaren Text jeglichen Formats (nicht nur Java-Code) zu erzeugen. Aber auch der Template-Code soll gut lesbar sein. Einrückungen der Kontrollkonstrukte (z.b. FOR, IF) werden nicht berücksichtigt. Zeilen, die keinen statischen Text enthalten, sondern Kontrollstrukturen oder Aufrufe, die leere Strings erzeugen, erscheinen nicht in der Ausgabe. Zwischenräume zwischen statischen Texten werden ausgegeben. Taentzer Modellgetriebene Softwareentwicklung 308
Navigation durch ein Model mit Vererbung Übergeordneter Container: econtainer Inhalt eines Eobject: econtents Selektion anhand des Typs: <obj> instanceof <type> Verwendung eines EObject als bestimmter Typ: <obj> as <type> Taentzer Modellgetriebene Softwareentwicklung 309
Zusammenfassung Xtend eignet sich zur Codeerzeugung Zum Generieren von Code wird IGenerator implementiert. Die Methode dogenerate wird überschrieben Weitere Template-basierte Methoden werden hinzugefügt. Zur Definition von Templates hat Xtend einfache Kontrollkonstrukte: for, if elseif else Berechnungen können in separaten Methoden durchgeführt werden. Zwischenräume können in den Templates explizit definiert werden. Taentzer Modellgetriebene Softwareentwicklung 310