16.12.2012 Aufrufe

Architekturzentrierte Modellgetriebene Softwareentwicklung

Architekturzentrierte Modellgetriebene Softwareentwicklung

Architekturzentrierte Modellgetriebene Softwareentwicklung

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!