Architekturzentrierte Modellgetriebene Softwareentwicklung
Architekturzentrierte Modellgetriebene Softwareentwicklung
Architekturzentrierte Modellgetriebene Softwareentwicklung
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
TU Wien<br />
Business Informatics Group<br />
Institut für Softwaretechnik und Interaktive Systeme<br />
Benedikt Weismann<br />
<strong>Architekturzentrierte</strong><br />
<strong>Modellgetriebene</strong> <strong>Softwareentwicklung</strong><br />
- Fallbeispiel und Evaluierung<br />
Magisterarbeit zur Erlangung des akademischen Grades<br />
eines Magister der Sozial- und Wirtschaftswissenschaften<br />
Eingereicht bei: o. Univ.-Prof. Mag. Dipl.-Ing. Dr. Gerti Kappel<br />
Betreuender Assistent: Univ.-Ass. Dipl.-Ing. Dr. Gerhard Kramler<br />
Wien, 15. September 2006
Eidesstattliche Erklärung<br />
Ich erkläre an Eides statt, dass ich die vorliegende Arbeit selbständig und ohne<br />
fremde Hilfe verfasst, andere als die angegebenen Quellen nicht benützt und die<br />
den benutzten Quellen wörtlich oder inhaltlich entnommenen Stellen als solche<br />
kenntlich gemacht habe.<br />
Wien, 15. September 2006 Benedikt Weismann<br />
ii
Danksagung<br />
Ich möchte mich bei o. Univ.-Prof. Mag. Dipl.-Ing. Dr. Gerti Kappel und Univ.<br />
-Ass. Dipl.-Ing. Dr. Gerhard Kramler für die Anregung zu dieser Magisterarbeit<br />
und für die fachliche Unterstützung bei der Erstellung der Arbeit bedanken.<br />
Mein besonderer Dank gilt meinen Eltern Margit und Christian Weismann, die<br />
mir mein Studium und somit auch vorliegende Arbeit ermöglichten. Des Weiteren<br />
möchte ich mich bei meinen Korrekturleserinnen Katharina Müller und Margit<br />
Weismann für ihre wertvollen Hinweise herzlich bedanken.<br />
iii
Kurzfassung<br />
In den vergangenen zwei Jahrzehnten hat Software eine immer stärkere Be-<br />
deutung in zahlreichen Geschäftsprozessen und alltäglichen Informationsflüssen<br />
erlangt. Sie stellt gewissermaßen das Fundament für diese Abläufe dar. Software<br />
ist somit zu einem bedeutenden Bestandteil vieler Unternehmen geworden. Als<br />
Folge dessen wird nach immer neuen Methoden im Bereich des Software Engi-<br />
neering gesucht, um die Entwicklungskosten zu senken, die Entwicklungszyklen<br />
zu verkürzen und die Qualität des Endprodukts zu erhöhen.<br />
Einer dieser Ansätze ist die <strong>Modellgetriebene</strong> Software Entwicklung (eng: Model<br />
Driven Software Development, kurz MDSD). Bei MDSD wird - basierend auf<br />
einem in den meisten Fällen graphischen Modell - durch Transformationen<br />
ein lauffähiger Sourcecode erzeugt. Anders als bei bisherigen Vorgangsweisen,<br />
haben Modelle im Rahmen von MDSD nicht vorrangig dokumentarischen Wert,<br />
sondern sind gleichbedeutend mit Sourcecode. MDSD versucht neben den bereits<br />
genannten Zielen auch den Grad an Wiederverwendung von Software zu steigern<br />
und Expertenwissen zu bündeln.<br />
Stahl und Völter beschreiben in ihrem Buch ” <strong>Modellgetriebene</strong> Software Ent-<br />
wicklung“ einen pragmatischen Ansatz, um mit Hilfe von MDSD und bereits<br />
heute verfügbaren Techniken den Infrastrukturcode einer Applikation bzw.<br />
einer ganzen Software-Systemfamilie zu generieren. Diesen Ansatz bezeichnen<br />
sie als architekturzentrierte-MDSD (eng: Architecture Centric MDSD, kurz<br />
AC-MDSD), weil es sich bei der adressierten Domäne um den Bereich der<br />
” Softwarearchitektur“ handelt. Es wird dabei versucht den Infrastrukturcode<br />
einer definierten Software-Systemfamilie möglichst vollständig zu generieren.<br />
Ziel dieser Magisterarbeit ist, AC-MDSD und den zur Umsetzung der Metho-<br />
dik zur Verfügung stehenden Toolkit ” openArchitectureWare“ kennen zu lernen,<br />
sowie die Praxistauglichkeit an Hand eines Fallbeispiels zu evaluieren. Als Fallbei-<br />
spiel wird die Domäne ” Softwarearchitektur für E-Businesssysteme“ behandelt,<br />
in deren Rahmen auf der Basis von Techniken aus dem J2EE-Bereich eine On-<br />
linebuchhandlung realisiert wird. Neben diesen praktischen Aspekten, sollen die<br />
für das Verständnis nötigen theoretischen Konzepte dargelegt werden und eine<br />
Abgrenzung zu verwandten Methoden wie MDA erfolgen.<br />
iv
Abstract<br />
During the last two decades the importance of software to support business<br />
processes and daily information flow raised continuously. Software is the basis<br />
for these procedures and therefore it is an essential part in every day life and<br />
business. Research on new methods of engineering software which offers lower<br />
development costs, shorter development cycles and software solutions with higher<br />
quality is the consequence of this trend.<br />
Model Driven Software Development (MDSD) is one of these approaches. It is<br />
based on the idea of generating executable source code from a mainly graphical<br />
model. Contrary to traditional methods MDSD related models are equal to<br />
source code and not just a medium for documentation. Besides of the already<br />
named targets MDSD tries to enhance the reuse of existing software components<br />
and to concentrate expert knowledge.<br />
Stahl and Völter describe in their book ” <strong>Modellgetriebene</strong> Software Entwicklung“<br />
( ” Model Driven Software Development“) a pragmatic way of generating the<br />
infrastructure code of an application with the help of MDSD in combination<br />
with already existing technologies. They call this approach architecture centric<br />
MDSD (AC-MDSD) because the addressed domain is software architecture. It<br />
is the aim to generate the complete infrastructure code of a family of software<br />
systems with AC-MDSD.<br />
The intention of this master thesis is to describe the ideas of AC-MDSD and to<br />
evaluate the method as well as the supporting toolkit ” openArchitectureWare“ on<br />
the basis of a case study. The case study implements with the help of technologies<br />
taken from the J2EE area an online book store. The addressed domain is called<br />
” software architecture for e-business systems“. Besides of these technical aspects<br />
the theoretical background of MDSD, which is necessary for understanding the<br />
approach, is explained. Additionally the differences and similarities with related<br />
methods, e.g., MDA are discussed.<br />
v
Inhaltsverzeichnis<br />
1 Einleitung 3<br />
2 MDSD, AC-MDSD und Begriffsdefinitionen 6<br />
2.1 Der MDSD-Ansatz . . . . . . . . . . . . . . . . . . . . . . . . . . 6<br />
2.2 Die MDSD-Ziele . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />
2.3 Terminologie und Allgemeine Konzepte . . . . . . . . . . . . . . . 10<br />
2.4 AC-MDSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
2.5 Vorurteile gegenüber <strong>Modellgetriebene</strong>n Entwicklungsansätzen . . 18<br />
3 Vergleich mit verwandten Methodiken 20<br />
3.1 MDSD vs. MDA - Gemeinsamkeiten und Unterschiede . . . . . . 20<br />
3.2 MDSD vs. Software Product Line Engineering - Mögliche Syner-<br />
gieeffekte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
3.3 MDSD vs. Agile Software Development - Ist eine Kombination<br />
möglich? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
4 Entwicklungsprozess, Vorgehensweise und Best Practices 30<br />
4.1 Iterative, zweigleisige Entwicklung . . . . . . . . . . . . . . . . . . 30<br />
4.2 Architektur-Entwicklungsstrang . . . . . . . . . . . . . . . . . . . 31<br />
4.3 Anwendungs-Entwicklungsstrang . . . . . . . . . . . . . . . . . . 35<br />
5 Einführung in openArchitectureWare 37<br />
5.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
5.2 Funktionsweise des Generators . . . . . . . . . . . . . . . . . . . . 38<br />
5.3 Eclipse Plugin: Installation und erste Schritte . . . . . . . . . . . 39<br />
5.4 Ablaufsteuerung mittels des Workflow Konzepts . . . . . . . . . . 45<br />
5.5 Modellierung und Metamodellentwicklung mit Hilfe von UML . . 46<br />
5.6 Templateentwicklung mittels Xpand . . . . . . . . . . . . . . . . . 51<br />
5.7 Expressions Framework . . . . . . . . . . . . . . . . . . . . . . . . 56<br />
5.8 Extend Language . . . . . . . . . . . . . . . . . . . . . . . . . . . 57<br />
1
Inhaltsverzeichnis 2<br />
5.9 Constraint Checking . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />
6 Fallbeispiel 60<br />
6.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60<br />
6.2 Das Anwendungsbeispiel . . . . . . . . . . . . . . . . . . . . . . . 61<br />
6.3 Domäne und Technologien . . . . . . . . . . . . . . . . . . . . . . 64<br />
6.4 Domänenarchitektur . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
6.5 Metamodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75<br />
6.6 Transformationsvorschriften - Xpand . . . . . . . . . . . . . . . . 89<br />
6.7 Ablaufsteuerung - Workflow . . . . . . . . . . . . . . . . . . . . . 93<br />
6.8 Erweiterungsmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . 96<br />
6.9 Vorgangsweise, Herausforderungen und Codeanalyse . . . . . . . . 98<br />
7 Evaluierung 104<br />
7.1 Wann ist MDSD sinnvoll? . . . . . . . . . . . . . . . . . . . . . . 104<br />
7.2 Vorteile und betriebswirtschaftliche Auswirkungen . . . . . . . . . 106<br />
7.3 Nötige Investitionen . . . . . . . . . . . . . . . . . . . . . . . . . . 109<br />
7.4 Mögliche Hindernisse für eine Verbreitung . . . . . . . . . . . . . 111<br />
8 Zusammenfassung und Ausblick 113<br />
Abbildungsverzeichnis 116<br />
Tabellenverzeichnis 118<br />
Listings 119<br />
Literaturverzeichnis 120
1 Einleitung<br />
In den vergangenen zwei Jahrzehnten hat Software eine immer stärkere Be-<br />
deutung in zahlreichen Geschäftsprozessen und alltäglichen Informationsflüssen<br />
erlangt. Sie stellt gewissermaßen, das Fundament für diese Abläufe dar. Software<br />
ist somit zu einem bedeutenden Bestandteil vieler Unternehmen geworden.<br />
Dem gegenüber steht eine Vielzahl an Projekten bei denen sowohl die Budgets<br />
überschritten als auch die Designziele verfehlt werden. Viele Hersteller sind<br />
so mit ständig wechselnden Implementierungstechnologien beschäftigt, dass<br />
keine Zeit für Produktivitätsüberlegungen und Risikominimierung bleibt. Weder<br />
schwergewichtige dokumentenlastige Entwicklungsprozesse noch CASE-Tools 1<br />
können/konnten Abhilfe schaffen.<br />
In den letzten Jahren rückten aus diesen Gründen sowohl agile Entwicklungs-<br />
prozesse als auch die Bedeutung von Modellen für das Software Engineering<br />
vermehrt ins Zentrum des Interesses. Die steigende Bedeutung von Modellen ist<br />
nicht zuletzt auf die Definition und Verbreitung der Unified Modeling Language<br />
kurz UML zurückzuführen. Es gibt mittlerweile eine Vielzahl an Modellierungs-<br />
tools, die in der Lage sind aus dem Modell einer Anwendung Teile der späteren<br />
Implementierung zu generieren. Problematisch in diesem Zusammenhang ist<br />
der Umstand, dass die Domäne in der die Anwendung angesiedelt ist, keinerlei<br />
Auswirkung auf den generierten Sourcecode hat. Es wird auf Basis eines ” One-<br />
Size-Fits-All!“-Ansatzes gearbeitet. Der generierte Code muss somit für alle<br />
Eventualitäten und Einsatzbereiche geeignet sein. Das führt leider oft zu einer<br />
Unzulänglichkeit des Generats und erfordert viel manuelle Zusatzarbeit um die<br />
Lücke zwischen Generat und Zielplattform zu schließen. Zudem sind die meisten<br />
dieser Tools nicht in der Lage Designänderungen iterativ auf einen bestehenden<br />
Quellcode zu übertragen. Letzten Endes nehmen die Modelle hier nur den Status<br />
einer Dokumentation ein und fallen auf Grund der rein gedanklichen Verbindung<br />
zwischen Modell und Sourcecode oftmals dem Zeitdruck zum Opfer.<br />
Einen anderen Weg gehen modellgetriebene Ansätze wie Model Driven Software<br />
Development kurz MDSD oder Model Driven Architecture kurz MDA. Hier<br />
1 Computer Aided Software Engineering-Tools unterstützen Softwareentwickler bei Planung<br />
Design und Umsetzung einer Anwendung (siehe auch [cas06]).<br />
3
1 Einleitung 4<br />
haben Modelle den selben Stellenwert wie Sourcecode, da ein Großteil der<br />
Implementierung aus ihnen generiert wird. Der Generierungsfaktor liegt bei<br />
diesen Techniken deutlich höher, da streng domänenspezifisch gearbeitet wird.<br />
<strong>Modellgetriebene</strong> Ansätze versuchen einen Großteil der Implementierungsarbeit<br />
auf die gegenüber dem Quellcode abstraktere Ebene formaler domänenorien-<br />
tierter Modelle zu verlagern. So werden die zentralen Konstruktionsparadigmen<br />
einer Anwendung in unverschleierter Form bewahrt, was auf dem detaillierten<br />
Niveau von Quellcode nicht mehr möglich ist.<br />
Den Ausgangspunkt dieser Arbeit bildet das Buch <strong>Modellgetriebene</strong> Softwareent-<br />
wicklung - Techniken, Engineering, Management von Thomas Stahl und Markus<br />
Völter ( [SV05]) in dem ein pragmatischer modellgetriebener Ansatz, die so<br />
genannte Architekurzentrierte-MDSD, vorgestellt wird. Dieser Ansatz fokussiert<br />
auf die Domäne ” Softwarearchitektur“ und arbeitet mit technisch motivierten<br />
Modellen. Ziel ist es anhand eines Fallbeispiels die Praxistauglichkeit der Metho-<br />
dik und des dazu passenden Open Source MDSD-Tools openArchitectureWare<br />
kurz oAW ( [oaw05]) festzustellen.<br />
Die Arbeit gliedert sich in drei Bereiche. Der erste Teil (Kapitel 2 bis 4) gibt<br />
eine Einführung in die theoretischen Grundlagen, die dem besseren Verständnis<br />
des zweiten praxisorientierten Abschnitts (Kapitel 5 bis 6) dienen. Der dritte<br />
Teil(Kapitel 7) beschließt die Arbeit mit einer Evaluierung auf Basis betriebs-<br />
wirtschaftlicher Kriterien.<br />
Kapitel 2 erklärt den Ansatz von MDSD im Allgemeinen und von AC-MDSD im<br />
Speziellen. Des Weiteren werden die zentralen Begriffe der Methodik definiert.<br />
Kapitel 3 vergleicht MDSD mit verwandten Ansätzen wie MDA beziehungs-<br />
weise mit stark beeinflussenden wie Software Product Line Engineering und<br />
Agile Software Development. In Kapitel 4 wird beschrieben welche Tätigkeiten<br />
ein Entwicklungsprozess mit MDSD umfasst, und wie er koordiniert werden kann.<br />
Der praktische Teil der Arbeit wird mit Kapitel 5 eingeleitet, das eine Einführung<br />
in das benutzte Tool openArchitectureWare gibt. Im folgenden Kapitel wird<br />
das Fallbeispiel und dessen Umsetzung mit Hilfe von oAW geschildert. Es wird<br />
explizit auf die verwendeten Technologien, die Softwarearchitektur und das<br />
beschreibende Metamodell eingegangen. Abgeschlossen wird das Kapitel mit<br />
einer Beschreibung der Vorgangsweise, den Herausforderungen und einer Analyse<br />
des Quellcodes hinsichtlich des erzielten Generierungsfaktors.
1 Einleitung 5<br />
Im dritten Teil erfolgt die Evaluierung in Hinblick auf die Methodik aus dem<br />
betriebswirtschaftlicher Sicht. Es wird gezeigt welche Vorteile MDSD für eine<br />
Organisation im Gesamten mit sich bringen kann, und wodurch der einzel-<br />
ne Entwickler profitiert. Des Weiteren werden nötige Investitionen, die die<br />
Einführung der Methodik mit sich bringt, erörtert und die Frage nach sinnvollen<br />
Einsatzgebieten gestellt. Darüber hinaus werden mögliche Hindernisse für eine<br />
Verbreitung aus heutiger Sicht diskutiert.<br />
Sämtliche Daten zum Fallbeipiel aus Kapitel 6 befinden sich auch auf der der<br />
Arbeit beiliegenden CD-ROM in Form eines Eclipse Workspaces.
2 MDSD, AC-MDSD und<br />
Begriffsdefinitionen<br />
2.1 Der MDSD-Ansatz<br />
Jede Anwendung besteht aus einer Reihe von Konstruktionsparadigmen, deren<br />
Art der Implementierung eine direkte Auswirkung auf Qualitätsmerkmale wie<br />
Wiederverwendbarkeit, Wartbarkeit, Performance, etc. hat. Auf Ebene des<br />
Quellcodes sind diese Muster nicht mehr klar erkennbar, da sie auf Grund des<br />
geringen Abstraktionsniveaus von zahlreichen Details verschleiert werden. Aber<br />
gerade diese Ideen hinter einer Software, in die ein Großteil des intellektuellen<br />
Aufwands während der Entwicklung einfließt, sind der wertvollste weil langle-<br />
bigste Bestandteil.<br />
Aus eben genannten Gründen wird in vielen Projekten versucht, die interne<br />
Struktur in Modellen zu dokumentieren um sie fassbar zu machen. Problematisch<br />
ist in diesem Zusammenhang, dass zwischen Modell und Code nur eine gedank-<br />
liche Verbindung besteht, die später von einem Entwickler manuell umgesetzt<br />
werden muss. Das Modell stellt also nur eine Form der Dokumentation dar. Diese<br />
Arbeitsweise nennt man modellbasiert.<br />
Auf Grund des für die Projektbeteiligten nicht klar erkennbaren Zusatznutzen<br />
der Modelle, fallen diese meist dem Zeitdruck zum Opfer, oder sind nicht<br />
auf dem aktuellen Stand, da sie als reiner Overhead betrachtet werden. Auch<br />
so genannte Round-trip Engineering Tools 1 schaffen meist keine Abhilfe, da<br />
es mit ihnen nicht möglich ist echte Abstraktion zu schaffen. Die von diesen<br />
Tools erzeugten Modelle liegen auf dem selben Abstraktionsniveau, wie der<br />
Programmcode. Echte Abstraktion hingegen ist eine intellektuelle Tätigkeit, die<br />
einen Informationsgewinn darstellt und daher manuell durchgeführt werden muss.<br />
1 Round-trip Engineering Tools führen eine Synchronisation zwischen einem Modell und dem<br />
zugehörigen Quellcode durch. Das Abstraktionsniveau des Modells rutscht dabei allerdings<br />
auf jenes des Quellcodes ab.<br />
6
2 MDSD, AC-MDSD und Begriffsdefinitionen 7<br />
Einen anderen Weg beschreitet die modellgetriebene Vorgangsweise, bei der die<br />
entworfenen Modelle den selben Stellenwert wie der Quellcode einnehmen, da<br />
sie gleichbedeutend mit ihm sind. Der Übergang vom Modell zum Code wird<br />
automatisiert mit Hilfe eines Generators und einer Reihe definierter Transfor-<br />
mationsvorschriften vorgenommen. Diesen Ansatz nennt man <strong>Modellgetriebene</strong><br />
<strong>Softwareentwicklung</strong> oder Model Driven Software Development kurz MDSD.<br />
Bei MDSD werden Modelle als abstrakt und formal zugleich angesehen. Sie<br />
sind abstrakt, da implementierungsspezifische Details weggelassen werden.<br />
Die Modelle zeigen ausschließlich Eigenschaften, die das Verständnis für die<br />
Problemstellung fördern. Formal sind diese Modelle, da sie sich an einer Domain<br />
Specific Language (DSL) orientieren.<br />
Bei MDSD stehen die benutzten Modelle immer im Kontext eines abgegrenzten<br />
Problemraums, der Domäne. Die Konzepte dieser Domäne werden mit einer<br />
für sie spezifischen Sprache beschrieben, der DSL. Eine DSL kann zum Beispiel<br />
durch ein UML-Profil abgebildet werden.<br />
Ein Hauptbestandteil der DSL ist das Metamodell der Domäne (siehe Abschnitt<br />
2.3.1). Es ist auch dem Generator bekannt. Auf diese Weise kann aus dem Modell<br />
bedeutend mehr ” herausgeholt“ werden, als es mit einem allgemeinen domänenu-<br />
nabhängigen Generator der Fall ist. Der MDSD-Ansatz unterscheidet sich somit<br />
auch auf Seite der Generatoren von aktuellen CASE-Tools, bei denen zumeist<br />
ein ” One Size fits all!“-Ansatz verfolgt wird. Hier wird nicht auf den spezifischen<br />
Einsatzzweck einer Software geachtet, sondern das Generat folgt stets den selben<br />
Designparadigmen. Dadurch ist einerseits der erzielbare Generierungsfaktor<br />
niedriger als bei einem domänenspezifischen Ansatz und andererseits wird mit<br />
hoher Wahrscheinlichkeit den geforderten Qualitätskriterien nicht Genüge getan.<br />
Um die Generierung zu vereinfachen und den erzeugten Quellcode nicht auf der<br />
” nackten“ Programmiersprache aufbauen zu müssen, werden domänenspezifische<br />
Plattformen eingesetzt. Sie bilden den zweiten Eckpfeiler von MDSD. Eine Platt-<br />
form setzt sich aus Komponenten und Frameworks zusammen. Diese Bestandteile<br />
sind für alle Anwendungen einer Domäne gleich. Der Einsatz höherwertiger APIs<br />
erleichtert den Entwurf der nötigen Transformationsvorschriften ungemein, da<br />
dem Generat ein Stück des Weges entgegengekommen wird.<br />
Abbildung 2.1 stellt die Zusammenhänge bei der Entwicklung mit MDSD dar.<br />
Betrachtet man den Quellcode eines beliebigen Mitglieds einer Softwaresys-
2 MDSD, AC-MDSD und Begriffsdefinitionen 8<br />
Abbildung 2.1: Grundidee <strong>Modellgetriebene</strong>r <strong>Softwareentwicklung</strong> (Quelle:<br />
[SV05] Seite 17)<br />
temfamilie (siehe Abschnitt 2.3.3) handelt es sich dabei auf den ersten Blick<br />
um ein Unikat. Strukturiert man den Code allerdings um und kategorisiert<br />
ihn, ergeben sich drei Bereiche. Zum einen existiert ein generischer Codeanteil,<br />
der über alle Anwendungen der Systemfamilie gleich ist. Zum anderen verfügt<br />
jedes ” Familienmitglied“ über einen Quellcode, der sich schematisch wiederholt<br />
und bestimmten Designmustern folgt. Der dritte Bereich wird durch einen<br />
individuellen Codeanteil gebildet. Dieser ist von Anwendung zu Anwendung<br />
unterschiedlich und folgt keinen durchgängigen Schemata.<br />
Es ist nun nahe liegend den gemeinsamen, generischen Codeanteil auszulagern.<br />
Das heißt, ihn nur einmal zu implementieren und anschließend wiederzuverwen-<br />
den. Diese Komponenten bilden zusammen die domänenspezifische Plattform.<br />
Die Implementierung des schematischen Codes ist in vielen Fällen eine reine ” Co-<br />
py & Paste“ Arbeit mit anschließender Nachbearbeitung. Diese Arbeitsschritte<br />
können durch einen Generator automatisiert werden. Der Generator benötigt für<br />
ein effizientes Arbeiten drei Dinge: erstens ein Modell der Applikation, zweitens<br />
eine DSL an der sich auch die Modelle orientieren und drittens eine Reihe von<br />
Transformationsvorschriften zur Ausgabesteuerung. Der individuelle Codeanteil,<br />
zum Beispiel fachspezifische Logik, muss manuell von einem Entwickler ergänzt<br />
werden.<br />
Zusammengefasst ist das Ziel von MDSD die automatisierte Erstellung von<br />
schematischen Codeanteilen der Applikationen einer Software-Systemfamilie,
2 MDSD, AC-MDSD und Begriffsdefinitionen 9<br />
aufbauend auf einer domänenspezifischen Plattform. Eine eingehende Behand-<br />
lung, der Ziele die mit MDSD verfolgt werden, nimmt Abschnitt 2.2 vor.<br />
Jorn Bettin, eine der treibenden Kräfte hinter der MDSD-Initiative, formuliert<br />
in [Bet06d] Seite 8 die im Folgenden frei zitierten Themenkreise, die von MDSD<br />
angeschnitten werden:<br />
• Domänenanalyse<br />
• Metamodellierung<br />
• <strong>Modellgetriebene</strong> Generierung<br />
• Templatesprachen<br />
• Domänengetriebene Framework-Entwicklung<br />
• Prinzipien agiler <strong>Softwareentwicklung</strong><br />
• Entwicklung und Nutzung von Open Source Infrastruktur<br />
2.2 Die MDSD-Ziele<br />
Stahl und Völter beschreiben in [SV05] Abschnitt 2.2 die von MDSD verfolgten<br />
Ziele. Sie weisen explizit darauf hin, dass diese nicht neu sind, sondern ” so etwas<br />
wie den >> heiligenGral
2 MDSD, AC-MDSD und Begriffsdefinitionen 10<br />
• Zentrale Fehlerbehebung: Fehler, die im schematischen Codeanteil auf-<br />
treten, können an einer Stelle - den Transformationsvorschriften - behoben<br />
werden. Danach sind sie in allen generierten Codeteilen beseitigt und treten<br />
auch in zukünftigen Anwendungen nicht mehr auf. Darüber hinaus bieten<br />
die Transformationsvorschriften Gelegenheit querschnittlich verteilte Imple-<br />
mentierungsaspekte gebündelt umzusetzen.<br />
• Steigerung der Wiederverwendung: Architektur, DSL und Transfor-<br />
mationsvorschriften werden einmal erstellt und anschließend laufend ver-<br />
bessert. Diese Artefakte werden, ähnlich einer Produktionsstraße in der<br />
industriellen Fertigung, zur Erstellung beliebig vieler Anwendungen her-<br />
angezogen. Durch diese Vorgangsweise kommt es auch zu einer Bündelung<br />
von Expertenwissen.<br />
• Handhabbarkeit von Komplexität durch Abstraktion: Problemori-<br />
entierte Modellierungssprachen sind weit abstrakter als Programmierspra-<br />
chen. Dadurch bleibt viel implementierungsspezifische Komplexität verbor-<br />
gen.<br />
Stahl und Völter halten abschließend fest, dass die zwei Ziele Interoperabilität und<br />
Portabilität des sehr verwandten MDA-Ansatzes (siehe 3.1) erst durch die von der<br />
Object Managment Group (OMG) angestrebten Standardisierungen ermöglicht<br />
werden. Zur Zeit fallen sie einem durchaus angebrachten Pragmatismus zum Op-<br />
fer (siehe Abschnitt 3.1.2).<br />
2.3 Terminologie und Allgemeine Konzepte<br />
Die in MDSD genutzte Terminologie ist dem sehr verwandten Ansatz Model<br />
Driven Architecture kurz MDA entliehen. Dieser Ansatz wurde von der OMG<br />
entwickelt und standardisiert. Auf MDA wird im Rahmen eines Vergleiches in<br />
Abschnitt 3.1 näher eingegangen.<br />
Die hier enthaltenen Informationen stammen aus [SV05] Kapitel 2 und 4,<br />
[mda06a] und [Fra03].<br />
2.3.1 Modellierung<br />
Domäne<br />
Eine Domäne stellt ein begrenztes Wissensgebiet dar. Sie spiegelt den zu bear-<br />
beitenden Problemraum wieder und ist somit der Startpunkt der Modellierung.
2 MDSD, AC-MDSD und Begriffsdefinitionen 11<br />
Bevor ein Metamodell bzw. eine DSL zur Beschreibung der Konzepte einer<br />
Domäne entworfen werden kann, muss diese abgegrenzt sein. Diesen Vorgang<br />
nennt man Domain Scoping (siehe [PBL05] Seite 188 bzw. Abschnitt 3.2).<br />
Eine Domäne kann sowohl fachlich als auch technisch motiviert sein. Eine<br />
fachliche Domäne ist beispielsweise der Bereich ” Bankwesen“. Darin enthaltene<br />
Konzepte sind ” Konto“, ” Kredit“, ” Sparbuch“, ” Bankomat“, etc. Eine technisch<br />
motivierte Domäne ” Softwarearchitektur für E-Business-Systeme“ wird im<br />
Fallbeispiel in Kapitel 6 behandelt. Im Metamodell, dass die Domänenkonzepte<br />
beschreibt sind Konstrukte enthalten wie ” Presentation“, ” EntityObject“, ” Ac-<br />
titvityController“, etc.<br />
Ab einer gewissen Größe ist es sinnvoll eine Domäne in Subdomänen zu zertei-<br />
len, was zu klareren Modellen führt und die Komplexität verringert. Technische<br />
Subdomänen sind typischerweise Aspekte wie graphische Oberflächen oder Per-<br />
sistenz der Datenhaltung. In obigem Bankenbeispiel kann man Subdomänen wie<br />
” Privatkunden“ und Firmenkunden“ einführen.<br />
”<br />
Metamodell<br />
Ein Metamodell formalisiert die Strukturen einer Domäne und definiert somit<br />
jene Konstrukte die später im Rahmen der Anwendungsmodelle zum Einsatz<br />
kommen. Es bildet daher die Grundlage für eine Automatisierung im Rahmen<br />
der Entwicklung.<br />
Wie der Name mit der griechischen Vorsilbe ” meta“ - dt: über - zum Ausdruck<br />
bringt, sagt ein Metamodell etwas über andere Modelle aus. In diesem Zusam-<br />
menhang zu beachten ist, dass dieses ” über“ relativ vom Betrachter aus gesehen<br />
ist. Je nach Betrachtungsebene kann ein Metamodell auch ” nur“ ein Modell<br />
verkörpern. Beispielsweise ist das UML-Metamodell ein Modell der Meta Object<br />
Facility kurz MOF (vgl. [Fra03] Kapitel 5). Umgekehrt muss ein Modell eines<br />
Modells nicht zwangsweise ein Metamodell sein, sondern kann durchaus auch<br />
nur einen Ausschnitt oder eine Aggregation darstellen (siehe [HKKR05]).<br />
In einem Metamodell ist nicht nur die abstrakte Syntax einer DSL enthalten<br />
sondern auch deren Wohlgeformtheitskriterien, die statische Semantik. Das heißt,<br />
es wird zum Ausdruck gebracht wie die Sprachkonzepte in einem konkreten<br />
Modell zu verwenden sind. Bei einem UML-Profil beispielsweise wären die<br />
Stereotypdefinitionen Teil der abstrakten Syntax, wohingegen die definierten
2 MDSD, AC-MDSD und Begriffsdefinitionen 12<br />
Constraints die statische Semantik bilden.<br />
Die Vorteile der Verwendung von Metamodellen werden in [HKKR05] zusammen-<br />
gefasst:<br />
• Metamodelle erlauben eine präzisere und vor allem eindeutigere Definition<br />
von Konstrukten, als es mit einer natürlichen sprachlichen Beschreibung<br />
der Fall ist.<br />
• Alle Instanzen eines Metamodells haben ein einheitliches Austauschformat,<br />
das Metamodell.<br />
• Modelle werden durch die Verwendung eines Metamodells computergestützt<br />
überprüfbar, da es einen vorgegebenen Regelsatz gibt.<br />
• Metamodelle sind nicht endgültig sondern können jederzeit verändert und<br />
erweitert werden. Sie gestalten eine Sprache auf diese Weise flexibel.<br />
Domänenspezifische Sprache<br />
Eine Domänenspezifische Sprache oder Domain Specific Language kurz DSL<br />
benötigt neben einem Metamodell noch eine Definition der (dynamischen) Se-<br />
mantik. Mit anderen Worten der Modellierer muss die Konstrukte der Sprache<br />
verstehen. Dazu gibt es zwei Möglichkeiten: entweder ist die Bedeutung eines<br />
Konstrukts intuitiv verständlich oder es existiert eine natürliche sprachliche Be-<br />
schreibung.<br />
Modell vs .Formales Modell<br />
Eine Auswahl an Definitionen für den Begriffe ” Modell“ im Zusammenhang mit<br />
<strong>Softwareentwicklung</strong>:<br />
Ein Modell ist eine abstrakte Repräsentation von Struktur, Funktion<br />
oder Verhalten eines Systems. [SV05] Seite 20<br />
Ein Modell ... beschreibt einen Aspekt eines konkret zu entwickeln-<br />
den Systems. [HK99] Seite 67<br />
A model of a system is a description of that system and its envi-<br />
ronment for some certain purpose. [mda06a] Seite 2-2
2 MDSD, AC-MDSD und Begriffsdefinitionen 13<br />
Modelle sind in einer bestimmten Modellierungssprache abgefasst. In vielen Fällen<br />
ist das auf Grund ihrer weiten Verbreitung und Verständlichkeit die Unified Mo-<br />
delling Language kurz UML. UML Modelle sind aber nicht per se formale Modelle.<br />
Formale Modelle sind immer die Instanz eines Metamodells und orientieren sich<br />
an den dort beschriebenen Konstrukten. Formal sind sie, da die Bedeutung der<br />
verwendeten Konstrukte definiert ist, sie also festgelegten Formalismen folgen.<br />
2.3.2 Plattform<br />
Das Konzept der Plattform stammt aus der industriellen Fertigung und erlaubt<br />
die kostengünstige Produktion kundenspezifischer Produkte, auf einer gemeinsa-<br />
men Basis, im großen Rahmen. In einer Plattform sind jene Technologien ver-<br />
einigt, die sich durch alle Produkte einer Produktfamilie ziehen. Gleichzeitig<br />
wird bei Erstellung der Plattform darauf geachtet, dass die einzelnen Baustei-<br />
ne flexibel genug sind, um über mehrere Produkte hinweg eingesetzt werden zu<br />
können. [PBL05] definiert den Begriff ” Plattform“ folgendermaßen (siehe Seite<br />
6):<br />
A platform is any base of technologies on which other technologies<br />
or processes are built.<br />
Legt man diesen Gedanken auf Softwaresysteme um führt das zu folgender Defi-<br />
nition:<br />
A software platform is a set of software subsystems and interfaces<br />
that form a common structure from which a set of derivative products<br />
can be efficiently developed and produced. ( [PBL05] Seite 15)<br />
MDSD hat das Konzept der Plattform dem Software Product Line Engineering<br />
entliehen auf das in Abschnitt 3.2 näher eingegangen wird.<br />
MDSD setzt reichhaltige domänenspezifische Plattformen bestehend aus Bi-<br />
bliotheken, Frameworks, Basisklassen, etc. ein. Diese verringern den Abstand<br />
zwischen den Konzepten einer Domäne und der Zielplattform, auf der die zu<br />
entwickelnden Anwendungen laufen sollen. Je ausgereifter die Plattform desto<br />
einfacher gestalten sich die nötigen Transformationen zur Codegenerierung.<br />
Abbildung 2.2 zeigt den schichtförmigen Aufbau einer domänenspezifischen<br />
Plattform und wie sie den Abstand zwischen technischer Plattform und gene-<br />
riertem Code verringert.
2 MDSD, AC-MDSD und Begriffsdefinitionen 14<br />
Abbildung 2.2: Anwendungen basierend auf einer domänspezifischen Plattform<br />
(Quelle [Bet06d] Seite 43)<br />
Im Laufe einer MDSD-Entwicklung wächst die Mächtigkeit der Plattform mit<br />
dem Verständnis der Domäne, die Transformationen vereinfachen sich und der<br />
manuell zu ergänzende Codeanteil verringert sich. Allerdings sollte die Platt-<br />
formentwicklung nicht über strapaziert werden, da man sonst zur traditionellen<br />
Entwicklung zurückkehrt und die Vorteile modellgetriebener Entwicklung verlo-<br />
ren gehen. Applikationsspezifische Codeanteile und Logik sollten auch weiterhin<br />
so weit wie möglich mit Hilfe der DSL modelliert und anschließend generiert<br />
werden.<br />
Jorn Bettin empfiehlt in [Bet06d] domänenspezifische Plattformen iterativ in-<br />
krementell umzusetzen. Versuche ausgereifte Frameworks vorab mit einmaligem<br />
Aufwand zu entwerfen, sind von vornherein zum Scheitern verurteilt. Stattdessen<br />
ist es ratsam mit einem kleinen Framework zu starten und dieses schrittweise<br />
je nach Bedarf weiterzuentwickeln. In den meisten Fällen ergibt sich der Bedarf<br />
an Verbesserungen von selbst sobald die Umsetzung der Transformationen sich<br />
schwierig gestaltet. Umgekehrt sind generative Ansätze oft eine elegante Lösung,<br />
falls sich die Umsetzung von bestimmen Plattformkomponenten als zu umständ-<br />
lich herausstellt.
2 MDSD, AC-MDSD und Begriffsdefinitionen 15<br />
2.3.3 Software-Systemfamilien<br />
Der Begriff der Software-Systemfamilie ist dem in Abschnitt 3.2 beschriebe-<br />
nen Konzept des Software Product Line Engineering entliehen. Als Software-<br />
Systemfamilie bezeichnet man alle jene Anwendungen, die auf einer gemeinsamen<br />
Domänenarchitektur aufbauen.<br />
Eine Domänenarchitektur setzt sich aus dem Metamodell einer Domäne, einer<br />
zugehörigen Plattform und den nötigen Transformationen um die Konzepte des<br />
Metamodells auf die Plattform zu übertragen, zusammen. Die Domänenarchitek-<br />
tur ist somit das zentrale Konzept von MDSD.<br />
Eine Domänenarchitektur legt fest welche Konzepte formal unterstützt und wie<br />
sie auf die jeweilige Plattform übertragen werden. Sie ist immer relativ zur jewei-<br />
ligen Plattform zu sehen. Von der Domänenarchitektur wird des Weiteren eine<br />
hinreichende Flexibilität gefordert, um die Unterschiede zwischen den einzelnen<br />
Mitgliedern der Software-Systemfamilie abbilden zu können.<br />
2.4 AC-MDSD<br />
<strong>Architekturzentrierte</strong>-<strong>Modellgetriebene</strong> <strong>Softwareentwicklung</strong> oder Architecture-<br />
Centric MDSD kurz AC-MDSD ist eine MDSD-Ausprägung bei der das<br />
Abstraktionsniveau der DSL auf Ebene der Softwarearchitektur liegt. Man<br />
spricht daher auch von architekturzentriertem Design. Mit anderen Worten: ” Die<br />
Domäne von AC-MDSD lautet >> Softwarearchitektur
2 MDSD, AC-MDSD und Begriffsdefinitionen 16<br />
Abbildung 2.3: Prinzip architekturzentrierter MDSD (Quelle: [SV05] Seite 27)<br />
ander nichts wissen. Aus diesem Grund liegt der Generierungsfaktor hier weit<br />
unter den Möglichkeiten, die ein ganzheitlicher architekturzentrierter Ansatz bie-<br />
ten kann. Zusammengefasst lautet das Ziel von AC-MDSD daher:<br />
” Ganzheitliche Automation bei der Erstellung von Infrastrukturcode<br />
bzw. Minimierung von redundantem, technischen Code in der Anwen-<br />
dungsentwicklung.“( [SV05] Seite 25)<br />
Die Grundlage für eine ganzheitliche Automatisierung bildet eine durchgängig<br />
ausgearbeitete und formalisierte Softwarearchitektur. Je besser diese ausgearbei-<br />
tet ist desto schematischer gestaltet sich der Sourcecode der darauf aufbauenden<br />
Anwendungen und desto mehr Code kann mit Hilfe eines Generators erzeugt<br />
werden.<br />
Abbildung 2.3 verdeutlicht die Zusammenhänge bei der Entwicklung mit AC-<br />
MDSD. Als Eingabe wird ein fachliches Modell der Anwendung benötigt, das<br />
formal auf einer <strong>Architekturzentrierte</strong>n DSL basiert. Als Ausgabe wird der ge-<br />
samte Infrastrukturcode erzeugt, der bei modernen E-Businessanwendungen bis<br />
zu 70% ausmachen kann (siehe [SV05] Seite 25). Die Modell-zu-Code Transfor-<br />
mationen werden durch eine Reihe von Generator Templates festgelegt. Da der<br />
generierte Code technisch motiviert ist, bleibt eine semantische Lücke, die von<br />
einem Entwickler manuell mit fachspezifsicher Anwendungslogik aufzufüllen ist.<br />
2.4.1 Merkmale<br />
Im Folgenden werden bisher noch nicht genannte Merkmale von AC-MDSD auf-<br />
gelistet und erklärt.
2 MDSD, AC-MDSD und Begriffsdefinitionen 17<br />
• AC-MDSD unterstützt individuelle architektonische Anforde-<br />
rungen. Die Ausgangsbasis für die Ableitung der Transformationsvor-<br />
schriften bildet eine Referenzimplementierung. Das heißt, es wird nichts ge-<br />
neriert, was nicht zuvor getestet und mittels der Referenzimplementierung<br />
verifiziert werden konnte. Der generierte Sourcecode besitzt exakt dieselbe<br />
Qualität wie die Referenzimplementierung.<br />
• Softwaresystemfamilien statt Unikate: AC-MDSD zielt nicht nur auf<br />
die Verbesserung des Entwicklungsprozesses einzelner Anwendungen ab,<br />
sondern fördert auch die Wiederverwendung von einmal erstellten Arte-<br />
fakten durch die Verwendung eines Generators und der Schaffung einer<br />
Plattform.<br />
• Keine 100% Generierung: Im Normalfall ist es nicht möglich bzw. sin-<br />
voll eine Anwendung komplett zu generieren. Der Fokus der Domänenar-<br />
chitektur ist in diesem Fall so schmal, dass sie nur eine Anwendung tragen<br />
könnte, was den MDSD-Ansatz ad absurdum führen würde.<br />
AC-MDSD ermöglicht in der Regel eine Generierung von 60-80% des Quell-<br />
codes einer Applikation. Der Rest besteht aus fachlichen Aspekten die auf<br />
Grund der technisch motivierten Domäne nicht modelliert werden können.<br />
2.4.2 Einsatz<br />
Markus Völter einer der geistigen Väter von AC-MDSD hält in einem Interview<br />
mit Code Generation Network (siehe [Net06]) fest, dass AC-MDSD einen günsti-<br />
gen Einstiegspunkt für den Aufbau einer Software-Systemfamilie mit MDSD bzw.<br />
den Umstieg auf diese Entwicklungsmethodik bietet. Die primäre Konzentration<br />
auf architektonische Aspekte ist aus mehreren Gründen sinnvoll. Erstens entfällt<br />
durch die automatisierte Umstellung für die Entwickler die mühsame Implemen-<br />
tierung des Infrastrukturcodes. Zweitens ist der technisch motivierte Code in den<br />
meisten Fälle jener der am häufigsten wiederverwendet wird. Dadurch macht sich<br />
eine automatisierte Erstellung bereits sehr früh positiv bemerkbar. Drittens sind<br />
die Entwickler zugleich die Domänenexperten und die Einbindung eines richtigen<br />
Kunden kann entfallen.<br />
Sobald eine stabile automatisierte Basis besteht können nach und nach fachspe-<br />
zifische Aspekte ergänzt und eine Umstellung auf eine fachliche Domäne vorge-<br />
nommen werden.
2 MDSD, AC-MDSD und Begriffsdefinitionen 18<br />
2.5 Vorurteile gegenüber <strong>Modellgetriebene</strong>n<br />
Entwicklungsansätzen<br />
An dieser Stelle werden einige Vorurteile gegenüber <strong>Modellgetriebene</strong>n Entwick-<br />
lungsansätzen behandelt und erklärt warum sie auf MDSD nicht zutreffen, basie-<br />
rend auf [Bet06d] Kapitel 4.<br />
1. Modellierung bedeutet stets die Darstellung aller Spezifikationsdetails in<br />
Form von visuellen Modellen. Diese Modelle besitzen denselben Abstrahie-<br />
rungsgrad wie der implementierte Quellcode.<br />
Der Einsatz einer umfangreichen domänspezifischen Plattform führt zu Spe-<br />
zifikationen, deren Abstraktionsniveau bedeutend höher liegt als jenes von<br />
” herkömmlichem Quellcode“. Modelle und die durch sie repräsentierten<br />
Spezifikationen werden mit Hilfe von Konzepten aus der Problemdomäne<br />
und nicht der Lösungsdomäne dargestellt.<br />
Round-trip Engineering Tools führten zu diesem falschen Bild, da sie nicht<br />
in der Lage sind echte Abstraktion zu schaffen.<br />
2. Generierter Code ist in der Regel schlecht strukturiert und für Entwickler<br />
nur schwer lesbar.<br />
Eine der Grundregeln bei der Codegenerierung mit MDSD ist die Generie-<br />
rung ” gut aussehenden“ Quellcodes. Dieser Zustand wird durch den Ein-<br />
satz von so genannten Code-Beautifiers sichergestellt, die den Quellcode<br />
nachträglich formatieren. Darüber hinaus wird bei MDSD nur Code gene-<br />
riert, der zuerst anhand einer Referenzimplementierung verifiziert werden<br />
konnte. Der generierte Code hat dieselbe Qualität wie diese.<br />
3. Generierter Code besitzt eine geringere Performance gegenüber manuell ver-<br />
fasstem.<br />
Auch hier ist die Referenzimplementierung und deren Verifizierbarkeit das<br />
ausschlaggebende Gegenargument. Des Weiteren besitzen die beteiligten<br />
Designer die Möglichkeit die Architektur auf Basis der Referenzimplemen-<br />
tierung laufend zu verbessern. Auf Grund des generativen Ansatzes ist es<br />
sehr einfach diese Verbesserungen auf den bestehenden Quellcode einer An-<br />
wendung zu übertragen, was bei einer rein manuellen Vorgangsweise schwie-<br />
riger wäre.<br />
4. Die wiederholte Generierung von bereits bestehenden Komponenten ist prak-<br />
tisch nicht durchführbar. Außerdem sind Modell und Code zwangsläufig ab<br />
einem gewissen Punkt nicht mehr synchron.
2 MDSD, AC-MDSD und Begriffsdefinitionen 19<br />
Grundvorrausetzung ist die vollständige Automatisierung bei der Erstellung<br />
von generierten Codeanteilen. Es darf keinerlei manuelle Nachbearbeitung<br />
geben. Zudem muss generierter und manuell erstellter Code streng getrennt<br />
werden, beispielsweise durch die Generierung von Basisklassen und deren<br />
Erweiterung via manuell implementierten Klassen. Ist eines von beiden nicht<br />
gegeben, ist die Wahrscheinlichkeit groß, das eben beschriebenes Szenario<br />
eintritt.<br />
5. Die Anpassung eines Generators benötigt mehr Zeit als die komplette An-<br />
wendung händisch zu implementieren.<br />
Praktische Erfahrungen haben gezeigt, dass die Ableitung der Transforma-<br />
tionen aus einer Referenzimplementierung circa 20-25% des Zeitaufwands<br />
erfordert, der für eine manuelle Implementierung erforderlich ist. Die Ent-<br />
wicklung einer Referenzimplementierung kann nicht zwangsläufig als Mehr-<br />
aufwand gesehen werden, da sie mit der in den meisten Fällen erforderlichen<br />
Implementierung eines Prototypen vergleichbar ist.<br />
6. Die Anpassung des Generators an Änderungen nimmt mehr Zeit in An-<br />
spruch als die manuelle Abänderung des generierten Codes.<br />
Solange generierter und manuell implementierter Code sauber von einander<br />
getrennt sind, und die Transformationsvorschriften auf dem adaptierten Ar-<br />
chitekturprototypen basieren, wird der MDSD-Ansatz immer schneller und<br />
bei weitem weniger fehleranfällig sein, als die manuelle Anpassung unzähli-<br />
ger Instanzen eines Design Patterns.
3 Vergleich mit verwandten<br />
Methodiken<br />
MDSD ist nur einer von zahlreichen <strong>Softwareentwicklung</strong>sansätzen der letzen<br />
Jahre. So rückten zum einen auf Seiten der technischen Methoden generative mo-<br />
dellgestützte Ansätze, wie Generative Programming (siehe [CE00]) oder MDA,<br />
in das Zentrum des Interesses. Zum anderen kam es auf Seiten der Prozesse zu<br />
einem Trend, der sich weg von schwergewichtigen behäbigen Strukturen hin zu<br />
agilen kurzfristig planenden Methodiken bewegte.<br />
In diesem Kapitel soll aufgezeigt werden, wie sich MDSD in dieses Bild einfügt.<br />
Abschnitt 3.1 stellt die Verwandtschaft zwischen MDSD und Model Driven Ar-<br />
chitecture vor. Der nächste Abschnitt(3.2) betrachtet das Konzept des Software<br />
Product Line Engineering, dessen Ideen MDSD stark beeinflussten. Abschließend<br />
wird in Abschnitt 3.3 erläutert wie mit Hilfe von MDSD die Vorgangsweisen des<br />
Agile Software Development unterstützt werden können.<br />
3.1 MDSD vs. MDA - Gemeinsamkeiten und<br />
Unterschiede<br />
Model Driven Architecture kurz MDA ist ein von der Object Managment Group<br />
(OMG) spezifizierter Standard, der sich mit der weit verbreiteten und seit<br />
langem existierenden Idee beschäftigt, die Spezifikation der Funktionen einer<br />
Anwendung von den plattformabhängigen Implementierungsdetails zu trennen.<br />
Die Spezifikation erfolgt dabei auf Basis von UML Modellen, die über mehrere<br />
Transformationsschritte hinweg in Sourcecode umgewandelt werden.<br />
Der MDA Standard soll Werkzeuge ermöglichen, die zu Folgendem in der Lage<br />
sind (vgl. [mda06a] Punkt 2.1.2):<br />
• Spezifikation einer Anwendung unabhängig von der Zielplattform<br />
• Spezifikation von Plattformen<br />
20
• Auswahl einer Zielplattform<br />
3 Vergleich mit verwandten Methodiken 21<br />
• Anpassung der Spezifikation an die Zielplattform<br />
Der MDA Standard ist in erster Linie für Toolhersteller gedacht und soll die<br />
Interoperablität zwischen den verschiedenen Werkzeugen gewährleisten. Neben<br />
der Interoperabilität sind Portabilität und Wiederverwendbarkeit die erklärten<br />
Primärziele. Diese Punkte sind essenziell für die Langlebigkeit einer Software, da<br />
sich sowohl die Technologien als auch die Fachlogik rasch aber getrennt von ein-<br />
ander entwickeln.<br />
MDA beschäftigt sich somit nicht wie MDSD vorrangig mit der Erstellung von<br />
Softwaresystemfamilien, der Bündelung von Expertenwissen und einer Steige-<br />
rung der Agilität von <strong>Softwareentwicklung</strong>sprozessen (siehe Abschnitt 3.3 und<br />
Abschnitt 4).<br />
3.1.1 Grundkonzepte<br />
Da MDSD die MDA-Terminologie übernommen hat, wurde ein Großteil, der im<br />
Zusammenhang mit MDA auftauchenden Begriffe, bereits unter Punkt 2.3 be-<br />
handelt. An dieser Stelle wird auf die für das Verständnis des Ansatzes noch<br />
fehlenden Konzepte eingegangen.<br />
Platform Independet Model (PIM)<br />
Ein plattformunabhängiges Modell konzentriert sich auf die Funktionalität einer<br />
Anwendung, während alle implementierungsspezifischen Details weggelassen wer-<br />
den. Ein PIM zeigt also jenen Teil einer Spezifikation, der sich beim Wechsel von<br />
einer technologischen Plattform auf eine andere nicht ändert. Mit anderen Wor-<br />
ten: ein PIM stellt die Geschäftslogik in Reinform dar. Die große Stärke eines<br />
PIMs ist die Resistenz gegenüber technologischen Veränderungen.<br />
Platform Model (PM)<br />
Ein Plattformmodell beschreibt die Konzepte einer bestimmten Plattform. Es<br />
zeigt sowohl die einzelnen Bestandteile der Plattform als auch die von ihr an-<br />
gebotenen Dienste. Daneben beinhaltet ein PM die nötigen Definitionen um ein<br />
PIM in ein PSM zu überführen. Von Seiten der OMG werden UML-Profile für<br />
diverse Technologien zur Verfügung gestellt, die diese Rolle übernehmen (sie-<br />
he [mda06b]).
Platform Specific Model (PSM)<br />
3 Vergleich mit verwandten Methodiken 22<br />
Ein plattformspezifisches Modell kombiniert die Inhalte eines PIMs mit der Sicht-<br />
weise auf eine bestimmte technologische Plattform. Es spezifiziert also wie ein be-<br />
stimmtes System die Eigenschaften einer Plattform konkret nutzt. Erzeugt wird<br />
es aus einem PIM mit Hilfe von Modelltransformationen. Dabei kann es zu ei-<br />
ner Folge von Transformationen kommen, in deren Verlauf die technologischen<br />
Aspekte immer konkreter zu Tage treten und an deren Ende die Generierung von<br />
Quellcode steht.<br />
An diesem Punkt zeigt sich, dass ein MDA-Modell nicht zwingend als PIM oder<br />
PSM eingeordnet werden kann. Ein PSM kann je nach Sichtweise auch ein PIM für<br />
ein daraus abgeleitetes PSM darstellen. So kann beispielsweise ein PSM, das die<br />
Umsetzung der Geschäftslogik mit Hilfe eines beliebigen Middlewaresystems dar-<br />
stellt, ein PIM zu einem PSM sein, das die Umsetzung der selben Fachlogik mittels<br />
Microsoft .NET ( [.ne06]) darstellt. Das heißt, was als Plattform zählt ist relativ<br />
in Bezug auf die Intentionen des Modellierers. Für die meisten MDA-Benutzer ist<br />
die Plattform ein Middlewaresystem. Für einen Middlewareentwickler hingegen<br />
übernimmt diese Rolle das Betriebssystem.<br />
3.1.2 Gegenüberstellung<br />
MDSD und MDA sind zwei sehr verwandte Ansätze. Bei beiden wird aus Model-<br />
len, die sich formal an den in Metamodellen definierten Konzepten orientieren,<br />
Code generiert, der sich auf eine entsprechende Plattform stützt. Stahl und<br />
Völter gehen in [SV05] soweit ” MDA als die Standardisierunginitiative der OMG<br />
zum Thema MDSD“ zu bezeichnen (siehe Seite 373).<br />
Beide Methodiken weisen allerdings zum Teil große Unterschiede auf. Erstens<br />
ist MDA ein Ansatz, der von einem Industriekonsortium, der OMG, spezifiziert<br />
und gefördert wird, wohingegen MDSD von einer Gruppe von ” Praktikern“<br />
definiert wurde (siehe [Bet06d] Seite 10). Durch seinen Ursprung ist MDSD<br />
auch pragmatischer in seinen Ansätzen und verzichtet bewusst auf die Punkte<br />
Interoperabilität und Portabilität, da hier zum einen noch die Standards fehlen<br />
und zum anderen auch die benötigten Tools. Des Weiteren spielen Modell-<br />
zu-Modelltransformationen bei MDSD nur eine nebensächliche Rolle, da wie<br />
in [SV05] aufgezeigt, derzeit die nötigen Modell-Transformationswerkzeuge, die<br />
mehrstufige Transaktionen in der Größenordnung realer Systeme unterstützen,<br />
nicht existieren. MDSD und im speziellen AC-MDSD erzeugt aus diesem Grund<br />
Sourcecode direkt aus dem PIM und verzichtet auf ein PSM.<br />
Zweitens fokussiert MDA bei der Modellierung auf UML, was MDSD nicht
3 Vergleich mit verwandten Methodiken 23<br />
tut. Hier ist prinzipiell jede Modellierungssprache möglich. Einschränkungen<br />
diesbezüglich werden nicht gemacht.<br />
Abschließend ist zu erwähnen, dass der MDA-Standard keinen durchgehenden<br />
Satz an Methoden definiert, die die Umsetzung eines modellgetriebenen An-<br />
satzes in der Praxis erlaubt. MDSD tut dies durch seine praktisch orientierte<br />
Ausrichtung sehr wohl (vgl. [Bet06d] Seite 11).<br />
Für weitere Informationen zu MDA wird auf die Quellen [Fra03] und [mda06a]<br />
verwiesen.<br />
3.2 MDSD vs. Software Product Line Engineering -<br />
Mögliche Synergieeffekte<br />
Bei hardwarelastigen Produkten vom Fahrrad bis zum Fernsehapparat existiert<br />
der Produktlinien-Ansatz bereits seit Jahrzehnten. In der Sofwareentwicklung<br />
nähert man sich ihm nur sehr langsam an. [PBG04] definiert den Begriff der<br />
Softwareproduktlinie wie folgt (siehe Seite 262):<br />
Eine Menge von softwarelastigen Systemen, die einen gemeinsamen<br />
kontrollierten Satz von Produkteigenschaften teilen, die auf die spezi-<br />
fischen Bedürfnisse eines einzelnen Marktsegments ausgerichtet sind<br />
und die ausgehend von einem gemeinsamen Vorrat an Softwaregütern<br />
auf eine vorgeschriebene Art und Weise entwickelt werden.<br />
Die treibende Kraft hinter dieser Bestrebung ist es den Grad an Wiederver-<br />
wendung zu steigern und die Entwicklungskosten einer einzelnen Applikation<br />
zu minimieren. Product Line Engineering beschäftigt sich vorrangig mit der<br />
systematischen Analyse von Domänen bis zur Umsetzung von Software-<br />
Produktionsstraßen, die auf diesen Ergebnissen aufbauen.<br />
Stahl und Völter geben in [SV05] an, dass Product Line Engineering für zahlreiche<br />
Tätigkeiten, die im Rahmen eines MDSD-Entwicklungsprozesses auftreten (siehe<br />
Kapitel 4) das methodische Grundgerüst liefert. Zu diesen Tätigkeiten zählen:<br />
• Definition und Begrenzung der Domäne<br />
• Definition der Kernkonzepte der Domäne<br />
• Trennung von Anwendung und Domänenarchitektur
3 Vergleich mit verwandten Methodiken 24<br />
• Entwicklung der Basiskomponenten einer Plattform<br />
Von diesem Standpunkt aus kann MDSD entweder als Realisierungmechanismus<br />
für Product Line Engineering gesehen werden oder umgekehrt Product Line<br />
Engineering als Analysemethode für MDSD (vgl. [SV05] Seite 244).<br />
Im Folgenden wird die grundlegende Methodik des Product Line Engineering<br />
dargestellt und gezeigt wie sich beide Ansätze miteinander kombinieren lassen<br />
bzw. ergänzen. Für weitere Informationen zu diesem Abschnitt wird auf die Quel-<br />
len [SV05] Kapitel 14, [PBG04] Kapitel 10, [CE00] Part I und [PBL05] verwiesen.<br />
3.2.1 Aktivitäten<br />
Software Product Line Engineering unterscheidet zwei Prozesse, der eine, das Do-<br />
main Engineering, ist die Schaffung einer gemeinsamen Plattform für alle Mit-<br />
glieder der Software-Systemfamilie, der andere, das Application Engineering hat<br />
die Ableitung der einzelnen Anwendungen zum Ziel.<br />
Der Vorteil dieser Trennung liegt in der Ausgliederung unterschiedlicher Belange<br />
in eigene Prozesse. Die Schaffung einer robusten langlebigen Plattform erfordert<br />
eine andere Herangehensweise als die Entwicklung kundenspezifischer Applikatio-<br />
nen in möglichst kurzer Zeit. Zugleich muss auch eine Abstimmung der beiden<br />
Teilprozesse aufeinander berücksichtigt werden. Ein Beispiel dafür ist die in Ka-<br />
pitel 4 vorgestellte iterative, zweigleisige Entwicklung.<br />
Ein zweiter Grund für diese Trennung ist die Sicherstellung der nötigen Variabi-<br />
lität der Plattform in Hinblick auf die Tauglichkeit über mehrere Anwendungen<br />
hinweg. Bei der Plattformentwicklung muss stets darauf Wert gelegt werden, dass<br />
ein und dieselbe Plattform für unterschiedliche aber doch ähnliche Anwendungen<br />
geeignet ist.<br />
Domain Engineering<br />
Der Prozess des Domain Engineering ist verantwortlich für die Schaffung einer<br />
wiederverwendbaren Plattform und somit auch für die Festlegung der Gemein-<br />
samkeiten und Unterschiede zwischen den einzelnen Produkten. Die Plattform<br />
besteht aus verschiedenen Artefakten und reicht von den Anforderungen über<br />
das Design, die Realisierung bis hin zu den Tests.<br />
Der Prozess des Domain Engineering gliedert sich in drei Teilaufgaben, die<br />
wiederum mehrere Tätigkeiten erfordern. Zu Beginn wird eine Domänenanalyse
3 Vergleich mit verwandten Methodiken 25<br />
durchgeführt, danach erfolgt das Design und abschließend die Implementierung.<br />
Der erste Schritt der Domänenanalyse umfasst deren Abgrenzung. Es werden die<br />
Grenzen der Domänen definiert und festgelegt was sich innerhalb der Domäne<br />
und was außerhalb befindet. Man nennt diesen Vorgang auch Domain Scoping.<br />
Domain Scoping ist aus zwei Gründen wichtig. Zum einen ist eine konsistente<br />
Realisierung nur möglich, wenn zwischen den Familienmitgliedern genügend<br />
Synergieeffekte bestehen. Ist der Fokus zu schmal wird die Produktlinie so<br />
klein, dass nur wenige Produkte von der Wiederverwendung profitieren. Ist der<br />
Fokus zu breit, ist die Anzahl der möglichen Produkte groß, das Wiederverwen-<br />
dungspotential wird allerdings im gleichen Maße minimiert. Beide Effekt sind<br />
unwirtschaftlich und daher nicht erwünscht.<br />
Zum anderen rufen unklare Anforderungen fortlaufend Diskussionen zwischen<br />
den Beteiligten hervor. Aus genannten Gründen kann Domain Scoping auch im<br />
Sinne einer Risikominimierung verstanden werden.<br />
Eine mögliche Form der Domänenanalyse bietet das Konzept des Feature<br />
Oriented Design Analysis(FODA) mit dem so genannten Feature Modelling.<br />
Besonders geeignet ist diese Methodik, da die Notation nichts über die spätere<br />
Implementierungstechnologie aussagt. Für weitere Informationen zu FODA<br />
siehe [KCH + 90].<br />
Im zweiten und dritten Schritt, dem Domänendesign und der Domänenimple-<br />
mentierung wird damit begonnen die Softwarestruktur der Domäne festzulegen<br />
bzw. die gemeinsamen Merkmale in einer Plattform zu implementieren. Krzysztof<br />
Czarnecki definiert in [CE00] (siehe Seite 22) den Begriff des Domänendesign wie<br />
folgt:<br />
Developing a common architecture for the systems in the domain<br />
and devising a production plan<br />
Der Vorgang der Domänenimplementierung beinhaltet folgende Tätigkeiten:<br />
Implementing the reusable assets, for example, reusable com-<br />
ponents, domain-specific languages, generators, a reuse infrastructure,<br />
and a production process<br />
Betrachtet man beide Zitate zeigt sich, dass der Prozess des Domain Engineering<br />
den in Abschnitt 4.2 beschriebenen Architektur-Entwicklungsstrang abbildet und<br />
gleichzeitig ein methodisches Grundgerüst dafür liefert.
Application Engineering<br />
3 Vergleich mit verwandten Methodiken 26<br />
Das Application Engineering stellt den eigentlichen Produktionsprozess dar bei<br />
dem aus einer Produktspezifikation ein Mitglied der Software-Systemfamilie ge-<br />
schaffen wird. Übertragen auf MDSD ist dieser Schritt mit dem in Abschnitt 4.3<br />
beschriebenen Anwendungs-Entwicklungsstrang vergleichbar. Hier wird versucht<br />
so viele Bestandteile der Domänenarchitektur wiederzuverwenden wie möglich.<br />
Dabei werden sowohl die Gemeinsamkeiten als auch Unterschiede zwischen den<br />
einzelnen Produkten ausgenutzt.<br />
Für die variablen Merkmale der verschiedenen Anwendungen gibt es diverse<br />
Alternativen diese an die Plattform zu binden, die ganz individuelle Vor- und<br />
Nachteile mit sich bringen. Eine Variante ist die Festlegung der optionalen Featu-<br />
res auf Quellcodeebene, was zu performanten aber auch inflexiblen Programmen<br />
führt. Das andere Extrem ist die Bindung zur Laufzeit über Polymorphismus<br />
oder interpretierte Konfigurationsparameter. Für weitere Varianten siehe [SV05]<br />
Seite 248ff und [PBG04] Seite 278.<br />
MDSD kann hier als Möglichkeit herangezogen werden, um die diversen Alterna-<br />
tiven umzusetzen. Ein Generator ist dazu das ideale Werkzeug. In Bezug auf die<br />
Generierung von Quellcode mit unterschiedlichen festgebunden Features ist das<br />
offensichtlich. Merkmale über die zur Linkzeit entschieden wird, können durch<br />
die Erzeugung unterschiedlicher Bibliotheken und eines zugehörigen Makefiles<br />
realisiert werden. Laufzeitentscheidungen können mit Hilfe der Generierung von<br />
Konfigurationsdateien unterstützt werden.<br />
3.2.2 Zusammenfassung<br />
Abschließend ist festzuhalten, dass sich MDSD und Software Product Line En-<br />
gineering hervorragend ergänzen. MDSD benötigt bewährte Methoden um die<br />
Analysephase durchzuführen und den Aufbau einer Software-Systemfamilie zu<br />
planen. Genau diese Methodiken bietet Software Product Line Engineering.<br />
Umgekehrt ist Software Product Line Engineering auf eine flexible und mächtige<br />
Methode zur Umsetzung der einzelnen Produkte angewiesen. Hier steuert MDSD<br />
durch seine modellgetriebene generative Vorgangsweise ein enormes Potential bei.
3 Vergleich mit verwandten Methodiken 27<br />
3.3 MDSD vs. Agile Software Development - Ist<br />
eine Kombination möglich?<br />
Auf Grund der Unzulänglichkeit schwergewichtiger dokumentenlastiger Prozesse<br />
kam es in den letzten Jahren vermehrt zur Entstehung so genannter agiler<br />
<strong>Softwareentwicklung</strong>smethodiken. Diese arbeiten mit sehr kurzen Planungsho-<br />
rizonten und reduzieren die geforderte Dokumentation meist auf ein Minimum.<br />
In kleinen bis mittelgroßen Teams ist diese Vorgangsweise unter Beachtung<br />
diverser Rahmenparameter sehr erfolgreich (siehe [Mar03]). In großen Projekten<br />
mit einer Vielzahl an Mitarbeitern, die stark fluktuieren können, macht sich der<br />
geringe Dokumentationsumfang allerdings negativ bemerkbar. Zudem kann die<br />
Agilität leicht ins Unstrukturierte abgleiten. MDSD kann hier mit dem Anspruch<br />
” das Modell ist zugleich Dokumentation und Code“ mehr Transparenz in die<br />
Entwicklung bringen. Darüber hinaus wird der Vorgang des Refactoring, der<br />
oft einen erheblichen Zeitaufwand bei agilen Projekten in Anspruch nimmt, bei<br />
MDSD stark verkürzt. Änderungen können hier zentral in den Transformati-<br />
onsvorschriften erfolgen und mittels Generator auf den bestehenden Quellcode<br />
übertragen werden.<br />
3.3.1 Das Agile Manifest und MDSD<br />
Im Folgenden wird anhand der Kernaussagen des Agilen Manifests (siehe [agi06])<br />
der Zusammenhang zwischen MDSD und Agile Software Development erläutert.<br />
Für weitere Informationen zu Agile Development wird auf [Mar03] verwiesen.<br />
Der Zusammenhang zwischen MDSD und Agile Development wird in [SV05] Ab-<br />
schnitt 5.4 und [Bet06d] Abschnitt 2.4 beschrieben.<br />
Individuals and interactions over processes and tools<br />
Mit dieser Forderung wird die Wertschätzung und Bedeutung des Menschen in<br />
der <strong>Softwareentwicklung</strong> zum Ausdruck gebracht. Die mitwirkenden Personen<br />
sind der Schlüssel zum Erfolg. Ein guter Prozess kann ein Projekt nicht vor<br />
dem Scheitern bewahren, falls ein Team keine kompetenten ” Spieler“ besitzt<br />
aber ein schlechter Prozess kann selbst stark Mitspieler ineffizient werden lassen.<br />
Neben kompetenten Einzelpersonen ist auch deren Zusammenspiel als Team<br />
Grundvorraussetzung für einen erfolgreichen Projektabschluss.<br />
Letztendlich ist es ratsamer keinen allzu formalen Prozess zu etablieren, der vom<br />
Team nicht mitgetragen wird, sondern das Team sollte vielmehr einen eigenen,
3 Vergleich mit verwandten Methodiken 28<br />
auf seine Anforderungen abgestimmten, Ablauf definieren.<br />
MDSD selbst schreibt keinen fixen Prozess vor. Es existiert vielmehr ein in Ka-<br />
pitel 4 beschriebener Vorschlag, der speziell in den Details auf die individuellen<br />
Bedürfnisse angepasst werden kann. Auch in Bezug auf die verwendeten Tools<br />
gibt es keine Einschränkungen, da diese an die zu bearbeitende Domäne ange-<br />
passt werden müssen.<br />
Working software over comprehensive documentation<br />
Quellcode ist nicht das geeignete Medium um die Struktur eines Softwaresystems<br />
und die Konzepte auf denen es aufbaut zum Ausdruck zu bringen. Verständli-<br />
cher als maschinenlesbarer Quellcode sind Fließtextdokumente und graphische<br />
Modelle, die einem Entwickler die Beweggründe für Entscheidungen verdeutli-<br />
chen und die Struktur der Anwendung näherbringen. Problematisch in diesem<br />
Zusammenhang ist der hohe Zeitaufwand der zur Erstellung und fortlaufenden<br />
Aktualisierung der Dokumentation benötigt wird. Ist die Dokumentation nicht<br />
auf dem aktuellen Stand wird sie wertlos und eine Quelle des Missverständnisses.<br />
In der Projektpraxis ist es meist wichtiger pünktlich eine lauffähige Anwendung zu<br />
liefern anstatt gut aussehender Dokumente. MDSD kann beide Punkte verbinden,<br />
da die eingesetzten Modelle einerseits den gleichen Stellenwert wie Quellcode<br />
einnehmen und andererseits als Dokumentation dienen. Ein positiver Nebeneffekt<br />
ist die ständige Aktualität der Dokumentation (=Modelle), da große Teile der<br />
Anwendung auf ihr beruhen.<br />
Customer collaboration over contract negotiation<br />
Software kann nicht wie ein beliebiger Gebrauchsgegenstand geordert werden.<br />
Versuche sämtliche Anforderungen bereits zu Projektbeginn festzulegen sind, wie<br />
die Vergangenheit gezeigt hat, zum Scheitern verurteilt. In den allermeisten Fällen<br />
wünscht der Kunde während des Projektverlaufs Abweichungen vom ursprüngli-<br />
chen Plan oder wird sich erst nach Implementierungsbeginn klar, was er wirklich<br />
benötigt.<br />
Agile Software Development fordert aus eben genanntem Grund eine sehr enge<br />
Zusammenarbeit mit dem Kunden. MDSD kann diese Zusammenarbeit erleich-<br />
tern, falls eine fachlich motivierte DSL zum Einsatz kommt, die sich zur Kommu-<br />
nikation mit dem Kunden eignet. Stahl und Völter sehen diesen Punkt ansonsten<br />
unabhängig von der Frage, ob modellgetrieben gearbeitet wird oder nicht (sie-
he [SV05]).<br />
3 Vergleich mit verwandten Methodiken 29<br />
Responding to change over following a plan<br />
Diese Aussage ist eng mit der Forderung einer intensiven Kundenzusammenar-<br />
beit verknüpft. Die Flexibilität in der Planung entscheidet in vielen Fällen über<br />
Erfolg oder Misserfolg eines Projekts.<br />
Während des Projektverlaufs kommt es möglicherweise zu Änderungen in den<br />
Anforderungen eines Kunden. In solchen Situationen ist es wichtig flexibel rea-<br />
gieren zu können, anstatt sich auf vorab festgelegte Anforderungen zu versteifen,<br />
die möglicherweise nicht mehr relevant sind.<br />
Ein modellgetriebenes Vorgang erleichtert die Umsetzung von Änderungen we-<br />
sentlich. Ändern sich fachliche Anforderungen können diese durch die generative<br />
Umsetzung schneller, als es bei einer manuellen Vorgangsweise der Fall wäre und<br />
vor allem konsistent in die bestehenden Komponenten integriert werden. Das<br />
liegt auch in dem Umstand begründet, dass Implementierungsaspekte, die in den<br />
Transformationsvorschriften festgelegt sind, zentral geändert werden können.<br />
3.3.2 Zusammenfassung<br />
Zusammenfassend ist festzuhalten, dass MDSD in der Lage ist, durch eine expli-<br />
zite Formalisierung von Domänenwissen und architektonischen Konzepten sowie<br />
der Trennung von Domänenarchitekturentwicklung und aufbauenden Anwendun-<br />
gen in unterschiedliche Prozesse, agile Techniken auch für große Projekte zu ska-<br />
lieren. Darüber hinaus bekommen agile Methodiken mehr Struktur durch das<br />
ständige Vorhandensein einer aktuellen Dokumentation (=Modelle). Letztend-<br />
lich sinken auch die unvermeidlichen Refactoring-Aufwände um die entwickelte<br />
Anwendung an die sich ändernden Anforderungen anzupassen.
4 Entwicklungsprozess,<br />
Vorgehensweise und Best<br />
Practices<br />
4.1 Iterative, zweigleisige Entwicklung<br />
Der <strong>Softwareentwicklung</strong>sprozess mit Hilfe von MDSD basiert auf einer klaren<br />
Trennung von Domain Engineering und Application Engineering. Das Domain<br />
Engineering beinhaltet die Erstellung der gemeinsamen Plattform bzw. Ar-<br />
chitektur der Mitglieder einer Softwaresystemfamilie. Application Engineering<br />
umschreibt die Entwicklung einzelner Anwendungen, die auf den Artefakten der<br />
Domain Engineering-Phase aufbauen. Beide Begriffe stammen aus dem in Ab-<br />
schnitt 3.2 beschriebenen Software Product Line Engineering. Diese Aufspaltung<br />
des Entwicklungsprozesses ist notwendig um die gemeinsame Softwarearchitek-<br />
tur, unabhängig von einer konkreten Anwendung zu formalisieren und generativ<br />
zu unterstützen.<br />
Aus der Sicht des Anforderungsmanagements nehmen die<br />
Anwendungsentwicklungs-Teams gegenüber dem Infrastrukturentwicklungs-<br />
Team die Kundenrolle ein. Das heißt, analog zum Verhältnis zwischen Kunde<br />
und Anwendungsentwicklungs-Team, wo der Endkunde in die Entwicklung<br />
miteinbezogen wird, ist es erforderlich Vertreter der Anwendungsentwicklung<br />
vor Ort in die Entwicklung der gemeinsamen Infrastruktur einzubinden. Diese<br />
Maßnahme soll dazu beitragen, die gemeinsame Plattform den Bedürfnissen der<br />
Anwendungsentwickler entsprechend zu gestalten.<br />
Stahl und Völter schlagen in [SV05] einen iterativen zweigleisigen Entwicklungs-<br />
prozess vor, bei dem die Entwicklung von Domänenarchitektur und mindestens<br />
einer darauf aufbauenden Anwendung in zwei virtuell von einander getrennten<br />
Projekten stattfindet. Die Iterationen beider Projekte sind zeitlich aufeinander<br />
abgestimmt und sollten eine konstante Dauer aufweisen. Um den Prozess agil<br />
30
4 Entwicklungsprozess, Vorgehensweise und Best Practices 31<br />
Abbildung 4.1: Iterative, zweigleisige Entwicklung (Quelle: [SV05] Seite 213)<br />
zu gestalten, ist es empfehlenswert die Dauer auf maximal sechs Wochen zu<br />
beschränken (siehe [VB06] Seite 8 und 10).<br />
Die Zusammenhänge zwischen den beiden Projekten verdeutlicht Abbildung<br />
4.1 aus der ersichtlich wird, dass die Entwicklung der Infrastruktur stets eine<br />
Iteration vor der Anwendungsentwicklung liegt. Neue Versionen der Domänen-<br />
architektur werden bei dieser Vorgangsweise immer zu Beginn einer Iteration in<br />
die Anwendungsentwicklung übernommen, um den Aufwand für das Refactoring<br />
überschaubar zu halten. Während der gesamten Entwicklungsdauer erhalten die<br />
Infrastrukturentwickler Feedback von den Anwendungsentwicklern um Verbesse-<br />
rungen an der Domänenarchitektur vornehmen zu können.<br />
Im Folgenden wird näher auf die in den beiden Entwicklungssträngen anfallenden<br />
Aktivitäten basierend auf [SV05], [VB06] und [Bet06c] eingegangen.<br />
4.2 Architektur-Entwicklungsstrang<br />
Im Rahmen des Architektur-Entwicklungsstranges wird die Domänenarchitektur<br />
entworfen, umgesetzt und laufend verbessert. Die erklärten Ziele bei der Entwick-<br />
lung sind zum einen die Ausweitung der Wiederverwendung von geschaffenen<br />
Artefakten und zum anderen eine Qualitätssteigerung des Codes sowie eine<br />
erhöhte Effizienz.<br />
Zum Projektstart ist es sinnvoll den in Abbildung 4.2 schematisch dargestellten<br />
Architektur-Entwicklungsstrang einmalig zu durchlaufen und erst danach mit der<br />
eigentlichen Anwendungsentwicklung zu beginnen. Im Folgenden werden die Sta-
4 Entwicklungsprozess, Vorgehensweise und Best Practices 32<br />
Abbildung 4.2: Erstellung einer Domänenarchitektur; Artefakte der Domänenarchitektur<br />
(hellgrau), wichtige Zwischenergebnisse (dunkelgrau);<br />
(Quelle: [SV05] Seite 204)<br />
tionen des Prozesses und die mit ihnen verbundenen Tätigkeiten vorgestellt.<br />
Prototyping<br />
Zu Beginn einer MDSD-Entwicklung existiert meist eine technische Plattform auf<br />
der die Domänenarchitektur aufbaut. Im Fallbeispiel in Kapitel 6 bilden Techni-<br />
ken aus dem J2EE Bereich sowie das Java-Webframework Struts diese Plattform.<br />
Sind diese Technologien für die Beteiligten noch neu, ist es sinnvoll sie im Rah-<br />
men einer Prototyping Phase kennen zu lernen. Die hier erzielten Ergebnisse<br />
können unter Umständen für die später zu erstellende Referenzimplementierung<br />
als Grundlage herangezogen werden.<br />
Plattformentwicklung<br />
Das Ziel dieser Tätigkeit ist die Implementierung der gemeinsamen MDSD-<br />
Plattform, also jener Komponenten die für alle Anwendungen der Domäne gleich<br />
sind. Die Plattform nimmt eine enorm wichtige Rolle im Rahmen von MDSD
4 Entwicklungsprozess, Vorgehensweise und Best Practices 33<br />
ein, da sie den generierten Code stützt und somit die Entwicklung der nötigen<br />
Transformationen zur Codegenerierung erleichtert.<br />
Zu beachten ist, dass dieser Schritt keine einmalige Maßnahme darstellt sondern<br />
eine iterative Aktivität ist. Des Weiteren ist es durchaus üblich, dass sich die<br />
Grenze zwischen Plattform und generiertem Code in die eine wie auch in die<br />
andere Richtung verschiebt.<br />
Referenzimplementierung erstellen<br />
Die Referenzimplementierung kann die Weiterentwicklung eines bereits existie-<br />
renden Prototypen sein, muss es aber nicht sein. Hier steht weniger der fachliche<br />
Gehalt als vielmehr eine Überdeckung mit den Konstrukten der DSL im Vor-<br />
dergrund. Das ist besonders wichtig, da die Referenzimplementierung zusammen<br />
mit dem Referenzmodell die Anwendung der DSL-Konzepte beschreibt und für<br />
die gewählte technische Plattform konkretisiert.<br />
Die Referenzimplementierung ist zwar nur ein Zwischenergebnis aber aus eben<br />
genannten Gründen ein sehr Wichtiges. Zusätzliche Bedeutung erlangt sie durch<br />
den Umstand, dass aus ihr die für die Codegenerierung benötigten Transforma-<br />
tionsvorschriften abgeleitet werden.<br />
Bei einer Neuentwicklung wird die Referenzimplementierung zuerst von Hand<br />
erstellt und nach und nach, sobald die Transformationsvorschriften vorliegen,<br />
durch aus dem Referenzmodell heraus generierten Code ersetzt. Zusammen mit<br />
der manuell ergänzten Fachlogik und den Komponenten der MDSD-Plattform<br />
muss der generierte Code wieder zu einer lauffähigen Referenzanwendung führen.<br />
Domänenanalyse/Design<br />
Das Ziel der Domänenanalyse ist die Findung einer DSL, die die Konzepte der<br />
Domäne beschreibt und formalisiert. Das Ergebnis kann zum Beispiel ein UML-<br />
Profil sein oder ein XML-Schema. Stahl und Völter geben in [SV05] Seite 207 die<br />
im Folgenden zitierten Ratschläge für die Beschaffenheit einer DSL:<br />
Die DSL sollte möglichst frei von technischen Termini sein, die<br />
ein Implementierungsdetail der MDSD-Plattform ... darstellen (z.B.<br />
Verwendung von EntityObject statt EntityBean als Stereotyp).<br />
Diese sprachliche Abstraktion von einer bestimmten Technologie erleichtert eine<br />
mögliche Migration auf eine andere Plattform.
4 Entwicklungsprozess, Vorgehensweise und Best Practices 34<br />
Die DSL sollte möglichst alle relevanten Konzepte der Domäne<br />
durch Sprachelemente semantisch überdecken.<br />
Hier wird eine Vollständigkeit der DSL gefordert. Sollten Konstrukte fehlen oder<br />
unvollständig sein, wird dies üblicherweise von den Anwendungsentwicklern be-<br />
merkt, da es für sie schwierig oder unmöglich ist gewisse Aspekte einer Anwen-<br />
dung auf Basis der DSL zu formalisieren.<br />
Die DSL sollte so kompakt wie möglich sein und keine Redundanzen<br />
aufweisen<br />
Das heißt, die DSL muss eindeutig sein, da es sonst zu fehlerhaften Modellen<br />
kommen könnte bzw. die Ausdrucksstärke darunter leidet.<br />
Die DSL muss die Wohlgeformtheit von Modellen überprüfbar ma-<br />
chen.<br />
Dieser Punkt ist besonders wichtig, falls die DSL eine Spezialisierung einer<br />
Sprache darstellt, wie es bei einem UML-Profil der Fall ist. Hier müssen<br />
Modellierungsvarianten, die in der allgemeinen Sprache zulässig sind, von der<br />
Spezialisierung aber nicht unterstützt werden, gefiltert werden.<br />
Nach Stahl und Völter besteht eine DSL im Rahmen der MDSD aus folgenden<br />
Teilen:<br />
• konkrete Syntax: z.B. ein UML-Profil oder ein XML-Schema<br />
• statische Semantik: Validierungsregeln und Einschränkungen. Sie be-<br />
schreiben die erlaubten und verbotenen Konstellationen.<br />
• Semantik: Die Semantik dokumentiert die Bedeutung der DSL-Konstrukte<br />
in textueller Form. Diese Information ist auch in den Transformationsvor-<br />
schriften und der Referenzimplementierung gekapselt. Allerdings ist sie hier<br />
bereits auf eine gewisse technische Plattform zugeschnitten.<br />
Des Weiteren weisen sie darauf hin, dass die DSL Findung eine der forderndsten<br />
Aufgaben im Rahmen einer MDSD-Entwicklung darstellt und entweder einiges<br />
an Erfahrung oder eine vorhandene Basis zum Beispiel in Form eines Beispiels<br />
nötig ist.
Referenzmodell<br />
4 Entwicklungsprozess, Vorgehensweise und Best Practices 35<br />
Das Referenzmodell verdeutlicht die DSL-Konzepte anhand eines Beispiels und<br />
dient als Vorlage für die Referenzimplementierung. Zusammen mit dieser bietet<br />
es eine detaillierte Beschreibung der Nutzung und des Zusammenspiels der DSL-<br />
Konstrukte.<br />
Transformationen ableiten<br />
Die Transformationen formalisieren den Übergang von einem Modell auf die Kon-<br />
strukte einer MDSD-Plattform. Sie transformieren ein Anwendungsmodell in eine<br />
lauffähige Implementierung oder einen Implementierungsrahmen. Abgeleitet wer-<br />
den sie aus der Referenzimplementierung.<br />
Die Arbeiten zum Fallbeispiel in Kapitel 6 haben gezeigt, dass es quasi unmöglich<br />
ist die Transformationen aus dem ” Nichts“ heraus zu erstellen, sondern immer<br />
eine Vorlage benötigt wird, aus der sie abgeleitet werden können.<br />
4.3 Anwendungs-Entwicklungsstrang<br />
Der Anwendungs-Entwicklungsstrang nutzt die Ergebnisse des Architektur-<br />
Entwicklunsstranges um auf dieser Basis ein individuelles Mitglied der<br />
Softwaresystem-Familie zu implementieren. Abbildung 4.3 zeigt die Akti-<br />
vitäten dieses Stranges und ihre Reihenfolge. In der Phase der Formalen<br />
Modellierung werden die fachlichen Anforderungen mittels der DSL formalisiert.<br />
Die Anwendungsentwickler orientieren sich hier besonders stark am Referenzmo-<br />
dell und der Referzenimplementierung. In dieser Phase ist eine funktionierende<br />
Kommunikation zwischen Architektur- und Anwendungsentwicklern besonders<br />
wichtig, da vor allem zu Beginn Fehler und Verbesserungspotential in der<br />
DSL festgestellt werden, die in der nächsten Überarbeitung der generativen<br />
Architektur Eingang finden. Darüber hinaus ist es durchaus wahrscheinlich, dass<br />
zusätzliches Generierungspotential aufgedeckt wird.<br />
Im nächsten Schritt wird aus dem Anwendungsmodell mit Hilfe der Transforma-<br />
tionsvorschriften Quellcode generiert, der um die individuelle Fachlogik manuell<br />
ergänzt die lauffähige Anwendung ergibt.
4 Entwicklungsprozess, Vorgehensweise und Best Practices 36<br />
Abbildung 4.3: Aktivitäten im Anwendungsentwicklungsstrang (Quelle: [SV05]<br />
Seite 211)
5 Einführung in<br />
openArchitectureWare<br />
5.1 Einleitung<br />
openArchitectureWare (kurz: oAW ) ist ein Werkzeugkasten bestehend aus ei-<br />
nem Generator und verschiedenen unterstützenden Modulen, der Entwicklern die<br />
Umsetzung von MDSD Projekten ermöglicht. oAW ist in Java implementiert und<br />
streng modular aufgebaut. Es besteht daher die Möglichkeit existierende Kom-<br />
ponenten selbständig zu ergänzen und neue hinzuzufügen.<br />
Unterstützt werden von Seiten des Werkzeugs Modelle beliebigen Formats<br />
und auch hinsichtlich des generierten Codes besteht keinerlei sprachliche Ein-<br />
schränkung. Um die Bedienung zu vereinfachen liegt oAW in Form eines Eclipse<br />
Plugins vor, das unter anderem Editoren, Modellbrowser und einen Debugger zur<br />
Verfügung stellt. Einen Überblick über die Kernfunktionalität bietet die folgende<br />
Auflistung:<br />
• Das Metamodell der Domäne, in deren Rahmen Code generiert wird, liegt<br />
explizit in Form von Java Klassen vor. Wie ein UML-Metamodell in oAW<br />
eingebunden werden kann, wird in Abschnitt 5.5 beschrieben.<br />
• Die zu verarbeitenden Modelle können in beliebigen Formaten vorliegen.<br />
Es wird nur ein für das jeweilige Format passender Instantiator benötigt.<br />
Derzeit werden standardmäßig UML, EMF, XML und Visio Modelle un-<br />
terstützt.<br />
• Die Workflow Engine ermöglicht eine Steuerung der Generatorabläufe<br />
über XML Konfigurationsdateien (siehe 5.4).<br />
• Der Generator erzeugt beliebigen textuellen Output basierend auf den in<br />
der Templatesprache Xpand (siehe 5.6) definierten Transformationsvor-<br />
schriften. Diese Sprache wurde im Rahmen des oAW Projekts definiert.<br />
37
5 Einführung in openArchitectureWare 38<br />
• Es besteht die Möglichkeit mittels einer deklarativen Constraint<br />
Checking Language die Einhaltung diverser Modellierungsregeln zu über-<br />
prüfen (siehe 5.9).<br />
oAW wird im Rahmen eines Open Source Projektes (Homepage siehe [oaw05])<br />
entwickelt und liegt derzeit in Version vier vor. Auf diese Version beziehen sich<br />
die hier beschriebenen Vorgangsweisen.<br />
Die oAW Dokumentation unterscheidet zwischen zwei unterschiedlichen Metho-<br />
diken. Die erste Möglichkeit,die Modellierung mittels eines externen UML-Tools<br />
durchzuführen, wird als ” classic style“ bezeichnet (siehe [Kad06b]). Die Bezeich-<br />
nung ” klassisch“ rührt daher, dass diese Methode bereits in früheren Versionen<br />
unterstützt wurde.<br />
Die zweite Möglichkeit, die es erst seit Version vier gibt, besteht darin die Mo-<br />
dellierung mittels des Eclipse Modeling Frameworks (EMF) vorzunehmen. Für<br />
oAW macht es keinen Unterschied ob EMF oder UML als Modellierungssprache<br />
zum Einsatz kommt. Beide Techniken werden vollwertig unterstützt.<br />
Im Rahmen dieser Arbeit wird nur der klassische Weg mittels UML-Modellierung<br />
beschritten. Diese Wahl liegt nicht in den Vor- oder Nachteilen der einen bzw.<br />
anderen Technik begründet, sondern einzig und allein in dem Umstand, dass<br />
die Arbeiten zum Fallbeispiel aus Kapitel 6 zum Zeitpunkt des Erscheinens von<br />
Version vier zu weit fortgeschritten waren, als dass eine Abwägung noch sinnvoll<br />
gewesen wäre.<br />
Die folgenden Ausführungen stellen die Grundlage für das Verständnis des Fall-<br />
beispiels in Kapitel 6 dar und sollen dem Leser die verschiedenen Teile von oAW<br />
und deren Verwendung im Rahmen eines MDSD-Projekts näher bringen.<br />
Einen guten Überblick über die unter [oaw06d] erhältliche Dokumentation bie-<br />
tet [Völ06a].<br />
5.2 Funktionsweise des Generators<br />
Abbildung 5.1 zeigt die Funktionsweise des oAW Generators. Als Eingabe<br />
benötigt der Generator ein beliebiges formales Modell, das der Semantik des vor-<br />
ab konfigurierten Metamodells folgt. Dieses Modell wird im ersten Verarbeitungs-<br />
schritt vom Parser eingelesen. Der Instantiator benutzt diese Informationen im
5 Einführung in openArchitectureWare 39<br />
Abbildung 5.1: Funktionsweise des openArchitectureWare-Generators (Quelle:<br />
[SV05] Seite 111)<br />
nächsten Schritt, um für jedes Element eine Instanz der passenden Metaklasse 1 im<br />
Speicher abzulegen. Auf diese Weise erhält man einen virtuellen Objektgraphen<br />
im Speicher des Generators. Beispielsweise wird ein Element vom Typ UML-<br />
Class durch eine Instanz von org.openarchitectureware.meta.uml.classifier.Class<br />
repräsentiert. Die im Speicher befindlichen Objekte werden nun mittels der<br />
bestehenden Validierungsregeln auf eine Einhaltung der Constraints geprüft.<br />
Nach diesen vorbereitenden Schritten kann die eigentliche Codegenerierung<br />
stattfinden. Dabei wendet der Codegenerator einen Satz von Transformations-<br />
vorschriften (=Templates) auf die Elemente des im Speicher befindlichen Modells<br />
an und erzeugt so den gewünschten Quellcode.<br />
Die hier vorgestellten Abläufe wurden aus [Völ05c] Abschnitt 4, [Völ05a] und<br />
[SV05] Abschnitt 6.9 entnommen.<br />
5.3 Eclipse Plugin: Installation und erste Schritte<br />
Eine der wichtigsten Eigenschaften des oAW-Werkzeugkastens stellt die Integra-<br />
tion in die Entwicklungsumgebung Eclipse ( [ecl06]) dar. Die Integration wurde,<br />
wie es bei Eclipse üblich ist, durch ein so genanntes Plugin realisiert. Dieses<br />
stellt beispielsweise Editoren für Templates, Extensionfiles und Checkfiles zur<br />
Verfügung. Des Weiteren wird die Möglichkeit geboten Generierungsvorgänge<br />
per Mausklick auszuführen und nötigenfalls auch darin enthaltene Fehler mittels<br />
des Eclipse Debuggers zu suchen.<br />
Im Folgenden wird beschrieben wie man das Plugin installiert, die Funktiona-<br />
1 Gemeint ist in diesem Fall eine Javaklasse, da wie in der Einleitung bereits erwähnt wurde,<br />
das Metamodell dem Generator in Form von Javaklassen kenntlich gemacht wird. Diese<br />
Klassen bezeichnet die Dokumentation von oAW in [Völ05c] auch als Metaklassen. Diese<br />
Arbeit schließt sich der in der oAW-Dokumentation verwendeten Nomenklatur an.
5 Einführung in openArchitectureWare 40<br />
Paket Inhalt Abhängigkeit<br />
oaw-core Workflow Engine, EMF Integration, oaw-core<br />
oaw-core-plugins<br />
Xpand 2 Engine<br />
Eclipse basierte IDE Unterstützung inkl<br />
Editoren<br />
oaw-core<br />
oaw-classic Unterstützung der klassischen Vorgangsweise<br />
inklusive Metamodellgenerator und<br />
Instantiators<br />
oaw-core<br />
Tabelle 5.1: Für das Fallbeispiel benötigte oAW Komponenten und ihre<br />
Abhängigkeiten (Quelle [Kad06a])<br />
lität der einzelnen Komponenten nutzt und welche Schritte nötig sind, um einen<br />
Eclipse Workspace für die Umsetzung eines MDSD Projekts vorzubereiten.<br />
5.3.1 Installation<br />
Sämtliche Teile des oAW Plugins können unter [oaw06b] als Zip File herunter-<br />
geladen werden. Für die weiteren Schritte wird vorausgesetzt, dass Eclipse ab<br />
Version 3.1 bereits installiert wurde. Für die Ausführung des Fallbeispiels von<br />
Kapitel 6 werden die in Tabelle 5.1 beschriebenen Pakete benötigt.<br />
Um das Plugin nach dem Download zu installieren, muss die Datei<br />
oaw-core-plugins.zip in das Eclipse Stammverzeichnis extrahiert werden.<br />
Die Struktur des Zip files wurde so gewählt, dass sich die darin enthaltenen<br />
Dateien nach der Extraktion in den korrekten Verzeichnissen befinden.<br />
Um den in Abschnitt 5.3.3 beschriebenen Dumpfile Browser nutzen zu können,<br />
muss das Zip File /plugins/org.openarchitectureware.dump_4.0.0.zip aus<br />
dem oaw-classic Paket ebenfalls in das Eclipse Stammverzeichnis exportiert<br />
werden. Alle Installationen sind nach einem Neustart von Eclipse abgeschlossen.<br />
Weitere Hinweise zur Installation von zusätzlichen Komponenten können<br />
[Kad06a] entnommen werden.<br />
5.3.2 Editoren<br />
Einen Hauptbestandteil des oAW-Plugins machen die Editoren aus. Einer der<br />
wichtigsten für die Entwicklung ist der in Abbildung 5.2 dargestellte Xpand-<br />
Templateeditor. Er stellt neben Syntax Highlighting und Codecompleation auch<br />
eine statische Fehlerüberprüfung zur Verfügung. Daneben gibt es noch Editoren<br />
für die so genannten Extensions, die Klassen des Metamodells um zusätzliche in<br />
den Templates nutzbare Eigenschaften erweitern und für die in den Checkfiles<br />
enthaltenen Validierungsregeln.
5 Einführung in openArchitectureWare 41<br />
Abbildung 5.2: Der Xpand Templateeditor<br />
5.3.3 Auswertung von Dump Files<br />
In der klassischen Vorgangsweise legt der oAW Generator nach einem erfolg-<br />
reichen Durchlauf einen so genannten Dump an. Das ist im Wesentlichen eine<br />
serialisierte Datenstruktur, die Informationen über den Aufbau des im letzten<br />
Generatordurchlaufs instanzierten Modells enthält. Man kann daher Dumpfiles<br />
mit Logfiles vergleichen.<br />
Mit Hilfe des Eclipse Plugins ist es möglich deren Inhalt auszuwerten. Um den<br />
Dump zu durchforsten, muss im Kontextmenü der Dumpdatei die Option Open<br />
Dump gewählt werden. Falls das Modell keine Fehler hat, öffnet sich daraufhin die<br />
Strukturansicht (siehe Abbildung 5.3) in der die Elemente des Modells und ihre<br />
Attribute in einer Baumstruktur dargestellt werden. Dadurch ist der Entwickler<br />
in der Lage Probleme, die während des Generatordurchlaufs auftraten und aus<br />
der Modellierung heraus entstanden, ausfindig zu machen.<br />
5.3.4 Eclispe-Workspace konfigurieren<br />
Um einen Generator für die Modelle einer Domäne mittels oAW umsetzen zu<br />
können, muss der verwendete Eclipse Workspace im Vorfeld konfiguriert werden.<br />
Der Workspace setzt sich in der Regel aus drei Typen von Projekten zusammen.<br />
Zum einen sind das Projekte die Bibliotheken und andere Bestandteile des oAW
5 Einführung in openArchitectureWare 42<br />
Abbildung 5.3: Die Strukturansicht des Dump Browsers<br />
Toolkits selbst enthalten. Zum anderen werden Projekte angelegt die gemeinsam<br />
das Fundament der Softwaresystemfamilie, bestehend aus dem zu entwickelnden<br />
Generator und den Plattformbestandteilen, bilden.<br />
Die restlichen Projekte umfassen die mit Hilfe von Generator und Plattform<br />
generierten Anwendungen und deren manuell verfasster Quellcode. Im Folgenden<br />
wird beschrieben wie die oben genannten Projekte angelegt und Abhängigkeiten<br />
aufgelöst werden.<br />
Es wird darauf hingewiesen, dass die beschriebene Konfiguration keineswegs zwin-<br />
gend erforderlich ist, um ein Projekt mittels oAW zu realisieren. Es handelt sich<br />
dabei lediglich, um die in der Dokumentation empfohlene Vorgangsweise, die auch<br />
im Rahmen des Fallbeispiels in Kapitel 6 angewandt wird. Beschrieben wird diese<br />
Vorgangsweise in [Kad06a], [Kad06b] und [Tho06]<br />
Projektstruktur<br />
Im ersten Schritt wird über den Menüpunkt File - New - Project... ein neu-<br />
es Javaprojekt für die benötigten oAW Module angelegt. Danach werden<br />
in das soeben erstellte Projekt die in Tabelle 5.1 beschriebenen Zipdateien<br />
oaw-core-4.0.0.zip und oaw-classic-4.0.0.zip entpackt.<br />
Diese Schritte sind zwar nicht zwingend notwendig, allerdings erleichtert die<br />
explizite Integration dieser Module die weitere Arbeit, da alle anderen Projekte<br />
Abhängigkeiten zu den Bibliotheken des oAW-Toolkits aufweisen.<br />
Im zweiten Schritt wird ein Projekt für den domänenspezifischen Generator, der<br />
die Transformation von Modell zu Code vornehmen soll, angelegt. Innerhalb die-<br />
ses Projekts erstellt man nun folgende Ordner und Source Folder 2 :<br />
• src - Dieser Source Folder enthält die manuell verfassten Komponenten des<br />
2 Eclipse bezeichnet Ordner, die Quellcode enthalten als Source Folder
5 Einführung in openArchitectureWare 43<br />
Generators, wie zum Beispiel Templates, Erweiterungen der Metamodell-<br />
klassen und Validierungsregeln.<br />
• src-gen - Dieser Source Folder enthält die mittels des in Abschnitt 5.5.2<br />
beschriebenen Metamodellgenerators automatisch erzeugten Metamodell-<br />
klassen.<br />
• metamodel - Dieser Ordner enthält die Metamodelle, mit denen die Kon-<br />
zepte der Domäne abgebildet werden in ihren Ausgangsformaten.<br />
• mappings - In diesen Ordner werden für den Generierungsvorgang nöti-<br />
ge Mappingfiles abgelegt. Mappingfiles sind XML Dateien, die beschreiben<br />
welchen Elementen des oAW Frameworks welche Metamodell Konzepte zu-<br />
geordnet sind. Des Weiteren definieren sie eine Zuordnung zwischen den in<br />
UML-Modellen verwendeten Stereotypen und den Metamodellklassen.<br />
Die empfohlene Aufteilung des Quellcodes in generierte und manuell codierte<br />
Bestandteile wird auf Dateisystemebene durch die Ordner src und src-gen<br />
realisiert. Die Dokumentation von oAW rät generierten und nicht genierten Code<br />
nur zu vermischen, wenn die Technologie keine andere Möglichkeit der Erweite-<br />
rung bietet. Im objektorientierten Umfeld beispielsweise werden generierter und<br />
manuell codierter Code mittels den Erweiterungsmechanismen der Vererbung<br />
verknüpft.<br />
Eine Einbindung von manuell entwickelten Teilen in generierten Code wird<br />
durch die Verwendung von so genannten Protected Regions ermöglicht. Wie<br />
das geht wird in Abschnitt [KE06] erklärt. Die Vermischung von Code hat<br />
allerdings mehrere Nachteile. Zum einen ist die Versionierung komplizierter, da<br />
auch generierter Code versioniert werden muss. Zum anderen besteht die Gefahr,<br />
dass auf Grund eines Programmier- oder Modellierfehlers Quellcode innerhalb<br />
eines geschützten Bereichs verloren geht.<br />
Im dritten Schritt werden die Projekte angelegt, die gemeinsam die zu entwickeln-<br />
de Applikation bilden. Auch hier sind wieder getrennte Ordner für manuellen und<br />
generierten Code anzulegen.<br />
Nach dieser Konfiguration sieht die Projektstruktur ähnlich dem in Abbildung<br />
5.4 gezeigten Beispiel aus.<br />
Konfiguration des Build Path<br />
Nach dem Anlegen der einzelnen Projekte muss der so genannte Build Path ge-<br />
setzt werden. Das heißt, der Entwicklungsumgebung muss bekannt gemacht wer-
5 Einführung in openArchitectureWare 44<br />
Abbildung 5.4: Beispiel einer Projektstruktur für ein mit oAW 4 und Eclipse<br />
realisiertes MDSD-Projekt<br />
den, wo die benötigten Bibliotheken zu finden sind. Dies geschieht über den Ein-<br />
trag Build Path - Configure Build Path ... des Kontextmenüs eines Projekts. Im<br />
daraufhin erscheinenden Dialog können über den Reiter Libraries Bibliotheken<br />
in Form von jar Dateien hinzugefügt werden.<br />
Das Generatorprojekt selbst benötigt die in Tabelle 5.2 dargestellten Bibliothe-<br />
ken des oAW Toolkits. Sämtliche Bibliotheken sollten sich in dem im vorigen<br />
Abschnitt erstellten Projekt für oAW Module befinden.<br />
Die Applikationsprojekte selbst müssen nur eine Abhängigkeit zu<br />
oaw-core-4.0.0.jar und zum Generatorprojekt definieren. Abhängigkei-<br />
oaw-classic-4.0.0.jar oaw-core-4.0.0.jar<br />
ahclib-1.2.jar antlr-2.7.6.jar<br />
beanutils-1.7.0.jar cli-1.0.jar<br />
commons-lang-2.0.jar jalopy-1.5rc3.jar<br />
jaxen-core-1.0.jar jaxen-jdom-1.0.jar<br />
jdom.jar log4j-1.2.8.jar<br />
logging-1.0.3.jar saxpath-1.0.jar<br />
oro-2.0.6.jar<br />
Tabelle 5.2: Vom Generatorprojekt benötigte jar Dateien aus dem oAW Toolkit
5 Einführung in openArchitectureWare 45<br />
ten zwischen Projekten können auch über den Configure Build Path... Dialog<br />
gesetzt werden.<br />
5.4 Ablaufsteuerung mittels des Workflow Konzepts<br />
Der Generierungsprozess wird über die deklarative und mittels einer einfa-<br />
chen XML basierten Sprache konfigurierbare Workflow engine gesteuert. Work-<br />
flows sind also ein Mechanismus, um eine Sequenz von Aktivitäten in ei-<br />
ner benutzerdefinierten Reihenfolge abzuarbeiten. Ein Worfklow setzt sich da-<br />
bei aus beliebig vielen WorkflowComponents zusammen. Solche Bestandtei-<br />
le sind üblicherweise model parser, Validatoren, Modelltransformatoren und<br />
Codegeneratoren. oAW4 enthält bereits alle für einen Generierungsablauf<br />
nötigen Komponenten. Es ist aber problemlos möglich mittels des Interfa-<br />
ces org.openarchitecutureware.workflow.WorkflowComponent eigene Kom-<br />
ponenten zu entwickeln. Für die konkrete Vorgangsweise wird auf [EV06] verwie-<br />
sen.<br />
Die Reihenfolge des Aufrufs und die Konfiguration der einzelnen WorkflowCom-<br />
ponents mittels Parametern, die beim Aufruf übergeben werden, wird in XML<br />
Dateien mit der Endung .oaw abgespeichert. Es ist möglich die Konfiguration auf<br />
mehrere Dateien aufzuteilen, ähnlich wie es bei dem Buildtool Ant (siehe [ant05])<br />
der Fall ist. Listing 5.1 zeigt das Beispiel einer Workflowkonfiguration bei dem<br />
zuerst ein model parser und anschließend ein Generator aufgerufen werden. Ein<br />
ausführliches Beispiel einer Workflowkonfiguration ist in Kapitel 6 zu finden. Wei-<br />
terführende Informationen zum Thema können [EV06] entnommen werden.<br />
Listing 5.1: Beispiel einer Workflowkonfiguration (Quelle: [EV06] Seite 5)<br />
<br />
< property name =’ genPath ’ value = ’/ home / user / target ’/ ><br />
< property name =’ model ’ value = ’/ home / user / model .xmi ’/ ><br />
< component class =’ oaw . emf . XmiReader ’><br />
<br />
<br />
< component class =’ oaw . xpand2 . Generator ’><br />
<br />
<br />
<br />
<br />
5 Einführung in openArchitectureWare 46<br />
Abbildung 5.5: Option zum Starten eines oAW-Workflows<br />
Die definierten Workflows werden über das Eclipse Plugin gestartet. Dazu muss<br />
im Kontextmenü der Workflowdatei die Option Run As - oAW Workflow aus-<br />
gewählt werden (siehe Abbildung 5.5). Danach startet die Verarbeitung. Sollte<br />
es zu Fehlern kommen, kann der Workflow mittels der Option Debug As - debug<br />
workflow im Debugmodus gestartet werden.<br />
Alternativ ist auch eine Verarbeitung mittels Ant oder über die Commandline<br />
möglich. Diese Vorgangsweisen bieten allerdings mehr Nach- als Vorteile. Aus<br />
diesem Grund werden sie im Rahmen dieser Arbeit auch nicht näher behandelt.<br />
5.5 Modellierung und Metamodellentwicklung mit<br />
Hilfe von UML<br />
Metamodelle bilden die Konzepte einer Domäne durch Modellierungselemente<br />
ab und beschreiben wie sie im Rahmen des Modellierungsansatzes verwendet<br />
werden können. Dieses Wissen ermöglicht erst eine effiziente Generierung von<br />
Quellcode, da dem Generator durch das Metamodell die Bedeutung der zu ver-<br />
arbeitenden Modelle bewusst gemacht wird. Anhand dieser Informationen kann<br />
er entscheiden, welche Transformationsvorschriften (=Templates) auf welches<br />
Modellelement anzuwenden sind. Darüber hinaus können die Eingabemodelle
5 Einführung in openArchitectureWare 47<br />
gegen das Metamodell validiert werden, um Modellierungsfehler aufzudecken.<br />
Im Rahmen von oAW kommt dem Metamodell noch weitere Bedeutung zu.<br />
Durch die Repräsentation des Metamodells in Form von Javaklassen wird die<br />
Komplexität der Eingabeformate vor den Transformationsvorschriften versteckt.<br />
Damit kann die Struktur der Problemdomäne unabhängig von der konkreten<br />
Modellsyntax dargestellt werden.<br />
Des Weiteren bieten die Klassen des Metamodells die Möglichkeit in den Trans-<br />
formationsvorschriften benötigte Logik zentral zu implementieren. Typische<br />
Beispiele sind die Auswertung bestimmter Eigenschaften von Modellelementen<br />
oder die Durchführung komplexer Suchvorgänge innerhalb der Modelle. Die<br />
Templatesprache Xpand bietet zwar Konstrukte zum Traversieren des Modells,<br />
für darüber hinausgehende Anweisungen ist eine Realisierung in Java oder als<br />
Extension (siehe Abschnitt 5.8) allerdings unumgänglich.<br />
Eine übliche Vorgangsweise in oAW ist es die Modellierung in UML mit einem<br />
externen Modellierungstool durchzuführen. Das Modell wird dem Generator<br />
anschließend im XML Metadata Interchange Format 3 (XMI siehe [omg06]), für<br />
das oAW eigene Parser mitliefert, übergeben. Auch das Metamodell kann auf<br />
diese Weise erstellt werden, da oAW über einen Metamodellgenerator verfügt,<br />
der aus einem in UML vorliegenden Metamodell, die von oAW benötigten<br />
Javaklassen generiert. Wie das geht zeigt Abschnitt 5.5.2.<br />
Dieser Abschnitt zeigt wie man ein Metamodell sowie konkrete Modelle, die des-<br />
sen Konzepten folgen, mit einem externen UML-Modellierungstool entwickelt und<br />
in oAW einbindet. Weiterführende Informationen findet man in [Völ05c], [Völ05b]<br />
und [Tho06].<br />
5.5.1 Modellierungswerkzeuge<br />
Für die Modellierung des Fallbeispiels wurde Poseidon for UML 3.2 Commu-<br />
nity Edition ( [pos05]) von Gentleware gewählt. Poseidon ist ein in der Com-<br />
munity Edition kostenloses UML-Modellierungsprogramm, dass den Export von<br />
Modellen in das Format XMI 1.2 unterstützt. Ein weiterer wichtiger Grund für<br />
die Wahl ist die sehr gute Unterstützung von Poseidon durch das oAW Fra-<br />
mework. Wie bereits erwähnt spricht jedes Modellierungswerkzeug einen ande-<br />
3 XMI bietet die Möglichkeit UML-Modelle in XML Dateien abzuspeichern. Problematisch in<br />
diesem Zusammenhang ist die Tatsache, dass XMI nicht gleich XMI ist, da jedes Modellierungswerkezeuge<br />
einen anderen XMI-Dialekt spricht.
5 Einführung in openArchitectureWare 48<br />
Abbildung 5.6: Metamodell mit einer Anbindung an die übergeordneten Konzepte<br />
der UML<br />
ren XMI Dialekt, was dazu führt, dass von Seiten des Generators für jedes<br />
Programm ein eigener Adapter benötigt wird, um die Modelle verarbeiten zu<br />
können. Der zu verwendende Adapter muss explizit in der Workflowkonfigura-<br />
tion bekannt gegeben werden. Wie das geht zeigt das Fallbeispiel in Kapitel<br />
6. Eine Liste der unterstützten Tools kann derzeit nur dem Inhalt des Javapa-<br />
kets org.openarchitectureware.core.frontends.xmi.toolsupport.uml ent-<br />
nommen werden.<br />
5.5.2 Metamodellentwicklung in UML mit dem<br />
Modellierung<br />
oAW-Metamodellgenerator<br />
Metaklassen sind einfache Javaklassen. Man kann Eigene erstellen oder der Ein-<br />
fachheit halber bestehende Metamodelle, wie das der UML durch Ableitung er-<br />
weitern. Die Erweiterung des UML Metamodells geschieht beispielsweise durch<br />
die Modellierung eines UML Profils. Das heißt, die Verwendung eines UML Ste-<br />
reotyps ist vergleichbar mit der Ableitung der zugehörigen Metaklasse.<br />
Ein Beispiel für diese Vorgangsweise wird in Abbildung 5.6 dargestellt. Die Klasse<br />
data::DataObject ist eine Instanz von UML::Class und besitzt unter seinen At-<br />
tributen genau eines vom Typ data::Key, das wiederum UML::Attribute ableitet.<br />
Aus diesen Informationen könnte man zum Beispiel eine JavaBean erzeugen.<br />
Konkrete Modelle, wie das in Abbildung 5.7, nutzen diese Konzepte durch die<br />
Vergabe von Stereotypen, die den Klassen des Metamodell zugeordnet sind.<br />
Um die Implementierung von UML basierten Metamodellen zu erleichtern,
5 Einführung in openArchitectureWare 49<br />
Abbildung 5.7: Nutzung eines Metamodells mittels Stereotypen<br />
stellt oAW mit dem Paket org.openarchitectureware.meta.uml bereits ei-<br />
ne Umsetzung des UML Metamodells zur Verfügung. Mit dessen Hilfe würde<br />
eine Implementierung der Klasse DataObject aus Abbildung 5.6 wie in Lis-<br />
ting 5.2 dargestellt aussehen. Die Implementierung von Key sieht ähnlich<br />
aus. Hier wird statt org.openarchitectureware.meta.uml.classifier.Class<br />
org.openarchitectureware.meta.uml.classifier.Attribute erweitert.<br />
package data ;<br />
Listing 5.2: Implementierung der Metaklasse DataObject<br />
import org . openarchitectureware . meta . uml . classifier . Class ;<br />
public class DataObject extends Class {<br />
}<br />
private String keyType = "";<br />
private Key key = null ;<br />
public void setKey ( Key key ){<br />
}<br />
this . key = key ;<br />
public Key Key (){<br />
}<br />
return this . key ;<br />
public void setKeyType ( String keyType ){<br />
}<br />
this . keyType = keyType ;<br />
public String KeyType (){<br />
}<br />
return this . keyType ();<br />
Listing 5.2 zeigt, dass DataObject eine Spezialisierung von Class ist und somit<br />
sämtliche Eigenschaften und Methoden erbt. Ein typisches Beispiel für eine<br />
geerbte Methode ist Name(), die den Namen eines Objekts zurückgibt.
5 Einführung in openArchitectureWare 50<br />
Die Attribute und Assoziationen der Metaklasse finden sich in den Getter- und<br />
Setter-Methoden der jeweiligen Klassen wieder, wobei die Getter-Methode per<br />
Konvention aus dem Namen des Attributs mit groß geschriebenem Anfangsbuch-<br />
staben bestehen. Das sonst übliche Präfix get entfällt in diesem Fall.<br />
Um den Wert zu setzen, wird ein UML tagged value benutzt, wobei der Name<br />
des Eigenschaftswerts der Name des Attributs aus dem Metamodell ist.<br />
Nach der Implementierung der Metaklasse muss noch ein weiterer Schritt er-<br />
folgen, um es dem Instantiator zu ermöglichen eine Verbindung zwischen dem<br />
Stereotyp > und der Klasse data.DataObject herzustellen. In<br />
der Konfigurationsdatei metamappings.xml im Verzeichnis mappings (siehe Ab-<br />
schnitt 5.3.4) muss eine Zuordnung von Stereotyp zu Metaklasse vorgenommen<br />
werden. Den Eintrag für > zeigt Listing 5.3.<br />
Listing 5.3: Zuordnung von Stereotypen zu Metaklassen via metamappings.xml<br />
<br />
<br />
DataObject <br />
data . DataObject <br />
<br />
<br />
Metamodellgenerator<br />
Da die händische Implementierung des Metamodells in Java eine mühevolle und<br />
fehleranfällige Angelegenheit ist, liegt dem Modul oaw-classic-4.0.0.zip ein<br />
Metamodellgenerator bei, der die Umwandlung eines Metamodells von UML zu<br />
Java vornimmt. Diese Vorgangsweise ist ganz im Sinne von MDSD.<br />
Prinzipiell sind Metamodelle nur UML-Modelle. Der Modellierer kann also sein<br />
gesamtes UML-Fachwissen nutzen. Um den Metamodellgenerator verwenden<br />
zu können, müssen allerdings gewisse Regeln beachtet werden. Die Wichtigsten<br />
werden anhand des Beispiels aus Abbildung 5.6 beschrieben. Für weiter gehende<br />
Informationen wird auf [Völ05b] verwiesen.<br />
Abbildung 5.8 zeigt die für den Metamodellgenerator adaptierte Variante des<br />
Beispiels. Die Anbindung an das Metamodell der UML erfolgt über die im Fra-<br />
mework bereits existierenden Klassen Class und Attribute. Beide Klassen sind<br />
mit dem Stereotyp > gekennzeichnet, das dem Generator anzeigt,
5 Einführung in openArchitectureWare 51<br />
Abbildung 5.8: Angepasstes Metamodell für den Metamodellgenerator<br />
dass diese Objekte bereits existieren und nicht mehr generiert werden müssen.<br />
Diese Klassen werden nun durch DataObject und Key erweitert. Durch die Aus-<br />
zeichnung mit dem Stereotyp > erzeugt der Metamodellgenera-<br />
tor abstrakte Basisklassen, die vom Entwickler durch konkrete Klasse abgeleitet<br />
werden müssen. Auf diese Weise ist es möglich die generierten Metaklassen durch<br />
eigenen Code zu ergänzen.<br />
Bei den Attributen der Metaklassen ist zu beachten, dass nur die folgenden drei<br />
Datentypen verwendet werden dürfen:<br />
• Strings: In diesem Fall werden einfache Setter und Getter generiert.<br />
• boolean: In diesem Fall wird der Getter mit dem Präfix ” is“ gekennzeich-<br />
net, und es existieren Setter sowohl für String als auch boolean Parameter.<br />
• int: In diesem Fall existieren Setter für int und String Parameter.<br />
Der Generatorlauf wird über ein dem Metamodellgenerator beiliegendes Work-<br />
flowskript gestartet. Es muss vom Entwickler nur noch richtig parametrisiert<br />
werden. Ein Beispiel dafür findet man in [oaw06c] bzw. in der Umsetzung des<br />
Fallbeispiels aus Kapitel 6.<br />
5.6 Templateentwicklung mittels Xpand<br />
Das oAW Framework beinhaltet eine spezielle Templatesprache genannt Xpand<br />
um die Ausgabeerzeugung der Generatorläufe zu steuern. Die mit Hilfe der Spra-
5 Einführung in openArchitectureWare 52<br />
che erzeugten Templates werden in Dateien mit der Endung .xpt gespeichert.<br />
Diese Dateien müssen im Classpath des Generatorprozesses liegen, um verarbei-<br />
tet werden zu können.<br />
Dieser Abschnitt beschreibt die gängigsten Konstrukte der Xpand Templatespra-<br />
che. Für weitere Informationen wird auf [KE06] verwiesen.<br />
5.6.1 Allgemeine Struktur von Template Files<br />
Listing 5.4 zeigt ein Beispiel eines Templates mit dem der Code für ein JavaBean<br />
erzeugt werden kann. Anhand dieses Beispiels werden im Weiteren die Konstrukte<br />
der Sprache erklärt.<br />
Listing 5.4: Beispiel für ein Xpand Template<br />
≪IMPORT org :: openarchitectureware :: meta :: uml :: classifier≫<br />
≪IMPORT data≫<br />
≪EXTENSION templates :: Extensions≫<br />
≪DEFINE JavaBean FOR DataObject≫<br />
≪FILE StandardPath≫<br />
package ≪JavaPackageName≫ ;<br />
public class ≪ObjectName≫ {<br />
≪EXPAND Variablen≫<br />
}<br />
public ≪ObjectName≫ (){<br />
}<br />
≪EXPAND GetterSetter FOREACH Attribute≫<br />
≪ENDFILE≫<br />
≪ENDDEFINE≫<br />
≪DEFINE Variablen FOR DataObject≫<br />
≪FOREACH Attribute AS a≫<br />
private ≪a. Type .NameS≫ ≪a.NameS≫;<br />
≪ENDFOREACH≫<br />
≪ENDDEFINE≫<br />
≪DEFINE GetterSetter FOR Attribute≫<br />
public void set≪UpperCaseName ()≫( ≪Type.NameS≫ ≪NameS≫ ){<br />
}<br />
this . ≪NameS≫ = ≪NameS≫;<br />
public ≪Type.NameS≫ get≪UpperCaseName ()≫(){
}<br />
return this . ≪NameS≫;<br />
≪ENDDEFINE≫<br />
5 Einführung in openArchitectureWare 53<br />
Das Beispiel zeigt, dass eine Templatedatei aus einer beliebigen Anzahl von IM-<br />
PORT Anweisungen, gefolgt von einer beliebigen Anzahl an EXTENSION An-<br />
weisungen und einem oder mehreren DEFINE Blöcken, besteht. Ein weiteres,<br />
auffälliges Merkmal sind die Guillemotzeichen - ≪,≫ - , die Xpand-Anweisungen<br />
auszeichnen. Text außerhalb dieser Zeichen wird nicht interpretiert, sondern eins<br />
zu eins ausgegeben. Xpand-Schlüsselwörter werden groß geschrieben. Der restliche<br />
Inhalt der Anweisungen setzt sich aus Aufrufen von Methoden der Metaklassen<br />
und Extensions (siehe Abschnitt 5.8) zusammen.<br />
Würde man die Transformationsvorschriften aus Listing 5.4 auf das DataObject<br />
Student aus Abbildung 5.7 anwenden, erhielte man den Code aus Listing 5.5.<br />
package example ;<br />
public class Student {<br />
}<br />
Listing 5.5: Beispiel für ein Xpand Template<br />
private String matrikelnummer ;<br />
private String name ;<br />
public Student (){<br />
}<br />
public void setMatrikelnummer ( String matrikelnummer ){<br />
}<br />
this . matrikelnummer = matrikelnummer ;<br />
public String getMatrikelnummer (){<br />
}<br />
return this . matrikelnummer ;<br />
public void setName ( String name ){<br />
}<br />
this . name = name ;<br />
public String getName (){<br />
}<br />
return this . name ;
5 Einführung in openArchitectureWare 54<br />
5.6.2 Anweisungen der Xpand Templatesprache<br />
IMPORT<br />
Um nicht immerzu den voll qualifizierten Namen von Metaklassen und Defini-<br />
tionen schreiben zu müssen, kann mittels IMPORT ein Namespace importiert<br />
werden. Danach können alle unter diesem Namespace liegenden Konstrukte mit<br />
dem einfachen Namen aufgerufen werden. In Listing 5.4 geschieht das unter an-<br />
derem mittels ≪IMPORT meta::data≫. Wäre diese Anweisung nicht vorhanden,<br />
müsste jeder Aufruf von DataObject durch meta::data::DataObject ersetzt<br />
werden.<br />
EXTENSION<br />
Metamodelle werden üblicherweise auf eine strukturelle Art und Weise be-<br />
schrieben. Ein damit verbundener Nachteil ist eine erschwerte Definition von<br />
zusätzlichem Verhalten, wie Suchoperationen, oder abgeleitete Eigenschaften.<br />
Darüber hinaus ist es sinnvoll das Metamodell nicht mit Details der technischen<br />
Plattform zu überfrachten, da es die Wiederverwendbarkeit schmälert.<br />
Die Idee von Extensions ist es, einen Weg zu schaffen Metaklassen leicht um<br />
zusätzliches Verhalten zu erweitern. Extensions werden mit Hilfe der oAW Spra-<br />
che Extend in Dateien mit der Endung .ext definiert und mit der Anweisung<br />
≪EXTENSION templates::Extensions≫ in Templatedateien eingebunden. Wie<br />
die Definition von Extensions erfolgt zeigt Abschnitt 5.8. Wichtig ist, dass die<br />
importierte Extensionsdatei im Classpath des Generatorprozesses liegt.<br />
DEFINE<br />
DEFINE Blöcke stellen die eigentlichen Templates dar und sind das zentrale Kon-<br />
zept von Xpand. Das Tag besteht aus einem Namen, einer optionalen Parameter-<br />
liste und dem Namen der Metaklasse, auf die es anzuwenden ist. Abgeschlossen<br />
wird die Anweisung durch das Schlüsselwort ENDDEFINE (Syntax siehe Listing<br />
5.6). Innerhalb des Blocks gilt für die aktuell behandelte Instanz der Metaklasse<br />
ein implizites this.<br />
Listing 5.6: Syntax des Xpand DEFINE-Blocks (Quelle [KE06])<br />
≪DEFINE templateName ( formalCommaSeperatedParameterList )<br />
FOR MetaClass≫<br />
a sequence of statements<br />
≪ENDDEFINE≫
5 Einführung in openArchitectureWare 55<br />
Xpand Templates unterstützen einen parametrischen Polymorphismus. Das heißt,<br />
gibt es zwei Templates mit demselben Namen für zwei Metaklassen, die von der<br />
selben Superklasse erben, wendet Xpand das korrespondierende Template der<br />
Subklasse an, falls das Template der Superklasse für die Subklasse aufgerufen<br />
wird. Umgekehrt wird das Template der Superklasse aufgerufen, falls kein Sub-<br />
klassentemplate vorhanden ist.<br />
FILE<br />
Die FILE Anweisung leitet die Ausgabe zwischen FILE und ENDFILE in die<br />
spezifizierte Datei um. Die Pfadangabe ist immer relativ zum Zielverzeichnis des<br />
aktuellen Generatorlaufs.<br />
EXPAND<br />
Mit Hilfe der EXPAND Anweisung wird ein anderer DEFINE Block aufgerufen<br />
und dessen Ausgabe an der momentanen Stelle eingefügt. Anschließend fährt die<br />
Verarbeitung mit der nächsten Anweisung fort. EXPAND ist vergleichbar mit<br />
dem Aufruf einer Subroutine in anderen Programmiersprachen. EXPAND gibt es<br />
in drei unterschiedlichen Varianten:<br />
• ≪EXPAND templateName FOR ObjectName≫: Ruft das Template mit dem<br />
angegebenen Namen für das spezifizierte Objekt auf. Das Objekt muss eine<br />
Instanz der Metaklasse sein, für die das Template geschrieben wurde.<br />
• ≪EXPAND templateName≫: Ruft das Template mit dem angegebenen Namen<br />
für das aktuell verarbeitete Objekt auf. Die Anweisung ist äquivalent zu<br />
≪EXPAND templateName FOR this≫.<br />
• ≪EXPAND templateName FOREACH ElementOfAnCollection≫: Führt das<br />
spezifizierte Template für jedes Element einer Datenstruktur aus, die das<br />
Java Interface Collection implementiert.<br />
FOREACH<br />
Der FOREACH Ausdruck führt sämtliche Anweisungen zwischen FOREACH und<br />
ENDFOREACH für alle Objekte einer spezifizierten Java Collection - ähnlich<br />
der EXPAND-FOREACH Anweisung - aus. Das aktuell verarbeitete Element<br />
wird über eine lokale Variable angesprochen. Zu beachten ist, dass innerhalb<br />
eines FOREACH Blocks jede andere Anweisung erlaubt ist, d. h. auch weitere<br />
FOREACH Anweisungen. Die konkrete Syntax zeigt Listing 5.7.
5 Einführung in openArchitectureWare 56<br />
Listing 5.7: Syntax des Xpand-FOREACH Blocks (Quelle [KE06])<br />
≪FOREACH ElementOfAnCollection AS variableName<br />
[ SEPARATOR expression ]≫<br />
a sequence of statements using variableName to access the<br />
current element of the iteration<br />
≪ENDFOREACH≫<br />
IF<br />
Die IF Anweisung hat wie in anderen Programmiersprachen die Funktion ei-<br />
ne Entscheidung auf Grund einer spezifizierten Bedingung vorzunehmen. Es be-<br />
steht die Möglichkeit IF Blöcke durch ELSE und ELSEIF zu erweitern, auch eine<br />
Schachtelung ist erlaubt. Die konkrete Syntax zeigt Listing 5.8.<br />
≪IF expression≫<br />
Listing 5.8: Syntax des Xpand IF-Blocks (Quelle [KE06])<br />
a sequence of statements<br />
[ ≪ELSEIF expression≫<br />
a sequence of statements ]<br />
[ ≪ELSE expression≫<br />
a sequence of statements ]<br />
≪ENDIF≫<br />
5.7 Expressions Framework<br />
Das oAW4 Generator Framework stellt unterschiedliche textuelle Sprachen für un-<br />
terschiedliche Anwendungszwecke zur Verfügung. Es gibt zum Beispiel die bereits<br />
beschriebene Templatesprache Xpand (siehe Abschnitt 5.6) zur Codegenerierung,<br />
die in Abschnitt 5.9 beschriebene Sprache Check zur Überprüfung von Modellie-<br />
rungsvorschriften und die in Abschnitt 5.8 erklärte Sprache Extend zur Definition<br />
zusätzlicher Funktionalität. Diese Sprachen haben eines gemeinsam, sie arbeiten<br />
mit unterschiedlichen Meta- und Meta-Metamodellen (EMF, MOF etc.). Das Ex-<br />
pressions Framework hat die Aufgabe von diesen zum Teil recht unterschiedlichen<br />
Modellierungsformen zu abstrahieren und eine einheitliche Basis zu schaffen. Die<br />
Abstraktionsschicht, auf API-Basis auch als type system bezeichnet, erlaubt den<br />
den Zugriff auf die diversen built-in types und auf die registrierten Metamodellim-<br />
plementierungen. Neben dem Typsystem bietet das Framework eine Subsprache<br />
- Expressions -, die Konstrukte auf Basis des Typsystems zur Verfügung stellt,<br />
die in den anderen Sprachen des oAW Generator Frameworks wiederverwendet
5 Einführung in openArchitectureWare 57<br />
werden. So definiert Expressions beispielsweise die Syntax zum Vergleich von Ob-<br />
jekten, erläutert wie man auf Eigenschaften und Methoden von Objekten zugreift,<br />
beschreibt Operatoren zur Selektion von bestimmten Elementen einer Menge und<br />
vieles mehr. Eine Auswahl an Beispielen, die [Eff06b] entnommen sind, zeigt Lis-<br />
ting 5.9.<br />
Für weitergehende Informationen zum Expressions Framework siehe [Eff06b] und<br />
die Dokumentation der built-in types unter [oaw06a].<br />
Listing 5.9: Beispiel für Konstrukte der Subsprache Expressions Quelle [Eff06b]<br />
// Zugriff auf einen Eigenschaftswert :<br />
myModelElement . name<br />
// Zugriff auf eine Methode :<br />
myModelElement . doStuff ()<br />
// Boolsche Ausdrücke :<br />
!( ’ text ’. startsWith (’t ’) && ! false )<br />
// Selektiert alle Elemente die dem definierten<br />
// Boolschen Ausdruck entsprechen :<br />
collection . select ( v | boolean - expression -with -v )<br />
//If - Anweisung :<br />
condition ? thenExpression : elseExpression<br />
5.8 Extend Language<br />
Die Extend Language bietet die Möglichkeit Bibliotheken von unabhängigen<br />
Operationen, basierend auf Javamethoden oder oAW Expressions zu schaffen.<br />
Diese Bibliotheken - auch Extensions genannt - können von allen textuellen<br />
Sprachen, die auf der Expressions Subsprache aufbauen, genutzt werden. Extend<br />
Methoden sind vergleichbar mit statischen Javamethoden. Sie sind wie diese<br />
zustandslos, man muss daher alle benötigen Informationen durch die Parameter-<br />
liste übergeben. Man kann Extend-Methoden aber durchaus auf die Objekte des<br />
gerade im Speicher befindlichen Modells anwenden.<br />
Sind die von Extend zur Verfügung gestellten Konstrukte nicht ausreichend, ist<br />
es möglich die nötige Logik in einer statischen Java Methode zu implementieren.<br />
Diese statische Methode kann über eine Extend-Methode aufgerufen werden.<br />
Man führt gewissermaßen ein Mapping auf die statische Javamethode durch.
5 Einführung in openArchitectureWare 58<br />
Dieses Mapping ist nötig, da eine statische Javamethode in Sprachen wie XPAND<br />
oder Checks nicht direkt aufgerufen werden kann.<br />
Extendmethoden werden in Dateien mit der Endung .ext abgespeichert und<br />
müssen im Classpath des Generators liegen. Listing 5.10 zeigt ein Beispiel<br />
einer Extendbibliothek. Es ist zu erkennen, dass eine Extenddatei aus be-<br />
liebig vielen Namespace- und Extensionimporten, gefolgt von einer beliebi-<br />
gen Anzahl an Extendmethoden besteht. Eine Extendfunktion kann auf zwei<br />
unterschiedlichen Arten aufgerufen werden. Zum einen wie eine Funktion -<br />
funktionsname(element) - und zum anderen wie eine Objekteigenschaft mit-<br />
tels - element.funktionsname(). Weitere Informationen und Beispiele kann<br />
man [Eff06c] entnehmen.<br />
Listing 5.10: Beispiel für eine Extendbibliothek (Quelle: [Eff06c])<br />
import my: metamodel ;<br />
extension other :: ExtensionFile ;<br />
/**<br />
* Documentation<br />
*/<br />
anExpressionExtension ( String stringParam ) :<br />
;<br />
/**<br />
doingStuff ( with ( stringParam ))<br />
* java extensions are just mappings<br />
*/<br />
String aJavaExtension ( String param ) :<br />
;<br />
JAVA my. JavaClass . staticMethod ( java . lang . String )<br />
5.9 Constraint Checking<br />
Die Validierung von Modellen gegen Metamodelle ist eine der wichtigsten Schritte<br />
im Zuge der Codegnerierung, nur so kann ein korrekter Ablauf ermöglicht wer-<br />
den. Da die Modellvalidierung derzeit von Modelleriungsprogrammen kaum un-<br />
terstützt wird, muss diese Aufgabe vom Generator erfüllt werden. oAW stellt dem<br />
Entwickler zu diesem Zweck die Check Sprache (siehe [Eff06a]) zur Verfügung.<br />
Sie basiert auf dem in Abschnitt 5.7 beschriebenen Expression Framework.
5 Einführung in openArchitectureWare 59<br />
Mit Check definierte Regeln werden in Dateien mit der Endung .chk hinterlegt.<br />
Bei der Regeldefinition ist darauf zu achten, dass der korrekte Zustand und nicht<br />
ein möglicher Fehlerzustand beschrieben wird. Listing 5.11 gibt die Syntax für<br />
eine Check-Definition wieder. Listing 5.12 zeigt ein Beispiel.<br />
Bei der Regeldefinition kann die volle Mächtigkeit der definierten Exendbibliothe-<br />
ken, sowie alle Eigenschaften der Metaklassen genutzt werden, um die Korrektheit<br />
der Modelle zu garantieren.<br />
Listing 5.11: Syntax von Check-Regeln (Quelle: [Eff06a])<br />
context TypeName ( ERROR | WARNING ) msg - expression - using - this :<br />
;<br />
/**<br />
*/<br />
constraint - expression - using - this<br />
Listing 5.12: Beispiel für eine Check-Regel<br />
* EBADataClass und seine Erben müssen unter ihren<br />
* Attributen genau einen Schlüssel aufweisen .<br />
* Die Metaklassen Methode " Key " gibt diesen zurück .<br />
context EBADataClass ERROR Name + " -<br />
;<br />
Es muss genau ein Attribut mit dem Stereotyp<br />
geben !" :<br />
Key != null
6 Fallbeispiel<br />
6.1 Einleitung<br />
In Kapitel 5 wurde der Werkzeugkasten openArchitectureWare vorgestellt, der<br />
die Umsetzung von MDSD-Projekten ermöglicht. An dieser Stelle soll nun<br />
anhand eines praktischen Beispiels die Nutzung der Technologie gezeigt werden.<br />
Dazu wird eine Onlinebuchhandlung basierend auf Techniken aus dem J2EE<br />
Bereich entwickelt. Die bearbeitete Domäne lautet ” Softwarearchitektur für<br />
E-Businesssysteme“.<br />
Neben der Beschreibung, der diesem Beispiel zu Grunde liegenden Softwa-<br />
rearchitektur, wird gezeigt, wie das daraus abgeleitete Metamodell bzw. die<br />
für oAW angepasste Version inklusive der Validierungsregeln aussieht. Danach<br />
wird der Aufbau der verwendeten Transformationsvorschriften analysiert und<br />
ein ausführliches Beispiel zum Thema ” Ablaufsteuerung“ gegeben. Außerdem<br />
werden Erweiterungsmöglichkeiten des Beispiels vorgestellt. Abschließend werden<br />
die Entstehunggeschichte des Fallbeispiels und aufgetretene Probleme beleuchtet.<br />
Zudem erfolgt ein Analyse des Verhältnisses zwischen generiertem und manuell<br />
entwickeltem Code.<br />
Das Fallbeispiel wurde mit oAW Version vier im Sinne der klassischen Vorgangs-<br />
weise mit UML-Diagrammen umgesetzt und zeigt wie Sourcecode aus UML-<br />
Klassendiagrammen erzeugt werden kann. Der Eclipse Workspace mit den Sour-<br />
cen zum Fallbeispiel liegt der Arbeit bei. Die Nutzung ist nach der Installation der<br />
in Abschnitt 5.3 beschriebenen Eclipse-Plugins möglich. Der Workspace besteht<br />
aus folgenden Projekten:<br />
• eba-Generator: Der Generator selbst mit dem Metamodell und allen<br />
Transformationsvorschriften<br />
• eba-BuecherwurmEJB: Anwendungsprojekt, das die Geschäftslogik-<br />
und Datenhaltungsschicht realisiert<br />
• eba-BuecherwurmWeb: Anwendungsprojekt mit dem Webfrontend der<br />
Onlinebuchhandlung<br />
60
6 Fallbeispiel 61<br />
• oaw4: Von den anderen Projekten benötigte oAW Libraries<br />
6.2 Das Anwendungsbeispiel<br />
Als Anwendungsbeispiel und Referenzapplikation zur Veranschaulichung der<br />
Domänenarchitektur dient die Onlinebuchhandlung ” Bücherwurm“, die es einem<br />
Kunden ermöglicht Bücher über das Internet zu bestellen. Neben der Gruppe<br />
der Kunden gibt es noch einen zweiten Benutzerkreis, die Administratoren. Die-<br />
se haben die Möglichkeit, die Daten des Systems über eine Webschnittstelle zu<br />
pflegen.<br />
6.2.1 Anwendungsfälle des Actors Kunden<br />
Kunden haben die Möglichkeit im Buchsortiment von ” Bücherwurm“ nach<br />
Büchern zu suchen und sie anschließend online zu kaufen. Es ist möglich den<br />
Buchbestand mittels der folgenden Kombinationen zu durchsuchen:<br />
• ISBN<br />
• Autor und Titel<br />
• Kategorie<br />
Eine Bestellung kann aus einem oder mehreren Büchern bestehen, um so Versand-<br />
kosten zu sparen. Bevor eine Bestellung endgültig im System erfasst wird, muss<br />
sich der Kunde mittels seiner Kundenkennung und dem dazugehörigen Passwort<br />
identifizieren. Nur im angemeldeten Zustand kann eine Bestellung im System er-<br />
fasst werden.<br />
Um sich anmelden zu können, muss der Kunde zuvor einen Benutzeraccount<br />
eröffnen, dabei werden verschiedene Daten zu seiner Person erfasst, ihm wird<br />
eine Kundennummer zugewiesen und er wählt ein Passwort. Der Kunde hat je-<br />
derzeit die Möglichkeit diese Daten zu bearbeiten, nachdem er sich im System<br />
angemeldet hat. Sind alle Einkäufe getätigt und die nötigen Datenänderungen<br />
durchgeführt, meldet sich der Kunde vom System ab.<br />
Eine graphische Darstellung der Anwendungsfälle für Kunden zeigt Abbildung<br />
6.1.<br />
6.2.2 Anwendungsfälle des Actors Administrator<br />
Ein Administrator hat die Möglichkeit die Daten des Systems über eine Web-<br />
schnittstelle zu pflegen. Um einen Anwendungsfall ausführen zu können, muss
6 Fallbeispiel 62<br />
Abbildung 6.1: Anwendungsfälle des Actors ” Kunde“<br />
der Administrator am System angemeldet sein. Er hat die Möglichkeit weitere<br />
Administratoren im System anzulegen und sein Passwort zu ändern.<br />
Die Hauptaufgabe der Administratoren ist es, neue Bücher im System anzule-<br />
gen, die Daten angebotener Bücher zu ändern und Bücher, die sich nicht mehr<br />
länger im Sortiment befinden, aus dem System zu löschen. Um die zu bearbei-<br />
tenden Bücher zu finden, stehen einem Administrator dieselben Suchroutinen zur<br />
Verfügung wie einem Kunden.<br />
Administratoren haben neben der Verwaltung von Büchern auch die Möglich-<br />
keit Kunden aus dem System zu löschen. Zur Auffindung von Kunden stehen<br />
Suchroutinen mit folgenden Eingabeparametern zur Verfügung:<br />
• Kundennummer<br />
• Vorname, Nachname<br />
Abschließend loggt sich der Administrator aus, um die Sitzung zu beenden. Einen<br />
Überblick, über die möglichen Anwendungsfälle bietet Abbildung 6.2.
6 Fallbeispiel 63<br />
Abbildung 6.2: Anwendungsfälle des Actors ” Administrator“
6.3 Domäne und Technologien<br />
6 Fallbeispiel 64<br />
Die Domäne des Anwendungsbeispiels kann mit Softwarearchitektur für E-<br />
Businesssysteme umschrieben werden. E-Businesssysteme sind Softwaresysteme<br />
die Geschäftsdaten auf elektronischem Wege verarbeiten. In vielen Fällen ist das<br />
System mit einer Webschnittstelle ausgestattet, um die Interaktion mit externen<br />
Benutzern oder die Verwaltung des selbigen zu ermöglichen. E-Businesssysteme<br />
werden mit dem Ziel entwickelt Geschäftstransaktionen via Internet mit einem<br />
externen Partner zu unterstützen. Technisch gesehen besitzen diese Systeme<br />
zumeist eine komponentenbasierte, verteilte Architektur.<br />
In den letzten Jahren haben sich besonders zwei Technologien zur Umsetzung<br />
solcher Anwendungen hervorgetan. Zum einen ist das Microsofts .Net Frame-<br />
work [.ne06] und zum anderen Suns Java Enterprise Edition (vormals Java 2<br />
Enterprise Edition; kurz: J2EE) [j2e05].<br />
Zur Umsetzung des Fallbeispiels wurden Technologien aus dem J2EE Bereich<br />
gewählt. Diese Wahl hat mehrere Gründe. Erstens ist J2EE komplett mit Open<br />
Source Produkten nutzbar, d. h. die für die Umsetzung nötige Software ist frei<br />
zugänglich. Des Weiteren existiert auch eine Vielzahl an frei verfügbaren Infor-<br />
mationsquellen (z.B. [BA04] und [JBo05b]), die das Erlernen der Technologie<br />
vereinfachen. Zweitens existiert in [SV05] Kapitel 3 ein auf J2EE basierendes<br />
Beispiel, das als Ausgangspunkt für das in diesem Kapitel vorgestellte Fallbeispiel<br />
dient.<br />
Im Folgenden werden jene Technologien aus dem J2EE Bereich, auf denen die<br />
Domänenarchitektur (siehe Abschnitt 6.4) des Fallbeispiels aufbaut, näher be-<br />
schrieben.<br />
6.3.1 J2EE als Rahmenarchitektur<br />
J2EE ist eine Plattform für verteilte mehrschichtige Applikationen. Die Anwen-<br />
dungslogik ist dabei in Komponenten aufgeteilt, die auf unterschiedlichen Geräten<br />
betrieben werden können. Eine J2EE-Komponente ist eine eigenständige funk-<br />
tionelle Softwareeinheit, die mit ihren Klassen und benötigten Dateien zu einer<br />
J2EE-Anwendung zusammengesetzt wird. Diese Komponenten können unterein-<br />
ander kommunizieren und bieten ihre Dienste anderen Komponenten an bzw. neh-<br />
men Dienste in Anspruch. J2EE-Komponenten sind im Grunde genommen wohl<br />
geformte Javaklassen, das heißt sie entsprechen der J2EE Spezifikation. Diese<br />
Komponenten laufen innerhalb eines J2EE Servers und werden von diesem ver-
6 Fallbeispiel 65<br />
waltet. Die J2EE-Spezifikation definiert die folgenden Komponenten (vgl. [BA04]<br />
Seite 3):<br />
• Client-Applikationen und Applets,<br />
• JavaServer Pages und Java Servlets<br />
• Enterprise JavaBeans<br />
Für das Fallbeispiel kommt J2EE in Version 1.4 zum Einsatz. Als Java 2 Platform,<br />
Standard Edition wird Version 1.4.2 benutzt.<br />
6.3.2 Enterprise JavaBeans<br />
Enterprise JavaBeans (EJBs) sind ein von Sun Microsystems in Zusammenarbeit<br />
mit der Java Community verabschiedeter Standard zur Entwicklung serversei-<br />
tiger Komponenten für verteilte Applikationen. Mit Hilfe von EJBs können<br />
sowohl Datenobjekte, wie zum Beispiel Kunden, Warenbestände etc. als auch<br />
Prozessobjekte realisiert werden. Da es sich um verteilte Applikationen handelt,<br />
müssen diese Objekte auch nicht auf ein und demselben Applikationsserver<br />
existieren, sondern können verteilt durch mehrere Server realisiert werden. Im<br />
Fallbeispiel wird JBoss 4.0.3 SP1 ( [jbo05a]) als Applikationsserver verwendet.<br />
Man unterscheidet drei verschieden Arten von EJBs: Entity Beans für die Da-<br />
tenhaltung, Session Beans und Message-driven Beans zur Implementierung von<br />
Anwendungslogik. Message-driven Beans werden für die Umsetzung des Fallbei-<br />
spiels nicht weiter benötigt und daher auch nicht erläutert.<br />
Im Folgenden soll näher auf die Besonderheiten von Entity und Session Beans<br />
eingegangen werden. Die EJBs des Fallbeispiels halten sich an die Regeln des<br />
EJB Standards in Version 2.1 (siehe [ejb06]).<br />
Allgemeines<br />
Jede EJB, egal welcher Art, setzt sich aus einer Reihe von Interfaces und einer<br />
abstrakten Klasse - der so genannten Beandefintion - zusammen, die vom Ap-<br />
plikationsserver automatisch mit Hilfe mehrere Konfigurationsdateien zu einem<br />
konkreten Objekt verbunden werden. Unterschieden wird zwischen Remote<br />
Interfaces, die zum Einsatz kommen falls auf eine EJB von einer anderen Java<br />
Virtual Machine (JVM) aus zugegriffen wird und Local Interfaces die verwendet<br />
werden um eine EJB innerhalb derselben JVM ressourcenschonend zu benutzen.<br />
Diese Interfaces definieren den angebotenen Funktionsumfang einer EJB durch
6 Fallbeispiel 66<br />
die Auflistung der zur Verfügung stehenden Methoden. Die Implementierung<br />
dieser Methoden erfolgt in der abstrakten Beanklasse. Zusätzlich gibt es noch<br />
so genannte Home Interface Definitionen mit Methoden zur Instanzierung einer<br />
EJB. Will ein Client die Funktionalität einer EJB nutzen tut er das über diese<br />
Interfaces.<br />
Für weiterführende Informationen zu Enterprise JavaBeans wird auf [BA04] und<br />
[MH04] verwiesen.<br />
Entity Beans<br />
Entity Beans werden genutzt, um die Entitäten einer Applikation abzubilden.<br />
Es handelt sich dabei um Dinge die in menschlichen Sprachen durch Nomen<br />
ausgedrückt werden. Entity Beans repräsentieren die Daten einer Datenbank.<br />
Änderungen an einer Entity Bean wirken sich direkt auf die Datenbank aus. Die<br />
Hauptaufgabe dieser Beans ist es, den Zugriff und die Änderung von Daten für<br />
J2EE Applikationen zu vereinfachen.<br />
Auf die Eigenschaften dieser Entitäten wird durch Getter und Setter Methoden<br />
zugegriffen. Des Weiteren bieten Enitiy Beans Operationen zum Suchen, Erstellen<br />
und Löschen von Daten. Es ist zu vermeiden Entity Beans mit Logik zu überlas-<br />
ten, für diese Aufgaben sind Session Beans zuständig.<br />
Entity Beans bieten die Möglichkeit Container-Managed Persistence(CMP) zu<br />
nutzen. Bei dieser Vorgangsweise verwaltet der Applikationsserver die Datenbank-<br />
zugriffe selbst. Für den Entwickler ist es nicht mehr nötig SQL Statements oder<br />
Stored Procedures zu verfassen. Alternativ dazu kann speziell bei der Integrati-<br />
on von Legacy Systemen auch Bean-Managed Persistence eingesetzt werden. Bei<br />
dieser Variante muss der Entwickler die nötige Persistenzlogik selbst verfassen.<br />
Session Beans<br />
Session Beans bilden die Logik einer Domäne ab. Sie können in vielen Fällen<br />
durch Verben beschrieben werden. Es gibt zwei Arten von Session Beans: State-<br />
ful und Stateless Session Beans.<br />
Stateful Session Beans merken sich, wie der Name bereits andeutet, Information<br />
über den Zustand der Interaktion mit dem Client. Stateless Session Beans tun das<br />
nicht. Aus diesem Grund sind sie auch effizienter in der Verarbeitung und belas-<br />
ten den Applikationsserver in geringerem Ausmaß. Die Methoden einer Stateless<br />
Session Bean kann man mit statischen Methoden aus konventionellen Javaklassen<br />
vergleichen.
Enterprise JavaBeans vs JavaBeans<br />
6 Fallbeispiel 67<br />
Sowohl Enterprise JavaBeans als auch JavaBeans sind ein Komponentenmodell.<br />
In diesem Kontext definiert ein Komponentenmodell eine Reihe von Verträgen<br />
zwischen einem Komponentenentwickler und der Laufzeitumgebung der Kom-<br />
ponente. Die Verträge legen dabei fest, wie die Komponente auszusehen und in<br />
welchem Format sie vorzuliegen hat.<br />
Die einzige Gemeinsamkeit zwischen den beiden Modellen ist der Name. EJBs<br />
sind im Gegensatz zu JavaBeans ein serverseitiges Komponentenmodell, das<br />
die Umsetzung von verteilten Komponenten spezifiziert. Der Haupteinsatzzweck<br />
von JavaBeans ist hingegen die Entwicklung von Clients durch die Verbin-<br />
dung von visuellen und nicht-visuellen Widgets. Somit kann man JavaBeans<br />
als Intraprozesskomponenten beschreiben, wohingegen Enterprise JavaBeans In-<br />
terprozesskomponenten darstellen (vgl. [MH04] Seite 8 und 9).<br />
JavaBeans kommen im Rahmen des Fallbeispiels im Sinne des Data Transfer<br />
Object Pattern zum Einsatz (siehe Abschnitt 6.4.2).<br />
JBoss Application Server<br />
Als J2EE Applikationsserver wird im Rahmen des Fallbeispiels der als Open Sour-<br />
ce erhältliche JBoss Application server in Version 4.0.3 SP1 eingesetzt. JBoss im-<br />
plementiert den kompletten Umfang an J2EE Services und ist in Java geschrieben.<br />
Für weitere Informationen zu JBoss siehe [jbo05a] und [JBo05b].<br />
6.3.3 Struts Webframework<br />
Um die Präsentationsschicht - die Webanwendung - des Fallbeispiels zu realisie-<br />
ren, wurde das Apache Struts Webframework eingesetzt. Struts nutzt die Java-<br />
technologien Servlet 1 und Java Server Pages (kurz JSP) 2 , um Entwickler insbe-<br />
sondere in folgenden Punkten Hilfestellung zu bieten (siehe [Weß05] Seite 2):<br />
• Überprüfen von Formulardaten auf deren Gültigkeit<br />
• Steuerung des Kontrollflusses<br />
• Integration von mehrsprachigen Texten<br />
1 Servlets könnte man als die CGIs der Java Welt bezeichnen. Die API erlaubt es einen HTTP-<br />
Request zu verarbeiten und die HTML-Ausgabe ähnlich wie bei CGI mittels Printkommandos<br />
in einen Ausgabestrom zu schreiben.<br />
2 Java Server Pages ermöglichen es Javacode in HTML-Code einzubetten. Dadurch wird die<br />
mit Servlets mühsame Erzeugung von HTML-Seiten entschieden vereinfacht.
6 Fallbeispiel 68<br />
Abbildung 6.3: Das Model 2 für Java Webanwendungen (Quelle [Weß05] Seite 13)<br />
Aus architektonischer Sicht realisiert Struts durch die Verknüpfung von JSPs<br />
und Servlets den Model 2-Ansatz, der eine Variante des bekannten Model-View-<br />
Controller Paradigmas (kurz MVC) für Webanwendungen darstellt. MVC teilt<br />
die Benutzerschnittstelle einer Applikation in drei Teile auf: das Model bildet die<br />
Daten ab, die View stellt die graphische Ausgabe zur Verfügung und der Control-<br />
ler kümmert sich um die Ablaufsteuerung. Die Model 2 Architektur ähnelt diesem<br />
Paradigma sehr stark, unterscheidet sich aber auch in manchen Details. Für eine<br />
Erläuterung des Unterschieds zwischen Model 2 und MVC siehe [Weß05] Seite 14.<br />
Abbildung 6.3 zeigt das Model 2 für Java Webanwendungen, dabei wird eine JSP<br />
zur Darstellung des Inhalt verwendet (View), ein zugehöriges Servlet übernimmt<br />
die Rolle des Controllers und die Daten werden durch eine JavaBean - das Model<br />
- abgebildet.<br />
Anfragen eines Webbrowsers werden durch ein Servlet ausgewertet. Es entschei-<br />
det auf Basis des HTTP-Requests welche JavaBeans erzeugt werden müssen<br />
und welche JSP für die Darstellung verwendet wird. Benötigte Daten laden die<br />
JavaBeans aus einem externen Informationssystem.<br />
Das Servlet als zentrales Steuerelement gewährleistet die im MVC Paradigma<br />
vorgeschriebene strenge Trennung von Daten, Darstellung und Kontrollfluss.<br />
Die Architektur des Strutsframeworks zeigt Abbildung 6.4. Der Controller wird<br />
dabei durch die Klasse ActionServlet repräsentiert. Diese Klasse wird mit<br />
einer XML Datei konfiguriert und ist somit unabhängig von der konkreten<br />
Anwendung in der sie zum Einsatz kommt. Zum Controller werden auch die<br />
Actionklassen gezählt. Actionklassen sind normale Javaklassen, die durch den<br />
Anwendungsentwickler implementiert werden müssen, die Klasse ActionServlet
6 Fallbeispiel 69<br />
Abbildung 6.4: Die Architetektur des Struts Frameworks (Quelle: [Weß05] Seite<br />
17)<br />
ist im Gegensatz dazu Bestandteil des Frameworks. Bei der Entwicklung einer<br />
Actionklasse leitet der Entwickler die Klasse Action ab und fügt den anwen-<br />
dungsspezifischen Code ein.<br />
Als View-Komponeneten werden im Normalfall JSP-Dateien in Verbindung<br />
mit Struts-spezifischen Taglibs verwendet. Zusätzlich zu diesen Komponenten<br />
bietet Struts eine spezielle JavaBean-Klasse, die ActionForm, an, von der die so<br />
genannten FormBeans, die die Validierung erleichtern, abgeleitet werden können.<br />
Das Model ist nicht genau spezifiziert und es bestehen keine Abhängigkeiten zu<br />
bestimmten Technologien. Wie im Fallbeispiel können zum Beispiel Enterprise<br />
JavaBeans in Kombination mit JavaBeans benutzt werden.<br />
Das Fallbeispiel basiert auf dem Struts Framework in Version 1.2.8. Für weiter<br />
gehende Informationen siehe [Weß05] und [str05].<br />
Als Webserver kam ein eigenständiger Apache Tomcat Server Version 5.5 (<br />
[tom05]) zum Einsatz. Aus Gründen der einfacheren Bedienbarkeit wurde auf<br />
die Nutzung des in JBoss integrierten Apache Tomcat Webservers verzichtet.<br />
6.4 Domänenarchitektur<br />
Die Architektur des Fallbeispiels - die Onlinebuchhandlung ” Bücherwurm“ -<br />
beruht auf einem dreischichtigen Ansatz. Bei diesem weit verbreiteten Aufbau<br />
gliedert sich eine Applikation in die Teile Präsentation, Geschäftslogik und
6 Fallbeispiel 70<br />
Abbildung 6.5: Schichtenarchitektur der Domäne ” E-Business Systeme“<br />
Datenhaltung. Die Kommunikation zwischen diesen Schichten ist von der kon-<br />
kreten Implementierung klar zu regeln, mit dem Ziel zyklische Abhängigkeiten<br />
zu verhindern. Um solche Abhängigkeiten zu vermeiden, dürfen obere Schichten<br />
die Funktionalität darunter liegender Schichten aufrufen, aber nicht umgekehrt.<br />
Die Aufrufe sind dabei nicht auf die direkt darunter liegende Schicht beschränkt.<br />
In der Praxis erfolgen die Aufrufe zum Teil über mehrere Schichten hinweg. Für<br />
weitere Informationen siehe [Fow03] Seite 19 bis 22.<br />
Abbildung 6.5 zeigt den dreischichtigen Aufbau der Fallbeispielarchitektur, die<br />
im Folgenden zusammen mit den auf der jeweiligen Schicht vorkommenden Kon-<br />
strukten erklärt wird. Geschäftslogik- und Datenhaltungsschicht werden durch<br />
den Einsatz von EJBs und dem JBoss Application Server realisiert (siehe 6.3.2).<br />
Die Präsentationsschicht wird durch eine Webapplikation, die auf dem Struts<br />
Framework basiert und auf einem Apache Tomcat Webserver läuft, umgesetzt.<br />
6.4.1 Datenhaltungsschicht<br />
Die Datenhaltungsschicht hat die Aufgabe mit externen Datenquellen zu kom-<br />
munizieren. Im Fallbeispiel ist diese externe Datenquelle der in JBoss integrierte<br />
Hypersonic SQL Server in dem die Daten der Online Buchhandlung lagern. Der<br />
Zugriff auf die Datenbank ist durch Entity Beans gekapselt. Sie führen sämtliche<br />
CRUD-Operationen 3 auf der Datenbank für die Anwendung aus. Daneben bieten<br />
3 Das Kürzel CRUD umschreibt die Standard DB-Operationen: Create-Read-Update-Delete
6 Fallbeispiel 71<br />
die eingesetzten Entity Beans einfache Suchroutine über EJB-find (siehe [MH04])<br />
Methoden an.<br />
Entity Beans können von den Clients (= Präsentationsschicht) nicht direkt ange-<br />
sprochen werden, da sie nur über Local Interfaces verfügen. Alle Zugriffe werden<br />
über die im nächsten Abschnitt beschriebenen Session Beans im Sinne des Session<br />
Facade Patterns gekapselt.<br />
6.4.2 Geschäftslogikschicht<br />
Die Geschäftslogik setzt sich aus Session Beans und JavaBeans, die im Sinne des<br />
unten erklärten Data Transfer Object Pattern genutzt werden, zusammen. Sessi-<br />
on Beans erfüllen unterschiedliche Aufgaben im Rahmen des Fallbeispiels. Zum<br />
einen werden Stateless Session Beans genutzt um das J2EE Session Facade Pat-<br />
tern (siehe unten) für die Architektur des Fallbeispiel umzusetzen. Zum anderen<br />
baut die Domänenarchitektur auf Stateful Session Beans auf, um fachspezifische<br />
Aspekte wie den ” Warenkorb“ der Onlinebuchhandlung zu implementieren.<br />
Stateless Session Beans als Session Facades<br />
In einem objektorientierten Umfeld ist es üblich kleine Objekte mit kurzen<br />
Methoden zu designen. Auf diese Art und Weise wird die Kontrolle über den<br />
Ablauf vereinfacht und einzelne Einheiten können leichter ersetzt werden. Eine<br />
Konsequenz dieser fein granulierten Strukturen sind zahlreiche Interaktionen<br />
zwischen den Objekten bzw. Methodenaufrufe. Solange sich alle Objekte im<br />
selben Adressraum befinden, stellt dieser Umstand kein Problem dar. Befinden<br />
sich die Objekte allerdings in den Adressräumen unterschiedlicher Rechner, die<br />
über ein Netzwerk miteinander kommunizieren, kann dieses Design zu einem<br />
Ressourcenproblem führen und die Performance darunter leiden.<br />
Dieses Problem wird vom Session Facade Pattern (siehe [ses06]), das eine<br />
große Ähnlichkeit mit dem in [Fow03] Seite 388ff beschriebenen Remote Facade<br />
Pattern aufweist, adressiert. Bei diesem Pattern wird von den darunter liegenden<br />
feingranulierten Objekten abstrahiert und ein ” grobkörniges“ aber Ressourcen<br />
schonendes Interface zur Verfügung gestellt. Die Session Facade verwaltet die<br />
Interaktionen zwischen den Geschäftsdaten und den Geschäftsobjekten, die in<br />
einem Workflow vorkommen. Des Weiteren kapselt sie die für diese Vorgänge<br />
nötige Geschäftslogik. Eine effiziente Form der Implementierung für Session<br />
Facades stellen die in Abschnitt 6.3.2 vorgestellten Stateless Session Beans dar.<br />
Eine mögliche Vorgangsweise, um die für eine Anwendung nötigen Session Facades
6 Fallbeispiel 72<br />
zu bestimmen, ist es die Anwendungsfälle zu analysieren und die sich daraus<br />
ergebenden Session Facades logisch zu gruppieren und zusammenzufassen.<br />
JavaBeans als Data Transfer Objects<br />
Um die Arbeit der im vorigen Abschnitt beschriebenen Session Facades zu<br />
erleichtern, ist es wichtig mit einem Methodenaufruf möglichst viele Daten zu<br />
transportieren. Diese Aufgabe kommt den in [Fow03] Seite 401ff erläuterten Data<br />
Transfer Objects zu. Diese Objekte bestehen in der Regel nur aus einer beliebigen<br />
Anzahl von Variablendefinitionen und zugehörigen Getter- und Settermethoden.<br />
Wann immer eine Session Bean Daten mit einem Client austauscht, geschieht dies<br />
auf Basis eines Data Transfer Objects. Im Regelfall werden dabei mehr Daten<br />
als für die Bearbeitung einer Aufgabe nötig sind transportiert. Dieser Overhead<br />
an Daten ist gegenüber der Latenzzeit der Remote Calls meist das geringere Übel.<br />
Data Transfer Objects setzen sich oft aus mehreren anderen Data Transfer<br />
Objects zusammen. Die sich aus den Beziehungen ergebende Struktur stellt<br />
immer einen einfachen Graphen dar. Für weitere Informationen wird auf [dat06]<br />
verwiesen.<br />
Im Rahmen der Domänenarchitektur des Fallbeispiels läuft die gesamte Kom-<br />
munikation zwischen den EJBs und dem Webclient der Präsentationsschicht auf<br />
Basis von JavaBeans ab, die im Sinne des Data Transfer Object Patterns genutzt<br />
werden.<br />
6.4.3 Präsentationsschicht<br />
Die Hauptaufgabe der Präsentationsschicht ist es, dem Benutzer Informationen<br />
anzuzeigen und Eingaben in Aktionen auf die Objekte der Geschäftslogik und Da-<br />
tenhaltungsschicht umzuwandeln. Im Rahmen des Fallbeispiels übernimmt diese<br />
Aufgaben ein auf dem Struts Framework (siehe Abschnitt 6.3.3) basierender Web-<br />
client. Mit Hilfe dieser Technologie wurde die an das MVC Pattern angelehnte<br />
Servlet Model 2 - Architektur umgesetzt, bei der ein Controller (ActionServlet<br />
und Actionklassen) die Ablaufsteuerung übernimmt, die gewünschten Operatio-<br />
nen auf das Datenmodell (JavaBean) ausführt und eine Antwortseite (JSP) gene-<br />
riert. Durch diesen Aufbau erfolgt auch auf Ebene der Präsentationsschicht eine<br />
Aufgabenteilung.<br />
Im Rahmen des Fallbeispiels wurden diverse bei der Arbeit mit dem Struts Fra-<br />
mework übliche Patterns und Techniken genutzt, die im Folgenden beschrieben
werden.<br />
BaseAction Pattern und Rechteverwaltung<br />
6 Fallbeispiel 73<br />
Die Actionklassen einer Struts-Webapplikation müssen vor der Durchführung der<br />
eigentlichen Aufgabe in vielen Fällen die gleichen bzw. sehr ähnliche vorbereiten-<br />
de Schritte durchführen. So müssen beispielsweise benötigte Objekte instanziert,<br />
Verbindungen zu externen Systemen aufgebaut und die Zugriffsrechte überprüft<br />
werden. Es ist daher nahe liegend diese Aufgaben in eine abstrakte Basisklasse<br />
auszulagern. Diese abstrakte Basisklasse nennt man BaseAction(vgl. [Weß05]<br />
Seite 237).<br />
Bei ” Bücherwurm“ wird in der BaseAction die Zugriffskontrolle vorgenommen.<br />
Dabei wird dem so genannten Gatekepper aus dem Paket com.buecherwurm.web<br />
der Typ des aktuellen Benutzers und der Kontext (= Actionpath) des Aufrufs<br />
übergeben. Auf Basis einer internen Tabelle entscheidet der Gatekepper über<br />
die Genehmigung des Zugriffs.<br />
Die für die Entscheidung nötigen Informationen liegen außerhalb des Ge-<br />
nerierungsfokus des Fallbeispiels und müssen vom Entwickler händisch<br />
ergänzt werden. Der für das Fallbeispiel erzeugte Code baut auf den Klassen<br />
com.buecherwurm.web.Gatekepper und com.buecherwurm.web.BaseAction<br />
auf. Aus diesem Grund kann man beide als Bestandteil der Plattform betrachten.<br />
Kapselung von JSPs mittels ActionFirst Pattern<br />
Sämtliche HTML-Seiten, die der Benutzer erhält, basieren auf Java Server Pa-<br />
ges. Um sicherzugehen, dass alle von der JSP zum Anzeigen der Seite benötigten<br />
Informationen in der Anfrage(Request) oder Sitzung (Session) vorhanden sind,<br />
ist es empfehlenswert, die JSP über eine Actionklasse aufzurufen. Diese Action-<br />
klasse prüft das Vorhandensein aller benötigten Informationen und lädt eventuell<br />
fehlende Elemente. Um ein Umgehen dieser Vorschrift zu verhindern, müssen alle<br />
JSPs der Anwendung unterhalb des Verzeichnisses WEB-INF liegen. Der Inhalt die-<br />
ses Ordners kann von einem Client nicht direkt aufgerufen werden, sondern nur<br />
indirekt über eine Webapplikation. Diese Vorgangsweise wird auch ActionFirst<br />
Pattern genannt (siehe [Weß05] Seite 238).<br />
Gestaltung von JSP-Seiten mit der Struts Tiles Template-Engine<br />
Die Webseiten einer Webapplikation bestehen aus verschiedenen Bereichen, wie<br />
zum Beispiel primären und sekundären Navigationselementen, dem Seiteninhalt
6 Fallbeispiel 74<br />
Abbildung 6.6: Schematischer Aufbau der Webseiten des Fallbeispiels<br />
und einem Seitenfuß. Ein Teil dieser Elemente ist für alle Seiten gleich. Aus diesem<br />
Grund ist es nahe liegend eine Vorlage zu erstellen, die mit den jeweils aktuellen<br />
Elementen ausgefüllt wird.<br />
Eine Möglichkeit um diese Vorlagen zu definieren, ist die zu Struts gehörige<br />
Template-Engine Tiles (siehe [Weß05] Kapitel 8). Sie bietet einfache Konstrukte,<br />
um die Teilbereiche einer auf JSP basierenden Webseite modular zu erstellen.<br />
Der Webdesigner erstellt dabei eine Layoutdefinition, die auch weiter vererbt<br />
und spezialisiert werden kann. In der Konfigurationsdatei tiles-def.xml wer-<br />
den anschließend die Kombinationen von JSP-Dateien festgelegt aus denen sich<br />
die Seiten der Webanwendung zusammensetzen.<br />
Abbildung 6.6 zeigt den schematischen Aufbau der ” Bücherwurm“ Webseiten.<br />
Die Seite ist eingeteilt in die Bereiche ” Primäre und Sekundäre Navigation“,<br />
” Footer“ und ” Seiteninhalt“. Generiert wird der Bereich Seiteninhalt“. Die übri-<br />
”<br />
gen Bereiche sind händisch von einem Webdesigner zu ergänzen, bzw. über al-<br />
le Seiten identisch. Die Definition der Layoutvorlage erfolgt im Fallbeispiel se-<br />
parat für jede Benutzergruppe. Das Seitenlayout für Administratoren wird in<br />
jsp/admin/index.jsp festgelegt. Für Kunden erfolgt die Definition analog in<br />
jsp/kunde/index.jsp.
6 Fallbeispiel 75<br />
Abbildung 6.7: Metamodell der Domäne<br />
” Softwarearchitektur für E-<br />
Businesssysteme“ als UML-Profil<br />
6.5 Metamodell<br />
6.5.1 Metamodell in UML-Profil-Form<br />
Ziel dieses Abschnitts ist es, die einzelnen Elemente des Metamodells, dargestellt<br />
in Abbildung 6.7 als UML-Profil, näher zu beschreiben, ihre Bedeutung im Rah-<br />
men der Architektur zu erklären und Einschränkungen sowie Zusammenhänge<br />
zwischen den Elementen aufzuzeigen. Des Weiteren werden die aus den einzelnen<br />
Stereotypen heraus generierten Codeteile skizziert.<br />
EntityObject<br />
Das Stereotyp > ist eine Spezialisierung von UML::Class. Es<br />
werden damit jene Klassen gekennzeichnet, die die Entity Beans (siehe 6.3.2) des<br />
Systems beschreiben. EntityObjects sind architektonisch auf Ebene der Daten-<br />
schicht angesiedelt und kapseln die Zugriffe der Anwendung auf eine Datenbank.<br />
Im Zuge der Generierung wird für jedes EntityObject eine Entity Bean mit Local<br />
Interfaces, einer Beanklasse sowie den nötigen Konfigurationsdateien generiert.<br />
Für jedes Attribut werden die nötigen Getter- und Setter-Methoden erstellt.<br />
Als einzige Methoden sind find-Methoden, mit denen gezielt nach Entity Beans
gesucht werden kann, vorgesehen.<br />
6 Fallbeispiel 76<br />
Bei der Modellierung dieser Datenobjekte sind mehrere Regeln zu beachten. Zum<br />
einen ist es nötig, dass jedes EntityObject genau ein Attribut - ausgezeichnet<br />
mit dem Stereotyp > - besitzt. Zum anderen muss der Eigenschafts-<br />
wert KeyType des Stereotyp > entweder den Wert USER<br />
oder SYSTEM aufweisen. Mit > wird der eindeutige Schlüssel zur<br />
Identifizierung einer Entity Bean definiert. Der Eigenschaftswert KeyType gibt<br />
an wer - ob Benutzer oder System - diesen Schlüsselwert setzt.<br />
Neben KeyType gibt es noch den Eigenschaftswert RangeOfValues der anzeigt,<br />
dass ein EntityObject eine Wertemenge abbildet, die als gegeben angesehen<br />
wird. Im Fallbeispiel sind das Entitäten wie ” Kreditkartenfirma“ oder ” Verlag“.<br />
Per Konvention dürfen EntityObjects nur mit EntityObjects assoziiert werden.<br />
Diese Maßnahme ist im Sinne der schichtenorientierten Domänenarchitektur not-<br />
wendig, um tiefere Schichten unabhängig von höheren zu halten. Da EntityOb-<br />
jects in der Datenschicht angesiedelt sind, die die Tiefste des Systems darstellt,<br />
dürfen sie nur mit ihresgleichen assoziiert werden.<br />
Eine weitere Regel der EntityObjects genügen müssen, ist der Umstand, dass es<br />
keine bidirektionalen Assoziationen zwischen ihnen geben darf, bei der auf bei-<br />
den Seiten die untere Schranke der Kardinalität eins ist. Wäre das der Fall, hätte<br />
man ein typisches ” Henne-Ei-Problem“, konstruiert. Beide assoziierten Partner<br />
brauchen sich von Anfang an, um bestehen zu können.<br />
Key<br />
Das Stereotyp > ist eine Spezialisierung eines UML::Attribute und<br />
kennzeichnet Attribute, die einen eindeutigen Schlüssel für die Instanzen einer<br />
Klasse darstellen. Angewandt wird das Stereotyp auf die Attribute von EntityOb-<br />
ject und DataObject, wobei nur jeweils eines der Attribute mit diesem Stereotyp<br />
ausgezeichnet werden kann.<br />
DataObject<br />
Das Stereotyp > zeichnet Klassen aus, die das in Abschnitt<br />
6.4.2 beschriebene Data Transfer Object Pattern implementieren. Um dieses De-<br />
signmuster umzusetzen, wird für jedes EntityObject ein DataObject modelliert,<br />
das eine exakte Kopie des EntityObjects darstellt.<br />
Auf Codeebene wird für jedes DataObject eine Javaklasse generiert die den
6 Fallbeispiel 77<br />
Konventionen des JavaBean Komponentenmodells folgt (siehe 6.3.2). Die Über-<br />
einstimmung zwischen einem EntityObject und dem zugehörigen DataObject<br />
wird vor der Generierung überprüft. Besonderes Augenmerk wird dabei auf<br />
Attribute und Methoden geworfen. Die Zuordnung erfolgt auf Basis des Klassen-<br />
namens.<br />
Architektonisch sind DataObjects zusammen mit den im nächsten Abschnitt be-<br />
schriebenen ProcessObjects auf Ebene der Geschäftslogikschicht angesiedelt.<br />
ProcessObject<br />
Das Stereotyp > ist eine Spezialisierung von UML::Class<br />
und realisiert das in Abschnitt 6.4.2 beschriebene Session Facade Pattern für<br />
die Domänenarchitektur. Aus Sicht der Architektur sind ProcessObjects Teil<br />
der Geschäftslogik. Auf Codeebene handelt es sich dabei um eine Reihe von<br />
Stateless Session Beans, die im Namen des Clients alle Operationen auf die<br />
Entity Beans des Systems durchführen. Im Konkreten sind das so genannte<br />
CRUD-Operationen, sowie diverse Suchmethoden 4 . Als Datenaustauschformat<br />
zwischen einem ProcessObject und einem Client dienen die bereits beschriebenen<br />
DataObjects in Form von JavaBeans. Diese Vorgangsweise unterstützt eine<br />
verbesserte Trennung zwischen den einzelnen Schichten der Architektur und<br />
erlaubt einem Client einen einfacheren Zugriff auf die Entity Beans.<br />
Zwischen einem ProcessObject und den von ihm betreuten EntityObjects, die<br />
in Beziehung stehen und gemeinsam einen Sachverhalt abbilden, besteht eine<br />
Abhängigkeitsbeziehung, die von ProcessObject zu EntityObject führt. Um den<br />
Transformationsvorschriften einen Einstiegspunkt zu bieten und explizit auszu-<br />
drücken, welcher Typ von DataObject zwischen einem ProcessObject und einem<br />
Client ausgetauscht wird, existiert weiters eine Abhängigkeit vom modellierten<br />
ProcessObject zu genau einem DataObject. Es handelt sich dabei um jenes<br />
DataObject, dessen EntityObject im modellierten Sachverhalt eine zentrale<br />
Rolle einnimmt. Ein Beispiel zeigt Abbildung 6.8, die die Kundenverwaltung<br />
des Fallbeispiels darstellt. Hier werden die Entitäten ” Kunde“, ” Kreditkarte“<br />
und ” Adresse“ von einem ProcessObject namens ” Kundenverwaltung“ betreut.<br />
Eine zentrale Stellung nimmt der Kunde in diesem Sachverhalt ein, da ohne<br />
4 Die Domänenarchitektur unterscheidet zwei Varianten von Suchmethoden. Variante eins besitzt<br />
das Präfix search und meint Suchmethoden, die auf von einem Entwickler zur Verfügung<br />
gestellten SQL-Select-Statement aufbauen. Variante zwei besteht aus EJB-find-Methoden,<br />
die das Präfix find besitzen. Hier wird von Seiten des ProcessObject nur ein Mapping auf<br />
eine find-Methode eines EntityObject durchgeführt.
6 Fallbeispiel 78<br />
Abbildung 6.8: Die Kundenverwaltung von ” Bücherwurm“<br />
ihn die Entitäten ” Kreditkarte“ und ” Adresse“ keine Bedeutung hätten. Um<br />
diese Bedeutung zu unterstreichen und anzuzeigen welchen Typ die mit einem<br />
Client ausgetauschten DataObjects aufweisen müssen, wird zusätzlich eine<br />
Abhängigkeit von Kundenverwaltung zu DataObject ” Kunde“ modelliert.<br />
Betrachtet man Abbildung 6.5 und ordnet die besprochenen Stereotypen den<br />
einzelnen Schichten der Architektur zu, stellt man fest, dass zwischen diesen und<br />
den im Folgenden beschriebenen eine logische Trennung existiert. Alle bisherigen<br />
Stereotypen, mit Ausnahme der DataObjects, die zum Datenaustausch benutzt<br />
werden, sind durch Komponenten realisiert, die serverseitig betrieben werden. Im<br />
konkreten Fall laufen sie auf einem JBoss Application Server.<br />
Die nun beschriebenen Controller und Presentation Elemente sind Teil der<br />
Präsentationsschicht und im Falle der vorliegenden Domänenarchitektur der Cli-<br />
entseite, realisiert mit Hilfe des Struts Frameworks, zuzuordnen.
ActivityController und seine Erben<br />
6 Fallbeispiel 79<br />
Das Stereotyp > zeichnet Klassen aus, die auf Co-<br />
deebene durch Struts Actions realisiert werden. Da die Erzeugung von Struts<br />
Actionklassen ohne Einbeziehung einer funktionalen Sichtweise nur einen sehr<br />
beschränkten Generierungsfaktor zulässt, wird ActivityController von zwei wei-<br />
teren Stereotypen SearchController und AdministrativeController spezialisiert.<br />
Bei beiden Varianten steht die Erfüllung von konkreten Aufgaben (Suche und<br />
Datenverwaltung) im Vordergrund.<br />
Alle drei Controllervarianten sind Teil der Präsentationsschicht und bilden die<br />
Controller der Servlet-Model2 Architektur (siehe 6.3.3) ab.<br />
Bei der Modellierung von Controller Elementen sind diverse Regeln zu beachten.<br />
Zum einen muss ein Controller eine Abhängigkeit zu genau einer Presentation und<br />
eine Assoziation zu genau einem ProcessObject aufweisen. Zum anderen muss ei-<br />
ne Abhängigkeit zum selben DataObject, wie dam assoziierten ProcessObject,<br />
existieren. Die Abhängigkeit zu einem DataObject wird aus dem selben Grund<br />
wie bei einem ProcessObject benötigt, da der Controller explizit wissen muss<br />
welcher Typ von DataObject als Datenaustauchformat herangezogen wird.<br />
Durch diese Modellierung wird die Semantik der Servlet-Model2 Architektur im<br />
Metamodell ausgedrückt, wobei Presentation Elemente den Bereich View reali-<br />
sieren und ProcessObjects sowie DataObjects das Model repräsentieren.<br />
AdministrativeController<br />
Das Stereotyp > stellt eine Spezialisierung des<br />
bereits beschriebenen Stereotyps > dar. Dieses Element<br />
hat die Aufgabe die Eingaben von neuen Daten und die Abänderung von beste-<br />
henden Daten zu koordinieren. Außerdem ermöglichen AdministrativeController<br />
das Löschen von Daten.<br />
Im Allgemeinen betreut ein AdministrativeController den selben Datenbe-<br />
reich wie der durch die Entitäten des assoziierten ProcessObject abgebilde-<br />
te. Ein AdministrativeController muss von einer Presentation des Typs > abhängig sein.<br />
Die korrekte Modellierung eines AdministrativeControllers zeigt Abbildung 6.9<br />
anhand der Kundenverwaltung.
6 Fallbeispiel 80<br />
Abbildung 6.9: Die Modellierung einer Webschnittstelle zur Datenverwaltung
SearchController<br />
6 Fallbeispiel 81<br />
Abbildung 6.10: Die Modellierung einer Suche<br />
> stellt ebenfalls eine Spezialisierung von > dar und erlaubt die Suche nach den vom assoziierten<br />
ProcessObject verwalteten Entitäten. Die Suchergebnisse werden in Form von<br />
DataObjects zurückgegeben. Ein SearchController muss von einer Presentation<br />
des Typs > abhängig sein.<br />
Die korrekte Modellierung eines SearchControllers zeigt Abbildung 6.10 anhand<br />
der Kundensuche.<br />
Presentation<br />
Aus dem Stereotyp > werden die User Interface Komponen-<br />
ten der Anwendung generiert. Im Konkreten sind das Java Server Pages und die<br />
zugehörigen FormBeans, um die eingegebenen Daten zwischenzuspeichern. Die<br />
Attribute der Presentation spiegeln sich in den Eingabefeldern der JSP wider-<br />
spiegeln. Aus den Methoden wird der HTML Code für Buttons generiert. Alle<br />
Attribute einer Presentation sind mit dem weiter unten beschriebenen Stereotyp<br />
> gekennzeichnet. Die Einhaltung dieser Konvention wird vor<br />
dem Generierungsvorgang überprüft. Da der für das User Interface benötigte Co-<br />
de nicht in allen Situationen dem selben Schema folgt, wird ><br />
durch > und > spezialisiert.
UIAttribute<br />
6 Fallbeispiel 82<br />
Das Stereotyp > ist eine Ableitung von UML::Attribute und<br />
kann nur auf die Attribute einer Presentation angewandt werden. UIAttribute<br />
führt mit dem Eigenschaftswert MappedToAttribute ein Mapping auf ein Attri-<br />
but eines DataObject durch. Mit Hilfe dieser Zuordnung ist ein Controller in der<br />
Lage aus den Attributen einer Presentation die nötigen DataObjects zu erzeugen.<br />
Neben diesem Mapping kann mit den Eigenschaftswerten des Stereotyps ein At-<br />
tribut als Passwort oder Hiddenfield im Sinne von HTML gekennzeichnet werden.<br />
AdministrativeMask<br />
Eine > realisiert das User Interface für die Eingabe<br />
von Daten und ist die Spezialisierung einer Presentation. Sie muss alle nötigen<br />
Eingabefelder definieren, um die Entitäten des durch den abhängigen Adminis-<br />
trativeControllers betreuten Sachverhalts erzeugen und ändern zu können.<br />
Für AdministrativeMask werden im direkten Vergleich mit Presentation im JSP<br />
zusätzliche HTML- Hiddenfields generiert, die den Status - ” Bearbeiten“ oder<br />
” Neu“ speichern und im Falle einer Bearbeitung auch die unique IDs der bearbeiteten<br />
DataObjects.<br />
SearchMask<br />
Aus einer Klasse mit dem Stereotyp > wird das User Interface<br />
für die Suche im Datenbestand generiert. Um die Eingabefelder in der JSP-Datei<br />
besser gruppieren zu können und dem SearchController den Aufruf der korrekten<br />
Suchmethode zu ermöglichen, ist es per Konvention erforderlich ein Attribut der<br />
SearchMask so zu benennen wie den korrespondierenden Parameter der Suchme-<br />
thode.<br />
6.5.2 Integration des Metamodells in openArchitectureWare<br />
In Abschnitt 6.5.1 werden die Konzepte des Metamodells anhand eines UML<br />
Profils beschrieben. Um dem oAW Generator dieses Metamodell bekannt zu<br />
machen, muss eine Umwandlung in Javaklassen vorgenommen werden. Dieser<br />
Schritt ist wie in Kapitel 5 erklärt erforderlich, um die Transformationsvorschrif-<br />
ten vor der Komplexität der Eingabeformate, in denen die Modelle zum Teil<br />
vorliegen, abzukapseln. Des Weiteren wird die Nutzung verschiedenster Formate<br />
ermöglicht, da der Generator durch die Repräsentation mit Hilfe von Javaklassen<br />
auf einer einheitlichen Schnittstelle aufbauen kann.
6 Fallbeispiel 83<br />
Neben der Vereinheitlichung der Eingabeformate hat der Einsatz eines Me-<br />
tamodells auf Basis von Javaklassen noch einen weiteren Zusatznutzen. Die<br />
Metamodellklassen bieten neben den in 5.8 erwähnten Extensions eine Möglich-<br />
keit in den Transfomationsvorschriften benötigte Logik zu implementieren. Eine<br />
” Kostprobe“ von typischen Funktionen, die in einer Metamodellklasse integriert<br />
werden, wird weiter unten in diesem Abschnitt gegeben. Für weitere Beispiele<br />
wird auf den beiliegenden Sourcecode zum Fallbeispiel verwiesen.<br />
Die Umwandlung eines Metamodells von UML in Java Metamodellklassen muss<br />
nicht händisch vorgenommen werden, sondern kann mit Hilfe eines Metamodell-<br />
generators, der Teil des oAW Toolkits ist, durchgeführt werden. Der Generator<br />
wird über ein beiliegendes Workflowskript, das korrekt parametrisiert werden<br />
muss, gestartet. Die Parametrisierung erfolgt durch ein Propertiesfile. Die kon-<br />
kreten Werte für das Fallbeispiel zeigt Listing 6.1, generate.properties liegt<br />
im Verzeichnis eba-Generator/metamodel.<br />
Listing 6.1: Propertiesfile zur Parametrisierung des Metamodellgenerators<br />
modelFile = ebaMetamodel . zuml<br />
# Mappingfile um das XMI des Modellierungstool<br />
# korrekt zu verarbeiten<br />
xmlMapFile = org / openarchitectureware / core / frontends / xmi /<br />
toolsupport / uml / poseidon / poseidon31_xmi12_all . xml<br />
# Modellierungstoolspezifischer Adapter<br />
# zum Einlesen des XMI<br />
toolAdapterClassname = org . openarchitectureware . core .<br />
frontends . xmi . toolsupport . uml . poseidon . PoseidonAdapter<br />
# Jede Metaklasse erhält ein Prefix<br />
classPrefix = EBA<br />
modelModifierClassname =<br />
MODELMOD . FILE =<br />
# Die folgenden Variablen basieren auf dem<br />
# Projektverzeichnis<br />
# e.g. genPath mündet in eba - Generator /src - gen<br />
# Mögliche Definition eines Oberverzeichnisses für sämtliche<br />
# Ausgaben .<br />
# Inhalt wird vor der Generierung gelöscht !<br />
genPath = src - gen<br />
# Das Dumpfile des Generatorlaufs
dumpfile = metamodel / mmgen . dump<br />
6 Fallbeispiel 84<br />
# Das Verzeichnis in dem der generierte Code gespeichert<br />
# wird .<br />
srcPath = src - gen<br />
# Verzeichnis für die Javadoc<br />
HTMLOUTPUT . DIR = html - gen<br />
Adaption des UML-Metamodells für den Metamodellgenerator<br />
Abbildung 6.7 zeigt das Metamodell der Domäne ” Softwarearchitektur für<br />
E-Businesssystem“ in Form eines UML-Profils. Dieses Modell kann nicht wie<br />
in Abschnitt 5.5.2 erwähnt ohne vorherige Anpassung mit dem Metamodell-<br />
generator verarbeitet werden. Zum einen muss eine Anbindung an die bereits<br />
bestehende UML-Metamodellklassen des Frameworks vorgenommen werden.<br />
Zum anderen müssen die extensions-Beziehungen des Profils gegen Vererbungs-<br />
beziehungen ausgetauscht werden. Das adaptierte Metamodell zeigt Abbildung<br />
6.12 für die Erben von UML::Class und Abbildung 6.11 für die Erben von<br />
UML::Attribute.<br />
Die Tatsache, dass die Metamodellelemente nicht direkt von<br />
org.openarchitectureware.meta.uml.classifier.Class abgeleitet sind<br />
sondern indirekt über eba.meta.base.EBAClass 5 , das eine Ableitung der Fra-<br />
meworkklasse durchführt, ist gesondert hervorzuheben. Dieser Zwischenschritt<br />
erlaubt die Implementierung von modellweit benötigter Funktionalität, wie<br />
Extraktion aller navigierbaren Assoziationen, Ausgabe des Klassennamen in<br />
einem bestimmten Format, Suchmethoden etc.. Ähnlich verhält es sich bei den<br />
Attributen, hier wurde mit eba.meta.base.EBAAttribute eine Spezialisierung<br />
von org.openarchitectureware.meta.uml.classifier.Attribute vorgenom-<br />
men.<br />
Die Taktik, gemeinsam genutzte Funktionalität in einer abstrakten Ba-<br />
sisklasse zu bündeln, wurde auch bei den inhaltlich verwandten Klassen<br />
eba.meta.data.EBAEntityObject und eba.meta.data.EBAEntityObject<br />
angewandt. Beide erben von eba.meta.data.EBADataClass.<br />
5 Aus historischen Gründe werden alle Java Metamodellklassen mit einem eindeutigen definierten<br />
Präfix versehen (siehe Listing 6.1). Dieses Präfix wird im UML-Metamodell nicht<br />
verwendet. Der Grund dafür ist, dass vor oAW4 in den Templates das Namespacekonzept<br />
nicht genutzt werden konnte. Um die einzelnen Metamodellklassen dennoch zu unterscheiden<br />
wurde ein eindeutiges Präfix eingeführt.
6 Fallbeispiel 85<br />
Abbildung 6.11: Adaptiertes Metamodell der Erben von UML::Attribute<br />
Modellvalidierung mit Check<br />
Bei der Beschreibung der Metamodellkonzepte in Abschnitt 6.5.1 wurde immer<br />
wieder auf diverse Regeln hingewiesen, denen die Modelle genügen müssen.<br />
Die Einhaltung dieser Regeln wird in oAW mit Hilfe der in Abschnitt 5.9<br />
erklärten Sprache Check überprüft. Die Definitionen finden sich in den Dateien<br />
ebaChecks.chk und eba-Web-Checks.chk des eba-Generator Projekts.<br />
Im Fallbeispiel nehmen die Regeldefinitionen eine zusätzliche Funktion ein: Sie<br />
drücken nicht in den Stereotypen bzw. Metamodellklassen enthaltene Seman-<br />
tik aus. So ist beispielsweise durch das UML Profil aus Abbildung 6.7 nicht<br />
festgelegt, dass ein EntityObject genau ein Attribut des Typs Key aufweisen<br />
muss. Dieser Constraint wird erst durch eine Validierungsregel festgelegt. Im<br />
Fallbeispiel sind Checkdefinitionen ein wichtiger Teil des Metamodells.<br />
Wie ein Teil dieser Semantik in das Metamodell, gebildet durch Stereotypen oder<br />
Metamodellklassen, verlagert werden kann, zeigt eine alternative Darstellung des<br />
Metamodells in Abschnitt 6.8.<br />
Beispiele für Funktionalität in Metamodellklassen<br />
Dieser Abschnitt zeigt typische Beispiele von Methoden, die in den Metamodell-<br />
klassen zu finden sind. Sämtliche Beispiele sind dem Sourcecode zum Fallbeispiel
6 Fallbeispiel 86<br />
Abbildung 6.12: Adaptiertes Metamodell der Erben von UML::Class
6 Fallbeispiel 87<br />
entnommen. Die Listings sollen eine Eindruck vermitteln wie mit Hilfe des oAW<br />
Frameworks Information, die in den Transformationsvorschriften genutzt wird,<br />
aus einem Modell extrahiert wird. Weitere Informationen können dem auf der<br />
Beilagen-CD befindlichen Sourcecode des Fallbeispiels entnommen werden.<br />
Listing 6.2 zeigt die Methode Key der Klasse eba.meta.base.EBADataClass mit<br />
deren Hilfe der eindeutige Schlüssel eines ” Datenobjekts“, den EntityObjects und<br />
DataObjects definieren müssen, aus der Menge der Attribute extrahiert wird. Um<br />
das entsprechende Attribut zu finden wird einer Klasse Filter, die vom oAW<br />
Framework zur Verfügung gestellt wird, die Menge der Attribute übergeben und<br />
ein Filter, der überprüft ob ein Element vom Typ EBAKey ist. Im Anschluss wird<br />
festgestellt, ob genau ein Element in der Ergebnismenge enthalten ist. Ist das<br />
nicht der Fall wird null zurückgegeben, sonst der Schlüssel dieses Datenobjekts.<br />
/**<br />
Listing 6.2: Die Methode Key() der Klasse EBADataClass<br />
* Die Methode filtert die Menge der Attribute und<br />
* liefert den Schlüssel zurück .<br />
* @return Der eindeutige Schlüssel des<br />
* Datenobjekts<br />
*/<br />
public EBAKey Key (){<br />
}<br />
ElementSet keys = Filters . filter ( this . Attribute () ,<br />
new TypeFilter ( EBAKey . class ));<br />
// Es muss einen Schlüssel geben !<br />
if( keys . isEmpty ())<br />
return null ;<br />
// Es muss genau einen Schlüssel geben<br />
else if( keys . size () >1)<br />
else<br />
return null ;<br />
return ( EBAKey ) keys . iterator (). next ();<br />
Die Methode isUserDefinedKey() der Klasse eba.meta.data.EBAEntityObject<br />
aus Listing 6.3 prüft, ob der Wert des eindeutigen Schlüssels vom Benutzer gesetzt<br />
wird. Um das zu bestimmen, ist im Stereotyp EntityObject der Eigenschaftswert<br />
KeyType vorgesehen. Dieser kann vom Modellierer entweder mit dem Wert<br />
USER oder SYSTEM belegt werden. Bei der Instanzierung wird dieser Wert<br />
ausgelesen und die korrespondierende Variable in der Metamodellklasse En-<br />
tityObject instanziert. Die Methode KeyType() gibt diesen Wert zurück. Weist
6 Fallbeispiel 88<br />
die Variable den Wert USER auf, wird true zurückgegeben.<br />
Listing 6.3: Die Methode isUserDefinedKey() der Klasse EBAEntityObject<br />
/**<br />
* Prüft ob der Typ des Schlüssel Benutzer definiert ist .<br />
* @return True falls die Annahme zutrifft<br />
*/<br />
public boolean isUserDefinedKey (){<br />
}<br />
if( this . KeyType (). toUpperCase (). equals (<br />
else<br />
EBAEntityObject . USER_KEYTYPE ))<br />
return true ;<br />
return false ;<br />
Die Methode UIAttribute() der Klasse eba.meta.presentation.<br />
EBAPresentation aus Listing 6.4 selektiert alle Attribute einer Presentati-<br />
on, die vom Typ EBAUIAttribute sind, und ein Mapping auf ein Attribut eines<br />
DataObjects aufweisen.<br />
/**<br />
Listing 6.4: Die Methode UIAttribute() der Klasse EBAPresentation<br />
* Die Methode retouniert alle Attribute die vom Type<br />
* EBAUIAttribute sind und ein Mapping auf<br />
* ein Attribut eines Datenobjekts besitzen .<br />
* @return<br />
*/<br />
public ElementSet UIAttribute (){<br />
this . uiAttributes = new ElementSet ();<br />
// Selektiere aus der Menge der Attribute<br />
// alle EBAUIAttribute<br />
this . uiAttributes . addAll (<br />
this . Attribute (). filter ( EBAUIAttribute . class ));<br />
Iterator it = this . uiAttributes . iterator ();<br />
// Prüfe das Mapping auf das Attribut eines<br />
// Datenobjekts<br />
while (it. hasNext ()){<br />
EBAUIAttribute att = ( EBAUIAttribute )it. next ();<br />
if(att . AttributeMappedTo () == null ||<br />
att . PointsToDataObject () == null )<br />
this . uiAttributes . remove ( att );
}<br />
}<br />
return this . uiAttributes ;<br />
6 Fallbeispiel 89<br />
6.6 Transformationsvorschriften - Xpand<br />
Die Transformationsvorschriften oder Templates zur Erzeugung des Codes aus<br />
einem Modell heraus werden in openArchitectureWare in der Sprache Xpand<br />
definiert. Die Konstrukte und der Aufbau von Xpand wurden bereits in Abschnitt<br />
5.6 vorgestellt. An dieser Stelle wird anhand des Fallbeispiels gezeigt, wie man<br />
Templates strukturieren kann und welche Möglichkeiten es zur Trennung von<br />
generiertem und nicht generiertem Code gibt.<br />
6.6.1 Strukturierung von Xpand-Templates<br />
Xpand Templates besitzen eine baumähnliche Strutur. Ein Template - be-<br />
stehend aus einem DEFINE-Block - ist ein Blatt des Baumes. Die Wurzel<br />
- das Starttemplate - wird dem oAW-Generator in einem Workflowskript<br />
per Konfigurationsparameter bekannt gegeben (siehe Abschnitt 6.7.3). Die<br />
Summe aller Templates eines Generators kann aus beliebig vielen Bäumen beste-<br />
hen, wobei anzumerken ist, dass ein Blatt in mehreren Bäumen vorkommen kann.<br />
Der Generator zur Domäne ” Softwarearchitektur für E-Businesssysteme“ des Fall-<br />
beispiels umfasst zwei Templatebäume. Baum eins, steuert die Ausgabeerzeugung<br />
für die Geschäftslogik und Datenhaltungsschicht. Das heißt, mit seiner Hilfe wer-<br />
den die Enterprise JavaBeans des Systems generiert. Die Wurzel bildet das Tem-<br />
plate eba::templates::EJBRoot::Root aus dem Sourcefolder des Generatorpro-<br />
jekts.<br />
Baum zwei ist für die Codeausgabe des Webfrontends zuständig. Mit seiner Hilfe<br />
werden die benötigten Struts Actionklassen, FormBeans und Java Server Pages<br />
generiert. Die Wurzel bildet das Template eba::templates::WebRoot::Root,<br />
das ebenfalls im Sourcefolder des Generatorprojekts liegt.<br />
Wurzeltemplate und Metaumgebung<br />
oAW bezeichnet den Bereich, in dem sämtliche Elemente eines soeben instanzier-<br />
ten Modells liegen, als Metaumgebung (siehe [Völ05c] Seite 19). Um die Transfor-<br />
mationsvorschriften auf das instanzierte Modell anwenden zu können, benötigt
6 Fallbeispiel 90<br />
der Generator neben einem Wurzeltemplate auch einen Einstiegspunkt in die<br />
Metaumgebung. Das heißt, dem Wurzeltemplate muss kenntlich gemacht werden,<br />
mit welchen Elementen der Templatebaum zu durchlaufen ist. Im Fallbeispiel<br />
übernimmt diese Aufgabe die Klasse eba.meta.EBATop, die mit ihren Methoden<br />
Elemente der Metaumgebung selektiert und den Wurzeltemplates zur Verfügung<br />
stellt. EBATop kann als ein ” Pseudoelement“ beschrieben werden, dessen einzi-<br />
ger Zweck es ist, einen Einstiegspunkt für die Codegenerierung zu bilden. Ein<br />
Ausschnitt des Quellcodes zu EBATop ist in Listing 6.5 zu sehen.<br />
Listing 6.5: Der Einstiegspunkt für Templates zur Codegenerierung<br />
public class EBATop extends CustomModelElement {<br />
}<br />
...<br />
/**<br />
* Die Methode sucht sämtliche Objekte vom Typ<br />
* EBADataObject heraus .<br />
* @return Ein ElementSet mit EBADataObjects<br />
*/<br />
public ElementSet EBADataObject (){<br />
}<br />
/**<br />
ElementSet dataObjects = MMUtil . findAllInstances (<br />
EBADataObject . class );<br />
return dataObjects ;<br />
* Die Methode sucht sämtliche Objekte vom Typ<br />
* EBAEntityObject heraus .<br />
* @return Ein ElementSet mit EBAEntityObjects<br />
*/<br />
public ElementSet EBAEntityObject (){<br />
}<br />
...<br />
ElementSet entityObjects = MMUtil . findAllInstances (<br />
EBAEntityObject . class );<br />
return entityObjects ;<br />
Die Methoden von EBATop werden nun beispielsweise vom Wurzeltemplate<br />
eba::templates::EJBRoot::Root (siehe Listing 6.6) genutzt. Wie aus dem Tem-<br />
plate ersichtlich wird EBATop wie eine Metaklasse behandelt, auf die das Templa-<br />
te mit Namen Root angewandt wird. Innerhalb des DEFINE-Blocks werden die
6 Fallbeispiel 91<br />
Methoden von EBATop aufgerufen und auf die zurückgegebenen Modellelemente<br />
weiterführende Transformationsvorschriften angewandt.<br />
Listing 6.6: Ausschnitt aus dem Template EJBRoot::Root<br />
≪IMPORT eba :: templates :: data≫<br />
...<br />
≪DEFINE Root FOR eba :: meta :: EBATop≫<br />
≪EXPAND DOJavaBean :: Root FOREACH EBADataObject≫<br />
≪EXPAND EOEntityBean :: Root FOREACH EBAEntityObject≫<br />
...<br />
≪ENDDEFINE≫<br />
6.6.2 Trennung von generiertem und nicht generiertem Code<br />
Ein wichtiger Aspekt bei der Codegenerierung ist die Trennung von generiertem<br />
und nicht generiertem Code. In den allermeisten Fällen kann nicht der gesamte<br />
Quellcode einer Software automatisch erzeugt werden. Das heißt, ein Entwickler<br />
muss händisch Ergänzungen vornehmen. Da bei einem Generierungsdurchlauf<br />
alle Artefakte eines früheren Durchlaufs überschrieben bzw. gelöscht werden, ist<br />
es nötig händisch entwickelte Artefakte an einem anderen Ort zu speichern oder<br />
zumindest zu schützen. Dazu kann man entweder Erweiterungsmöglichkeiten der<br />
verwendeten Technologie oder das Konzept der Protected Regions nutzen. Beide<br />
Vorgangsweisen werden im Folgenden besprochen.<br />
Trennung durch Erweiterungstechniken<br />
Automatisch erzeugter Code kann mit händisch entwickeltem verknüpft werden,<br />
indem Erweiterungsmöglichkeiten, die die Technologie selbst bietet, genutzt<br />
werden. Das kann beispielsweise die Generierung einer abstrakten Basisklasse<br />
sein, die ein Entwickler ableitet und um individuellen Code ergänzt. Skriptspra-<br />
chen zum Beispiel bieten in vielen Fällen die Möglichkeit andere Skripte mittels<br />
Include-Befehlen einzubinden.<br />
Im Rahmen des Fallbeispiels wird für jede Javaklasse, die erweitert werden muss,<br />
eine abstrakte Basisklasse generiert. Diese wird anschließend händisch um nöti-<br />
ge Logik ergänzt. Beispielsweise besteht bei den generierten Struts FormBeans<br />
die Möglichkeit Validierungsregeln händisch in einer konkreten Ableitung zu<br />
ergänzen, da die nötige Information nicht im Modell vorhanden ist.
6 Fallbeispiel 92<br />
Bei Java Server Pages erfolgt eine Trennung des Codes mit Hilfe der Struts Ti-<br />
les Template Engine, die eine Aufgliederung einer JSP-Seite in mehrere Dateien<br />
ermöglicht. So wird zum Beispiel der Inhalt einer HTML-Form automatisch aus<br />
den Informationen eines Presentation Elements erstellt. Das Form-Tag mit der<br />
Pfadangabe muss vom Entwickler händisch in einer weiteren JSP Datei, die den<br />
generierten Inhalt einbettet, ergänzt werden.<br />
Geschützte Bereiche<br />
Bietet die Technologie selbst keine Möglichkeit der Erweiterung bestehenden<br />
Codes an, können in den Templates so genannte Protected Regions definiert<br />
werden. Diese erlauben die Integration von manuell erstelltem Code in gene-<br />
riertem. Diese Vorgangsweise hat allerdings einige Nachteile und sollte nur als<br />
letzte Möglichkeit in Betracht gezogen werden. Zum einen erhöhen Protected<br />
Regions den Versionierungsaufwand, da nun auch generierter Code versioniert<br />
werden muss, weil er individuelle Codeteile enthält. Ohne deren Einsatz ist es<br />
nur erforderlich den Generator und die Modelle zu versionieren, der generierte<br />
Quellcode kann aus diesen Artefakten per Knopfdruck erzeugt werden. Speziell<br />
bei der Arbeit in größeren Teams dürfte es hier zu Problemen kommen.<br />
Zum anderen bleiben Protected Regions nur erhalten so lange das Modellelement<br />
existiert, zu dem der Bereich gehört. Sollte auf Grund eines Modellier- oder<br />
Programmierfehlers bei der Generatorentwicklung das Modellelement verloren<br />
gehen oder im Generierungsvorgang nicht bearbeitet werden, wird auch die Proc-<br />
ted Region entfernt. Aus diesem Grund ist Quellcode innerhalb von Protected<br />
Regions potentiell gefährdet.<br />
Im Fallbeispiel werden Protected Regions nur für die Erweiterung von JBoss<br />
Konufigurationsdateien benutzt. Listing 6.7 zeigt ein Beispiel für die Integration<br />
von EJB-Query Language Code für EJB-find-Methoden, sowie ein Beispiel, das<br />
mit Hilfe der Anweisung generiert wurde.<br />
Listing 6.7: Beispiel für eine Protected Region<br />
≪PROTECT CSTART " "<br />
ID nameWithoutSuffix + "_"+ find .NameS≫<br />
<br />
≪ENDPROTECT≫<br />
wird bspw . zu<br />
SELECT<br />
OBJECT (c) FROM Buch AS c<br />
WHERE<br />
6 Fallbeispiel 93<br />
c. kategorie . bezeichnung = ?1 ORDER BY c. titel<br />
<br />
6.7 Ablaufsteuerung - Workflow<br />
Der Generierungsvorgang wird im oAW Toolkit, wie in Abschnitt 5.4 erwähnt,<br />
mit Hilfe so genannter Workflowskripts gesteuert. Ein Workflow setzt sich dabei<br />
aus beliebig vielen WorkflowComponents zusammen. Solche Bestandteile sind<br />
üblicherweise Model Parser, Validatoren, Modelltransformatoren und Code-<br />
generatoren. oAW4 enthält bereits alle für einen Generierungsablauf nötigen<br />
Komponenten. Diese Komponenten müssen vom Entwickler nur noch in der<br />
richtigen Reihenfolge mit den jeweils passenden Parametern aufgerufen werden.<br />
Wie das geht, wird in diesem Abschnitt anhand des Workflowsskripts zur<br />
Generierung der Enterprise JavaBeans und JavaBeans gezeigt.<br />
Um nicht bei jedem Durchlauf den Sourcecode des gesamten Projekts neu zu<br />
generieren, ist die Ablaufsteuerung der Generierung für das Fallbeispiel auf<br />
zwei Workflowskripte, die im Generatorprojekt liegen, aufgeteilt. Skript eins,<br />
eba-ejb-workflow.oaw, das an dieser Stelle als Beispiel herangezogen wird, steu-<br />
ert die Generierung der Artefakte der Geschäftslogik- und Datenschicht. Skript<br />
zwei - eba-web-workflow.oaw - steuert die Generierung der Präsentationsschicht<br />
(Webclient). Die Parametrisierung der Skripte erfolgt in separaten Workflowdefi-<br />
nitionen, die in den jeweiligen Anwendungsprojekten liegen. Listing 6.8 zeigt ein<br />
Beispiel dafür.<br />
6.7.1 Einbindung anderer Workflows<br />
Um die in Workflowskripten enthaltene Funktionalität wieder zu verwenden, ist<br />
es möglich aus einem Skript heraus ein anderes aufzurufen. Diese inkludierten<br />
Skripts werden auch als Cartridges bezeichnet. Das Beispiel in Listing 6.8 zeigt<br />
die Syntax des Aufrufs.<br />
<br />
Listing 6.8: Einbinden eines anderen Workflows<br />
< cartridge file =" eba /eba -ejb - workflow . oaw "><br />
< projectroot value ="../ eba - BuecherwurmEJB "/ >
genroot value ="../ eba - Generator "/ ><br />
< dumpfile value =<br />
6 Fallbeispiel 94<br />
"../ eba - BuecherwurmEJB / buecherwurm . dump "/ ><br />
< appProjectName value =" eba - BuecherwurmEJB "/ ><br />
<br />
<br />
<br />
6.7.2 Die Komponente als Grundbaustein der<br />
Workflowdefinition<br />
In der Einleitung wurde erwähnt, dass sich eine Workflowdefinition aus<br />
einer beliebigen Anzahl von Workflowcomponent-Aufrufen zusammen-<br />
setzt. Eine WorkflowComponent ist eine Javaklasse, die das Interface<br />
org.openarchitectureware.workflow.WorkflowComponent implementiert.<br />
Listing 6.9 zeigt ein Beispiel bei dem ein Instantiator zum Parsen und Insta-<br />
nizieren eines Modells aufgerufen wird. Neben diversen Parametern wird der<br />
Komponente auch ein so genannter Slot übergeben. Slots ermöglichen es Work-<br />
flowComponents untereinander zu kommunizieren. Um Daten auszutauschen<br />
einigen sich zwei Komponenten auf einen Slot, identifiziert durch den gleichen<br />
Namen. Die erste Komponente kann nun etwas in diesen Einschub hineinstellen<br />
und die zweite Komponente kann es anschließend entnehmen.<br />
Listing 6.9: Aufruf einer WorkflowComponent<br />
< component class =" org . openarchitectureware . core .<br />
frontends . xmi . workflow . XMIInstantiator "><br />
< instantiatorEnvironmentSlot value =" ie "/ ><br />
< modelFile value ="${ projectroot }/${ model . xmi }"/ ><br />
< xmlMapFile value ="${ genroot }/${ xmlMapFile }"/ ><br />
< metaMapFile value ="${ genroot }/${ metaMapFile }"/ ><br />
< toolAdapterClassname value ="${ toolAdapterClassname }"/ ><br />
<br />
Slots sind neben Komponenten eines der zentralen Konstrukte von Work-<br />
flowdefinitionen. Zwei im Rahmen der klassischen Vorgangsweise zwingend<br />
zu definierende Slots sind instantiatorEnvironmentSlot und metaEnvironment-<br />
Slot. Beide müssen vor anderen Arbeitsschritten wie Modellinstanzierung, -<br />
validierung und Codegenerierung, der von Seiten des oAW Frameworks zur<br />
Verfügung gestellten Cartridge classicstart.oaw, bekannt gegeben werden<br />
(siehe Listing 6.10). Diese Cartridge erstellt die grundlegenden Strukturen,
6 Fallbeispiel 95<br />
um die Informationen aus den Modellen im Speicher abzulegen. Mit dem Be-<br />
fehl wird dabei ein Objekt vom Typ<br />
MetaEnvironment angelegt, dass in der Workflowdefinition mittels dem Schlüssel<br />
me angesprochen werden kann. Dieses Objekt stellt die Metaumgebung dar, die<br />
alle Elemente aus den Modellen enthält und in den Templatedefinitionen ” durch-<br />
forstet“ wird. erstellt ein Ob-<br />
jekt der Klasse ClassicOAWInstantiatorEnvironment, das den Instantiators die<br />
Möglichkeit bietet die gewonnen Informationen zur Weiterverarbeitung durch an-<br />
dere Komponenten abzulegen.<br />
Listing 6.10: Aufruf der Cartridge classicstart<br />
< cartridge file =" org / openarchitectureware / workflow /<br />
oawclassic / classicstart . oaw "><br />
< log4jConfigFile value ="${ genroot }/${ log4jConfigFile }"/ ><br />
< metaEnvironmentSlot value =" me "/ ><br />
< instantiatorEnvironmentSlot value =" ie "/ ><br />
<br />
6.7.3 Generatoraufruf<br />
Wie in Abschnitt 6.6 beschrieben benötigen Xpand-Templates zur Codege-<br />
nerierung einen Einstiegspunkt in das instanzierte Modell. Diesen Einstiegs-<br />
punkt liefern die Methoden des CustomModelElements eba.meta.EBATop,<br />
die von den Root-Templates aufgerufen werden. Die WorkflowComponent<br />
eba.plugin.TopBuilder stellt einen Wrapper für EBATop dar, um es in eine<br />
Workflowdefinition integrieren zu können.<br />
In Listing 6.11 wird zuerst die Komponente topbuilder konfiguriert und ein<br />
Slot namens model bekannt gegeben, über den auf eine Instanz der Klas-<br />
se eba.meta.EBATop in der Workflowdefintion zugegriffen werden kann. Auf<br />
diesen Slot wird im Zuge der Generatorkonfiguration mit dem Komman-<br />
do verwie-<br />
sen. Dieses Kommando gibt gleichzeitig die Wurzel des Templatebaums an, bei<br />
der die Codegnerierung gestartet werden soll.<br />
In den Anweisungen zuvor wird das zu Grunde liegende Metamodell definiert. Es<br />
ist dabei anzugeben, um welchen Typ es sich handelt und welche Verarbeitungs-<br />
strategie anzuwenden ist. Im Fallbeispiel handelt es sich um ein Java Metamodell,<br />
das auf ” klassische Art und Weise“ (siehe Abschnitt 5.1) verarbeitet werden soll.<br />
Abschließend werden Ausgabeverzeichnisse und Beautifier zur Formatierung des
Codes definiert.<br />
6 Fallbeispiel 96<br />
Listing 6.11: Aufruf der Generatorkomponente<br />
< component id =" topbuilder " class =" eba . plugin . TopBuilder "><br />
< metaEnvironmentSlot value =" me "/ ><br />
< modelSlot value =" model "/ ><br />
<br />
< component id =" generator "<br />
class =" org . openarchitectureware . xpand2 . Generator "><br />
< fileEncoding value =" ISO -8859 -1"/ ><br />
< metaModel class =<br />
" org . openarchitectureware . type . impl . java . JavaMetaModel "><br />
< typeStrategy class =<br />
" org . openarchitectureware . type . impl . oawclassic .<br />
<br />
OAWClassicStrategy "<br />
convertPropertiesToLowerCase =" false "/ ><br />
< expand value =" eba :: templates :: EJBRoot :: Root FOR model "/ ><br />
< genPath value ="${ srcGenPath }"/ ><br />
< srcPath value ="${ srcGenPath }"/ ><br />
< prSrcPathes value ="${ srcGenPath }/ resources "/ ><br />
< beautifier class =<br />
" org . openarchitectureware . xpand2 . output . JavaBeautifier "/ ><br />
< beautifier class =<br />
" org . openarchitectureware . xpand2 . output . XmlBeautifier "/ ><br />
<br />
Für weitere Beispiele wird auf den beiliegenden Sourcecode zum Fallbeispiel und<br />
auf [EV06] verwiesen.<br />
6.8 Erweiterungsmöglichkeiten<br />
Im Laufe der Arbeiten zum Fallbeispiel und während der Dokumentationsphase<br />
kristallisierten sich diverse Bereiche heraus, die entweder im Rahmen dieser Ar-<br />
beit nicht adressiert werden konnten oder Potential zur Weiterentwicklung auf-<br />
wiesen. Einige dieser Punkte werden in diesem Abschnitt vorgestellt und sollen
6 Fallbeispiel 97<br />
Abbildung 6.13: Metamodell mit erweiterter Semantik<br />
Erweiterungsmöglichkeiten und Anknüpfungspunkte an die Thematik aufzeigen.<br />
6.8.1 Metamodell<br />
Der Entwurf eines aussagekräftigen Metamodells ist mit Sicherheit eine der<br />
schwierigsten Herausforderungen bei der Entwicklung eines oAW-Generators.<br />
Aus genanntem Grund bietet dieser Bereich auch ein großes Veränderungspoten-<br />
tial.<br />
Das in Abschnitt 6.5.1 behandelte Metamodell besitzt eine sehr einfache Struk-<br />
tur. Es definiert eine Reihe von Stereotypen, die untereinander bis auf extensions-<br />
Beziehungen nicht in Verbindung stehen. Wesentliche Teile der Semantik werden<br />
in den Constraints zum Ausdruck gebracht.<br />
In der Nachberarbeitungs- und Dokumentationsphase des Fallbeispiels entstand<br />
eine weiterentwickelte Variante des Metamodells, bei der ein Großteil dieser Se-<br />
mantik aus den Validierungsregeln bereits im Modell zum Ausdruck kommt. Diese<br />
Variante wird in Abbildung 6.13 dargestellt.<br />
Bei der Weiterentwicklung des Metamodells wäre es sinnvoll die Datenhal-<br />
tungsschicht um eine Persistenzlogik zu erweitern. Das könnte beispielsweise<br />
über die Einführung eines Stereotyps > analog zu<br />
> realisiert werden. Dieses Stereotyp könnte aus SQL ent-
6 Fallbeispiel 98<br />
lehnte Eigenschaftswerte wie ” notNull“ oder ” unique“ aufweisen.<br />
Der nächste logische Schritt wäre die Aufspaltung des Modells auf mehrere Teilm-<br />
odelle. Sinnvoll wäre es, die Präsentationssicht in einem separaten Modell darzu-<br />
stellen und Geschäftslogik und Datenhaltung gemeinsam zu modellieren. Wie die<br />
Verwendung mehrerer Modelle technisch realisiert wird zeigt [Völ05c] Seite 39ff.<br />
6.8.2 Ablaufsteuerung<br />
openArchitectureWare verfügt über die in der Projektdokumentation zum Verfas-<br />
sungszeitpunkt nicht adressierte Möglichkeit UML-Actitvity-Diagramme zu ver-<br />
arbeiten. Dieser Umstand wird durch das Beispiel in [SV05] Kapitel 3 und das<br />
Vorhandensein des Pakets org.openarchitectureware.meta.uml.activity be-<br />
legt. Diese Funktionalität könnte genutzt werden, um die auf Seiten des Webcli-<br />
ents benötigte Ablaufsteuerung automatisch aus einem Aktivitätsdiagramm her-<br />
aus zu generieren. Die erstellten Artefakte wären Teile der Struts-Konfiguration,<br />
der Rechteverwaltung sowie der in den JSPs enthaltenen HTML-Forms.<br />
6.8.3 Recipes<br />
Um Code, der mit oAW generiert wurde, zu erweitern, ist zum Teil viel Wissen<br />
über dessen Beschaffenheit notwendig. In Version vier des Generatorframeworks<br />
wurde eine neue Technologie eingeführt, die es ermöglicht dem Anwendungsent-<br />
wickler anzuzeigen, wo eine manuelle Ergänzung generierter Artefakte nötig ist.<br />
Dazu muss der Generatorentwickler ein so genanntes Recipe verfassen. Ein Recipe<br />
ist eine Javaklasse die eine Regel implementiert. Überprüft wird dabei beispiels-<br />
weise, ob eine abstrakte Basisklasse abgeleitet wurde oder ob ein bestimmter<br />
Ausdruck in einer Datei vorkommt. Diese Recipes können von einem Eclipse<br />
Plugin geladen und validiert werden. Regelverstöße werden von diesem Plugin,<br />
ähnlich wie es Eclipse mit Problems und Warnings tut, in einem separaten Tab<br />
angezeigt. Für weitere Informationen siehe die oAW Dokumentation zu Recipes<br />
unter [Völ06b].<br />
6.9 Vorgangsweise, Herausforderungen und<br />
Codeanalyse<br />
Am Beginn der Arbeiten zum Fallbeispiel stand die Domänenfindung und<br />
die Wahl der zur Umsetzung benötigten bzw. geeigneten Technologien. Hier<br />
stand die Frage im Raum, ob eine technisch oder fachlich motivierte Domäne
6 Fallbeispiel 99<br />
herangezogen wird. Bei fachlichen Domänen bestand die Ungewissheit, ob<br />
oAW diese ausreichend unterstützt, da sämtliche verfügbaren Beispiele in einer<br />
technischen Domäne angesiedelt sind. Darüber hinaus unterstützte oAW mit der<br />
zum damaligen Zeitpunkt aktuellen Version (Version drei) hauptsächlich UML<br />
Modelle, die für die Darstellung fachlicher Aspekte nur wenig geeignet sind. (Die<br />
Unterstützung von EMF-Modellen wurde erst in Version vier realisiert.)<br />
Markus Völter, ein Mitwirkender am oAW Projekt, hält in Bezug auf die<br />
Behandlung von fachlichen Domänen in einem im April erschienen Interview<br />
(siehe [Net06]) fest, dass fachliche Domänen durchaus realisierbar sind. Zu<br />
Beginn sei es aber einfacher technologisch motivierten Code zu generieren,<br />
da hier ein hohes Automatisierungspotential bestehe und dieser Bereich den<br />
Entwicklern vertraut sei.<br />
Auf Grund der Unsicherheiten in Bezug auf die Natur der Domäne, der Leis-<br />
tungsfähigkeit von oAW und der Beschaffenheit einzusetzender Technologien fiel<br />
die Entscheidung auf Basis des in [SV05] Kapitel drei vorgestellten Beispiels, das<br />
vorliegende Fallbeispiel zu konstruieren und eine technische Domäne umzusetzen.<br />
Nach der Domänenfindung wurde ein Technologieprotoyp der Onlinebuchhand-<br />
lung ” Bücherwurm“ angefertigt. Auf diese Weise war es möglich, die Techniken<br />
zu erlernen und architektonische Konzepte auf ihre Tauglichkeit zu überprüfen.<br />
So fand beispielsweise das in Abschnitt 6.4.2 beschriebene Konzept der Session<br />
Facades erst später Einzug in die Architektur, nachdem sich ein direkter Zugriff<br />
auf die Entity Beans als unzulänglich herausgestellt hatte. Im Anschluss an<br />
die Prototypisierung fanden erste Gehversuche mit oAW Version drei statt.<br />
Experimentiert wurde mit der Erzeugung der sehr einfach strukturierten Data<br />
Transfer Objects(siehe 6.4.2).<br />
Diese Einarbeitungsphase war sicher eine der schwierigsten bei der Arbeit mit<br />
oAW, da zu diesem Zeitpunkt nur eine unzureichende Dokumentation existierte<br />
und das Diskussionsforum auf der damaligen Projektseite nur wenig frequentiert<br />
war. Zum Teil musste der Sourcecode zum oAW-Toolkit selbst als Informations-<br />
quelle genutzt werden. Außerdem war ein hohes Maß an Wissen und Verständnis<br />
für die internen Zusammenhänge notwendig, um die Software nutzen zu können.<br />
Zeitgleich mit Beginn der Arbeiten an der Referenzimplementierung für die<br />
Domänenarchitektur erschien Ende Jänner 2006 Release Candidate 1 von oAW<br />
Version vier. Diese Version brachte zahlreiche Neuerungen mit sich, wie eine<br />
verbesserte Integration in Eclipse, neue Sprachen, eine Erweiterung der un-<br />
terstützten Modellpalette, umfangreichere Dokumentation, zusätzliche Tutorials<br />
und eine rege Teilnahme der oAW Entwickler im Forum der Projektseite. Aus
6 Fallbeispiel 100<br />
diesen Gründen fiel die Entscheidung oAW Version vier für die Umsetzung des<br />
Fallbeispiels zu nutzen.<br />
Nach einer Einarbeitungsphase und dem Entwurf der Domänenarchitektur<br />
mussten deren Konzepte in einem Metamodell modelliert werden. Hier stellte<br />
sich die Frage, auf welcher Ebene die Konzepte des Metamodells anzusiedeln<br />
sind. Sollten die Konzepte auf Ebene der technischen Plattform liegen oder<br />
höher angesiedelt werden? Das heißt, sollte das Metamodell die Konzepte von<br />
J2EE und Struts oder Konstrukte wie Session Facades und Data Transfer<br />
Objects abbilden. Variante eins führt zu einer sehr breiten Domäne mit geringem<br />
Generierungspotential. Variante zwei schmälert durch die Einschränkung auf<br />
eine bestimmte Architektur die Domäne, aber erhöht in gleichem Maße das<br />
Potential an generierbarem Code. Den Ratschlägen von [SV05] Seite 137 und<br />
dem Metamodell des Beispiels aus Kapitel drei des selben Buchs folgend wurde<br />
das Metamodell auf einer höheren Ebene angesiedelt und die architektonischen<br />
Konzepte dargestellt.<br />
Im Anschluss an die Phase der Domänenanalyse erfolgte die Modellierung der<br />
Referenzimplementierung mit Hilfe der Konstrukte des Metamodells. Vor der<br />
Entwicklung der Transformationsvorschriften musste dieses Referenzmodell<br />
händisch umgesetzt werden, um eine Vorlage für den zu generierenden Code zu<br />
besitzen. Der Sourcecode des Prototypen war dafür zu uneinheitlich und zu wenig<br />
ausgereift. Aus diesem Grund wurden Teile des Prototypen neu entwickelt und<br />
auf ein Referenzniveau gebracht. Besonders wichtig war es, den Sourcecode der<br />
Instanzen eines Metamodellelements mit den gleichen Schemata zu entwickeln<br />
um ein und dieselben Templates darauf anwenden zu können. Es wurde dabei<br />
nicht die gesamte Referenzimplementierung händisch entwickelt sondern es fand<br />
ein schrittweiser Übergang zur Generierung statt.<br />
Der Ablauf war dabei wie folgt: Zuerst wurden ausgewählte Instanzen eines<br />
Metamodellelements händisch implementiert. Danach wurden aus dem händisch<br />
verfassten Sourcecode die Transformationsvorschriften abgeleitet und versucht<br />
die Instanzen eines Metamodellelements zu generieren. Bei der Auswahl der<br />
händisch zu implementierenden Instanzen war besonders darauf zu achten<br />
ein möglichst breites Spektrum an Variationen zu einem Metamodellelement<br />
abzudecken. So sind zum Beispiel ” KundenverwaltungPO“ (Abbildung 6.8) und<br />
” BuchverwaltungPO“ - zur Verwaltung von Entitäten zum Thema Buch“ -<br />
”<br />
beides Ausprägungen des Stereotyps >, auf Codeebene<br />
bestehen dennoch gewisse Unterschiede.
6 Fallbeispiel 101<br />
Oft wurde nach der Generierung festgestellt, dass gewisse Aspekte eines Meta-<br />
modellelements mit den manuell implementierten Beispielen nicht erfasst wurden<br />
und somit Fehler und Unzulänglichkeiten im erzeugten Code zu finden waren.<br />
In den allermeisten Fällen war es nötig diese fehlenden Aspekte zuerst händisch<br />
zu implementieren, um anschließend wieder Transformationsvorschriften daraus<br />
abzuleiten. Die manuelle Implementierung war notwendig, da eine Templateent-<br />
wicklung ohne Vorlage sehr komplex und fehlerbehaftet war.<br />
Nach der Fertigstellung aller generierbaren Teile wurden die individuellen Code-<br />
teile, wie der Warenkorb, ergänzt.<br />
Die soeben beschriebenen Phasen der Domänenanalyse und Referenzimplemen-<br />
tierung sind nicht starr sondern gehen fließend ineinander über. Oftmals war<br />
während der Arbeiten an der Referenzanwendung eine Änderung bzw. Erweite-<br />
rung des Metamodells notwendig. Es handelt sich also nicht um eine Vorgangswei-<br />
se im Sinne des ” Wasserfallmodells“ sondern sie ist vielmehr iterativ inkrementell.<br />
6.9.1 Herausforderungen bei der Umsetzung<br />
Neben den bereits beschriebenen Unsicherheiten bei der Domänenfindung und<br />
der anfänglichen Unzugänglichkeit von oAW war der Bereich der Modellierung<br />
eine der größten Herausforderungen bei der Umsetzung. Speziell zu Beginn war<br />
es auf Grund mangelnder Erfahrung oft schwierig abzuschätzen inwieweit Me-<br />
tamodell und Modell die Sachverhalte in geeigneter Art und Weise ausdrücken.<br />
Die Eignung zeigte sich jedoch in den allermeisten Fällen sehr bald bei der<br />
Templateentwicklung und der Implementierung von Logik im Metamodell. War<br />
beispielsweise kaum Generierungspotential auszumachen war eine Spezialisierung<br />
eines Stereotyps oft hilfreich.<br />
Zu diesen großen Herausforderungen kamen viele kleine bei der täglichen Arbeit<br />
mit oAW, wie die Extraktion von Information, die über mehrere Modellelemente<br />
verstreut war. Schwierig war es auch die Logik zur Schachtelung der einzelnen<br />
Data Transfer Objects in den Templates zur Generierung der Session facades<br />
abzubilden. Hier musste intensiv mit rekursiver Programmierung gearbeitet wer-<br />
den. Herausfordernd war auch die Navigation durch das instanzierte Modell, da<br />
in manchen Templates Information über den Pfad von Modellelement A zu Mo-<br />
dellelement B benötigt wurde. Hier kamen graphentheoretische Algorithmen zum<br />
Einsatz.
6.9.2 Codeanalyse<br />
6 Fallbeispiel 102<br />
Abschließend wird diskutiert wie das Verhältnis von generierten zu manuell co-<br />
dierten Codeteilen aussieht. Als Maßzahl dient Lines of Code (LOC). Tabelle 6.1 6<br />
stellt die manuell und automatisch erzeugten LOC der einzelnen Komponenten<br />
gegenüber. Es zeigt sich dabei, dass 70,8% des Fallbeispiels automatisch erzeugt<br />
werden können. Dies ist laut [SV05] Seite 32 im üblichen Bereich des bei AC-<br />
MDSD generierbaren Codeanteils von 60-80%.<br />
Besonders hohes Generierungspotential befindet sich auf Seiten des EJB basierten<br />
Backends, bei dem auf Grund der ausgeprägten Strukturierung und des hohen<br />
Schematisierungsgrades 93% des Javacodes und der XML-Konfiguration gene-<br />
riert werden konnte. Bei der Entwicklung des Webfrontends sinkt dieser Faktor<br />
auf 45,2% des Codes. Dieses Absinken ist durch einen hohen individuellen Co-<br />
deanteil und die nicht aus Klassendiagrammen generierbare Ablaufsteuerung zu<br />
erklären.<br />
6 Die Werte wurden mit dem Programm Lines of Code Counter ( [loc06]), das die Zeilenanzahl<br />
innerhalb einer Textdatei minus Leerzeilen und Zeilen mit weniger als drei Zeichen ausgibt,<br />
erstellt. Codeanteil der auf Protected Regions entfällt wurde händisch subtrahiert.
6 Fallbeispiel 103<br />
Herstellung Web-Frontend EJB-Backend Gesamt<br />
JSP Actions und Konfiguration Gesamt EJB Konfiguration Gesamt<br />
FormBeans<br />
Generiert 416 44% 1033 55,6% 0 0% 1449 45,2% 2091 90,4% 1319 97,7% 3410 93% 4859 70,8%<br />
Manuell 528 56% 826 54,4% 400 100% 1754 54,8% 223 9,6% 31 2,3% 254 7% 2008 29,2%<br />
Gesamt 944 1859 400 3203 46,7% 2314 1350 3664 53,3% 6867 100%<br />
Tabelle 6.1: Gegenüberstellung der Anzahl manuell codierter LOC und generierter LOC
7 Evaluierung<br />
Bisher wurden nur die technischen und prozessualen Aspekte von MDSD<br />
betrachtet, wirtschaftliche Belange wurden außer Acht gelassen. Aber gerade<br />
hier sind die Auswirkungen modellgetriebener <strong>Softwareentwicklung</strong> in Form von<br />
Kostenersparnissen bei qualitativ höherwertiger Software besonders zu spüren.<br />
Um die Methodik zu etablieren sind allerdings einige Anfangsinvestitionen<br />
nötig, die von der Schaffung einer generativen Umgebung, über den Aufbau<br />
einer entsprechenden domänenspezifischen Plattform bis hin zur Schulung der<br />
Mitarbeiter reichen.<br />
Ziel dieses Kapitels ist es das betriebswirtschaftliche Potential des MDSD-<br />
Ansatzes aufzuzeigen, sinnvolle Einsatzgebiete darzustellen und die nötigen In-<br />
vestitionen aufzulisten. Abschließend wird auf derzeit bestehende Probleme auf-<br />
merksam gemacht. Die kritische Betrachtung der Methodik basiert auf folgenden<br />
Quellen: [SV05] Kapitel 17, [Bet06b], [Net06], [PBG04] Kapitel 10 und [CN04].<br />
7.1 Wann ist MDSD sinnvoll?<br />
MDSD zeichnet sich durch eine enge Verwandtschaft mit Software-Produktlinien<br />
aus. In Abschnitt 3.2 wurde bereits auf den Umstand hingewiesen, dass MDSD<br />
zur Realisierung von Software Product Lines genutzt werden kann. Aus dieser<br />
Überlegung folgt, dass beide Methodiken unter ähnlichen Bedingungen sinnvoll<br />
einzusetzen sind.<br />
Software Product Lines haben das Ziel eine Menge von ähnlichen Systemen<br />
umzusetzen. Durch die Planung über mehrere Systeme hinweg wird versucht,<br />
Einsparungspotential gegenüber der Entwicklung singulärer Systeme zu nutzen.<br />
Je ähnlicher die Systeme sind, desto mehr Komponenten lassen sich wiederver-<br />
wenden. Gemeinsame Basis aller Familienmitglieder ist die domänenspezifische<br />
Plattform. Ähnlich verhält es sich bei MDSD, wo die Überlappung von Ei-<br />
genschaften der zu entwickelnden Anwendungen nicht nur in Bezug auf die<br />
Wiederverwendung von Plattformbestandteilen eine Rolle spielt, sondern auch<br />
104<br />
für die Transformationsvorschriften. Es ist nur sinnvoll in diesen Vorschriften
7 Evaluierung 105<br />
Aspekte zu beschreiben, die sich schematisch wiederholen. In allen anderen<br />
Fällen ist eine manuelle Umsetzung effizienter (siehe Abschnitt 2.1).<br />
Aus eben genannten Gründen folgt, dass MDSD besonders in Unternehmen Sinn<br />
macht, die eine Menge gleicher Software-Produkte herstellen. Profitieren können<br />
auch IT-Dienstleister im projektorientierten Bereich, die sich in einer fachspe-<br />
zifischen Domäne spezialisieren, was wiederum zu einer Menge an ähnlichen<br />
Produkten führt. Bezieht man in diese Überlegungen nicht nur die Entwick-<br />
lungskosten sondern auch den anfallenden Wartungsaufwand mit ein, kann sich<br />
MDSD bereits im Rahmen einer Anwendung als Gewinn herausstellen. Ein<br />
Großteil der Wartungsaufgaben kann Zentral in den Transformationsvorschriften<br />
vorgenommen und mit Hilfe des Generators gleichmäßig auf die bestehende<br />
Codebasis übertragen werden.<br />
Als groben Anhaltspunkt, ab welchem Zeitpunkt sich der MDSD-Einsatz in<br />
einem Projekt für die unmittelbar beteiligten Entwickler positiv bemerkbar<br />
machen sollte, gibt Markus Völter in [Net06] den Zeitraum von vier Wochen<br />
nach Einführung der Methodik an.<br />
Zum erfolgreichen Einsatz von MDSD müssen, wie [PBG04] darlegt (siehe Seite<br />
266), mehrere Rahmenbedingungen gegeben sein:<br />
• Die einzelnen Systeme müssen genügend Gemeinsamkeiten ha-<br />
ben.<br />
• Die Anforderungen müssen verhandelbar sein.<br />
• Das Eigentum an den entwickelten Gütern ... darf nicht an den<br />
Kunden übergehen.<br />
Punkt zwei bedarf einer näheren Betrachtung. Sind die Anforderungen an ein<br />
Softwaresystem nicht verhandelbar, ist es möglich, dass die Kundenwünsche nicht<br />
im Rahmen der Domänenarchitektur umzusetzen sind. Das führt zu einem Unikat,<br />
wie es aus der traditionellen Entwicklung bekannt ist. MDSD ist also nur dann<br />
sinnvoll, wenn die Anforderungen der einzelnen Systeme soweit verhandelbar sind,<br />
dass man auf Basis der Gemeinsamkeiten eine Software-Systemfamilie gründen<br />
kann.
7 Evaluierung 106<br />
Abbildung 7.1: Aufwand bei traditioneller <strong>Softwareentwicklung</strong> (Quelle: [SV05]<br />
Seite 318)<br />
7.2 Vorteile und betriebswirtschaftliche<br />
Auswirkungen<br />
7.2.1 Automation und Wiederverwendung<br />
Ein wesentliches Merkmal modellgetriebener <strong>Softwareentwicklung</strong> ist die automa-<br />
tisierte Erstellung von sich schematisch wiederholendem Code durch einen Gene-<br />
rator, in Verbindung mit der Wiederverwendung von Komponenten auf Basis ei-<br />
ner domänenspezifischen Plattform. Diese Techniken verkürzen die Entwicklungs-<br />
zeit neuer Produkte und folglich auch die so genannte Time-To-Market Phase,<br />
also jene Zeit die von der Idee bis zum Markteintritt vergeht, was zu entschei-<br />
denden Wettbewerbsvorteilen führen kann 1 . Zudem ist der Zeit- und Personalbe-<br />
darf pro Projekt geringer, als bei einer traditionellen rein manuellen Entwicklung.<br />
Das führt zu kostengünstigeren Produkten, da die Arbeitszeit den entscheidenden<br />
Kostenfaktor bei der <strong>Softwareentwicklung</strong> darstellt.<br />
Reduziert man den Prozess der <strong>Softwareentwicklung</strong> auf die beiden Faktoren ” In-<br />
formationsgewinnung über die Domäne“ und ” Detaillierungsgrad der Implemen-<br />
tierung“ führt der Weg zum fertigen Produkt über Analysemodell, Design bis hin<br />
1 Im Hochtechnologiesektor wird durch einen frühen Markteintritt der Umstand genutzt, dass<br />
die Gruppe der Early Adopters bereit ist, sehr hohe Preise für ein Produkt zu bezahlen.
7 Evaluierung 107<br />
Abbildung 7.2: Aufwand bei modellgetriebener <strong>Softwareentwicklung</strong> mit teilweise<br />
manueller Kodierung (Quelle [SV05] Seite 319)<br />
zur fertigen Anwendung. Dabei zeigt sich, dass zu Beginn der Informationsgehalt<br />
überproportional zum Detaillierungsgrad steigt. Je weiter die Implementierung<br />
voranschreitet desto mehr kehrt sich dieses Verhältnis um.<br />
Stahl und Völter führen hier als Vergleich die Skizze eines GUIs mit der fertigen<br />
Ausarbeitung in Form einer JSP Seite an ( [SV05]). Beide Artefakte enthalten<br />
denselben Informationsgehalt, der Unterschied liegt im Detaillierungsgrad. Aus<br />
der Sicht der enthaltenen Information ist die Ausarbeitung somit eine reine Fleiß-<br />
aufgabe, um sie in eine computergestützte Form zu bringen. Diese ” Fleißarbeit“<br />
übernimmt bei MDSD ein Generator. Abbildung 7.1 und 7.2 verdeutlichen das<br />
Einsparungspotential durch den beschriebenen Sachverhalt.<br />
Neben der automatisierten Codeerstellung ist die Wiederverwendung der zweite<br />
Motor zur Kostensenkung, da einmal entwickelte Artefakte in mehreren Anwen-<br />
dungen genutzt werden. Die Entwicklungskosten für eine Komponente verteilen<br />
sich somit auf mehrere Projekte.<br />
7.2.2 Sicherstellung von Anwendungsqualität<br />
MDSD bewirkt eine Steigerung der Anwendungsqualität durch mehrere<br />
Umstände. Erstens verfügen Anwendungen, die mit Hilfe von MDSD entwickelt<br />
wurden, zwingend über eine wohldefinierte Architektur. Sie ist eine Vorausset-
7 Evaluierung 108<br />
zung für die spätere Codegenerierung. Bei der Codegenierung wird ein Regelsatz<br />
auf Modellelemente angewandt, um daraus den Quellcode einer Anwendung zu<br />
erstellen. Es ist also unumgänglich diese Regeln vorab zu definieren und sich da-<br />
durch sehr genau mit der Architektur der Anwendung auseinander zu setzen.<br />
Zweitens ist die Architektur durch die automatisierte Umsetzung gleichförmig<br />
mit ein und derselben Qualität in der gesamten Anwendung wiederzufinden. Sie<br />
schwankt also nicht mit den Fähigkeiten eines einzelnen Entwicklers. Das heißt,<br />
MDSD unterstützt die Bündelung von fachlichem und technischem Wissen in den<br />
Bestandteilen der Domänenarchitektur. Technische Experten bilden ihr Wissen<br />
in den Transformationen und der Plattform ab. Fachliche Experten halten die<br />
Geschäftslogik in den (hoffentlich) weitestgehend technologieunabhängigen Mo-<br />
dellen fest.<br />
Drittens müssen Plattform und Transformationsvorschriften ihre Funktionalität<br />
in mehreren Produkten unter Beweis stellen. Diese umfangreiche Qualitätssiche-<br />
rung erhöht die Chance einen Fehler zu finden signifikant. Wird ein Fehler ent-<br />
deckt und behoben, steigert das die Qualität aller auf dem jeweiligen Artefakt<br />
aufbauenden Anwendungen.<br />
7.2.3 Technologiewechsel<br />
Bei einer modellgetriebenen Entwicklung, wie sie im Rahmen dieser Arbeit vorge-<br />
stellt wird, besteht eine klare Trennung von Infrastruktur und fachlichem Code,<br />
was einen Technologiewandel erleichtert. Sind die Anwendungsmodelle techno-<br />
logieunabhängig gehalten, beschränken sich die nötigen Änderungen auf Trans-<br />
formationen und Plattform. Somit müssen Anbindungen an neue Technologien<br />
nur einmal zentral implementiert werden und können anschließend mit Hilfe des<br />
Generators auf bestehende Anwendungen umgelegt werden. Das heißt, MDSD<br />
unterstützt die Bestrebung den Anwendungslebenszyklus vom Technologielebens-<br />
zyklus zu entkoppeln.<br />
7.2.4 Auswirkungen auf den Einzelnen<br />
Bisher wurden nur die Auswirkungen von MDSD auf eine Organisation im Gan-<br />
zen betrachtet. Clements und Northrop haben bei ihren Untersuchungen von<br />
Software Product Lines zahlreiche Interviews mit Entwicklern durchgeführt um<br />
herauszufinden wie sich die Methodik auf deren tägliche Arbeit auswirkt. Einige<br />
der in [CN04] gelisteten Punkte (siehe Seite 21) lassen sich auf MDSD übertragen<br />
und werden hier frei wiedergegeben.<br />
• Anstatt den größten Teil der Entwicklungszeit mit grundlegenden Arbeiten
7 Evaluierung 109<br />
zu verbringen, ist es den Entwicklern möglich sich auf die individuellen<br />
Aspekte einer Anwendung zu konzentrieren.<br />
• Die in vielen Projekten mühevolle Anfangsphase entfällt, da man auf einer<br />
erprobten Architektur aufbaut.<br />
• Innerhalb eines Unternehmens besteht ein größerer Einsatzbereich, da das<br />
Wissen des Einzelnen eine globalere Gültigkeit besitzt.<br />
• Es bleibt mehr Zeit sich mit neuen Technologien auseinander zu setzen.<br />
7.3 Nötige Investitionen<br />
Um die Vorteile einer MDSD-Entwicklung nutzen zu können sind vorab eini-<br />
ge Investitionen nötig. Erstens müssen die organisatorischen Strukturen auf ei-<br />
ne modellgetriebene <strong>Softwareentwicklung</strong> abgestimmt werden. Zweitens muss ei-<br />
ne entsprechende Domänenarchitektur bestehend aus DSL, Transformationsvor-<br />
schriften und Plattform aufgebaut werden und drittens muss die eigentliche An-<br />
wendung mittels der Artefakte der Domänenarchitektur, ergänzt um individuelle<br />
Komponenten, erstellt werden.<br />
Zu beachten ist, dass die im Folgenden beschriebenen Kosten nicht wasserfallar-<br />
tig nacheinander anfallen sondern sich entsprechend der iterativ inkrementellen<br />
Vorgangsweise über den gesamten Entwicklungszyklus verteilen.<br />
7.3.1 Organisatorische Kosten<br />
Organisatorische Kosten sind alle jene die anfallen, um den <strong>Softwareentwicklung</strong>s-<br />
prozess einer Organisation (unabhängig von deren Größe) an den MDSD-Ansatz<br />
anzupassen. Darunter fallen Punkte wie Training der Mitarbeiter, Einführung agi-<br />
ler Methodiken, Etablierung eines iterativ inkrementellen Vorgehens bei der Pro-<br />
jektabwicklung, Einschulung in die benötigten Tools etc.. Diese Kosten sind stark<br />
vom aktuellen Organisationszustand sowie dem Wissensstand und den Fähigkei-<br />
ten der Mitarbeiter abhängig.<br />
7.3.2 Kosten für die Entwicklung einer Domänenarchitektur<br />
Eine Domänenarchitektur setzt sich aus einer Plattform, einer DSL und den da-<br />
zu passenden Transformationen zusammen. All diese Dinge müssen zum Teil vor<br />
bzw. während der Entwicklung darauf aufbauender Anwendungen entworfen wer-<br />
den. Besonders zu berücksichtigen ist der Umstand, dass diese Artefakte nicht für
7 Evaluierung 110<br />
eine einzelne Anwendung sondern für viele entwickelt werden, das bringt zusätz-<br />
liche Komplexität sowohl bei der Abstimmung als auch beim Design mit sich. Es<br />
darf darüber hinaus nicht außer Acht gelassen werden, dass auch die Artefakte<br />
der Domänenarchitektur einer fortlaufenden Pflege und Wartung bedürfen, was<br />
zu entsprechenden Kosten führt.<br />
Im Folgenden wird eine Auswahl an Punkten gegeben, die im Vergleich zur Ent-<br />
wicklung singulärer Systeme zu erhöhten Aufwendungen führen:<br />
• Domänenanalyse/DSL: Die Anforderungen werden für eine Gruppe von<br />
Systemen festgelegt. Anforderungen einzelner Systeme stellen entweder ei-<br />
ne Abweichung oder Weiterentwicklung dar. Die Schwierigkeit liegt hier in<br />
der Erhebung der Gemeinsamkeiten und der Findung geeigneter Variations-<br />
punkte. Voraussetzung ist in jedem Falle eine detaillierte Domänenanalyse<br />
und möglicherweise sind intensive Besprechungen zur Abstimmung nötig.<br />
Die Ergebnisse der Anforderungsanalyse haben letztendlich auch eine direk-<br />
te Auswirkung auf die DSL, da sie die zu bearbeitende Domäne beschreiben.<br />
In Folgeprojekten kann der Aufwand für die Anforderungsanalyse durch die<br />
Wiederverwendung und Anpassung bestehender Anforderungsanalysen ge-<br />
senkt werden.<br />
Mit Hilfe der in der Anforderungsanalyse gewonnenen Ergebnisse wird eine<br />
DSL, und hier insbesondere ein Metamodell, zur Beschreibung der Konzepte<br />
einer Domäne entworfen. Diese Tätigkeit ist eine der Forderndsten im Zu-<br />
sammenhang mit MDSD und wird speziell zu Beginn bei noch mangelnder<br />
Erfahrung einiges an Aufwand benötigen.<br />
• Architektur/Design: Eine Softwarearchitektur muss im Zusammenhang<br />
mit MDSD nicht nur einer einzigen Anwendung genügen, sondern zusätzlich<br />
in der Lage sein eine Reihe ähnlicher Applikationen zu tragen. Sie bildet<br />
also nicht nur die Gemeinsamkeiten ab, sondern muss auch die Unterschiede<br />
zwischen den Anwendungen ermöglichen. Das ist eine zusätzliche Anforde-<br />
rung, die ein mitunter großes Geschick beim Design erfordert. Ein großer<br />
Vorteil ist der Umstand, dass der wichtigste Designschritt für die aufbau-<br />
enden Anwendungsentwicklungen bereits durchgeführt, und die Ergebnisse<br />
anhand einer Referenzimplementierung validiert werden konnten. Die Ab-<br />
leitung der Transformationen aus der Referenzimplementierung wird in der<br />
Literatur auf 25% des Aufwands für die manuelle Codierung der Referenz-<br />
implementierung geschätzt (siehe [Net06], [SV05] und [Bet06a]).<br />
• Plattformkomponenten: Die Plattformkomponenten bilden das Funda-<br />
ment sowohl für den generierten als auch manuell entwickelten Quellco-
7 Evaluierung 111<br />
de. Sie werden bei der Entwicklung der einzelnen Mitglieder der Software-<br />
Systemfamilie laufend wiederverwendet. Daraus ergibt sich eine höhere An-<br />
forderung hinsichtlich Qualität und Design dieser Komponenten. Sie müssen<br />
sowohl robust als auch erweiterbar sein, so dass eine Erweiterung bzw. der<br />
Einsatz in mehreren Applikationen möglich ist. In vielen Fällen sind diese<br />
Komponenten generell designt, dürfen gleichzeitig aber keine Einbußen bzgl.<br />
der Performance bewirken. Dadurch sind wiederverwendbare Komponenten<br />
in der Herstellung im Vergleich zu Unikaten auch teurer.<br />
7.3.3 Kosten der Anwendungsentwicklung<br />
Die Kosten für die eigentliche Anwendungsentwicklung fallen bei MDSD durch<br />
die Nutzung von Artefakten der Domänenarchitektur wesentlich geringer aus als<br />
bei einer traditionellen Vorgangsweise. Sie werden im wesentlichen durch die Er-<br />
stellung individueller Anwendungsteile, sowie der Anwendungsmodellierung ver-<br />
ursacht. Hinzu kommen Aufwendungen die durch die Abstimmung mit dem Ar-<br />
chitekturentwicklungsteam entstehen (siehe Entwicklungsprozess Kapitel 4).<br />
7.4 Mögliche Hindernisse für eine Verbreitung<br />
<strong>Modellgetriebene</strong> Ansätze, wie MDA oder MDSD, die sich in manchen Details<br />
stark von einer traditionellen <strong>Softwareentwicklung</strong> unterscheiden, werden von<br />
der in Bezug auf neue Methodiken eher konservativ eingestellten Softwareent-<br />
wicklergemeinde mit einer gewissen Skepsis betrachtet. Diese Skepsis liegt in den<br />
nicht haltbaren Heilsversprechungen früherer Ansätze, wie beispielsweise den<br />
so genannten CASE-Tools begründet. Auch der intensiven Wiederverwendung<br />
bestehender Artefakte über mehrere Projekte hinweg stehen Softwareentwickler<br />
oft kritisch gegenüber, da sie zum ” Not invented Here!“-Syndrom neigen.<br />
Zu dieser skeptischen Grundhaltung kommt zum Teil fehlendes Know-how<br />
hinzu. MDSD erfordert fortgeschrittene Kenntnisse im Bereich der Modellierung,<br />
um zum Beispiel eine DSL zu entwerfen bzw. diese entsprechend einsetzen zu<br />
können. In Modellen zu denken ist derzeit nicht etabliert. Außerdem werden<br />
hohe Anforderungen an die Rolle des Softwarearchitekten gestellt.<br />
Neben diesen Punkten haben die verfügbaren Tools zur Realisierung der Metho-<br />
dik noch einige Kinderkrankheiten. Die Entwicklung ist hier sicherlich noch nicht<br />
abgeschlossen. Diese Situation bessert sich aber immer mehr wie die Fallstudie<br />
in Kapitel 6 zeigt. So stellt beispielsweise die Uneinheitlichkeit der erzeugten
7 Evaluierung 112<br />
XMI-Ausgaben der UML-Modellierungstools und deren Anbindung an einen<br />
Generator nach wie vor ein Problem dar. Des Weiteren ist der Entwurf eines<br />
Editors zu einer DSL ein mühsamer Prozess, der mittlerweile durch das Eclipse<br />
GMF Projekt ( [gmf06]) erleichtert wird (vgl. [Net06]).<br />
Ein Umstand der in Bezug auf Tools nicht außer Acht gelassen werden darf, ist<br />
der zum Teil signifikante Aufwand zum Erlernen. MDSD-Tools wie openArchi-<br />
tectureWare sind sehr mächtig und haben einen breiten Funktionsumfang, was<br />
allerdings auch einen entsprechenden Zeitaufwand für das Erlernen zur Folge<br />
hat. Zahlreiche Userkommentare im Diskussionsforum von oAW belegen diesen<br />
Umstand.<br />
Abschließend sind auch die nötigen organisatorischen Umstrukturierungen als<br />
Hindernis anzuführen. Sowohl der etablierte <strong>Softwareentwicklung</strong>sprozess als auch<br />
die existierenden Teamstrukturen müssen an MDSD angepasst werden, was in<br />
bestehenden Organisationen durchaus auf Widerstand stoßen kann.
8 Zusammenfassung und Ausblick<br />
Der in dieser Arbeit vorgestellte Model Driven Software Development-Ansatz<br />
verspricht eine pragmatische Möglichkeit um den Entwicklungsprozess von<br />
Softwaresystemen hinsichtlich Wiederverwendbarkeit, Steigerung der Entwick-<br />
lungsgeschwindigkeit und erzielter Qualität zu verbessern. Dabei wird, wie<br />
der Vergleich mit verwandten Ansätzen zeigt, nicht versucht ” das Rad neu zu<br />
erfinden“ sondern auf bestehende Ansätze zurückgegriffen. MDA liefert MDSD<br />
die Nomenklatur und Impulse für die Modellierung. Software Product Line En-<br />
gineering steuert zum einen Methodiken beispielsweise für die Analysephase und<br />
zum andern das Konzept der Plattform, die ein wieder verwendbares Fundament<br />
bildet, bei. Der Entwicklungsprozess selbst wird stark von den Ideen des Agile<br />
Software Development beeinflusst.<br />
Die hier vorgestellten Ideen zu modellgetriebener <strong>Softwareentwicklung</strong> sind<br />
geprägt davon, die angestrebten Ziele durch eine Vielzahl kleiner Schritte zu<br />
erreichen. Auf große Revolutionen, die mit heute verfügbaren Standards und<br />
Technologien nur schwer oder noch gar nicht umgesetzt werden können, wird<br />
bewusst verzichtet (siehe Probleme bei der Umsetzung von echter Portabilität<br />
im Rahmen von MDA).<br />
Ein Beispiel für die Strategie der ” kleinen Schritte“ ist der bevorzugte Einstieg<br />
in MDSD über die architekturzentrierte Ausprägung, bei der nur technische<br />
Artefakte erzeugt werden. Eine technische Domäne hat den Vorteil, dass sie<br />
den Entwicklern vertraut ist, und ihre tägliche Arbeit erleichtert. Die positiven<br />
Auswirkungen sind hier am schnellsten zu spüren. Später kann schrittweise<br />
der Übergang zu einer fachlichen Domäne erfolgen, womit auch der Umfang<br />
des automatisch erzeugten bzw. wieder verwendeten Codes mehr und mehr steigt.<br />
Neben diesem Pragmatismus sind die hier vorgestellten Ansätze im Gegensatz<br />
beispielsweise zu MDA unabhängig von den Standardisierungsarbeiten eines<br />
Gremiums. Zudem wird eine Unterstützung durch Open Source Programme<br />
angestrebt und die Anwendung der Methodik ist vollkommen individualisier-<br />
113<br />
bar. Das untersuchte Tool openArchitectureWare liefert zum Beispiel keinerlei
8 Zusammenfassung und Ausblick 114<br />
vordefinierte Domain Specific Languages oder domänenspezifische Plattformen<br />
mit. Diese Artefakte müssen vom Anwender selbst geschaffen werden. Das<br />
erschwert zwar einerseits den Einstieg, erlaubt andererseits aber den Einsatz der<br />
Methodik unabhängig von äußeren Einflüssen. Darüber hinaus kommt man nicht<br />
in die Situation gegen das Tool arbeiten zu müssen um eigene Vorstellungen<br />
zu realisieren. Die Strategie der ” kleinen Schritte“ und die Unabhängigkeit von<br />
einem Industriekonsortium ermöglicht es mit Hilfe von MDSD Zielen, die von<br />
Softwareentwicklern seit jeher verfolgt wurden, wie eine effizientere Entwicklung<br />
bei höherer Qualität, schon jetzt ein Stückchen näher zu kommen. Der Anspruch<br />
mit MDSD die ultimative Lösung zu besitzen wird nicht erhoben.<br />
Das in Kapitel 6 mit Hilfe des Open Source Tool openArchitectureWare<br />
durchgeführte Fallbeispiel zeigt, dass auf Seiten der Werkzeuge ausreichend Un-<br />
terstützung besteht, um eine MDSD basierte Entwicklung umzusetzen. Es gibt<br />
sowohl Möglichkeiten Modellvalidierungen vorzunehmen, Transformationsvor-<br />
schriften festzulegen, als auch bei der Generierung benötigte Logik umzusetzen.<br />
Zu dem wird keine Beschränkung hinsichtlich der Modellierungssprache vorge-<br />
nommen. Die gängigsten sind UML, EMF und XML.<br />
Vor dem Einsatz von oAW muss allerdings ein beträchtlicher Lernaufwand in<br />
Kauf genommen werden, da die Dokumentation zwar ständig wächst, aber in<br />
Bezug auf die Mächtigkeit des Tools immer noch lückenhaft ist. Anzumerken ist,<br />
dass diese Situation durch ein, auch von Seiten der Entwickler frequentiertes,<br />
Diskussionsforum gemildert wird. Ein weiteres Problem bei der Arbeit mit<br />
oAW stellt die Anbindung von externen UML-Modellierungstools dar. Durch<br />
die Uneinheitlichkeit der diversen XMI-Dialekte kann es beim Importieren von<br />
Modellen in oAW immer wieder zu Problemen kommen.<br />
Abschließend ist zu bemerken, dass MDSD einen viel versprechenden Ansatz<br />
darstellt, der allerdings auch Anfangsinvestitionen beziehungsweise neue Fähig-<br />
keiten erfordert. So müssen Artefakte wie eine domänenspezifische Plattform<br />
und eine DSL geschaffen werden. Speziell Letztere stellt hohe Anforderungen an<br />
die Modellierungsfertigkeiten der beteiligten Entwickler. Dieses Wissen ist nicht<br />
immer vorhanden sondern muss in vielen Fällen erst erworben werden.<br />
MDSD stellt ein noch relativ junges Forschungsgebiet der Informatik dar, was<br />
auch der geringe Umfang an verfügbarer Literatur belegt. Im Laufe der Arbeit<br />
ergaben sich immer wieder Fragestellungen, deren Behandlung den Rahmen die-<br />
ser Magisterarbeit gesprengt hätte, die aber Ausgangspunkte für weitere Unter-
8 Zusammenfassung und Ausblick 115<br />
suchungen bieten. Im Folgenden werden einige gelistet.<br />
• oAW bietet seit Version 4.0 die Möglichkeit EMF basierte Modelle zu ver-<br />
arbeiten. Die Arbeiten zum Fallbeispiel waren zum Erscheinen von Version<br />
4.0 allerdings bereits zu weit fortgeschritten, als dass eine Abwägung noch<br />
sinnvoll gewesen wäre. Es wäre interessant einen Vergleich zwischen der<br />
Nutzung von oAW mit Hilfe von UML Modellen und EMF basierten Mo-<br />
dellen anzustellen. Des Weiteren kann in diesen Vergleich auf Seiten von<br />
EMF, die Erzeugung eines domänenspezfischen Editors mit Hilfe des GMF<br />
Projekts, mit einbezogen werden.<br />
• In Rahmen des Fallbeispiels wurde sowohl auf die Nutzung von Aktivitäts-<br />
diagrammen zur Generierung von Code zur Ablaufsteuerung verzichtet als<br />
auch auf die Möglichkeit Modelle in Submodelle zu zerteilen um bestimmte<br />
Aspekte wie die Persistenz besser herauszuarbeiten. Ein möglicher Ansatz-<br />
punkt wäre es zu beschreiben, wie das mit oAW umgesetzt werden kann.<br />
Diesbezüglich existiert auch keine Ablaufbeschreibung in der Dokumenta-<br />
tion.<br />
• In der Arbeit wurde nur ein Tool vorgestellt um den MDSD Ansatz zu<br />
realisieren. Eine Evaluation und ein Vergleich weiterer Werkzeuge ist ein<br />
logischer nächster Schritt.<br />
• Die Arbeit adressiert nur die Umsetzung einer technischen Domäne. Eine<br />
Möglichkeit der Weiterführung ist die Betrachtung der Umsetzung einer<br />
fachlichen Domäne oder die Darstellung des Übergangs von technischer zu<br />
fachlicher Domäne.<br />
• Die vorliegende Arbeit untersucht MDSD von einem technischen Stand-<br />
punkt aus, betriebswirtschaftliche Aspekte werden nur im Rahmen der Be-<br />
wertung adressiert. Diese zu untersuchen ist ein möglicher Schritt um die<br />
Effizienz des Ansatzes zu belegen.
Abbildungsverzeichnis<br />
2.1 Grundidee <strong>Modellgetriebene</strong>r <strong>Softwareentwicklung</strong> (Quelle: [SV05]<br />
116<br />
Seite 17) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
2.2 Anwendungen basierend auf einer domänspezifischen Plattform<br />
(Quelle [Bet06d] Seite 43) . . . . . . . . . . . . . . . . . . . . . . 14<br />
2.3 Prinzip architekturzentrierter MDSD (Quelle: [SV05] Seite 27) . . 16<br />
4.1 Iterative, zweigleisige Entwicklung (Quelle: [SV05] Seite 213) . . . 31<br />
4.2 Erstellung einer Domänenarchitektur; Artefakte der Domänen-<br />
architektur (hellgrau), wichtige Zwischenergebnisse (dunkelgrau);<br />
(Quelle: [SV05] Seite 204) . . . . . . . . . . . . . . . . . . . . . . 32<br />
4.3 Aktivitäten im Anwendungsentwicklungsstrang (Quelle: [SV05]<br />
Seite 211) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
5.1 Funktionsweise des openArchitectureWare-Generators (Quelle:<br />
[SV05] Seite 111) . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
5.2 Der Xpand Templateeditor . . . . . . . . . . . . . . . . . . . . . . 41<br />
5.3 Die Strukturansicht des Dump Browsers . . . . . . . . . . . . . . 42<br />
5.4 Beispiel einer Projektstruktur für ein mit oAW 4 und Eclipse rea-<br />
lisiertes MDSD-Projekt . . . . . . . . . . . . . . . . . . . . . . . . 44<br />
5.5 Option zum Starten eines oAW-Workflows . . . . . . . . . . . . . 46<br />
5.6 Metamodell mit einer Anbindung an die übergeordneten Konzepte<br />
der UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48<br />
5.7 Nutzung eines Metamodells mittels Stereotypen . . . . . . . . . . 49<br />
5.8 Angepasstes Metamodell für den Metamodellgenerator . . . . . . 51<br />
6.1 Anwendungsfälle des Actors ” Kunde“ . . . . . . . . . . . . . . . . 62<br />
6.2 Anwendungsfälle des Actors ” Administrator“ . . . . . . . . . . . . 63<br />
6.3 Das Model 2 für Java Webanwendungen (Quelle [Weß05] Seite 13) 68<br />
6.4 Die Architetektur des Struts Frameworks (Quelle: [Weß05] Seite 17) 69<br />
6.5 Schichtenarchitektur der Domäne ” E-Business Systeme“ . . . . . . 70
Abbildungsverzeichnis 117<br />
6.6 Schematischer Aufbau der Webseiten des Fallbeispiels . . . . . . . 74<br />
6.7 Metamodell der Domäne<br />
” Softwarearchitektur für E-<br />
Businesssysteme“ als UML-Profil . . . . . . . . . . . . . . . . . . 75<br />
6.8 Die Kundenverwaltung von ” Bücherwurm“ . . . . . . . . . . . . . 78<br />
6.9 Die Modellierung einer Webschnittstelle zur Datenverwaltung . . 80<br />
6.10 Die Modellierung einer Suche . . . . . . . . . . . . . . . . . . . . 81<br />
6.11 Adaptiertes Metamodell der Erben von UML::Attribute . . . . . . 85<br />
6.12 Adaptiertes Metamodell der Erben von UML::Class . . . . . . . . 86<br />
6.13 Metamodell mit erweiterter Semantik . . . . . . . . . . . . . . . . 97<br />
7.1 Aufwand bei traditioneller <strong>Softwareentwicklung</strong> (Quelle: [SV05]<br />
Seite 318) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106<br />
7.2 Aufwand bei modellgetriebener <strong>Softwareentwicklung</strong> mit teilweise<br />
manueller Kodierung (Quelle [SV05] Seite 319) . . . . . . . . . . . 107
Tabellenverzeichnis<br />
5.1 Für das Fallbeispiel benötigte oAW Komponenten und ihre<br />
118<br />
Abhängigkeiten (Quelle [Kad06a]) . . . . . . . . . . . . . . . . . . 40<br />
5.2 Vom Generatorprojekt benötigte jar Dateien aus dem oAW Toolkit 44<br />
6.1 Gegenüberstellung der Anzahl manuell codierter LOC und gene-<br />
rierter LOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Listings<br />
5.1 Beispiel einer Workflowkonfiguration (Quelle: [EV06] Seite 5) . . . 45<br />
5.2 Implementierung der Metaklasse DataObject . . . . . . . . . . . . 49<br />
5.3 Zuordnung von Stereotypen zu Metaklassen via metamappings.xml 50<br />
5.4 Beispiel für ein Xpand Template . . . . . . . . . . . . . . . . . . . 52<br />
5.5 Beispiel für ein Xpand Template . . . . . . . . . . . . . . . . . . . 53<br />
5.6 Syntax des Xpand DEFINE-Blocks (Quelle [KE06]) . . . . . . . . 54<br />
5.7 Syntax des Xpand-FOREACH Blocks (Quelle [KE06]) . . . . . . . 56<br />
5.8 Syntax des Xpand IF-Blocks (Quelle [KE06]) . . . . . . . . . . . . 56<br />
5.9 Beispiel für Konstrukte der Subsprache Expressions Quelle [Eff06b] 57<br />
5.10 Beispiel für eine Extendbibliothek (Quelle: [Eff06c]) . . . . . . . . 58<br />
5.11 Syntax von Check-Regeln (Quelle: [Eff06a]) . . . . . . . . . . . . . 59<br />
5.12 Beispiel für eine Check-Regel . . . . . . . . . . . . . . . . . . . . . 59<br />
6.1 Propertiesfile zur Parametrisierung des Metamodellgenerators . . 83<br />
6.2 Die Methode Key() der Klasse EBADataClass . . . . . . . . . . . 87<br />
6.3 Die Methode isUserDefinedKey() der Klasse EBAEntityObject . . 88<br />
6.4 Die Methode UIAttribute() der Klasse EBAPresentation . . . . . 88<br />
6.5 Der Einstiegspunkt für Templates zur Codegenerierung . . . . . . 90<br />
6.6 Ausschnitt aus dem Template EJBRoot::Root . . . . . . . . . . . 91<br />
6.7 Beispiel für eine Protected Region . . . . . . . . . . . . . . . . . . 92<br />
6.8 Einbinden eines anderen Workflows . . . . . . . . . . . . . . . . . 93<br />
6.9 Aufruf einer WorkflowComponent . . . . . . . . . . . . . . . . . . 94<br />
6.10 Aufruf der Cartridge classicstart . . . . . . . . . . . . . . . . . . . 95<br />
119<br />
6.11 Aufruf der Generatorkomponente . . . . . . . . . . . . . . . . . . 96
Literaturverzeichnis<br />
[agi06] Manifesto for Agile Software Development.<br />
http://www.agilemanifesto.org/. Version: Juli 2006<br />
[ant05] Apache Ant. http://ant.apache.org/. Version: Oktober 2005<br />
[BA04] Bodoff, Stephanie ; Armstrong, Eric: The J2EE Tutorial.<br />
Second Edition. Addison Wesley Publishing Company, 2004<br />
[Bet06a] Bettin, Jorn: Best Practices for Component-Based Development<br />
and Model-Driven Architecture. http://www.softmetaware.com/<br />
publicwhitepapers/best-practices-for-cbd-and-mda.pdf.<br />
Version: März 2006<br />
[Bet06b] Bettin, Jorn: Model-Driven Architecture Implementation &<br />
Metrics. http://www.softmetaware.com/publicwhitepapers/<br />
mda-implementationandmetrics.pdf. Version: März 2006<br />
[Bet06c] Bettin, Jorn: Model-Driven Software Development Activities: The<br />
Process View of an MDSD Project.<br />
120<br />
http://www.softmetaware.com/mdsd-process.pdf. Version: März<br />
2006<br />
[Bet06d] Bettin, Jorn: Model-Driven Software Development: An emerging<br />
paradigm for Industrialized Software Asset Development. http://<br />
www.softmetaware.com/publicwhitepapers/mdsd-and-isad.pdf.<br />
Version: März 2006<br />
[cas06] Computer-Aided Software Engineering (CASE) Environments.<br />
http://www.sei.cmu.edu/legacy/case/case_whatis.html.<br />
Version: März 2006<br />
[CE00] Czarnecki, Krzyszstof ; Eisenecker, Ulrich W.: Generative<br />
Programming : Methods, Tools and Applications. First Edition.<br />
Addison Wesley Publishing Company, 2000
Literaturverzeichnis 121<br />
[CN04] Clements, Paul ; Northrop, Linda: Software Product Lines,<br />
Practices and Patterns. 2. Auflage. Addison Wesley Publishing<br />
Company, 2004<br />
[dat06] Core J2EE Patterns - Transfer Object. http://java.sun.com/<br />
blueprints/corej2eepatterns/Patterns/TransferObject.html.<br />
Version: Jänner 2006<br />
[ecl06] Eclipse.org home. http://www.eclipse.org. Version: April 2006<br />
[Eff06a] Efftinge, Sven: Check - Validation Language. http:<br />
//www.eclipse.org/gmt/oaw/doc/r30_checkReference.pdf.<br />
Version: Jänner 2006<br />
[Eff06b] Efftinge, Sven: Expressions Framework Reference. http://www.<br />
eclipse.org/gmt/oaw/doc/r10_expressionsReference.pdf.<br />
Version: Jänner 2006<br />
[Eff06c] Efftinge, Sven: Extend Language Reference. http:<br />
//www.eclipse.org/gmt/oaw/doc/r25_extendReference.pdf.<br />
Version: Jänner 2006<br />
[ejb06] Enterprise JavaBeans Specification 2.1.<br />
http://java.sun.com/products/ejb/docs.html. Version: April<br />
2006<br />
[EV06] Efftinge, Sven ; Voelter, Markus: Workflow Engine Reference.<br />
http:<br />
//www.eclipse.org/gmt/oaw/doc/r05_workflowReference.pdf.<br />
Version: Jänner 2006<br />
[Fow03] Fowler, Martin: Patterns of Enterprise Application Architecture.<br />
1. Auflage. Addison Wesley Publishing Company, 2003<br />
[Fra03] Frankel, David S.: Model Driven Architecture, Applying MDA to<br />
Enterprise Comptuing. Wiley Publishing, Inc., Indianaplois,<br />
Indiana, 2003<br />
[gmf06] Graphical Modeling Framework. http://www.eclipse.org/gmf/.<br />
Version: August 2006<br />
[HK99] Hitz, Martin ; Kappel, Gerti: UML@Work, Von der Analyse zur<br />
Realisierung. 1. Auflage, korrigierter Nachdruck. dpunkt.verlag,<br />
1999
Literaturverzeichnis 122<br />
[HKKR05] Hitz, Martin ; Kappel, Gerti ; Kapsammer, Elisabeth ;<br />
Retschitzegger, Werner: UML@Work, Objektorientierte<br />
Modellierung mit UML 2. 3. aktualisierte und überarbeitete<br />
Auflage. dpunkt.verlag, 2005<br />
[j2e05] Java Platform, Enterprise Edition (Java EE).<br />
http://java.sun.com/javaee/index.jsp. Version: Oktorber 2005<br />
[jbo05a] JBoss Application Server.<br />
http://www.jboss.com/products/jbossas. Version: November<br />
2005<br />
[JBo05b] JBoss, Inc. (Hrsg.): The JBoss 4 Application Server Guide. JBoss<br />
AS 4.0.3. JBoss, Inc., 2004,2005<br />
[Kad06a] Kadura, Clemens: oAW 4 Installation.<br />
http://www.eclipse.org/gmt/oaw/doc/10_installation.pdf.<br />
Version: April 2006<br />
[Kad06b] Kadura, Clemens: oaW 4 Migration. http://www.eclipse.org/<br />
gmt/oaw/doc/25_migrationAndOAWClassic.pdf. Version: Jänner<br />
2006<br />
[KCH + 90] Kang, K. ; Cohen, S. ; Hess, J. ; Novak, W. ; Peterson, A.:<br />
Feature-Oriented Domain Analysis (FODA) Feasibility Study /<br />
Software Engineering Institue, Carnegie Mellon University. 1990<br />
(CMU/SEI-90-TR-21). – Forschungsbericht<br />
[KE06] Kadura, Clemens ; Efftinge, Sven: Xpand Language Reference.<br />
http:<br />
//www.eclipse.org/gmt/oaw/doc/r20_xPandReference.pdf.<br />
Version: Jänner 2006<br />
[loc06] Lines of Code Counter.<br />
http://www.csc.calpoly.edu/~jdalbey/SWE/PSP/LOChelp.html.<br />
Version: Mai 2006<br />
[Mar03] Martin, Robert C.: Agile Software Development : Principles,<br />
Patterns and Practices. First Edition. Prentice Hall - Pearson<br />
Education, Inc, 2003<br />
[mda06a] MDA Guide Version 1.01.<br />
http://www.omg.org/docs/omg/03-06-01.pdf. Version: März<br />
2006
[mda06b] MDA Specifications, UML-Profiles.<br />
Literaturverzeichnis 123<br />
http://www.omg.org/mda/specs.htm#Profiles. Version: Juli 2006<br />
[MH04] Monson-Haefel, Richard: Enterprise JavaBeans. Fourth Edition.<br />
O’Reilly Media, Inc., 2004<br />
[.ne06] Microsoft .Net Homepage.<br />
http://www.microsoft.com/net/default.mspx. Version: April<br />
2006<br />
[Net06] Network, Code G.: Markus Voelter tells us about<br />
openArchitectureWare. http://www.codegeneration.net/<br />
tiki-read_article.php?articleId=80. Version: April 2006<br />
[oaw05] openArchitectureWare. http://www.openarchitectureware.org/.<br />
Version: Oktober 2005<br />
[oaw06a] Built-in Types Documentation.<br />
http://www.openarchitectureware.org/api/built-ins/.<br />
Version: Jänner 2006<br />
[oaw06b] openArchitectureWare. http://www.eclipse.org/gmt/oaw/.<br />
Version: April 2006<br />
[oaw06c] openArchitectureWare Classic Example.<br />
http://www.eclipse.org/downloads/download.php?file=<br />
/technology/gmt/oaw/40/oaw-sample-classic-4.0.0.zip.<br />
Version: April 2006<br />
[oaw06d] openArchitectureWare Documentation.<br />
http://www.eclipse.org/gmt/oaw/doc/. Version: April 2006<br />
[omg06] MOF 2.0/XMI Mapping Specification, v2.1.<br />
http://www.omg.org/docs/formal/05-09-01.pdf. Version: April<br />
2006<br />
[PBG04] Posch, Torsten ; Birken, Klaus ; Gerdom, Michael: Basiswissen<br />
Softwarearchitektur Verstehen, entwerfen, bewerten und<br />
dokumentieren. 1. Auflage. dpunkt.verlag, 2004<br />
[PBL05] Pohl, Klaus ; Böckle, Günter ; Linden, Frank van d.: Software<br />
Product Line Engineering, Foundations, Principles, and Techniques.<br />
Springer-Verlag Berlin Heidelberg, 2005
Literaturverzeichnis 124<br />
[pos05] Gentleware Poseidon for UML 3.2 Community Edition.<br />
http://www.gentleware.com/index.php?id=ce. Version: Oktober<br />
2005<br />
[ses06] Core J2EE Patterns - Session Facade. http://java.sun.com/<br />
blueprints/corej2eepatterns/Patterns/SessionFacade.html.<br />
Version: Jänner 2006<br />
[str05] Apache Struts Project. http://struts.apache.org/.<br />
Version: November 2005<br />
[SV05] Stahl, Thomas ; Völter, Markus: <strong>Modellgetriebene</strong><br />
<strong>Softwareentwicklung</strong>: Techniken, Engineering, Management. 1.<br />
Auflage. dpunkt.verlag, 2005<br />
[Tho06] Thomas, Karsten: oAW Classic UML Example. http:<br />
//www.eclipse.org/gmt/oaw/doc/55_umlClassicExample.pdf.<br />
Version: März 2006<br />
[tom05] Apache Tomcat. http://tomcat.apache.org/. Version: November<br />
2005<br />
[VB06] Völter, Markus ; Bettin, Jorn: Patterns for Model-Driven<br />
Software-Development.<br />
http://www.voelter.de/data/pub/MDDPatterns.pdf.<br />
Version: März 2006<br />
[Völ05a] Völter, Markus: Metamodellbasierte Codegenierierung in Java.<br />
http:<br />
//www.voelter.de/data/articles/MetaModelBasedCodeGen.pdf.<br />
Version: Semptember 2005<br />
[Völ05b] Völter, Markus: openArchitectureWare Metamodel Generator.<br />
http:<br />
//www.voelter.de/data/articles/MetaModelBasedCodeGen.pdf.<br />
Version: Oktober 2005<br />
[Völ05c] Völter, Markus: openArchitectureWare Tutorial.<br />
http://prdownloads.sourceforge.net/architecturware/<br />
exampleWorkspace-3.0-DocPack.zip?download. Version: Oktober<br />
2005
Literaturverzeichnis 125<br />
[Völ06a] Völter, Markus: oAW 4 Introduction and Overview. http://www.<br />
eclipse.org/gmt/oaw/doc/05_IntroductionAndOverview.pdf.<br />
Version: April 2006<br />
[Völ06b] Völter, Markus: Recipe Framework Reference. http:<br />
//www.eclipse.org/gmt/oaw/doc/r40_recipeReference.pdf.<br />
Version: Mai 2006<br />
[Weß05] Weßendorf, Matthias: Struts : Websites effizient entwickeln.<br />
W3L Verlag Herdecke,Bochum, 2005