Westfälische Wilhelms-Universität Münster Ausarbeitung Model Driven Architecture: AndroMDA im Rahmen des Seminars Software Engineering Thomas Korte Themensteller: Prof. Dr. Herbert Kuchen Betreuer: Christian Hermanns Institut für Wirtschaftsinformatik Praktische Informatik in der Wirtschaft Inhaltsverzeichnis 1 Motivation.................................................................................................................. 1 2 Grundlagen ................................................................................................................ 2 3 2.1 Model Driven Software Development ............................................................... 2 2.2 Model Driven Architecture ................................................................................ 3 AndroMDA ................................................................................................................ 5 3.1 Überblick ............................................................................................................ 5 3.2 Komponenten ..................................................................................................... 6 3.3 Vom Modell zum Quellcode ............................................................................ 10 3.3.1 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 4 5 Erstellen des UML-Modells...................................................................... 11 Einlesen des Modells in das Repository ................................................... 12 Festlegung der benötigten Cartridges ....................................................... 14 Instanziierung der Metafassaden .............................................................. 15 Auswahl der Templates ............................................................................ 16 Erstellung des Quellcodes anhand der Templates .................................... 17 AndroMDA in der praktischen Anwendung............................................................ 20 4.1 Anlegen eines AndroMDA Projektes............................................................... 20 4.2 Erstellen einfacher UML-Modelle ................................................................... 21 4.3 Generierung des Quellcodes ............................................................................ 22 Zusammenfassung und Fazit ................................................................................... 24 Literaturverzeichnis ........................................................................................................ 25 II Kapitel 1: Motivation 1 Motivation Effiziente Geschäftsprozesse bilden das Rückgrat einer jeden erfolgreichen Firma, sind sie doch der Kern eines jeden Unternehmens. Um eine Effizienzsteigerung zu erreichen bietet es sich häufig an die IT-Unterstützung der Geschäftsprozesse zu verbessern. Durch neue Techniken ergeben sich praktisch alle paar Jahre neue Möglichkeiten für die Unterstützung durch IT. Doch genau hier liegt das Problem. Nach einer Studie für das Jahr 2004, wurden nur 29% aller IT Projekte erfolgreich abgeschlossen [PT07]. Diese erschreckend niedrige Quote resultiert zum einen aus illusorischen Fristen und zu kleinen Budgets, zum anderen aus den ständig steigenden Anforderungen an die Software und dem damit verbundenen Komplexitätsanstieg. Da jedoch Fristen und Budget fast immer fixiert sind, kann als Ausgleich nur noch die Qualität der Software sinken. Neue, den Entwicklungsprozess unterstützende Techniken sind somit gefragt. Zwar wurden in den letzten Jahren, durch Entwicklungen wie Entwurfsmuster und Objektorientierte Sprachen, Fortschritte für den Entwicklungsprozess eines Projekts erreicht, dennoch wird dieser immer noch durch viele sich wiederholende Aufgaben geprägt. An dieser Stelle setzt die modellgetriebene Softwareentwicklung an, indem sie Teile der Anwendung selbständig generiert. Dabei handelt es sich vornehmlich um die Teile, die ausschließlich Fleißarbeit für die Entwickler bedeuteten. Durch die Generierung dieser Teile, kann sich der Entwickler voll und ganz auf die Implementierung der Geschäftslogik konzentrieren. Basis des modellgetriebenen Vorgehens ist das Modell der zu erstellenden Anwendung. Häufig werden die Modelle nur zu Beginn eines Projektes erstellt, um zu sehen wohin die Reise gehen soll. Sie dienten nur als Spezifikation und Dokumentation. Sobald mit der Implementierung gestartet wurde, gerieten sie häufig vollständig in Vergessenheit bzw. mussten mühsam im Nachhinein angepasst werden. Da die Modelle nun im Fokus des Entwicklungsprozesses stehen, sind sie automatisch aktuell. Dies führt zu weniger Wissensbindung durch Mitarbeiter und erleichtert die Einarbeitung neuer Mitarbeiter. Diese können anhand der aktuellen Modelle deutlich schneller produktiv an dem Entwicklungsprozess mitwirken. 1 Kapitel 2: Grundlagen 2 Grundlagen 2.1 Model Driven Software Development Die modellgetriebene Softwareentwicklung (Model Driven Software Development, MDSD) hat zum Ziel, möglichst viele Artefakte einer zu erstellenden Software generativ aus formalen Modellen abzuleiten [PT07]. Da nach [PM06] Artefakte Arbeitsergebnisse sind, die während eines Projektes produziert und benutzt werden, bedeutet dies, dass nicht nur der eigentliche Quellcode in großen Teilen automatisch generiert wird, sondern auch weitere wichtige Dokumente und Dateien generativ erstellt werden (z.B. Konfigurationsdateien, Dokumentationen, Datenbankskripte). [GPR06] und [PM06] sehen in der modellgetriebenen Entwicklung eine logische Konsequenz aus dem im Laufe der Zeit immer weiter steigenden Abstraktionsgrad von Programmiersprachen. Wie Abbildung 1 verdeutlicht, stehen Modellierungssprachen am derzeitigen Ende der Entwicklung von Programmiersprachen. Modellierungs sprachen Abstraktionsgrad Objektorientierte Sprachen Prozedurale Sprachen AssemblerSprache Maschinensprache Zeit Abbildung 1: Entwicklung von Programmiersprachen nach Abstraktionsgrad Der Grund für das Steigen des Abstraktionsgrads liegt nach [GPR06] in der steigenden Komplexität der Softwareentwicklung begründet. Steigt die Komplexität auf ein nicht mehr zu beherrschendes Ausmaß an, so war in der Vergangenheit ein Sprung auf die nächst höhere Abstraktionsstufe die Lösung. Nach dem gleichen Prinzip ist der Sprung hin zu den Modellierungssprachen als Entwicklungssprache nur logisch. 2 Kapitel 2: Grundlagen An dieser Stelle setzt die modellgetriebene Softwareentwicklung an, indem sie aus formalen Modellen, die mithilfe von Modellierungssprachen erstellt wurden, generativ große Teile der zu entstehenden Software erzeugt. Dieses Vorgehen hat den Vorteil, dass Änderungen nicht mehr am Quellcode selber erfolgen, sondern in den vorgelagerten Modellen durchgeführt werden. Hieraus ergibt sich, dass die bisher fast ausschließlich zur Spezifikation und Dokumentation erstellten Modelle automatisch konsistent gehalten werden und somit einen wesentlich leichteren Einstieg in den Entwicklungsprozess ermöglichen. 2.2 Model Driven Architecture Auf Basis der Idee des MDSD hat die Object Management Group (OMG) ein Framework für eben dieses modellgetriebene Vorgehen bei der Softwareentwicklung vorgestellt, die Model Driven Architecture (MDA). Im Jahr 2003 veröffentlichte die OMG eine MDA Spezifikation [OMG03], die jedoch nach Ansicht vieler Autoren auch heute noch wenig konkret ist (vgl. [PT07] S. 14 und [GPR06] S. 23). Es handelt sich somit weniger um eine genaue Spezifikation, als vielmehr um ein Konzept für modellgetriebenes Vorgehen. Kern des MDA Frameworks sind Modelle mit unterschiedlichen Abstraktionsebenen: • Computation Independent Model (CIM): Hierbei handelt es sich um eine umgangssprachliche Beschreibung von Zusammenhängen und Anforderungen der gewünschten Anwendung, ohne auf Details der Implementierung einzugehen. Technische Zusammenhänge entfallen somit vollständig. Vielmehr stellt das CIM eine Brücke zwischen zwei Welten dar; dem Domänenexperten auf der einen und dem Design- und Konstruktionsexperten auf der anderen Seite. • Platform Independent Model (PIM): An dieser Stelle wird die Anwendung mit einem formalen Modell beschrieben, welches implementierungstechnische Details enthält. Es bleibt jedoch unabhängig von der einzusetzenden Plattform und stellt somit ein generisches Modell dar. • Platform Specific Model (PSM): Das PSM ist im Wesentlichen ein um technische Details einer spezifischen Plattform (z.B. Java oder .Net) erweitertes PIM. Beispielsweise werden erst an dieser Stelle die Datentypen der konkreten Plattform verwendet. 3 Kapitel 2: Grundlagen Für den Schritt vom PIM hin zum implementierten Quellcode, gibt es im Wesentlichen zwei Wege. Zum einen über das PSM, zum anderen direkt vom PIM zum Code. Abbildung 2 illustriert diese zwei Varianten. Abbildung 2: Transformationsschritte der MDA Für den Weg über das PSM wird unter anderem ein metamodellbasiertes Vorgehen propagiert [OMG03, Abschnitt 3.10.2], das mit Hilfe von Metamodellen der beteiligten Modelle Transformationsregeln für die Überführung des PIM in das PSM festlegt. Wie dies im Einzelnen ablaufen soll, wird nicht genau spezifiziert. Die OMG liefert jedoch an dieser Stelle mit ihrer Query/View/Transformation Spezifikation [OMG08] eine umfassende Lösung für das Problem der model-to-model Transformation. QVT gehört zu der Meta Object Facility (MOF) [OMG06], einer Architektur, die ein Metametamodell für Modellierungssprachen darstellt. Die OMG stellt mit QVT einen Standard bereit, mit dem Abfragen und Transformationen auf (Meta-)Modellen definiert werden [Boh06]. Ziel ist es unter anderem, Modelle durch eine explizite Abfragesprache (Queries) und der daran angelehnten Transformationsbeschreibung zu transformieren [PT07, S. 71]. Dieses Vorgehen über das PSM, sollte im Rahmen der MDA den Normalfall darstellen. Die zweite Variante kommt ohne das PSM als Zwischenschritt aus. Für diese model-tocode Transformation direkt aus dem PIM, wird häufig ein auf Templates basierendes Verfahren angewendet. Mithilfe dieser Templates (Schablonen) der Zielsprache, wird das PSM durch eine Template Engine, wie beispielsweise Velocity [Vel08], in den eigentlichen Code überführt. Das PIM wird zu diesem Zweck häufig um wenige plattformspezifische Informationen erweitert. Dieser Punkt wird jedoch von [GPR06] kritisiert, weil somit die Trennung von Technik und Fachlichkeit geopfert wird. Es wird von einer Verunreinigung des Modells mit technischen Informationen gesprochen [GPR06, S. 179]. In den meisten MDA-Tools wird heutzutage die zweite Variante umgesetzt, da die sehr umständliche model-to-model Transformation häufig Probleme bereitet. Abgedeckt werden beide Varianten durch die MDA Spezifikation der OMG [OMG03, Abschnitt 3.6 und Abschnitt 3.7]]. 4 Kapitel 3: AndroMDA 3 AndroMDA 3.1 Überblick Bei AndroMDA handelt es sich um einen Open-Source MDA Generator, der in Java entwickelt wurde und unter der BSD-Lizenz steht. Er bezieht UML-Modelle als Input und liefert Quellcode als entsprechenden Output. Eine Entwicklungsumgebung oder ein Modellierungstool für die Erstellung der UML-Modelle sind nicht Bestandteil des Frameworks und müssen separat zur Verfügung gestellt werden. Zwar kann AndroMDA prinzipiell direkt über die Konsole angesprochen und bedient werden, jedoch wird von den Entwicklern dringend die Verwendung eines Build-ManagementTools empfohlen [Ando8b]. Hier wird dem Anwender explizit das Tool Maven nahe gelegt, da es hierfür schon eine Reihe von Plugins gibt, die die Verwendung von AndroMDA wesentlich vereinfachen. Zu beziehen ist AndroMDA über das Webportal Sourceforge, wo eine Vielzahl von Open Source Projekten verwaltet werden. Auf der Projekthomepage [And08] befinden sich einige Tutorials, sowie Dokumentationen zu den einzelnen Komponenten von AndroMDA. Es sei schon an dieser Stelle angemerkt, dass die Dokumentation von AndroMDA weder aktuell noch vollständig ist, und somit nicht als zufriedenstellend bewertet werden kann. Positiv herauszuheben ist jedoch das Supportforum [And08a] des Projekts, über welches der Anwender bei konkreten Problemen Hilfe von Entwicklern und anderen Anwendern bekommt. Prinzipiell erstellt AndroMDA Quellcode für beliebige Zielplattformen und Programmiersprachen wie Java und .Net. Diese Variabilität wird durch den Einsatz auswechselbarer Module, sogenannten Cartridges, erreicht. Vereinfacht ausgedrückt geben die Cartridges dem Generator vor, wie der zu generierende Quellcode aussehen muss, um den Anforderungen einer bestimmten Zielplattform bzw. Programmiersprache zu entsprechen. Das momentan aktuelle Release von AndroMDA ist Version 3.3 final, welche im April 2008 veröffentlicht wurde. Die Veröffentlichung der Vorgängerversion 3.2 final lag zu diesem Zeitpunkt eineinhalb Jahre zurück. Auch an einem komplett neuen Release 4.0 wurde gearbeitet, jedoch liegt dieses zurzeit auf Eis. Im Supportforum wird als Grund für den momentanen Stillstand genannt, dass ein Entwickler der ersten Stunde das 5 Kapitel 3: AndroMDA Projekt verlassen hat [And08a]. Die letzte Nachricht von Version 4.0 wurde im Mai 2007 in Form einer Preview auf den aktuellen Entwicklungsstand veröffentlicht. Desweiteren gibt es Bestrebungen unter dem Namen Android, eine AndroMDA IDE als Plugin für Eclipse zu entwickeln. Android erleidet jedoch momentan das gleiche Schicksal wie AndroMDA 4.0. Das letzte Lebenszeichen von Android gab es im Juni 2006 in Form einer Preview mit der Versionsbezeichnung 0.0.5 [And08c]. 3.2 Komponenten Bevor im Anschluss in Kapitel 3.3 der Weg vom Modell zum generierten Code im Detail erläutert wird, wird an dieser Stelle zunächst kurz auf die verschiedenen Komponenten des AndroMDA Frameworks eingegangen. Die genaue Funktionsweise der Komponenten und deren Zusammenspiel untereinander, ist ebenfalls Gegenstand von Kapitel 3.3 AndroMDA Core Da es sich bei AndroMDA um ein Framework handelt, das aus vielen Komponenten besteht, muss die Zusammenarbeit eben dieser Komponenten koordiniert werden. Dies ist Aufgabe des Kerns, welcher die Konnektoren der Komponenten beinhaltet. Über einen Plugin-Discovery-Mechanismus erkennt AndroMDA automatisch im Klassenpfad verfügbare Plugins, wie beispielsweise Cartridges und Translation Libraries. [PM06] Cartridges Die Cartridges sind der wichtigste Teil des Frameworks. Sie legen fest, wie aus einem gegebenen PIM, vorliegend als UML-Modell, der angestrebte Quellcode generiert wird. Doch es ist nicht nur eine Cartridge, die für den Code eines gesamten Projekts verantwortlich ist. Jede Cartridge ist nur für eine Zielarchitektur zuständig. So gibt es eine Reihe von verschiedenen Cartridges mit denen AndroMDA von Haus aus bestückt ist. In Tabelle 1 werden die mitgelieferten Cartridges kurz und übersichtlich dargestellt und deren Einsatzzweck erläutert. Anhand der mitgelieferten Cartridges erkennt man schnell, das AndroMDA speziell für den Einsatz im Rahmen von JavaEE Projekten erdacht wurde. Es gibt zwar auch eine .Net Cartridge inklusive einer kleinen Einführung in die Erstellung eines .Net Projektes, jedoch existiert keine Dokumentation zu der Cartridge an sich. Das Hauptaugenmerkt von AndroMDA liegt somit bislang eindeutig auf Java als Programmiersprache. 6 Kapitel 3: AndroMDA Name Beschreibung BPM4Struts BPM4Struts steht für „Business Process Modeling for Struts“. Diese Cartridge erstellt aus UML Aktivitätsdiagrammen und UML Anwendungsfalldiagrammen (Use-Cases) Struts-konforme Webapplikationen. jBPM Bei jBPM handelt es sich um eine Workflow-Engine die zur jBoss Produktlinie gehört [jBPM08]. Diese Cartridge generiert Prozessdefinitionen und Handler für jBPM aus UML Aktivitätsdiagrammen. JSF Erstellt Komponenten für die JavaServer Faces Technologie [JSF08] EJB Generiert CMP Entity Beans für die Datenschicht und/oder Sessions Beans für die Geschäftslogikschicht. Hibernate Dient dazu, eine komplette Hibernate Datenschicht zu erstellen. [Hib08] Java Generiert grundsätzliche Java Objekte aus statischen UML-Modellen Meta Erlaubt das Erstellen von Modellen für Metafassaden in UML, aus welchen die eigentlichen Metafassaden generiert werden können. Spring Mithilfe dieser Cartridge lassen sich Spring Komponenten für die Geschäftslogik erstellen [Spr08]. Sie muss zusammen mit der Hibernate Cartridge verwendet werden, um die Datenschicht zu gewährleisten. WebService Erstellt WSDD und WSDL Dateien für Apache Axis [Axis08] XML-Schema Generiert XMl-Schemata aus Klassenmodellen Tabelle 1: In AndroMDA standardmäßig verfügbare Cartridges Für jede der drei typischen Schichten einer Enterprise Applikation, gibt es entsprechende Cartridges. So lässt sich die Datenschicht entweder mit der Hibernate oder mit der EJB (CMP Entity Beans) Cartridge erstellen. Für die Geschäftslogikschicht stellt AndroMDA die Spring Cartridge oder wiederum die EJB Cartridge zur Verfügung. Die Präsentationsschicht kann mithilfe der BPM4Struts oder der JSF 7 Kapitel 3: AndroMDA Cartridge erzeugt werden. Hier ist festzustellen, dass bis jetzt lediglich Cartridges für Weboberflächen mitgeliefert werden. AndroMDA ist jedoch nicht auf die mitgelieferten Cartridges beschränkt. Vielmehr erlaubt das Framework das Verändern und Überschreiben vorhandener Cartridges. Aber auch das komplette Selbsterstellen und Einbinden von Cartridges ist möglich. Erläuterungen zum Vorgehen finden sich in [And08b]. Die Bestandteile einer Cartridge sind im hautpsächlich XML-Deskriptoren, diverse Metafassaden als Java Klassen und die benötigten Templates zur eigentlichen Codegenerierung. Diese Bestandteile befinden sich gepackt in einem JAR-Archiv, welches wiederum die Cartridge darstellt. Der wichtigste Deskriptor ist der Cartridge Deskriptor, der in Form einer cartridge.xml daher kommt. In ihm werden das Verhalten und der Leistungsumfang der Cartridge beschrieben. Dazu zählt, dass alle zur Verfügung stehenden Ressourcen an dieser Stelle zugeordnet werden. So werden alle benötigten Templates eingebunden und es wird festgelegt, welche Metafassaden sie verwenden um auf die Modellelemente zugreifen zu können [Loew07]. Ein zweiter wichtiger Deskriptor ist die metafacades.xml. Er sorgt dafür, dass den Metafassaden die entsprechenden Modellelemente anhand ihrer Stereotype zugeordnet werden [Loew07]. Die profile.xml enthält eine vollständige Aufzählung und Beschreibung der von der Cartridge unterstützen Stereotype und Eigenschaftswerten und ordnet die im Modell verwendete Bezeichnung der internen Bezeichnung zu [PM06]. Translation-Libraries Die Translation-Libraries dienen dazu, den an Modellen angefügten OCL-Code in eine für die Zielplattform geeignete Sprache (z.B. Java oder SQL) zu übersetzen. OCL bedeutet Object Constraint Language und ist Teil der UML Sprachfamilie. Mit OCL können beispielsweise dynamische Aspekte in Form von Bedingungen an UMLDiagramme angefügt werden. 8 Kapitel 3: AndroMDA Metafassaden Der Begriff Metafassade steht für Metamodell-Fassade. Wie schon am Begriff zu erkennen, handelt sich dabei um eine Ausprägung des Entwurfsmusters Fassade, dessen Aufgabe es ist, eine vereinfachte Schnittstelle für den Zugriff auf ein System bereitzustellen. So ist es Ziel der Metafassaden, die Komplexität des Metamodells vor den Templates zu verbergen und eine vereinfachte Schnittstelle auf die Metamodellinstanzen anzubieten. AndroMDA stellt in seinem Kern bereits ein Set von Metafassaden bereit, welche wichtige Methoden für den Zugriff auf das UML-Modell bereitstellt. Zusätzlich enthalten die Cartridges eigene interne Metafassaden, welche die Basis-Metafassaden um Methoden ergänzen, die speziell von den in der Cartridge enthaltenen Templates benötigt werden. Abbildung 2 illustriert den Sachverhalt anschaulich. Die Basis-Metafassaden (UML common) implementieren die verschiedenen unterstützen UML-Metamodelle (UML 1.4, UML 1.3 und UML 2.0) und werden durch den Einsatz der Cartridge-Metafassaden erweitert. Abbildung 3: Zusammenspiel der Metafassaden. Übernommen aus [And08b] 9 Kapitel 3: AndroMDA Ein weiterer Vorteil der Metafassaden als Schnittstelle zu den Metamodellinstanzen ist, dass eine Unabhängigkeit gegenüber dem zugrundeliegenden Metamodell besteht. Dem Template, welches nur die Methoden der Metafassade kennt, ist es egal, ob es sich um ein UML 1.4 oder ein UML 2 Modell handelt. Desweiteren können über die Metafassaden dynamische Aspekte, wie etwa Logikoperationen, bei der Generierung wahrgenommen werden. Repositories Repositories dienen AndroMDA dazu, ein gegebenes (UML-)Modell in den Speicher zu lesen und für die weitere Verarbeitung persistent zu halten. Bis Version 3.2 konnte AndroMDA nur UML 1.4 Modelle verarbeiten. Zu diesem Zweck gibt es das mitgelieferte Netbeans Meta Data Repository (MDR) [MDR08]. Seit Version 3.2 gibt es über das Eclipse Modeling Framework (EMF) [EMF08] eine Unterstützung für Modelle basierend auf UML2. Template Engines Für die Erzeugung von Code mithilfe von Templates wird eine sogenannte Template Engine benötigt. Sie sorgt dafür, dass die in den Templates integrierten Methodenaufrufe der Metafassaden durchgeführt werden, und somit die entsprechenden Informationen aus den Modellelementen ausgelesen werden. Die Template Engine füllt sozusagen das Template mit Informationen und gibt den daraus entstehenden Quellcode aus. Bei den Versionen 2.x von AndroMDA war Apache Velocity als Template Engine noch fest integriert. Bei Versionen 3.x ist Velocity zwar immer noch Bestandteil, jedoch bietet sich hier die Möglichkeit, andere Template Engines einzusetzen. 3.3 Vom Modell zum Quellcode Um das Zusammenspiel der Komponenten und die generelle Funktionsweise von AndroMDA besser zu verstehen, ist zu Beginn eine Übersichtsgrafik hilfreich, auf die im weiteren Verlauf des Kapitels bei Verständnisproblemen zurückgegriffen werden kann. In Abbildung 2 werden die Zusammenhänge der AndroMDA Komponenten dargestellt. 10 Kapitel 3: AndroMDA Abbildung 4: Übersicht des Zusammenspiels der AndroMDA Komponenten 3.3.1 Erstellen des UML-Modells Der erste Schritt auf dem Weg zum Quellcode ist das UML Modell der zu entwerfenden Anwendung. Damit das UML-Modell eine AndroMDA konforme Gestalt hat, wird zum Modellieren ein AndroMDA-eigenes UML-Profil verwendet. Durch das UML-Profil 11 Kapitel 3: AndroMDA wird beispielsweise vorgegeben, welche Stereotype, Eigenschaftswerte und Datentypen verwendet werden dürfen. Die Stereotype dienen dazu, die Modellelemente zu klassifizieren. Soll beispielsweise eine Klasse modelliert werden, die später eine Tabelle in einer relationalen Datenbank darstellen soll, so bekommt sie das Stereotyp «Entity». Dies kennzeichnet die Klasse als persistente Klasse. Die Eigenschaftswerte (Tagged Values) dienen dazu, dem Modell weitere Informationen hinzuzufügen. So kann einer persistenten Klasse beispielsweise mit auf den Weg gegeben werden, welchen Namen die entsprechende Tabelle in der Datenbank haben soll. Leider schränken die Eigenschaftswerte die Plattformunabhängigkeit des erstellten Modells ein. Da sie jedoch optional sind, kann sich der Entwickler im Vorhinein überlegen, ob sein Modell plattformunabhängig bleiben soll. Unterstützt wird die Plattformunabhängigkeit hingegen durch die Verwendung von plattformunabhängigen Datentypen. Über Mapping Dateien in den einzelnen Cartridges werden die Datentypen des UML Profils in die Datentypen der Zielplattform übersetzt. Weiterhin wird in [And08b] eine Reihe von Modellierungskonventionen festgelegt, die beim modellieren einzuhalten sind. Dazu zählen auf den ersten Blick selbstverständliche Hinweise, z.B. dass jedem Attribut zwingend einen Datentyp zugewiesen werden muss, aber auch wichtigere Konventionen gehören dazu. So dürfen dem Modell beispielsweise keine getter- und setter-Methoden hinzugefügt werden, da diese im Generierungsprozess automatisch erstellt werden. 3.3.2 Einlesen des Modells in das Repository Nach der Modellierung wird das UML-Modell dem entsprechenden Repository übergeben. Bei UML 1.4 Modellen erfolgt dies, indem das Modell im XMI Format (XML Metadata Interchange) abgespeichert wird und so direkt von der Netbeans MDR interpretiert werden kann. UML 2.0 Modelle müssen zunächst von einem geeigneten Modellierungstool oder einem anderen Programm mit Konvertierungsfunktion in den EMF/UML2 Standard exportiert werden, bevor das EMF Repository mit diesen arbeiten kann. Im Folgenden sei am Beispiel des Netbeans MDR kurz erläutert, wie ein Repository im Wesentlichen arbeitet. Zunächst benötigt das MDR das Metamodell der verwendeten 12 Kapitel 3: AndroMDA Modellierungssprache, in diesem Fall das UML 1.4 Metamodell. Für dieses Metamodell werden auf Basis von JMI (Java Metadata Interchange) [JMI08] Java Interfaces erstellt, die den Zugriff auf Objekte des Metamodells erlauben. Für jedes Objekt des Metamodells wird ein eigenes Java Interface generiert. Im Falle von UML gäbe es somit, vereinfacht ausgedrückt, Interfaces für (UML-)Klassen, Attribute, Operationen (Methoden), Assoziationen, etc. [Tho05]. Um das eigentliche Modell nun in das MDR einzulesen, wird es als Metamodellinstanz im XMI Format benötigt. Metamodellinstanz bedeutet, dass alle Elemente aus denen das Modell besteht, als Instanzen der jeweiligen Metamodellobjekte dargestellt werden. Beispielsweise ist jedes im Modell vorkommende Attribut eine Instanz des Objekts „Attribut“ des Metamodells. Auf Basis dieser Metamodellinstanz erstellt das MDR eine interne Repräsentation des Modells in Form eines Abstract Syntax Tree (AST). Jeder Knoten dieses Baums, also jedes Objekt bzw. Element der Metamodellinstanz wird durch ein eigenes Java Objekt repräsentiert. An dieser Stelle kommen nun die erstellten Java Interfaces ins Spiel, denn jedes dieser Java Objekte muss das entsprechende Java Interface implementieren, damit ein sicherer Zugriff von außen gewährleistet ist. Da das UML-Metamodell jedoch sehr komplex ist, bietet es sich an, dass die Templates später bei der Codegenerierung über vereinfachte Schnittstellen auf die Objekte der Metamodellinstanz zugreifen. Diese Schnittstellen sind die bereits im vorherigen Kapitel erwähnten Metafassaden, von denen die AndroMDA Engine zur Laufzeit Instanzen erzeugt. Abbildung 5 zeigt, wie der Zugriff auf ein Objekt der Metamodellinstanz funktioniert. Abbildung 5: Der Einsatz von Metafassaden. Übernommen aus [And08b]. 13 Kapitel 3: AndroMDA Bei der mit dem Stereotyp «metafacade» gekennzeichneten Klasse mit dem Namen ClassifierFacade, handelt es sich um eine Metafassade, die zu den im Kern von AndroMDA befindlichen Basis-Metafassaden gehört. Über diese Metafassade greift die Template Engine bei der Codegenerierung auf die Classifier Objekte der Metamodellinstanz zu. Zum besseren Verständnis: Bei Classifier handelt es sich unter anderem um eine Oberklasse von Class, welche für jede Klasse aus einem UML-Klassendiagramm instanziiert wird. Wie in Abbildung 5 zu sehen, delegiert die Metafassade den Zugriff weiter an das JMI Java Interface namens Classifier. Dieses Interface wird von der eigentlichen Implementierung des Metamodellobjekts, der Klasse ClassifierImpl, implementiert. An dieser Stelle kann die Frage aufkommen, warum das eigentliche Objekt des Metamodells nicht den Namen Classifier, sondern ClassifierImpl trägt. Der Grund dafür ist, dass bei Zugriffen von außen nach einem Objekt Classifier gesucht wird. Da der Zugriff aber über das Interface erfolgen soll, muss dieses stattdessen den Namen Classifier tragen. 3.3.3 Festlegung der benötigten Cartridges Mittels der Java Interfaces, traversiert AndroMDA nun über den Objektbaum und prüft, um welche Arten von Objekten es sich handelt. Anhand der Stereotype erkennt AndroMDA welche Cartridges benötigt werden und weist ihnen die entsprechenden Metafassadeninstanzen zu, welche stellvertretend für die Objekte der Metamodellinstanz stehen. Stößt die AndroMDA Engine beispielsweise auf eine Klasse, die mit dem Stereotyp «Service» gekennzeichnet ist, durchsucht sie die in dem Projekt eingebundenen Cartridges und stellt fest, welche dieser Cartridges für eine Klasse mit dem Stereotyp «Service» verantwortlich ist. Von den in AndroMDA enthaltenen Cartridges wären dies entweder die EJB oder die Spring Cartridge. Welche es im konkreten Fall ist, hängt davon ab, welche von beiden im Klassenpfad des Projekts eingebunden ist. Nehmen wir für den weiteren Verlauf an, es würde sich um die Spring Cartridge handeln. Anhand der profile.xml der Cartridge, erkennt die AndroMDA Engine, für welche Stereotype die Cartridge verantwortlich ist. Der folgende Auszug aus der profile.xml zeigt die Beschreibung der beiden Stereotype «Service» und «Entity»: 14 Kapitel 3: AndroMDA <elementGroup name="Stereotypes"> <element name="ENTITY"> <documentation> […] </documentation> <value>Entity</value> <appliedOnElement>class</appliedOnElement> </element> <element name="SERVICE"> <documentation> […] </documentation> <value>Service</value> <appliedOnElement>class</appliedOnElement> </element> </elementGroup> Neben einer textuellen Beschreibung, was mit dem Stereotyp gekennzeichnet wird (wurde aus Platzgründen weggelassen), wird in der profile.xml zusätzlich ein Mapping der Bezeichnungen festgelegt. Die Stereotype in den UML-Modellen werden «Service» und «Entity» geschrieben. Intern in den Metafassaden wird die Bezeichnung jedoch vollständig in Großbuchstaben verwendet, so wie es das <element name> Tag vorgibt. Das Tag <appliedOnElement> gibt an, bei welchen Modellelementen das Stereotyp verwendet wird. In diesem Fall handelt es sich um Stereotype für UML-Klassen. 3.3.4 Instanziierung der Metafassaden Nun weiß die Engine, dass die Spring Cartridge verwendet wird, um aus der Klasse mit dem Stereotyp «Service» eine dem Spring Framework entsprechende Java-Klasse zu generieren. Sie weist der Cartridge die Zuständigkeit in Form von Metafassadeninstanzen zu, welche stellvertretend für die Modellelemente stehen. Von welchen Metafassaden die Engine Instanzen erstellen muss, steht in der metafacades.xml. Wird zu diesem Zweck die metafacades.xml der Spring Cartridge betrachtet, so entdeckt man folgenden Eintrag: <metafacade class="org.andromda.cartridges.spring.metafacades. SpringServiceLogicImpl" contextRoot="true"> <mapping> <stereotype>SERVICE</stereotype> </mapping> […] </metafacade> 15 Kapitel 3: AndroMDA Für eine beim Traversieren des Objektbaums gefundene Klasse mit dem Stereotyp «Service», wird eine Instanz der Metafassade SpringServiceLogicImpl erstellt. 3.3.5 Auswahl der Templates Um mit der eigentlichen Codegenerierung zu beginnen, prüft die Cartridge anhand des Cartridge Deskriptors cartridge.xml, welches Template von der Template Engine zu verarbeiten ist. Der Cartridge Deskriptor enthält eine Aufzählung sämtlicher verfügbarer Templates und prüft nun für jedes dieser Templates, ob die Bedingungen zutreffen, die für das Erzeugen von Quellcode aus den Templates notwendig sind. Beispielhaft werden im Folgenden zwei Einträge aus der langen Liste aller Templates dargestellt, um die Arbeitsweise zu veranschaulichen. <template path="templates/spring/richclient/SpringClientTest.vsl" outputPattern="$generatedFile" outlet="client-test" overwrite="false" outputOnEmptyElements="false"> <modelElements> <modelElement variable="service"> <type name="org.andromda.cartridges.spring.metafacades. SpringService"> <property name="remotable"/> […] </type> </modelElement> </modelElements> </template> <template path="templates/spring/SpringService.vsl" outputPattern="{0}/{1}.java" outlet="service-interfaces" overwrite="true"> <modelElements variable="service"> <modelElement> <type name="org.andromda.cartridges.spring.metafacades. SpringService"> <property name="configonly">false</property> <property name="private">false</property> </type> </modelElement> </modelElements> </template> Der erste Eintrag stellt ein Template dar, welches wegen nicht zutreffender Bedingungen nicht ausgeführt werden würde. Aus Platzgründen wird an dieser Stelle 16 Kapitel 3: AndroMDA nicht auf jedes einzelne Tag eingegangen. Informationen über die verwendeten Tags liefert [And08b]. Damit ein Template zur Ausführung in die Template Engine gelangt, muss ein entsprechendes Modellelement existieren, welches mithilfe dieses Templates in Quellcode transformiert werden soll. Dies wiederum bedeutet, dass es eine entsprechende Metafassadeninstanz geben muss, welche stellvertretend das Modellelement darstellt. Das <type> Tag innerhalb des Tags <modelElement> gibt an, von welcher Metafassade eine Instanz benötigt wird. In diesem Fall ist dies eine Instanz der Metafassade SpringService. Dabei handelt es sich um ein Interface, welches von der SpringServiceLogicImpl implementiert wird. Von dieser Metafassade, wurde bereits eine Instanz erstellt. Die Bedingung, dass für das Template ein entsprechendes Modellelement existieren muss, trifft also zu. Durch das <property> Tag können noch weitere Bedingungen formuliert werden. In dem dargestellten Auszug des Cartridge Deskriptors, ist eine zusätzliche Bedingung festgelegt. Diese Bedingung fordert, dass es sich um eine Klasse handelt, die bei der Modellierung über einen Eigenschaftswert als remotable deklariert worden ist. Für unseren konkreten Fall wird festgelegt, dass der Service (darum handelt es sich bei dem Modellelement übrigens) nicht remotable ist. Die Bedingung trifft also nicht zu. Dies führt dazu, dass aus diesem Template kein Quellcode entsteht. Angenommen, der zu generierende Service habe die Sichtbarkeit public, so würde das Template, welches im zweiten Eintrag definiert wird, ausgeführt werden, und eine Java Klasse würde enstehen. Denn hier trifft zusätzlich die Bedingung zu, dass es sich nicht um eine Klasse mit der Sichtbarkeit private handelt. 3.3.6 Erstellung des Quellcodes anhand der Templates Ausgeführt wird die eigentliche Codegenerierung über die Template Engine. AndroMDA benutzt dafür standardmäßig die Velocity Engine [Vel08]. Deren Sprachumfang beschränkt Variablenoperationen, sich Schleifen, im Wesentlichen Verzweigungen auf und Anweisungen wie Zeichenkettenoperationen. Zusätzlich dazu besteht die Möglichkeit, Java Methoden aus einem Template heraus aufzurufen [Loew07]. Diese Möglichkeit erlaubt den Zugriff aus den Templates, über die Metafassaden, auf die Informationen der Modellelemente. Ein Template hat im Wesentlichen die Struktur, die auch die daraus entstehende Klasse haben muss. Zusätzlich zu den festen Java Fragmenten sind sowohl Anweisungen aus 17 Kapitel 3: AndroMDA dem Velocity Sprachumfang integriert, also auch Aufrufe von Methoden der Metafassade. Das folgende Template dient der Erstellung eines Spring Service Interfaces. // license-header java merge-point // // Attention: Generated code! Do not modify by hand! // Generated by: SpringService.vsl in andromda-spring-cartridge. // #if ($stringUtils.isNotBlank($service.packageName)) package $service.packageName; #end /** $service.getDocumentation(" * ") */ public interface $service.name #if ($service.generalization) extends $service.generalization.fullyQualifiedName #if (!$service.interfaceAbstractions.empty) , $service.implementedInterfaceList #end #else #if (!$service.interfaceAbstractions.empty) extends ${service.implementedInterfaceList} #end #end { ##do generate operation declarations for all implemented service ##interfaces as well when spring transactions are enabled ##(workaround for spring MethodMapTransactionAttributeSource, ##which does no map inherited interface methods) #if ($enableSpringTransactionsWhenEjbsEnabled.equalsIgnoreCase("true ") || !$ejbsEnabled) #set ($serviceOperations = $service.implementationOperations) #else #set ($serviceOperations = $service.operations) #end #foreach ($operation in $serviceOperations) /** $operation.getDocumentation(" * ") */ #if ($operation.exceptionsPresent) $operation.visibility $operation.returnType.fullyQualifiedName $operation.signature $operation.throwsClause; #else $operation.visibility $operation.returnType.fullyQualifiedName $operation.signature; #end 18 Kapitel 3: AndroMDA #end } Der in blau eingefärbte Code kennzeichnet die Velocity Sprachbefehle. Alles schwarz eingefärbte ist Java Code, der uneingeschränkt in den Zielquellcode übernommen wird. Mit der Raute (#) werden in Velocity Anweisungen gekennzeichnet. Dabei handelt es sich hauptsächlich um Bedingungen (#if und #else), das Setzen von Variablen (#set) und das Ausführen von Schleifen (#foreach). Velocity Kommentare werden mit einer Doppelraute (##) versehen und sind grün dargestellt. Die mit einem Dollarzeichen ($) gekennzeichneten Ausdrücke sind Variablen. Methodenaufrufe, die keine Parameter benötigen, können abgekürzt werden. So steht beispielsweise der Ausdruck fullyQualifiedName für die Methode getFullyQualifiedName(). Das Template beginnt mit Java Kommentaren, die besagen, dass es sich um generierten Code handelt, der nicht von Hand verändert werden darf. Darauf folgt die Deklaration des Interfaces (public interface). Über Bedingungen wird geprüft, ob und wenn ja von welcher Klasse das Interface erben soll (extends). Im anschließenden Block werden die Methoden deklariert. Hier sind fast ausschließlich Velocity Anweisungen zu erkennen und kein Java Code der die Methodenrümpfe füllt. Dies verwundert nicht, da es sich hier um ein Interface handelt, welche per Definition keine Methodenrümpfe besitzt. Aber auch wenn es sich um eine normale Klasse handeln würde, wären die Methodenrümpfe häufig leer, da die Geschäftslogik von Hand implementiert werden muss. Die Velocity Anweisungen fügen zum einen die Dokumentation der Methode ein (wenn verfügbar) und setzen, falls benötigt, die Exception Ausdrücke aus Variablen zusammen. Als Ergebnis liefert die Template Engine ein auf Basis des Templates entstandenes Java Interface, welches bereits vollständig implementiert ist. Es ist nicht nötig und auch nicht erlaubt, an dieses Interface manuell Hand anzulegen. Falls Änderungen notwendig sind, müssen diese im UML-Modell getätigt werden und das Interface wird vollständig neu generiert. 19 Kapitel 4: AndroMDA in der praktischen Anwendung 4 AndroMDA in der praktischen Anwendung 4.1 Anlegen eines AndroMDA Projektes Das hier verwendete Beispiel stellt Teile der Entwicklung einer JavaEE Anwendung mit Hilfe von AndroMDA dar. Hierfür sind eine Reihe von Programmen und Werkzeugen notwendig. Neben eines Java Development Kits (JDK) wird ein Applikationsserver, ein Modellierungstool und eine Datenbank benötigt. In diesem Beispiel wurden dazu der Applikationsserver JBoss [JBo08], das Modellierungstool MagicDraw [Mag08] und die Datenbank mySQL [SQL08] verwendet. Zur Steuerung von AndroMDA wird das Build-Management-Tool Maven genutzt. Maven wird mit bestimmten Befehlen, sogenannten Goals, über die Konsole gesteuert. Neben der Möglichkeit, AndroMDA zu steuern, wird von Maven die komplette Projektverwaltung übernommen, und zwar vom Erstellen der Projektstruktur über die Validierung, Testen, Packen, Kompilieren, bis hin zum Deployment auf einem Applikationsserver. AndroMDA selber wird als Plugin für Maven bereitgestellt und installiert. In [And08] ist eine „Schritt für Schritt“-Anleitung bereitgestellt, die die genaue Installation und Konfiguration der benötigten Komponenten erläutert. Auf eine genaue Ausführung im Rahmen dieser Ausarbeitung wird aus diesem Grund verzichtet. Das Erstellen eines Projektes wird über ein spezielles Maven Goal initiiert. Der dazu notwendige Konsolenbefehl wird von dem Pfad aus ausgeführt, in dem der Projektordner erstellt werden soll. Soll dieser auf Laufwerk C:/ erstellt werden, lautet das entsprechende Maven-Goal: C:\mvn org.andromda.maven.lugins:andromdapp-mavenplugin:3.3:generate Es wird der Befehl generate des AndroMDA Plugins Version 3.3 ausgeführt. In dem folgenden Dialog wird der Anwender dazu aufgefordert, die Details zu dem Projekt anzugeben. Dazu zählen beispielsweise der Projektname, die zu verwendende UML Version und die zu verwendenden Cartridges für die Persistenz- und die Geschäftslogikschicht. Im Anschluss daran erstellt Maven die Projektstruktur und legt sie dem Projektverzeichnis ab. Zur Unterstützung des Anwenders bzw. des Entwicklers, wird zusätzlich eine readme.txt erstellt, in der die Verzeichnisstruktur des Projekts und die benötigten Maven-Goals erläutert werden. Unser kleines Beispiel soll von einer 20 Kapitel 4: AndroMDA in der praktischen Anwendung Autovermietung handeln, weswegen der Projektname schlicht „Autovermietung“ lautet. Für die Daten- und Geschäftslogikschicht wird das Spring Framework in Verbindung mit Hibernate verwendet. Auf die Präsentationsschicht wird aus Platzgründen in dieser Ausarbeitung verzichtet. 4.2 Erstellen einfacher UML-Modelle Unter Verwendung des AndroMDA-eigenen UML-Profils wird MagicDraw zum Erstellen der UML-Modelle verwendet. Bei der Erzeugung des Projektes wurde ein leeres Modell im XMI Format erstellt und unter C:\autovermietung\mda\src\main\uml\autovermietung.xmi abgelegt. Dieses gilt es nun in MagicDraw zu öffnen und zu editieren. Ein stark vereinfachtes Datenmodell für den Fuhrpark einer Autovermietung könnte wie in Abbildung 6 dargestellt aussehen. Abbildung 6: Datenmodell der Autovermietung Der Fuhrpark besteht aus Fahrzeugen, welche jeweils einen Hersteller, eine Modellbezeichnung und ein Kennzeichen haben. Zusätzlich bekommen sie noch einen Fahrzeugtyp zugewiesen, der festlegt, ob es sich um einen PKW, einen LKW oder ein Motorrad handelt. Neben der Klasse Fahrzeug gibt es so noch eine Klasse Typ. Die Kardinalitäten geben an, dass jedem Fahrzeug ein Typ zugeordnet wird. Jeder Typ kann indes null bis unendlich viele Fahrzeuge repräsentieren. Die Geschäftslogik dieses Beispiels beschränkt sich auf eine einzige Methode, nämlich das Ermitteln der Daten eines Fahrzeugs. Zu diesem Zweck wird ein Spring Service erstellt, der in Abbildung 7 dargestellt ist. Abbildung 7: Modell der Geschäftslogik der Autovermietung 21 Kapitel 4: AndroMDA in der praktischen Anwendung Die Beziehung zwischen dem FahrzeugService und der persistenten Klasse Fahrzeug wird über eine Abhängigkeitsbeziehung modelliert. 4.3 Generierung des Quellcodes Nachdem die Modellierung abgeschlossen ist, wird über das Goal mvn install die Codegenerierung angestoßen. Dabei werden für jede der drei UML-Klassen, mehrere Java Klassen erstellt. Generell können die Klassen in zwei Gruppen einteilen. Die Klassen, die vollständig generiert wurden, kommen in ein spezielles Verzeichnis innerhalb der Projektstruktur und werden bei jedem erneuten Aufruf des Maven Goals mvn install überschrieben. Die zweite Gruppe sind Klassen, die manuellen Eingriff erfordern. Sie werden mit dem Zusatz „impl“ im Klassennamen gekennzeichnet und werden nicht von AndroMDA überschrieben. So ist sichergestellt, dass manuell implementierter Code nie verloren geht. Für die persistente Klasse Fahrzeug wurden folgende Klassen erstellt: • Fahrzeug.java: Diese Klasse stellt das eigentliche Entity dar. Hier sind die Attribute deklariert und die getter- und setter-Methoden implementiert. Bedingt durch die Assoziation zur persistenten Klasse Typ, erhält sie zusätzlich ein Attribut Typ. Anzumerken ist, dass es sich um eine abstrakte Klasse handelt. Sie lässt sich folglich nicht instanziieren. • Fahrzeugimpl.java: Hierbei handelt es sich um eine konkrete Unterklasse von Fahrzeug. Über Factory-Methoden der Fahrzeug Klasse, werden Instanzen dieser Klasse erzeugt. Zusätzlich dient sie dazu, manuellen Code zum Fahrzeug Entity hinzuzufügen. • FahrzeugDao.java: Diese und die beiden folgenden Klassen stellen zusammen das Konzept der Data Access Objects (DAO) dar, basierend auf dem gleichnamigen Entwurfsmuster. Durch die Verwendung der DAO, ist der Zugriff auf die Entities gekapselt. So ist es möglich die Datenbank auszutauschen, ohne die Entities selber anzupassen. Das Interface FahrzeugDao spezifiziert die sogenannten CRUD Methoden. CRUD steht für Create, Retrieve, Update und Delete. Sie dienen dem Zugriff auf die Objekte. • FahrzeugDaoBase.java: In dieser abstrakten Klasse werden die im Interface spezifizierten CRUD Methoden implementiert. 22 Kapitel 4: AndroMDA in der praktischen Anwendung • FahrzeugDaoImpl.java: Wie schon bei Fahrzeug und Fahrzeugimpl, dient auch hier die Klasse dem manuellen Hinzufügen von Code. FahrzeugDaoImpl ist Unterklasse der abstrakten Klasse FahrzeugDaoBase. • Fahrzeug.hbm.xml: Hierbei handelt es sich um eine Mapping Datei, die das Fahrzeug Entity auf den entsprechenden Eintrag in der Datenbank abbildet. Die generierten Java-Klassen für Typ entsprechen ebenfalls diesem Aufbau aus zwei Entity Klassen, drei DAO Klassen und einem Hibernate Deskriptor. Für den Spring Service wurden folgende Klassen erstellt: • FuhrparkService.java: Hierbei handelt es sich um ein Interface für den Zugriff auf den Service. Es spezifiziert die Methoden des Services, in diesem Fall die Methode ZeigeFahrzeugDaten(). • FuhrparkServiceBase.java: Implementiert das Interface und stellt Methoden bereit, um auf die DAO Objekte der Entities zuzugreifen. Auch die ZeigeFahrzeugDaten() Methode wird an dieser Stelle implementiert, indem sie auf eine Handler Methode namens handleZeigeFahrzeugDaten() der folgenden Klasse verweist. • FuhrparkServiceImpl.java: Hier wird die eigentliche Geschäftslogik eingefügt, indem der Rumpf von handleZeigeFahrzeugDaten() manuell implementiert wird. Das Beispiel sollte einen kleinen Einblick in die Arbeitsweise mit AndroMDA geben. Zusammenfassend lässt sich feststellen, dass die Klassen der Datenschicht vollständig generiert wurden. Es kann über die „impl“ Klassen zwar manuell Code hinzugefügt werden, jedoch ist dies nicht notwendig. Für die Geschäftslogik wird insgesamt weniger generiert, da die Methoden der Geschäftslogik vollständig selber implementiert werden müssen. 23 Kapitel 5: Zusammenfassung und Fazit 5 Zusammenfassung und Fazit Diese Ausarbeitung beschäftigte sich mit dem Tool AndroMDA. Nach einem Überblick über das Prinzip des Model Driven Software Development und der Model Driven Architecture, wurden die Komponenten des Tools beschrieben. Darauf folgte eine detaillierte Beschreibung des Wegs vom einfachen UML-Modell, hin zum generierten Quellcode. Abschließend wurde anhand eines sehr einfachen Beispiels, die praktische Anwendung des Tools demonstriert. Im Prinzip handelt es sich um einen gut nutzbaren Codegenerator mit brauchbaren Ergebnissen. Jedoch lassen die mitgelieferten Cartridges nicht viel Spielraum bei der Auswahl der Technologien eines Projekts. Es ist die klare Tendenz hin zu Java EE Projekten via Spring, Hibernate und Struts feststellbar. Zwar können dank der modularen Architektur eigene Cartridges und Metafassaden entwickelt werden, doch gilt es zu prüfen, ob der Aufwand der Entwicklung nicht die Einsparungen durch die Generierung von Code übersteigt. Ein weiterer Punkt ist die Modellierung. Zwar handelt es sich im Wesentlichen um normales UML, jedoch werden durch das AndroMDA-eigene Profil Vorgaben gemacht, die eingehalten werden müssen. Wird zu Beginn eines Projektes festgelegt, dass AndroMDA zum Einsatz kommt, stellt dies kein Problem dar. Jedoch müssen bereits vorhandene Modelle erst den Vorgaben entsprechend umgestaltet werden. Ein erfolgreicher Einsatz von AndroMDA bei der Lufthansa Systems zeigt aber, das AndroMDA durchaus für Großprojekte geeignet ist. [FB06] Der größte Knackpunkt ist aber die momentane Vernachlässigung des Projekts seitens der Entwickler. So liegen sowohl AndroMDA 4.0 als auch die AndroMDA IDE (Android) zurzeit auf Eis. Es ist nicht absehbar, ob es in naher Zukunft noch Updates geben wird. Ebenso fällt die lückenhafte und teilweise veraltete Dokumentation auf. Aufgrund dieser Vernachlässigungen werden im Supportforum vermehrt Fragen gestellt, ob das Projekt bereits gestorben sei. 24 Literaturverzeichnis Literaturverzeichnis [And08] AndroMDA: Projekthomepage. URL: http://www.andromda.org/, Abrufdatum: 6. November 2008. [And08a] AndroMDA: Supportforum. URL: http://forum.andromda.org/, Abrufdatum: 6. November 2008. [And08b] AndroMDA: Dokumentation für Release 3.3. URL: http://team.andromda.org/docs-3.3/, Abrufdatum: 6. November 2008. [And08c] Android: Update Site. URL: http://www.andromda.org/updatesite/, Abrufdatum 8. November 2008. [Axis08] Apache Axis: Projekthomepage. URL: http://ws.apache.org/axis/, Abrufdatum: 8. November 2008. [Boh06] Matthias Bohlen: QVT und Multi-Metamodell-Transformationen in MDA, OBJEKTspektrum, 02/2006, 2006. [BS03] Matthias Bohlen, Gernot Starke: MDA entzaubert, OBJEKTspektrum, 03/2003, S. 52-56, 2003. [EMF08] Eclipse Modeling Framework: Projekthomepage. URL: http://www.eclipse.org/modeling/emf/, Abrufdatum 9. Dezember 2008. [FB06] Peter Friese, Matthias Bohlen: Erfolgreicher Einsatz von AndroMDA bei Lufthansa Systems, OBJEKTspektrum, 03/2006, S. 62-68, 2006. [GPR06] Volker Gruhn, Daniel Pieper, Carsten Röttgers: MDA®, Effektives Software-Engineering mit UML 2® und EclipseTM, Springer-Verlag, 2006. [Hib08] Hibernate: Projekthomepage. URL: http://www.hibernate.org/, Abrufdatum: 8. Dezember 2008. [JBo08] JBoss: Projekthomepage. URL: http://www.jboss.org/, Abrufdatum 10. Dezember 2008. [jBPM08] JBoss jBPM: Projekthomepage. URL: http://www.jboss.org/jbossjbpm/, Abrufdatum 7. Dezember 2008. [JMI08] Java Metadata Interface: Produkthomepage. URL: http://java.sun.com/products/jmi/, Abrufdatum: 9. Dezember 2008. [JSF08] JavaServer Faces Technology: Projekthomepage. URL: http://java.sun.com/javaee/javaserverfaces/, Abrufdatum 6. Dezember 2008. 25 Literaturverzeichnis [Loew07] Christoph Loewer: Erstellen einer AndroMDA Cartridge, Orientation in Objects GmbH, 2007. URL: http://www.oio.de/andromda-cartridge.pdf, Abrufdatum: 9. Dezember 2008. [Mag08] MagicDraw UML: Produkthomepage. URL: http://www.magicdraw.com/, Abrufdatum 8. Dezember 2008. [Mav08] Apache Maven: Projekthomepage. URL: http://maven.apache.org/, Abrufdatum 10. Dezember 2008. [MDR08] Netbeans Meta Data Repository: Projekthomepage. URL: http://mdr.netbeans.org/, Abrufdatum 9. Dezember 2008. [OMG03] Object Management Group: Technical Guide to Model Driven Architecture: The MDA Guide v1.0.1, 2003. [OMG06] Object Management Group: Meta Object Facility (MOF) Core Specification, Version 2.0, 2006. [OMG08] Object Management Group: Meta Object Facility (MOF) 2.0 Query/View/Transformation Specification, 2008. [PM06] Roland Petrasch, Oliver Meimberg: Model Driven Architecture, Eine praxisorientierte Einführung in die MDA, dpunkt.verlag, 2006. [PT07] Georg Pietrek, Jens Trompeter: Modellgetriebene Softwareentwicklung, MDA und MDSD in der Praxis, entwickler.press, 2007. [Spr08] Spring Framework: Projekthomepage. URL: http://www.springframework.org/, Abrufdatum: 8. Dezember 2008. [SQL08] mySQL: Projekthomepage. URL: http://www.mysql.com/, Abrufdatum 10. Dezember 2008. [Tho05] Alexander Thomas: Einsatz von Massgeschneiderten Codegeneratoren auf Basis des „Java Metadata Interface“, OBJEKTspektrum, 02/2005, S. 1822, 2005. [Vel08] Velocity: Projekthomepage. URL: http://velocity.apache.org/, Abrufdatum: 6. Dezember 2008. 26