Wirtschaftsinformatik Im Rahmen des Seminars „Ausgewählte Themen des Softwareengineering“ Christian Mehring [email protected] 29.05.2007 Gliederung ■ Einführung ■ openArchitectureWare ■ Entwicklungsprozess ■ Beispielimplementierung ■ Modellierung ■ Metamodell ■ Modell ■ Modellüberprüfung ■ Generator ■ Code-Integration ■ Fazit 2 openArchitectureWare ■ Generatorframework zur Codeerzeugung aus Modellen ■ Ganzheitliche Unterstützung des Erstellungsprozesses ■ Ansatz: Metamodell + Templates ■ Ziel: Erzeugung von technischem, redundantem Code nicht 100% generieren, sondern die „langweiligen“ 50-70% ■ Unterstützung durch Eclipse-Plugins ■ Einsatzbeispiele ■ Webanwendungen ■ Embedded Systeme ■ Wissenschaftliche Anwendungen 3 OAW: Funktionsweise ■ Modell einlesen und überprüfen ■ Codeerzeugung ■ Modell wird an Generator übergeben ■ Template verarbeitet Modellelemente und erstellt Code EingabeModell MetamodellKlassen Parser MetamodellInstantiator Templates MetamodellInstanz Generierter Code Code Generator openArchitectureWare Quelle: Stahl, Völter (2005) 4 Entwicklungsprozess Referenzimplementierung (Meta-) Modellierung Domänenanalytiker Generatorentwicklung Domänenarchitekt Manuelle Implementierung Anwendungsentwickler 5 Beispielimplementierung ■ Web-Anwendung zur Produktbestellung ■ 4-Schichten Architektur ■ Möglichst wenig Code generieren, vorhandene Funktionalität nutzen ■ Java Enterprise Edition (JEE) ■ Spring Framework, insb. Webflow ■ Was lässt sich generieren? ■ EJB Modell: Datenhaltung, einfache Geschäftslogik ■ Spring Modell: Konfiguration, Actionklassen ■ Manuelle Implementierung: JSPs, erweiterte G‘logik 6 EJB Metamodell 7 EJB Modell ■ Generiert werden hieraus: ■ Entitybeans ■ Sessionbeans mit Datenmanipulations- und Lesemethoden für die referenzierten Entities 8 Spring Konfiguration: Metamodell View Zustandsautomat Daten und Anbindung G‘logik 9 Unterstützung für die Metamodellierung: xText Grammatik Metamodell: Entity : "entity" name=ID "{" (features+=Feature)+ "}" ; Abstract Feature: Attribute | Reference ; Attribute : "attr" type=Datatype name=ID ";" ; Reference : "ref" type=ID (multiple?"[]")? name=ID ("<->" oppositeName=ID)? ";" ; Grammatik-konformes Modell: entity Produkt { attr string name; attr int preis; } entity Bestellung { attr string datum; attr int menge; ref Produkt ware; } entity Kunde { attr int kundennummer; attr string name; attr string kennwort; ref Bestellung[] bestellungen <-> Bestellung; } erzeugt: Metamodell in Ecore, Parser, Editor, Fehlerprüfung 10 Zugriff auf das Modell: Expressions-Language ■ Wie arbeiten Metamodell und Modell zusammen? Expressions-Language Elemente: // Zugriff auf ein Attribut e.name bspw. „Kunde“ // Suche in Listen entities.select(e|e.features.size == 0); // Nur best. Typ selektieren features.typeSelect(Attribute); /* Eigene Expressions definieren */ // Alle Referenzen des Entities references(Entity this) : features.typeSelect(Reference); // Entityname für Javaklassennamen javaClassname(Entity this) : name.toFirstUpper(); 11 Modellüberprüfung: Check-Language ■ Syntaxfehler werden durch Editor vermieden ■ Überprüfungen auf semantische Beschränkungen: ■ Vom Modellierer festzulegen ■ Verwendet Expressions-Language ■ Vergleichbar mit der OCL, aber weniger detailliert ■ Generatorlauf nur bei fehlerfreier Prüfung ■ Direkte Prüfung bei Verwendung des xText-Editors ■ Beispiel: context Entity ERROR "Entities müssen eindeutig benannt sein: " + name : // silbings() gibt eine Liste mit den Geschwistern des Entities zurück silbings().select(e|e.name == name).size == 1; 12 Ergebnis der Modellierung ■ Analyse der Domäne ■ Warum Ecore in diesem Fall? ■ Einfachere API für den Zugriff ■ Probleme mit XMI-Datenformat für UML2 ■ Textbasierte Metamodellierung mit xText ■ Erzeugt Ecore Metamodell ■ Integriert Modellüberprüfungen ■ Eclipse-Editor zur Erstellung der Modelle ■ Eclipse-GMF als Erweiterung für grafische Modellierung ■ Das Modell ausbeuten! 13 Generator: Templatesprache Xpand ■ Wie kann das Modell in Code überführt werden? «IMPORT metamodel» «EXTENSION myJavaExtensions» «DEFINE javaClassImpl FOR Entity» «FILE name + ".java"» » javaFilename(this) /** Implementierung Implementierung für für Entity Entity «name» «name» */ */ /** public { publicclass class«name» «javaClassname(this)» { «FOREACHfeatures featuresAS ASthis» this» «FOREACH private«type» «type»«name»; «name»; private «ENDFOREACH» «ENDFOREACH» Datei Produkt.java }} «ENDFILE» /** Implementierung für Entity Produkt */ «ENDFILE» public class Produkt { «ENDDEFINE» private String name; private int preis; } 14 Generator: Eigenschaften und Anforderungen ■ Überlagern von Templates: «DEFINE javaClassImpl FOR Entity» «EXPAND implFeature FOREACH features» «ENDDEFINE» «DEFINE implFeature FOR Attribute» // generierter Code für das Attribut «ENDDEFINE» «DEFINE implFeature FOR Reference» // generierter Code für die Referenz «ENDDEFINE» ■ Erweiterungsmöglichkeiten ■ Expressions-Language ■ Java-Extensions ■ Einbinden vorgefertigter Generatoren: Cartridges ■ Erzeuge gut lesbaren Code: ■ Code-Beautifier zur Formatierung ■ Kommentare! ■ Modell und Template im Quelltext vermerken 15 Beispielimplementierung: Generatorstruktur 16 Code-Integration ■ Verknüpfung von automatischem und manuellem Code notwendig ■ „Never touch generated code!“ ■ Mögliche Ansätze ■ Problematisch: Geschützte Bereiche in generierten Dateien ■ Besser: Integration über Möglichkeiten der OOP ■ Recipes: Komponente zur Überprüfung der Integrationsrichtlinien in Eclipse ■ Versionierung ■ Metamodell und Modell ■ Templates und Generator-Konfiguration ■ Manuell erstellte Komponenten 17 Fazit generator ■ „A fool with a tool is still a fool!“ M. Völter ■ Komplex, hoher Einarbeitungsaufwand ■ Technisches Projektsetup: Eclipse-Plugin-Hölle ■ Zusammenspiel der Komponenten ■ Flexibel einsetzbar ■ Beliebige Metamodellierungen ■ Erweiterbarkeit ■ Auch für Spezialgebiete geeignet ■ Einsatz nur sinnvoll, wenn mehrfache Verwendung möglich ■ Alternativen prüfen OAW ist bei passenden Projektvoraussetzungen empfehlenswert. 18 Vielen Dank! ■ Fragen, Diskussion 19