Graphbasiertes Reengineering Seminar Model-Driven Software Development (MDSD) Stefan Sosnicki Inhaltsverzeichnis: 1. Einleitung 2. Graphbasiertes Reengineering 3. Vorstellung der Werkzeuge 3.1 Fujaba 3.1.1 Installation 3.1.2 Reverse Engineering 3.1.3 Restrukturierung und Forward Engineering 3.2 Jumli 3.3 Umodel 4. Vergleich der Werkzeuge 5. Reengineeren einer Java-Anwendung 6. Fazit 2 1. Einleitung In der heutigen Softwaretechnik gewinnt die Verbesserung und Aufbereitung von Software, neben der Neuentwicklung, eine immer größere Bedeutung (vgl. dazu [2]). Es gibt einen großen Bestand an Software, die bereits seit vielen Jahren eingesetzt wird und auch weiterhin intensive Wartung und Pflege erfordert. Softwaresysteme sind aber mit der Zeit vielen verschiedenen Entwicklungen unterworfen, so kann sich die zugrundeliegende Architektur verändern, neue Technologien werden entwickelt, die ebenfalls integriert werden müssen, oder äußere Einflüsse erfordern eine Umstellung der Programme, um beispielsweise neue Gesetzte zu beachten. Viele dieser Altsoftware (engl. legacy systems) genannten Programme sind in alten Programmiersprachen geschrieben oder auf veraltete Systemarchitekturen zugeschnitten. Solche Altsoftware erschwert die Wartung in vielerlei Hinsicht. So führen der unterschiedliche Programmierstil, mangelnde Dokumentation und Kommentierung, und die Verwendung undurchsichtiger Optimierungen dazu, dass das Programm kaum mehr zu verstehen und daher schwer zu warten ist. Außerdem kann durch jahrelange Wartung die Übersichtlichkeit noch weiter verloren gehen. Allerdings kann man diese Programme nicht immer einfach durch neue ersetzen, da sie oftmals eng mit den Geschäftsprozessen verknüpft sind und viel unternehmensinternes Wissen enthalten. Dies, und die oben beschriebenen Probleme führten zur Entwicklung des Reengineering. In dieser Arbeit wird der Begriff des Graphbasierten Reengineerings im Rahmen des Model-Driven Software Development betrachtet und anhand dreier ausgewählter Tools verdeutlicht. 3 2. Graphbasiertes Reengineering The Program Transformation Wiki [1] definiert Reengineering als: „the examination and alteration of a subject system to reconstitute it in a new form and the subsequent implementation of the new form“ Reengineering wird auch als Redevelopment oder Roundtrip-Engineering bezeichnet. Beim Graphbasierten Reengineering handelt es sich um eine Form, bei der graphbasierte Techniken in einem oder mehreren Schritten des Reengineeringprozesses zum Einsatz kommen. Der Prozess des Reengineerings wird im Allgemeinen in 3 Phasen unterteilt: - das Reverse Engineering - die Restrukturierung des Modells und - das Forward Engineering. Im Sinne des Model-Driven Software Development handelt es sich beim Reverse Engineering um eine vertikale Modelltransformation von einer niedrigeren in eine höhere Sprachebene. Bei der Restrukturierung des Modells kann eine horizontale Transformation vorgenommen werden. Und beim Forward Engineering handelt es sich wieder um eine vertikale Transformation von der höheren in eine niedrigere Ebene, wobei dies nicht die gleich Sprache wie vor dem Reverse Engineerung sein muss. Beim Software-Reengineering wird diese Phase oft auch als Code Generierung bezeichnet. Beim Graphbasierten Reengineering erfolgt die Transformation in bzw. aus einer graphbasierten Sprache. Abbildung 1 stellt dies noch einmal schematisch dar. Abbildung 1: Drei Phasen des Reengineering 4 Das Reverse Engineering dient dazu, das zu wartende Programm in eine abstraktere Form zu bringen, um es besser verstehen und analysieren zu können. Beim Graphbasierten Reengineering handelt es sich bei der abstrakteren Form um eine graphische Sprache, beispielsweise UML. Auf dieser Ebene wird das Programm umstrukturiert bzw. erweitert. Hierbei kann es in andere Modelle dieser Ebene transformiert werden, beispielsweise die Umwandlung einer Darstellung prozeduraler Programmsegmente in ein objektorientiertes Modell. Bei der Restrukturierung werden meist gängige Softwaremodellierungstechniken verwendet. In diese Phase des Reengineeringprozesses fallen auch andere Aufgaben, wie die Analyse und Problemerkennung. Aus dem dabei entstandenen Modell wird mittels Forward Engineering wiederum ein Modell in der niedrigeren Spracheebene generiert. Damit ist der Reengineering Prozess abgeschlossen. All diese Teilschritte können mit Hilfe jeweils einzelner Tools oder mit einem einzigen, das diese Funktionen unterstützt, durchgeführt werden. Ein solches Tool zum Graphbasierten Reengineering von Software unterstützt mindestens eine Sprache für den Prozess des Reverse Engineerings und erlaubt die Codegenerierung für ebenfalls mindestens eine Sprache. Dies kann die selbe sein wie beim Reverse Engineering oder aber eine andere, je nach Einsatzgebiet des Tools. So gibt es beispielsweise Tools, die dazu dienen Programme, welche in veralteten Sprachen wie Cobol oder Fortran geschrieben sind, in moderne Sprachen zu portieren. Für die Unterstützung der Restrukturierungsphase werden meist vielfältige graphische Darstellungsformen und Designhilfen zur Verfügung gestellt. Viele dieser Tools wurden dafür konzipiert, den Softwareentwicklungsprozess zu unterstützen. So steht bei ihnen das Reengineering nicht im Vordergrund, sondern das Design und der Entwurf von Applikationen. Das Reverse Engineering stellt eine Zusatzfunktion dar, mit deren Hilfe alte Programme neu designt werden können, oder das Designmodell von, sich in der Entwicklung befindlichen, Programmen aktualisiert werden kann. Es gibt aber auch spezialisierte Werkzeuge, deren einzige Aufgabe das Reengineering von bestimmten Programmen ist. Deren Aufgaben betreffen beispielsweise das Portieren von einer Sprache in eine andere, oder die Kapselung prozeduralen Codes in Objekte1. 1 Die Umwandlung prozeduralen Codes in objektorientierten geht meist auch mit der Portierung in eine andere Sprache einher. 5 Es gibt auch Reengineering-Werkzeuge, die nicht mit graphischen Modellen arbeiten. Diese sind meist in einer noch niedrigeren Sprachebene angesiedelt, beispielsweise Decompiler, oder es bietet sich für ihre spezielle Aufgabe keine graphische Darstellungsform an. 6 3. Vorstellung der Werkzeuge Es gibt ein Vielzahl an Software, die Graphbasiertes Reengineering unterstützt. Hier sollen 3 solche Programme untersucht und mit einander verglichen werden. Alle 3 ähneln sich von der Art und Zielstellung her. Sie vertreten die geläufigste Klasse von Reengineering-Tools. Diese 3 sind: - Fujaba, - Jumli und - Altova UModel. Fujaba ist ein Open-Source-Programm. Sein Name steht für „From UML to Java and back again“. Es ist ein Softwareentwicklungstool für Java und ermöglicht es dem Nutzer mit Hilfe von UML Diagrammen Programme zu modellieren und daraus Java-Klassen zu generieren. Außerdem bietet es die Möglichkeit einzelne Javadateien oder ganze Verzeichnisse zu importieren und aus ihnen Klassendiagramme zu erzeugen. Jumli ist ein Freeware-Programm, das primär zu Schulungszwecken entwickelt wurde. Es ist eine Entwicklungsumgebung mit UML-Editor und unterstützt die Sprachen C++, C# und Java und kann aus den UML-Diagrammen Code generieren und aus Quelldateien auch wieder UML-Diagramme erstellen. Mit dem UML-Editor kann eine Vielzahl an verschiedenen Diagrammen erstellt werden. Altova Umodel ist ein kommerzielles Produkt für die Modellierung und Entwicklung von Applikationen in Java mit UML-Editor und umfangreichen Funktionen der Codegenerierung und des Reverse Engineerings. Es verbindet das Designmodell dauerhaft mit dem Code und ermöglicht es Änderungen auf der einen Seite automatisch in die andere einfließen zu lassen. 3.1 Fujaba Die Fujaba Tool Suite wird an der Universität Paderborn entwickelt. Es ist eine durch Plugins erweiterbare Entwicklungsumgebung für UML und Java. Es ermöglicht einem, aus dem mit UML erstellten Design, eine komplett lauffähige Java-Anwendung zu generieren. Außerdem ermöglicht es auch die Umkehrrichtung, so dass Java-Code geparst und in UML abgebildet werden kann. 7 3.1.1 Installation Es gibt auch eine Variante des Programms speziell für Reengineeringzwecke, die Fujaba Tool Suite RE Edition, welche bereits mit Plugins für das Reengineeren und die Design-Pattern-Erkennung konfiguriert ist. Jedoch laufen manche der benötigten Plugins nicht mit der Version Fujaba Tool Suite RE 4.2.0. Daher empfiehlt es sich Fujaba Tool Suite Standard 4.3.1 zu verwenden und die benötigten Plugins manuell zu installieren. Zu den benötigten Plugins gehören: - JavaAST 1.1, enthält einen abstrakten Syntaxbaum für Java-Dateien; - JavaParser 3.1, Parser für Java-Quellcode; - Inference Engine 2.1 zur Erkennung von Design Pattern; - Pattern Specification 2.1, ermöglicht die Erstellung von Diagrammen für die Spezifikation von Design Pattern; - Pattern Recognition Engines Generator 1.1, kompiliert Design Pattern Spezifikationen, damit sie von der Inference Engine verwendet werden können und - Association Detection 1.0 für die Erkennung von Assoziationen. In der Version Fujaba Tool Suite RE 4.2.0 laufen das Plugin für die Assoziationserkennung und die Erzeugung der Inference Engines nicht, da sie wegen Abhängigkeiten zu anderen Komponenten, welche für Version 4.3.1 entworfen wurden, nicht installierbar sind. Außerdem wird noch ein Java SDK ab Version 1.4 benötigt. 3.1.2 Reverse Engineering Fujaba ermöglicht nicht nur die Generierung von UML-Klassendiagrammen aus Java-Quellcode, sondern bietet auch eine Möglichkeit im Code verwendete Design Pattern (Entwurfsmuster) zu erkennen. Design Pattern werden oftmals beim Erstellen von Programmen verwendet und sind den meisten Entwicklern geläufig. Daher hilft es dem Reengineerer ein Programm zu verstehen, wenn solche Muster erkannt werden. Design Pattern werden gewöhnlich informal beschrieben. Für eine computergestützte Erkennung solcher Entwurfsmuster müssen diese aber formal beschrieben werden. Hierfür verwendet Fujaba eine Patternspezifikationssprache basierend auf Graphgrammatiken und einen iterativen und skalierbaren Ableitungsalgorithmus. Das Pattern Specification Plugin bietet einen graphischen Editor für die Spezifikation von Design Pattern. Die Pattern werden in Form von Graphtransformationsregeln beschrieben, die den Abstract Syntax Graph (ASG) des Quellcodes verwenden. Das Anwenden der Regeln resultiert in einer Erweiterung des ASG um Annotationselemente, die mit einer beliebigen Anzahl von ASG Elementen verknüpft werden können. 8 Eine Regel ist durch eine linke und eine rechte Seite definiert. Die linke Seite der Regel beschreibt die Struktur, die im ASG gefunden werden muss, wenn eine Instanz dieser Regel existiert. Es können auch von anderen Regeln erzeugte Annotationen enthalten sein, wodurch Kompositionen von Regeln möglich werden. Außerdem werden Trigger für die Ausführung der Regel festgelegt. Abbildung 2: zusammengesetzte Patternregel Trigger und die Abhängigkeiten der Regeln untereinander bestimmen die Ausführreihenfolge der Regeln. Die Abhängigkeiten innerhalb des gesamten Kataloges werden in einem gesonderten Graphen dargestellt (siehe Abbildung 3). Abbildung 3: Abhängigkeitsgraph Die rechte Seite der Regel definiert das Annotationselement und Verbindungen zu einzelnen ASG Elementen, die erzeugt werden, wenn die linke Seite erfüllt ist. Ein solcher Katalog von Regeln wird in eine Pattern-Erkennungs-Maschine übersetzt und kann dann bei der Patternableitung verwendet werden. Nachdem der Quellcode geparst wurde kann die Patternerkennung gestartet werden, indem ein Katalog von Regeln geladen wird. Der Ableitungsalgorithmus verwendet ein Netz, in welchem die Regeln in Ebenen organisiert werden, entsprechend ihrer Abhängigkeiten untereinander und der 9 Trigger. Basierend auf diesem Netz wendet der Algorithmus die Regeln nach Prioritäten an, beginnend mit den unabhängigen. Erfolgreich angewandte Regeln erzeugen Annotationen, welche wiederum Regeln auf höheren Ebenen auslösen. Dies ist die Bottom-Up Methode der Ableitungsmaschine. Regeln auf höheren Ebenen erhalten eine entsprechend höhere Ausführungspriorität, um schnell gute Resultate zu erzielen. Höhere Regeln, die ausgeführt werden sollen, können aber auch noch von Regeln abhängen die noch nicht überprüft wurden. In diesem Fall wechselt die Ableitungsmaschine zum Top-Down Modus und versucht rekursiv alle benötigten Regeln anzuwenden. Die Ableitungsmaschine arbeitet semiautomatisch, da sie den Anwender mit einbezieht. Dieser kann den Analysevorgang jederzeit pausieren und die bereits erzielten Ergebnisse betrachten und gegebenenfalls die ermittelten Wahrscheinlichkeiten ändern und die Analyse fortsetzen. Die gemachten Änderungen werden dann bei der Bewertung berücksichtigt. Die Resultate der Analyse, also die erstellten Annotationen, werden direkt im Klassendiagramm angezeigt (siehe Abbildung 4). Abbildung 4: Klassendiagramm mit erkannten Design Pattern 3.1.2 Restrukturierung und Forward Engineering Fujaba bietet neben den gewohnten UML-Diagrammen auch ein erweitertes Aktivitätendiagramm an. Darin lassen sich sogenannte Story Pattern 10 spezifizieren. In diesen wiederum können Objekte von, im Klassendiagramm definierten, Klassen und Interaktionen zwischen diesen erstellt werden. Dies ermöglicht es Funktionen der Klassen vollständig zu definieren, so dass bei der Codegenerierung bereits lauffähige Programme entstehen. Objekte können erzeugt und zerstört werden, ebenso wie Referenzen auf andere Objekte. Außerdem können Constraints für die Ausführung der einzelnen Story Pattern angegeben werden. Es kann auch direkt Javacode verwendet werden für bestimmte Bereiche, beispielsweise um Story Pattern in eine Try-CatchAnweisung zu kapseln. Abbildung 5: erweitertes Aktivitätsdiagramm Der resultierende Quellcode kann jederzeit im Editor eingesehen werden. Er ist teilweise mit speziellen Kommentaren versehen um Assoziationen kenntlich zu machen. Für die Verwendung des Programms muss noch die RuntimeTools.jar eingebunden werden. 11 3.2 Jumli Jumli ist eine für Schulungszwecke entwickelte Entwicklungsumgebung mit UML. Ursprünglich wurde nur Java als Zielsprache unterstützt, daher auch der Name Java-UML-IDE. Doch mittlerweile können damit auch C++ und C# Programmen entwickelt werden. Außerdem können auch wxWidgets-Projekte erstellt werden. Dies ist eine freie und systemunabhängige Oberflächenbibliothek. Die neueste Version von Jumli selbst wurde damit erstellt. Die Unterstützung dieser drei Sprachen ist der große Vorteil von Jumli. Allerdings müssen für die Einbindung von C++ neben einem Compiler auch noch MSYS, eine GNU Toolsammlung, und tmake, zur Erzeugung von Makefiles, installiert werden. Für die Verwendung von C# muss ebenso wie für Java lediglich das SDK installiert werden. Neben dem Entwurf von UML-Diagrammen und der Code-Generierung aus diesen, bietet Jumli auch die Möglichkeit Quellcode-Dateien zu parsen und zu analysieren, wodurch die entsprechenden Klassen erzeugt bzw. abgeändert werden. Dies ermöglicht es dem Anwender auch, im Quellcode vorgenommene Änderungen jederzeit mit den UML-Klassen zu synchronisieren. Die QuellcodeDateien müssen in der gleichen Sprache sein wie das Projekt. Jedoch ist es über Umwege auch möglich beispielsweise C++-Dateien in ein Java-Projekt zu laden und ihre Klassen ins UML-Diagramm einzufügen. Beim Analysieren von C++Dateien ist noch zu beachten, dass nur Klassen analysiert werden können, also keine reinen C-Dateien. Abbildung 6 zeigt ein analysiertes C++-Projekt (in Teilen). Jumli kann auch Assoziationen zwischen Klassen erkennen, jedoch wird nicht jede richtig erkannt. Abbildung 6: Reverse Engineering eines C++-Projektes 12 Bei der Code-Generierung werden nur Prototypen der Klassen erzeugt. Die Methoden müssen noch von Hand programmiert werden. Hierfür bietet Jumli einen eigenen Editor an. Wie bereits erwähnt können Quellcode und Modell jederzeit miteinander abgeglichen werden, dabei wird stets nachgefragt welche Änderungen am Modell vorgenommen werden sollen. Ist der Quellcode fertiggestellt, so kann das Programm kompiliert und ausgeführt werden. Debugging ist ebenfalls möglich. Standardklassen können aus dem jeweiligen Development Kit in ein Diagramm importiert werden. Diese sind dann als externe Klassen im Projekt verfügbar (siehe Abbildung 7), können jedoch nicht verändert werden. Per Drag and Drop können Attribute oder Methoden auch anderen Klassen zugewiesen werden. Abbildung 7: Jumli-Projekt mit externen Klassen Da Jumli zu Schulungszwecken entwickelt wurde gibt es eine umfangreiche Tutorialsammlung, welche noch weiter ausgebaut werden soll. 3.3 Altova UModel Altova UModel stellt ein ausgereiftes, kommerzielles Produkt für die Modellierung von Java-Programmen mittels UML dar. Es bietet dem Nutzer zahlreiche Komfortfunktionen, wie z.B. die Suche nach bestimmten Klassen oder Diagrammen im Projekt, oder grafisches Hilfsfunktionen. Zudem bietet es auch über große Projekte eine gute Übersicht, da es neben einem Überblickfenster für das aktuelle Diagramm auch 3 verschiedene Navigationssichten auf das Projekt bietet: - Die Model Tree Sicht stellt das Projekt als Baum dar, entsprechend seiner Packages. 13 - Die Diagram Tree Sicht stellt sämtliche Diagramme des Projektes nach Diagrammart geordnet dar, oder alle in alphabetischer Reihenfolge. - Die Favorites Sicht erlaubt es durch ausgewählte UML Elemente zu navigieren. Abbildungs 8 zeigt die Oberfläche von UModel. Abbildung 8: UModel Oberfläche Neben der Verwendung von Standard UML Diagrammen bietet UModel auch die Möglichkeit sogenannte Deployment- und Komponentendiagrammen zu erstellen. Komponentendiagramme dienen dazu einzelne Klassen des Projekts zu logischen Einheiten zusammenzufassen und die Realisierungsabhängigkeiten zwischen den einzelnen Teilen, aber auch zwischen den Komponenten selbst, darzustellen (siehe Abbildung 9). Abbildung 9: Komponentendiagramm 14 Das Deploymentdiagramm wiederum zeigt, wie sich diese Komponenten in Artefakten (z.B. jar-Archive) wiederspiegeln und wo sie zum Einsatz kommen (Abbildung 10). Diese beiden Diagrammarten haben jedoch nur einen rein dokumentierenden Charakter. Auf das zugrunde liegende Modell haben sie keinen Einfluss. Abbildung 10: Deploymentdiagramm Im Projekt erstellte Packages können auch von anderen Projekten verwendet werden, und sogar ganze Projekte können als Teilprojekte eingebunden werden. Die Reverse Engineering Fähigkeiten von UModel beschränken sich auf das Erzeugen von UML Klassen aus dem Quellcode und UML Dokumentation aus den javadocs. Eine Assoziationserkennung gibt es nicht. Jedoch können einfache Assoziationen mit zwei Mausklicks hinzugefügt werden. Es ist nicht nur der Import von einzelnen Java-Dateien möglich, sondern auch der Import eines ganzen Eclipse oder JBuilder Projektes. Außerdem steht ein Kommandozeilentool zur Verfügung, mit dem sich bestimmte Vorgänge automatisieren lassen. So kann beispielsweise eine neu erstellte Quellcode-Datei automatisch ins Modell importiert werden. Für die Code-Generierung verwendet UModel SPL Templates, welche man auch selber anpassen kann. Somit lassen sich für bestimmte Anwendungsfälle mittels entsprechender Templates mehr als nur reine Rümpfe von Klassen erstellen. Zudem bietet UModel Unterstützung für UML Templates und ihre Anbindung an Java 5.0 Generics. Ein Editor für die Bearbeitung des erzeugten Quellcodes steht nicht zur Verfügung. 15 Eine stärke von UModel ist die Möglichkeit Model und Code bzw Code und Model zu synchronisieren. Hierbei wird bei jeder vorzunehmenden Änderung explizit nachgefragt. Nicht mehr benötigter Quellcode wird wahlweise auskommentiert oder gelöscht. Die Synchronisation kann auf unterschiedlichen Ebenen erfolgen, auf projekt-, Package- oder Klassenebene. Ein Tutorial und eine umfangreiche Hilfe zu UModel sind im Programm integriert, so dass die Bedienung recht einfach zu erlernen ist. 16 4. Vergleich der Werkzeuge Als Kriterien für den Vergleich der drei Werkzeuge dienen die Plattformen, auf denen die Programme lauffähig sind, Bewertung von Schwierigkeiten bei der Installation, der Umfang der Dokumentation, die Stabilität des Programms im Betrieb, da hierbei Probleme aufgetreten sind, welche Sprachen die einzelnen Programme unterstützen und eine Bewertung der Fähigkeiten für die drei Phasen des Reengineeringprozesses. Kriterium Jumli UModel Fujaba Plattform Windows, Linux Windows Windows, Mac, alle weiteren mit Java Unterstützung Installation Einfache Einfache Fujaba Tool Suite Installation, für Installation RE 4.2.0 nicht voll C++ weitere (einmonatige lauffähig, Komponenten Trialversion) Installation der erforderlich benötigten Plugins mühsam Dokumentation Umfangreiche Hilfe Umfangreiche Hilfe Manche Funktionen und Tutorials mit Tutorial nicht dokumentiert (Pattern Spezifikation), nur Tutorials von Dritten Stabilität Kleinere Probleme Keine Fehler Oftmals Neustart mit externen aufgetreten des Programms Klassen (Interfaces erforderlich, Pluginwerden z.T. nicht Inkompatibilitäten als solche erkannt) Sprachunterstützung Java, C++, C# Java Java Reverse Klassengenerierung, Klassengenerierung, Klassengenerierung, Engineering AssoziationsSynchronisation Assoziationserkennung, erkennung, Synchronisation Patternerkennung Restrukturierung/ Standard UML Standard UML mit Standard UML und Modellierung vielen Story Pattern für Komfortfunktionen Funktionssund weiteren pezifikation Diagrammarten Forward Einfache CodeEinfache CodeBeinahe Engineering/ Code- Generierung, Generierung, vollständige CodeGenerierung Synchronisation Synchronisation, Generierung, keine Templates Synchronisation 17 5. Fazit Der große Vorteil von Jumli ist die Unterstützung gleich dreier Sprachen. Zudem stellt es eine komplette Entwicklungsumgebung dar und ermöglicht dank der Synchronisation ein komplettes Roundtrip-Engineering mit nur einem Programm. UModel ist als kommerzielles Produkt und nur für Windows nicht für jeden einsetzbar. Es stellt jedoch eine sehr gute Modellierungsumgebung für JavaProgramme dar und die zahlreichen Zusatzfunktionen und Synchronisationsmöglichkeiten erleichtern die Entwicklung großer Projekte. Aufgrund seiner schwachen Reverse Engineering Fähigkeiten und dem Schwerpunkt auf der Modellierungsphase ist es eher für die Gesamtentwicklung eines Projekts und der automatischen Wartung des Modells geeignet. Fujaba bietet mit dem Entwurf von Story Pattern und der Pattern Erkennung innovative Funktionen. Die Pattern Erkennung macht es zu einem leistungsstarken Reverse Engineering Tool und die Spezifikation von Story Pattern ermöglicht die Generierung beinahe vollständiger Klassen aus dem Modell. Jedoch eignet es sich wegen der mangelnden Stabilität und einer fehlenden Synchronisationsmöglichkeit nicht so sehr für größere Projekte. Je nach eigener Aufgabenstellung und Präferenzen eignet sich somit ein anderes Tool zum Graphbasierten Reengineering. 18 Literatur: [1] The Program Transformation Wiki, 31.01.2006, http://www.program-transformation.org [2] Jürgen Ebert, Konradin-Verlag, Grasbrunn, Informatiktage 2003, Software-Reengineering - Umgang mit Software-Altlasten, Seiten 224-31 [3] Workshop Software Reengeneering, 31.01.2006, http://www.uni-koblenz.de/~ist/wsr2004/ [4] Udo Gleich, Thomas Kohler, Juli 1997, Tool-support for Reengeneering of object-oriented systems http://www.iam.unibe.ch/~famoos/ESEC97/submissions/gleich.pdf [5] Fujaba Homepage, 31.01.2006, http://www.fujaba.de [6] Jumli Hompage, 31.01.2006, http://www.jumli.de [7] Altova Umodel Homepage, 31.01.2006, http://www.Altova.com/UModel 19