Studienarbeit Umwandlung von XMI in GXL und von GXL in XMI
Transcription
Studienarbeit Umwandlung von XMI in GXL und von GXL in XMI
19.06.2005 Universität Koblenz-Landau Fachbereich Informatik Institut für Softwaretechnik Studienarbeit Umwandlung von XMI in GXL und von GXL in XMI von Thomas Hebel Betreuer: Prof. Dr. Jürgen Ebert/Dr. Andreas Winter Version 1.0 ABSTRACT ......................................................................................................... 6 I. STUDIENARBEIT „UMWANDLUNG VON XMI IN GXL UND VON GXL IN XMI“...................................................................................................... 7 1. EINLEITUNG ......................................................................................................................... 7 2. GXL.................................................................................................................................... 7 3. XMI .................................................................................................................................... 8 4. ZIEL DER STUDIENARBEIT ................................................................................................... 8 5. ÜBERBLICK ÜBER DIE STUDIENARBEIT ................................................................................ 9 II. GXL – GRAPH EXCHANGE LANGUAGE ............................................ 10 1. EINLEITUNG ....................................................................................................................... 10 2. BEISPIELE .......................................................................................................................... 10 3. GXL DTD......................................................................................................................... 12 3.1 Extensions................................................................................................................... 12 3.2 Attribut-Typen ............................................................................................................ 12 3.3 GXL-Element .............................................................................................................. 13 3.4 Type-Element.............................................................................................................. 13 3.5 Graph-Element ........................................................................................................... 13 3.6 Node-Element ............................................................................................................. 14 3.7 Edge-Element ............................................................................................................. 14 3.8 Rel-Element ................................................................................................................ 15 3.9 Relend-Element .......................................................................................................... 15 3.10 Attr-Element ............................................................................................................. 15 3.11 Locator-Element....................................................................................................... 16 3.12 Datentypen ............................................................................................................... 16 4. GRAPH-SCHEMATA............................................................................................................ 16 III. XMI – XML METADATA INTERCHANGE......................................... 18 1. EINLEITUNG ....................................................................................................................... 18 2. MOF – META OBJECTS FACILITY ...................................................................................... 18 3. XMI-DTD......................................................................................................................... 18 3.1 Notwendige XMI-DTD-Deklarationen ....................................................................... 19 3.1.1 Attribute zur Identifikation.................................................................................. 19 3.1.2 Verweise auf Attribute ........................................................................................ 19 3.2 Übersicht der Elemente einer XMI-DTD ................................................................... 20 3.2.1 XMI ..................................................................................................................... 20 3.2.2 XMI.header ......................................................................................................... 21 3.2.3 XMI.content ........................................................................................................ 21 3.2.4 XMI.difference .................................................................................................... 21 3.2.5 XMI.extensions ................................................................................................... 22 3.2.6 XMI.documentation ............................................................................................ 22 3.2.7 XMI.model .......................................................................................................... 22 3.2.8 XMI.metamodel, XMI.metametamodel .............................................................. 23 3.2.9 XMI.import ......................................................................................................... 23 3.2.10 XMI.extension................................................................................................... 23 3.2.11 XMI.reference ................................................................................................... 24 3.3 Repräsentation von Metamodell-Klassen in der DTD ............................................... 24 2 3.3.1 Namensbereiche .................................................................................................. 24 3.3.2 Deklaration einer Metamodell-Klasse................................................................. 24 3.3.3 Vererbung............................................................................................................ 25 3.3.4 Multiplizitäten ..................................................................................................... 25 3.3.5 Attribut-Spezifikation.......................................................................................... 25 3.3.6 DTD-Darstellung einer einfachen Klasse ........................................................... 26 3.3.7 Assoziationen ...................................................................................................... 26 3.3.8 Beispiel einer DTD-Deklaration einer Assoziation ............................................ 26 4. UML-DTD........................................................................................................................ 26 4.1 Einfaches Beispiel ( XMI-Dokument mit einer Klasse mit Attribut) .................... 27 4.2 Deklaration der verwendeten Elemente ..................................................................... 27 4.2.1 Klasse .................................................................................................................. 27 4.2.2 Assoziation .......................................................................................................... 30 5. BEISPIELDIAGRAMM .......................................................................................................... 33 IV. UML-KONZEPTE FÜR KLASSENDIAGRAMME IN XMI UND GXL ............................................................................................................................. 34 1. EINLEITUNG ....................................................................................................................... 34 2. UML-KONZEPTE ............................................................................................................... 34 2.1 Klasse ......................................................................................................................... 34 2.1.1 Klasse: XMI-Darstellung .................................................................................... 34 2.1.1.1 Ameos........................................................................................................... 35 2.1.1.2 Rational Rose ............................................................................................... 36 2.1.2 Klasse: GXL-Darstellung ........................................................................................ 37 2.2 Klasse mit Attribut...................................................................................................... 38 2.2.1 Klasse mit Attribut: XMI-Darstellung ................................................................ 38 2.2.1.1 Ameos........................................................................................................... 39 2.2.1.2 Rational Rose ............................................................................................... 40 2.2.2 Klasse mit Attribut: GXL-Darstellung ................................................................ 41 2.3 Assoziation ................................................................................................................. 42 2.3.1 Assoziation: XMI-Darstellung ............................................................................ 42 2.3.1.1 Ameos........................................................................................................... 42 2.3.1.2 Rational Rose ............................................................................................... 44 2.3.2 Assoziation: GXL-Darstellung............................................................................ 46 2.4 Aggregation ................................................................................................................ 48 2.4.1 Aggregation: XMI-Darstellung ........................................................................... 48 2.4.1.1 Ameos........................................................................................................... 49 2.4.1.2 Rational Rose ............................................................................................... 51 2.4.2 Aggregation: GXL-Darstellung........................................................................... 53 2.5 Komposition ............................................................................................................... 55 2.5.1 Komposition: XMI-Darstellung .......................................................................... 55 2.5.1.1 Ameos........................................................................................................... 56 2.5.1.2 Rational Rose ............................................................................................... 58 2.5.2 Komposition: GXL-Darstellung.......................................................................... 60 2.6 Generalisierung.......................................................................................................... 62 2.6.1 Generalisierung: XMI-Darstellung ..................................................................... 62 2.6.1.1 Ameos........................................................................................................... 62 2.6.1.2 Rational Rose ............................................................................................... 63 2.6.2 Generalisierung: GXL-Darstellung ..................................................................... 64 2.7 Package ...................................................................................................................... 65 2.7.1 Package: XMI-Darstellung.................................................................................. 65 3 2.7.1.1 Ameos........................................................................................................... 65 2.7.1.2 Rational Rose ............................................................................................... 66 2.7.2 Package: GXL-Darstellung ................................................................................. 67 2.8 Assoziations-Klasse.................................................................................................... 69 2.8.1 Assoziations-Klasse: XMI-Darstellung............................................................... 69 2.8.1.2 Ameos........................................................................................................... 69 2.8.1.2 Rational Rose ............................................................................................... 69 2.8.2 Assoziations-Klasse: GXL-Darstellung .............................................................. 71 V. JAXP/XSLT .................................................................................................. 73 1. EINLEITUNG ....................................................................................................................... 73 2. JAXP................................................................................................................................. 73 2.1 Benötigte Klassen ....................................................................................................... 73 2.2 Einlesen der Daten in ein DOM-Objekt ..................................................................... 74 2.3 Zugriff auf Elemente................................................................................................... 75 2.4 Erzeugen neuer Elemente........................................................................................... 75 2.5 Speichern eines DOM als XML-Datei........................................................................ 76 3. XSLT ................................................................................................................................ 77 3.1 Einfaches Beispiel ...................................................................................................... 78 3.2 Pfadangaben............................................................................................................... 79 3.3 Attribute...................................................................................................................... 79 3.4 Einfaches Beispiel zur Umwandlung.......................................................................... 79 3.5 Zusätzliche Anmerkungen .......................................................................................... 80 4. FAZIT ................................................................................................................................. 80 VI. TESTSTRATEGIE XMI2GXL UND GXL2XMI ................................... 81 1. EINLEITUNG ....................................................................................................................... 81 2. TEST XMI2GXL ............................................................................................................... 81 2.1 Ameos ......................................................................................................................... 81 2.2 Rational Rose ............................................................................................................. 81 2.3 Testdokument.............................................................................................................. 82 3. TEST GXL2XMI ............................................................................................................... 84 3.1 Ameos ......................................................................................................................... 84 3.2 Rational Rose ............................................................................................................. 84 3.3 Testdokument.............................................................................................................. 84 VII. ANWENDUNG DER ERSTELLTEN PROGRAMME........................ 85 1. XMI-EXPORT .................................................................................................................... 85 1.1 Ameos ......................................................................................................................... 85 1.2 Rational Rose ............................................................................................................. 86 2. UMWANDLUNG MIT XMI2GXL UND GXL2XMI .............................................................. 87 3. IMPORT VON XMI-DOKUMENTEN ..................................................................................... 88 3.1 Ameos ......................................................................................................................... 88 3.2 Rational Rose ............................................................................................................. 88 VIII. ZUSAMMENFASSUNG......................................................................... 89 IX. LITERATURVERZEICHNIS................................................................... 90 4 ANHANG A: GRAPHSCHEMA.XMI............................................................ 91 ANHANG B: UMWANDLUNG UML-KLASSEN IN GXL-NODES ......... 99 ANHANG C: XMI-DOKUMENT IN GXL TRANSFERIERT.................. 101 ANHANG D: ANMERKUNGEN/ BESONDERHEITEN DER VERWENDETEN WERKZEUGE ............................................................... 102 1. Ameos ......................................................................................................................... 102 2. Rational Rose ............................................................................................................. 102 3. Sonstiges..................................................................................................................... 102 5 Abstract GXL (Graph Exchange Language) wurde als ein Austauschformat für graph-basierte Werkzeuge entwickelt. Das XMI (XML Metadata Interchange)-Format wurde zur textuellen Darstellung von auf dem MOF (Meta Object Facility)-Metamodell basierenden Modellen entwickelt; hierunter fallen auch UML (Unified Modelling Language)-Modelle. In dieser Studienarbeit wurde ein Umsetzungstool entwickelt, um XMI-Daten (erzeugt aus UMLKlassendiagrammen) in das GXL-Format zu überführen und umgekehrt: Hiermit soll eine Interoperabilität zwischen Werkzeugen, die eins der beiden Formate verwenden, ermöglicht werden. Mit diesem Tool können dann beispielsweise UML-Klassendiagramme, die mit einem CASE-Tool entworfen wurden, in GXL-Graphen überführt werden und umgekehrt. Dazu wurde zuerst das GXL- und das XMI-Format analysiert; hierbei ist für XMI zu beachten, dass verschiedene Tools verschiedene XMI-Dialekte verwenden. Im Rahmen dieser Arbeit wurden Ameos und Rational Rose benutzt. Anschließend wurde der für diese Tools erzeugte XMI-Code analysiert und in das GXL-Format „übersetzt“. Das Umwandlungstool wurde mit XSLT (Extensible Stylesheet Language Transformation) umgesetzt, sodass es unter allen Betriebssystemen verfügbar ist, für die ein XSL-Prozessor existiert (z.B. Windows und Linux). 6 I. Studienarbeit „Umwandlung von XMI in GXL und von GXL in XMI“ 1. Einleitung Das GXL (Graph Exchange Language)-Format wird zum Austausch von Informationen, die als Graph dargestellt werden und der dazugehörigen Schemainformationen benutzt. Hiermit können nahezu alle Arten von Graphen ausgetauscht werden. XMI (XML Metadata Interchange) wurde von der OMG (Object Modelling Group) entwickelt, um Modelle, die auf der MOF (Meta Object Facility) basieren, zwischen verschiedenen Anwendungen auszutauschen. Beide Formate speichern die benötigten Informationen gemäß dem XML-Standard1. In dieser Studienarbeit wurde eine Anwendung entwickelt, die es ermöglicht, Daten zwischen beiden Formaten zu transferieren, d.h. vorliegende (durch entsprechende Anwendungen erstellte) XMI-Daten sollen ins GXL-Format und Daten im GXL-Format sollen ins XMIFormat umgewandelt werden können. Hierdurch soll eine Interoperabilität zwischen verschiedenen Werkzeugen, die eins der beiden Formate verwenden, ermöglicht werden. Beispielweise können GXL-Dokumente, die von Reengineering-Tools erzeugt wurden, nach einer Umwandlung in XMI-Daten in einem CASE-Tool weiterverarbeitet werden. Dort können die überarbeiteten Diagramme wiederum als XMI-Datei exportiert werden und wiederum in GXL-Dokumente transferiert werden. 2. GXL GXL wurde als ein Austauschformat für graph-basierte Werkzeuge entwickelt, um beispielsweise Daten zwischen einzelnen Software-Reengineering-Werkzeugen auszutauschen. Da mit GXL nahezu alle Graphenarten dargestellt werden können, kann es als allgemeines Austauschformat für graph-basierte Werkzeuge genutzt werden [Wint01]. GXL ist als eine XML-Sprache definiert, mit der sowohl Instanz-Graphen als auch die zugehörigen Schema-Informationen ausgetauscht werden können. Die Syntax von GXL wird in Form einer XML-DTD (Document Type Definition) angegeben; die komplette Syntax der GXL-XML-Dateien findet sich unter http://www.gupro.de/GXL. Die darzustellenden Daten werden als attributierte, typisierte, gerichtete Graphen (kurz TGraphen) dargestellt. Diese TGraphen werden in XML kodiert, jeder Knoten wird beispielsweise zwischen <node> und </node>-Tags beschrieben, Kanten zwischen den Knoten zwischen <edge> und </edge>-Tags. Diese Knoten und Kanten werden mit ihren Typen und Attributen als ein GXL-Dokument in XML beschrieben [HoWi00], z.B. werden Verknüpfungen zu den entsprechenden Schema-Informationen angegeben. Es existieren Erweiterungen zur Darstellung von Hypergraphen und hierarchischen Graphen [WiKuRi01]. Die Graph-Schemata geben die Graphenstruktur an, d.h. die Definition der Knoten- und Kantenklassen, der Relationen zwischen diesen Knoten und Kanten, ihrer Attribute, der Graphenhierarchie und zusätzliche Beschränkungen [Wint01]. Graph-Klassen werden als UMLKlassendiagramme definiert. Hierbei werden z.B. Knotenklassen durch Klassen, Kantenklassen durch Assoziationen und attributierte Kantenklassen durch assoziierte Klassen definiert. Diese Klassendiagramme können in äquivalente Graphen (Schema-Graphen) umgeformt und somit mit dem gleichen Dokumenttyp wie auch Instanzen-Graphen ausgetauscht werden. [Wint01]. 1 Beschrieben unter http://www.w3.org/TR/REC-xml 7 GXL wird in Abschnitt II genauer beschrieben. 3. XMI Da in UML keine textuelle Beschreibung der Diagramme vorgesehen war, war ein Austausch dieser Modelle zwischen verschiedenen Werkzeugen nur möglich, wenn diese kompatible Datenformate benutzten. Mit XMI wurde ein Format entwickelt, um diese Modelle austauschen zu können. Die Darstellung der Informationen erfolgt auch hier im XML-Format, die DTD, welche die Syntax beschreibt, findet sich in [XMI02] bzw. die aktuellere Version 2.0 in [XMI03]. Die Modelle, die mit XMI beschrieben werden können, müssen auf einem MOF (Meta Object Facility)-Metamodell basieren (einer Sprache, mit der weitere Sprachen/(Meta-)Modelle definiert werden können; alle Sprachen, die in verschiedenen OMG-Metamodellen definiert werden, basieren auf der MOF). Damit ist es möglich, außer UML eine Vielzahl weiterer Modelle auszutauschen, sofern ein MOF-Metamodell existiert. Im XMI-Standard werden sog. „XML DTD Schema Production Rules“ definiert, die einen Algorithmus beschreiben, um MOF-basierte Modelle automatisch in eine XMI-konforme XML-Grammatik umzusetzen. Damit können dann XML-DTD bzw. XML-Schemata (ab XMI Version 2) zur Beschreibung der Syntax der erzeugten Metadaten erstellt werden, auch für momentan noch nicht entwickelte Modelle. Die „XML-Document Production Rules“ beschreiben die Regeln, mit denen die Metadaten in ein XML-kompatibles Format kodiert werden [Jeck04]. Jede Klasse wird als ein XML-Element mit zusätzlichen XML-Elementen für jedes Attribut, Assoziation und Komposition dargestellt. Im Metamodell vorhandene Attribute werden als XML-Attribute (und auch als XML-Elemente) deklariert. Für mehrwertige Attribute werden keine XML-Attribute definiert, jeder Wert wird als ein XML-Element kodiert. Komplexe Attribute werden wie Assoziationen behandelt. Jede Assoziation wird als ein XML-Element und/ oder ein XML-Attribut dargestellt, definiert in der Klasse, auf die sie sich bezieht. [Jeck04]. Die meisten der UML-unterstützenden CASE- und Zeichenwerkzeuge unterstützen XMI zum Export und Import von UML-Modellen [Jeck04], damit stellt XMI eine Möglichkeit dar, UML-Modelle in XML zu speichern und zwischen diesen Werkzeugen auszutauschen. XMI wird in Abschnitt III genauer beschrieben. 4. Ziel der Studienarbeit Im Rahmen dieser Studienarbeit wurden insgesamt vier betriebssystemunabhängige Programme2 entwickelt, mit denen ein Austausch zwischen Programmen möglich ist, die das XMI- bzw. das GXL-Format benutzen. Eine bestimmte Programmiersprache wurde anfangs noch nicht festgelegt, in Betracht kamen Java oder XSL (XML Style Language). Ein Vergleich hierzu, der zu der Entscheidung zur Umsetzung mit XSL führte, findet sich in Abschnitt V. Die XMI-Konformität verschiedener Werkzeuge musste überprüft werden, mindestens zwei hiervon sollten von dem Werkzeug unterstützt werden (z.B. Rational Rose (IBM), Together (Borland), Ameos (Aonix), ArgoUML (University of California, Irvine); eine Liste von UML-Werkzeugen findet sich unter http://www.jeckle.de/umltools.html). Insbesondere war darauf zu achten, welche XMI-Version unterstützt wird; in den Versionen 1.x werden die 2 Für die Umsetzung von XMI in GXL jeweils ein Programm für Ameos und eins für Rational Rose; analog für die Umsetzung von GXL in XMI. Die Programme wurden als XMI2GXL (für die beiden XMI zu GXL-Programme) sowie GXL2XMI bezeichnet, ist der Zusatz „-Ameos“ bzw. „-RR“ angegeben, ist das Programm für das entsprechende Tool gemeint. 8 Schemata als DTD gespeichert, in Version 2 ist auch eine Speicherung als XML-Schema möglich. Diese möglicherweise unterschiedlichen XMI-„Dialekte“ mussten dann standardkonform ins GXL-Format transferiert werden, welches z.B. vom Software-Reengineering-Tool GUPRO (http://www.gupro.de) verarbeitet werden kann. Auch sollten GXL-Daten in XMI-Daten (zurück-)überführt werden können. Auch hier musste ggf. nach dem „Zielwerkzeug“ unterschieden werden, falls diese unterschiedliche XMI-„Dialekte“ benötigen. Bei GXL werden die Schemagraphen als XML-Daten dargestellt, auf die in der Instanzgraphen-Datei referenziert werden kann. Die DTD dient bei GXL der Definition der Syntax, mit der sowohl die Graphenschemata als auch die Instanzgraphen beschrieben werden. In XMI (Version 1.x) werden die Graphenschemata als DTD angegeben (d.h. zu jeder Sprache kann eine DTD generiert werden), ab Version 2.0 ist auch die Darstellung als XML-Schema möglich. Durch die für diese Studienarbeit vorgegebene Einschränkung auf UML-Modelle war die UML DTD, die aufgrund der „XML DTD Production Rules“ erzeugt wurde, genau zu analysieren ([XMI02], Anhang A) und mit dem entsprechenden GXL-Schema zu vergleichen. Auch eine Unterstützung des DI (Diagram Interchange)-Formats, welches die Speicherung der visuellen Darstellung der Modelle erlaubt, war (je nach Unterstützung dieses Formats durch die Entwurfs-Software) angedacht. Hier könnten dann auch die graphische Darstellung der Modelle berücksichtigt werden, welche in der aktuellen GXL-Version unterstützt wird. Allerdings wurde dies in dieser Studienarbeit nicht umgesetzt. 5. Überblick über die Studienarbeit Im Anschluß wird in Abschnitt II und III ein Überblick über die Konzepte der GXL (Graph Exchange Language) und von XMI (XML Metadata Interchange) gegeben. In Abschnitt IV wird die Umsetzung verschiedener UML-Konzepte durch die verwendeten Tools Ameos und Rational Rose (in XMI) sowie die entsprechende Darstellung durch die GXL aufgezeigt. Im fünften Abschnitt wird auf die Auswahl der Programmiersprache zur Realisierung der Umsetzungsprogramme eingegangen und die zur Auswahl stehenden Konzepte JAXP und XSLT vorgestellt. Vor der abschließenden Zusammenfassung werden in Abschnitt VI kurz die durchgeführten Tests der Programmfunktionalität erläutert und in Abschnitt VII auf die praktische Anwendung der erstellten Programme und der verwendeten Werkzeuge eingegangen. Ebenso wird hier auf Besonderheiten, die während der Benutzung aufgefallen sind, verwiesen. 9 II. GXL – Graph Exchange Language 1. Einleitung GXL (Graph eXchange Language) wurde als Standardaustauschformat für graphbasierte Anwendungen entwickelt. GXL ist als eine XML-Sprache definiert, hiermit können Graphen und (zugehörige) Schema-Informationen in einem einheitlichen Format ausgetauscht werden. Die darzustellenden Daten werden als attributierte, typisierte, gerichtete Graphen (kurz TGraphen) beschrieben, die durch Konzepte zur Unterstützung der Darstellung von Hypergraphen und hierarchischen Graphen erweitert werden [WiKuRi01]. Die Syntax von GXL ist in Form einer DTD (Document Type Definition) angegeben. 2. Beispiele <?xml version="1.0"?> <!DOCTYPE gxl SYSTEM "gxl-1.0.dtd"> <gxl><graph id = “graph1”> <node id = "p"> <type xlink:href = "schema.gxl#Proc"/> <attr name = "file"> <string>main.c</string> </attr> </node> <node id = "v"> <type xlink:href = "schema.gxl#Var"/> <attr name = "line"> <int>27</int> </attr> </node> <edge id = "e" from = "p" to = "v"> <type xlink:href = "schema.gxl#refers"/> <attr name = "line"> <int>42</int> </attr> </edge> </graph></gxl> p : Proc File = “main.c“ e : refers line = 42 v : Var line = 27 Beispiel 1: attributierter, typisierter, gerichteter Graph mit attributierter Kante 10 Der in Bild 1 dargestellte Graph wird in der angegebenen Form als GXL-Dokument gespeichert. Knoten werden als node-Elemente, Kanten als edge-Elemente gespeichert, denen jeweils eine eindeutige ID zugewiesen wird. Bei Kanten muss jeweils der Start- und Endknoten angegeben werden. Zugehörige Attribute werden als attr-Elemente gespeichert. Der Typ eines Elements wird durch einen Verweis auf eine zugehörige schema.gxl-Datei, die diese spezifiziert, definiert. Der gesamte Graph wird in <gxl>-Tags eingeschlossen. Bei ungerichteten Kanten wird dies durch orientation = „undirected“ bei den Kantenattributen angegeben, ist der ganze Graph ungerichtet, kann dies auch als Attribut des kompletten Graphen angegeben werden (siehe DTD). <rel id = "r" orientation = "directed"> <link ref = "u" role = "theFirstU" direction = "out" endorder = "2" /> <link ref = "u" role = "theSecondU" direction = "out" endorder = "1" /> <link ref = "v" role = "theV" direction = "in" /> <link ref = "w" role = "theW" direction = "none"/> </rel> v:V theV theSecondU {1} u:U r: {2} theFirstU theW w:W Beispiel 2: Hypergraph und n-äre Relationen Hierarchische Graphen werden als Graphen innerhalb eines Knotens gespeichert, siehe Bild 3. <node id = "t"> <type xlink:href = "schema.gxl#T" /> <graph id = "g"> <type xlink:href = "schema.gxl#GraphT"/> <node id = "v"/> <node id = "w"/> <edge id = "e" from = "v" to = "w"/> </graph> </node> <node id = "u"/> <edge id = "f" from = "t" to = "u"/> t:T g : GraphT v: e: w: f: u: Beispiel 3: Hierarchischer Graph 11 3. GXL DTD Im folgenden wird der Aufbau der gxl.dtd dargestellt und erläutert. Alle Informationen aus diesem Abschnitt finden sich (ausführlicher) unter [GXL02]. 3.1 Extensions <!-- Extensions --> <!ENTITY % gxl-extension <!ENTITY % graph-extension <!ENTITY % node-extension <!ENTITY % edge-extension <!ENTITY % rel-extension <!ENTITY % value-extension <!ENTITY % relend-extension <!ENTITY <!ENTITY <!ENTITY <!ENTITY <!ENTITY <!ENTITY % % % % % % "" "" "" "" "" "" "" > > > > > > > gxl-attr-extension graph-attr-extension node-attr-extension edge-attr-extension rel-attr-extension relend-attr-extension "" "" "" "" "" "" > > > > > > Dies sind vordefinierte „leere“ Makros, um Informationen zu GXL-Dokumenten hinzuzufügen. Da diese Erweiterungen von den GXL-Werkzeugen nicht unterstützt werden, soll hierauf auch nicht näher eingegangen werden. 3.2 Attribut-Typen <!-- Attribute values --> <!ENTITY % val " locator | bool | int | float | string | enum | seq | set | bag | tup %value-extension;"> Hier werden die möglichen Attribut-Typen in GXL aufgezählt, neben den OCL-Standarddatentypen (bool, int, float, string, seq, set und bag) sind Tupel (tup) und Aufzählungen (enum) möglich, mit dem locator-Datentyp werden Dokumente und XML-Elemente verlinkt. 12 3.3 GXL-Element <!-- gxl --> <!ELEMENT gxl (graph* %gxl-extension;) > <!ATTLIST gxl xmlns:xlink CDATA #FIXED "http://www.w3.org/1999/xlink" %gxl-attr-extension; > Mit diesem Element wird das GXL-Dokument, welches mehrere Graphen enthalten kann, „eingeschlossen“. Mit dem xlink-Attribut kann auf Objekte verwiesen werden, die außerhalb des aktuellen GXL-Dokuments definiert werden. 3.4 Type-Element <!-- type --> <!ELEMENT type EMPTY> <!ATTLIST type xlink:type (simple) #FIXED "simple" xlink:href CDATA #REQUIRED > Im type-Element wird auf entsprechende Elemente des Schemas verwiesen. Typen können folgenden Elementen zugewiesen werden: graph, node, edge, rel und attr. Alle Typen eines einzelnen Graphen müssen auf Elemente eines einzelnen Schema-Graphen verweisen. Ein Knoten vom Typ Text (der in einer type.gxl-Datei definiert ist), würde folgendermaßen dargestellt: <node id=“node1“> <type xlink:href = “type.gxl#Text“ /> </node> 3.5 Graph-Element <!ELEMENT graph (type? , attr* , ( node | edge | rel )* %graph-extension;) > <!ATTLIST graph id ID #REQUIRED role NMTOKEN #IMPLIED edgeids ( true | false ) "false" hypergraph ( true | false ) "false" edgemode ( directed | undirected | defaultdirected | defaultundirected) "directed" %graph-attr-extension; > Mit diesem Element wird ein Graph innerhalb eines GXL-Dokuments eingeschlossen. Es kann ein Link zu der entsprechenden Typ-Definition im Schema-Graphen angegeben werden. Ein Graph kann mehrere Knoten (node), Kanten (edge) oder Relationen (rel) enthalten. Als Attribut kann neben der (benötigten) id eine Rolle (role) angegeben werden. 13 Das edgeids-Attribut gibt an, ob Kanten und Relationen eigene IDs besitzen (true) oder nicht (false). Das hypergraph-Attribut gibt an, ob mehrere Elemente miteinander verknüpft sein können (durch Hyperedges). Im edgemode-Attribut kann angegeben werden, ob die einzelnen Kanten des Graphen gerichtet (directed) oder ungerichtet (undirected) sein sollen; dies kann in der Definition der einzelnen Kanten dann nicht mehr überschrieben werden. Des Weiteren besteht die Möglichkeit, hier einen Default-Wert anzugeben, der dann bei bestimmten Kanten oder Relationen überschrieben werden kann. 3.6 Node-Element <!ELEMENT node (type? , attr*, graph* %node-extension;) > <!ATTLIST node id ID #REQUIRED %node-attr-extension; > Ein Knoten kann auf seinen Typ im Graph-Schema verweisen und eine Liste von Attributen und Graphen (zur Darstellung hierarchischer Graphen) enthalten. Jeder Knoten muss eine eindeutige ID besitzen. 3.7 Edge-Element <!ELEMENT edge (type?, attr*, graph* %edge-extension;) > <!ATTLIST edge id ID #IMPLIED from IDREF #REQUIRED to IDREF #REQUIRED fromorder CDATA #IMPLIED toorder CDATA #IMPLIED isdirected ( true | false ) #IMPLIED %edge-attr-extension; > Eine Kante (edge) stellt eine Verbindung zweier Elemente dar. Es kann wiederum auf den im Graphen-Schema definierten Typen verwiesen werden, außerdem können eine Liste von Attributen und Graphen angegeben werden. Als Attribut kann eine ID angegeben werden, es müssen im from- und to-Attribut die beiden verknüpften Elemente anhand ihrer ID referenziert werden. In Graphen, die in einer festgelegten Reihenfolge durchlaufen werden müssen kann diese Ordnung durch Angabe eines fromorder- und toorder-Attributs angegeben werden, diese Werte müssen Zahlen sein. Im isdirected-Attribut kann schließlich festgelegt werden, ob die Kante gerichtet (true) oder ungerichtet (false) interpretiert werden soll; hierbei kann dieser Wert aber von der Festlegung im graph-Element überschrieben werden (siehe Abschnitt 3.5). 14 3.8 Rel-Element <!ELEMENT rel (type? , attr*, graph*, relend* %rel-extension;) > <!ATTLIST rel id ID #IMPLIED isdirected ( true | false ) #IMPLIED %rel-attr-extension; > Das rel-Element erlaubt die Definition n-ärer Relationen, die mehrere Graph-Elemente verbinden. Hier kann analog zu Knoten und Kanten wiederum der Typ sowie eine Liste von Attributen und Graphen angegeben werden. Zusätzlich können die Relations-Endpunkte (relend) verzeichnet werden. Analog zu Kanten („2-äre Relationen“) kann eine ID vergeben werden. Das isdirectedAttribut gibt auch hier an, ob die Kanten als gerichtet oder ungerichtet zu interpretieren. 3.9 Relend-Element <!ELEMENT relend (attr* %relend-extension;) > <!ATTLIST relend target IDREF #REQUIRED role NMTOKEN #IMPLIED direction ( in | out | none) #IMPLIED startorder CDATA #IMPLIED endorder CDATA #IMPLIED %relend-attr-extension; > Die relend-Liste einer rel-Definition enthält die Liste der verbundenen Graphen-Elemente. relend-Elemente können eine eigene Liste von Attributen enthalten. Als Attribut muss die ID der „Eltern-Relation“ angegeben werden; es können eine Rolle sowie die Richtung bezüglich der zugehörigen Relation (zeigt auf die Relation (in) oder aus der Relation heraus(out), oder ungerichtet (none bzw. keine Angabe)) angegeben werden. Die Ordnung der Relations-Endpunkte kann wiederum (analog zu Kanten) mit dem startorder(bezüglich der Relation) und endorder-Attribut (bezüglich des Endpunkts der Relation) als Zahl angegeben werden. 3.10 Attr-Element <!ELEMENT attr (attr*, (%val;)) > <!ATTLIST attr id ID #IMPLIED name NMTOKEN #REQUIRED kind NMTOKEN #IMPLIED > Ein Attribut hat einen Namens- und einen Wert-Teil (val). Attribute können wiederum weitere Attribute enthalten. Es kann eine ID angegeben werden. Das kind-Attribut dient der Unterscheidung verschiedener Arten von Attributen (z.B. zur Kennzeichnung abgeleiteter Attribute). 15 Der Wert eines Attributs kann von den OCL-Standard-Typen bool, int, float, string, seq, set, und bag oder tup(le), enum oder locator sein. 3.11 Locator-Element <!ELEMENT locator EMPTY > <!ATTLIST locator xlink:type (simple) xlink:href CDATA > #FIXED "simple" #REQUIRED Ein locator-Element verweist auf zusätzliche Dokumente oder Dokument-Elemente. 3.12 Datentypen <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT bool int float string (#PCDATA) (#PCDATA) (#PCDATA) (#PCDATA) > > > > Atomare Datentypen. GXL benutzt die Bezeichnungen und Grammatikregeln von Java. <!ELEMENT enum (#PCDATA) > Werte, die vom Typ Aufzählung sind. <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT seq set bag tup (%val;)* (%val;)* (%val;)* (%val;)* > > > > Zusammengesetzte Werte, die weitere Werte (vom gleichen Typ) enthalten. 4. Graph-Schemata Graph-Klassen werden bei GXL durch UML-Klassen-Diagramme definiert (siehe als Beispiel Abbildung 1). Knoten-Klassen (hier Function, Variable und FunctionCall) werden durch Klassen definiert, Kanten-Klassen (isCallee, isOutput und isCaller) durch Assoziationen und attributierte Kanten-Klassen (isCaller) werden durch Assoziations-Klassen beschrieben. Abbildung 1: Graph-Schema (als UML-Klassendiagramm) [WiKuRi01] 16 Die Richtung der Kanten wird durch ein gefülltes Dreieck angegeben. Mit dem Schlüsselwort „ordered“ wird die Existenz einer Reihenfolge angegeben. Auf ähnliche Weise können Hypergraphen und hierarchische Graph-Schemata in der üblichen UML-Notation dargestellt werden. Diese UML-Klassendiagramme können als Graphen und damit in einer GXLkompatiblen Weise dargestellt werden. Damit können dann Instanz-Graphen und die dazugehörigen Schema-Graphen mit dem gleichen Dokumentenformat (d.h. GXL) ausgetauscht werden. In Abbildung 2 wird das UML-Klassendiagramm aus Abbildung 1 als TGraph dargestellt, der dann wie jeder andere Graph in GXL gespeichert werden kann. Hierzu werden Knotenklassen und Kantenklassen als Knoten vom Typ NodeClass bzw. EdgeClass modelliert, deren Attribute weitere Eigenschaften beschreiben. Beziehungen zwischen diesen Knoten (bzw. zwischen den Klassen) werden durch Kanten des entsprechenden Typs dargestellt (from und to-Kanten mit Attributen, die Richtung und Kardinalitäten als Attribute enthalten). Attribute und Attributtypen werden als AttributeClass-Knoten mit passenden AttributtypKnoten dargestellt. Attributinformationen werden mit den ensprechenden Knoten- und Kantenklassen mit hasAttribute und hasDomain-Kanten verbunden. Analog können auch weitere Konzepte wie Hierarchie, Hypergraphen, Aggregation und Komposition sowie Generalisation modelliert werden. Die Graphenklasse selbst wird durch einen GraphClass-Knoten dargestellt, der durch (contains-)Kanten mit allen Entsprechungen von Knoten- und Kantenklassen verbunden ist. In GXL-Dokumenten, die Instanz-Graphen repräsentieren, kann dann mittels Verweisen auf die entsprechenden Definitionen verwiesen werden. [WiKuRi01] [HSSW04] Abbildung 2: Graph-Schema (als Schema-Graph) [WiKuRi01] Das komplette GXL-Metaschema findet sich unter http://www.gupro.de/GXL/MetaSchema/metaSchema.html. 17 III. XMI – XML Metadata Interchange 1. Einleitung Das XMI (XML Metadata Interchange)-Format wurde zur textuellen Darstellung von auf dem MOF (Meta Object Facility)-Metamodell basierenden Modellen entwickelt. Hierunter fallen auch UML (Unified Modelling Language)-Modelle, wobei im Rahmen dieser Studienarbeit wiederum nur Klassen- und Objektdiagramme relevant sind. Allerdings wurde während des Überprüfens der verwendeten Tools (Ameos von Aonix und Rational Rose von Rational Software/IBM) festgestellt, dass Objektdiagramme nicht exportiert bzw. dargestellt werden können. Diese XMI-Daten können von verschiedenen Tools, unter anderem auch den in der Studienarbeit verwendeten Rational Rose und Ameos, aus dort entworfenen Diagrammen/Modellen generiert werden. Die so erzeugten Dokumente sollen sowohl zwischen diesen Werkzeugen ausgetauscht werden können als auch in GXL-Dateien umgewandelt werden, die dann von entsprechenden Werkzeugen verarbeitet werden können (z.B. Gupro). Da die verwendeten Werkzeuge XMI-Dokumente in der XMI-Version 1.1 erzeugen, soll hier nur auf diese Version vom November 2000 eingegangen werden (Spezifikation siehe [XMI00]); aktuell ist die Version 2.0, die auch den UML 2.0-Standard unterstützt (siehe [XMI03]). 2. MOF – Meta Objects Facility Die Meta Objects Facility ist die Beschreibungssprache der OMG, mit der alle Modellierungssprachen der OMG (und damit auch UML) beschrieben werden. Das MOF-Metametamodell (kurz MOF-Modell) ist eine Sprache, um MOF-Metamodelle (z.B. das UML-Metamodell) zu definieren, so wie das UML-Metamodell eine Sprache darstellt, um UML-Modelle zu definieren. Das UML-Metamodell selbst ist eine Instanz des MOF-(Metameta-)Modells. MOF-Modell und der Hauptteil des UML-Metamodells sind eng verwandt; die UML-Notation wird benutzt, um MOF-basierte Metamodelle zu beschreiben. Das MOF-Modell wird in einer 4-Schichten-Darstellung dargestellt: Meta-Level M3 M2 M1 M0 MOF-Begriffe Meta-Metamodell Metamodell Modell Objekte Beispiele Das MOF-Modell UML-Metamodell UML-Modelle Modellierte Systeme Tabelle 1: MOF-Modell 3. XMI-DTD Da mit XMI außer UML auch andere Metamodelle (basierend auf der MOF) dargestellt werden können, werden in der Spezifikation [XMI00] Regeln vorgegeben, mit denen aus jedem MOF-Metamodell (wie z.B. dem UML-Metamodell) eine DTD (Document Type Definition) generiert werden kann, die die Syntax des entsprechenden Modells beschreibt. Diese Regeln werden in Abschnitt 4 der Spezifikation [XMI00] in EBNF-Schreibweise dargestellt. Durch diese DTD (also der Metamodell-Beschreibung) wird der Aufbau der XMI-Dokumente (der Modelle) festgelegt. 18 Im Rahmen dieser Studienarbeit sind nur die von den zu unterstützenden Werkzeugen verwendeten UML-Modelle (Rational Rose verwendet UML 1.3, Ameos UML 1.4) im Rahmen der Umwandlung relevant. Zuerst soll hier auf die notwendigen Elemente und Attribute, die jedes XMI-Dokument enthalten kann (oder enthalten muss) eingegangen werden. Die hier verwendeten Informationen finden sich in ausführlicher Form im 3. Kapitel der XMI-Spezifikation 1.1 [XMI00]. Jede XMI-DTD besteht aus den folgenden Deklarationen [XMI00]: - Eine „XML-Version-Verarbeitungs-Anweisung“ (Beispiel: <? XML version=”1.0” ?>). - Eine optionale Kodierungs-Deklaration über den verwendeten Zeichensatz nach dem ISO10646-Standard (Beispiel: <? XML version="1.0" ENCODING=”UCS-2” ?>). - Andere gültige XML-Verarbeitungs-Anweisungen. - Die erforderlichen XMI-Deklarationen (siehe 3.1) - Deklarationen für ein spezielles Metamodell - Deklarationen für „Unterschiede“ - Deklarationen für Erweiterungen Jedes XMI-Dokument besteht aus den folgenden Deklarationen: - Eine „XML-Version-Verarbeitungs-Anweisung“ (Beispiel: <? XML version=”1.0” ?>). - Eine optionale Kodierungs-Deklaration über den verwendeten Zeichensatz nach dem ISO10646-Standard (Beispiel: <? XML version="1.0" ENCODING=”UCS-2” ?>). - Andere gültige XML-Verarbeitungs-Anweisungen. - Eine optionale externe DTD-Deklaration, die wiederum (optionale) interne DTD-Deklarationen enthalten kann (Beispiel: <! DOCTYPE XMI SYSTEM “http://www.xmi.org/xmi.dtd“ >). Ein Beispieldokument befindet sich in Abschnitt 4.1. 3.1 Notwendige XMI-DTD-Deklarationen 3.1.1 Attribute zur Identifikation Zuerst werden drei XML-Attribute definiert, um XML-Elemente zu kennzeichnen, damit andere XML-Elemente auf diese verweisen können. Diese Attribute werden in der Entity XMI.element.att deklariert: <!ENTITY % XMI.element.att ’xmi.id ID #IMPLIED xmi.label CDATA #IMPLIED xmi.uuid CDATA #IMPLIED ’ > Die xmi.id kann eine eindeutige ID innerhalb eines XML-Dokuments bezeichnen; hierauf kann mit dem xmi.idref-Attribut verwiesen werden und es kann als Wert des href-Attributs in XLinks verwendet werden. Diese Attribute werden in Abschnitt 3.1.2 beschrieben. xmi.label kann eine beliebige Beschreibung des Elements enthalten, xmi.uuid kann einen (global) eindeutigen Identifier für das Element enthalten. 3.1.2 Verweise auf Attribute Damit XML-Elemente auf andere Elemente verweisen können, benötigt XMI einige XMLAttribute, die als Wert die oben verwendeten IDs benutzen. 19 <!ENTITY % XMI.link.att 'href CDATA #IMPLIED xmi.idref IDREF #IMPLIED' > Mit dem Attribut href kann auf XML-Elemente verwiesen werden, deren xmi.id-, xmi.labeloder xmi.uuid-Attribute auf die entsprechenden Werte gesetzt sind. xmi-idref verweist auf das Element mit der entsprechenden xmi.id. 3.2 Übersicht der Elemente einer XMI-DTD Jede XMI-DTD muss die Deklarationen für die folgenden XML-Elemente enthalten: • XMI • XMI.header • XMI.documentation • XMI.owner • XMI.contact • XMI.longDescription • XMI.shortDescription • XMI.exporter • XMI.exporterVersion • XMI.exporterID • XMI.notice • XMI.model • XMI.metamodel • XMI.metametamodel • XMI.import • XMI.content • XMI.extension • XMI.reference • XMI.difference • XMI.delete • XMI.add • XMI.replace • XMI.extensions Die folgenden weiteren Deklarationen werden benötigt, wenn die entsprechenden Datentypen von dem verwendeten Metamodell benutzt werden: • XMI.field • XMI.array • XMI.struct • XMI.enum • XMI.seqItem • XMI.discrim • XMI.sequence • XMI.union • XMI.arrayLen • XMI.any Im folgenden werden diese Deklarationen genauer beschrieben. Dabei wird nach dem Wurzelelement zuerst auf die inneren Elemente der ersten Ebene eingegangen (3.2.2 bis 3.2.5), anschließend auf die darin enthaltenen Elemente. 3.2.1 XMI Das Wurzel-Element jedes XMI-Dokuments ist das Element XMI. Es kann einen XMI.header und XMI.content-Elemente enthalten, außerdem kann es mehrere XMI.difference und XMI.extensions-Elemente enthalten. 20 Das Attribut xmi-version muss auf 1.1 gesetzt sein (zumindest für XMI-Dokumente, die der hier verwendeten Spezifikation entsprechen). Als Attribute können timestamp (Zeitpunkt der Datenerzeugung) sowie eine Angabe, ob das Modell dem Metamodell entspricht oder nicht (verified), enthalten sein. <!ELEMENT XMI (XMI.header?, XMI.content?, XMI.difference*, XMI.extensions*) > <!ATTLIST XMI xmi.version CDATA #FIXED "1.1" timestamp CDATA #IMPLIED verified (true | false) #IMPLIED > Zusätzlich können die benutzten Namensbereiche deklariert werden: <!ATTLIST XMI xmlns:n #CDATA IMPLIED> 3.2.2 XMI.header Das Element XMI.header enthält Angaben, die das verwendete Model, Metamodell und Metametamodell bezeichnen, sowie Angaben über die übertragenen Metadaten: <!ELEMENT XMI.header (XMI.documentation?, XMI.model*, XMI.metamodel*, XMI.metametamodel*, XMI.import*) > 3.2.3 XMI.content Das Element XMI.content enthält die zu übertragenden Metadaten: <!ELEMENT XMI.content ANY > 3.2.4 XMI.difference Das Element XMI.difference enthält Elemente, die Unterschiede zur den Basis-Daten repräsentieren. Es kann im Content-Teil eines XMI-Dokuments oder in einem eigenen Abschnitt benutzt werden. Es kann Löschungen, Hinzufügungen oder Ersetzungen von Basis-Metadaten durch Metadaten enthalten. Das Attribut xmi.position gibt an, wo der Inhalt der hinzugefügten oder ersetzten Elemente (relativ zu anderen XML-Elementen) eingefügt werden soll. <!ELEMENT XMI.difference (XMI.difference | XMI.add | XMI.delete | XMI.replace)* > <!ATTLIST XMI.difference %XMI.element.att; %XMI.link.att; > 21 <!ELEMENT XMI.delete EMPTY > <!ATTLIST XMI.delete %XMI.element.att; %XMI.link.att; > <!ELEMENT XMI.add ANY > <!ATTLIST XMI.add %XMI.element.att; %XMI.link.att; xmi.position CDATA "-1" > <!ELEMENT XMI.replace ANY > <!ATTLIST XMI.replace %XMI.element.att; %XMI.link.att; xmi.position CDATA "-1" > 3.2.5 XMI.extensions Das Element XMI.extensions enthält Daten über Erweiterungen zum Metamodell (z.B. Informationen über die visuelle Darstellung der Metadaten). Das Attribut xmi-extender gibt an, welches Werkzeug für die Erweiterungen verantwortlich ist. <!ELEMENT XMI.extensions ANY > <!ATTLIST XMI.extensions xmi.extender CDATA #REQUIRED > 3.2.6 XMI.documentation Das Element XMI.documentation enthält Informationen über die übertragenen Metadaten, z.B. den Eigentümer der Daten, eine Kontaktperson, Beschreibungen der Metadaten, das Werkzeug, das die Metadaten erzeugt kann, dessen Version, Copyright-Vermerke etc.: <!ELEMENT XMI.documentation (#PCDATA | XMI.owner | XMI.contact | XMI.longDescription | XMI.shortDescription | XMI.exporter | XMI.exporterVersion | XMI.notice)* > <!ELEMENT XMI.owner ANY > <!ELEMENT XMI.contact ANY > <!ELEMENT XMI.longDescription ANY > <!ELEMENT XMI.shortDescription ANY > <!ELEMENT XMI.exporter ANY > <!ELEMENT XMI.exporterVersion ANY > <!ELEMENT XMI.exporterID ANY > <!ELEMENT XMI.notice ANY > 3.2.7 XMI.model Das Element XMI.model gibt das verwendete Modell (oder auch die verwendeten Modelle) an: 22 <!ELEMENT XMI.model ANY> <!ATTLIST XMI.model %XMI.link.att; xmi.name CDATA #REQUIRED xmi.version CDATA #REQUIRED> 3.2.8 XMI.metamodel, XMI.metametamodel Analog dazu existieren die Elemente XMI.metamodel und XMI.metametamodel, die das (oder die) verwendeten Metamodell(e) und Metametamodell(e) angeben. Das Metametamodell wird in den meisten Fällen einen Verweis auf die verwendete MOF-Version sein. <!ELEMENT XMI.metamodel ANY> <!ATTLIST XMI.metamodel %XMI.link.att; xmi.name CDATA #REQUIRED xmi.version CDATA #REQUIRED > <!ELEMENT XMI.metametamodel ANY> <!ATTLIST XMI.metametamodel %XMI.link.att; xmi.name CDATA #REQUIRED xmi.version CDATA #REQUIRED> 3.2.9 XMI.import Das Element XMI.import kann auf weitere für das aktuelle Dokument benötigte Dokumente verweisen: <!ELEMENT XMI.import ANY> <!ATTLIST XMI.import %XMI.link.att; xmi.name CDATA #REQUIRED xmi.version CDATA #REQUIRED > 3.2.10 XMI.extension Das Element XMI.extension enthält XML-Elemente, die Metadaten enthalten, die das Metamodell erweitern. Dieses Element kann direkt in XML-Elemente im content-Abschnitt eingefügt werden, um die erweiterten Metadaten mit einem bestimmten XML-Element zu verbinden. <!ELEMENT XMI.extension ANY > <!ATTLIST XMI.extension %XMI.element.att; %XMI.link.att; xmi.extender CDATA #REQUIRED xmi.extenderID CDATA #IMPLIED > 23 3.2.11 XMI.reference Das Element XMI.reference erlaubt Verweise auf andere XML-Elemente innerhalb eines Attributs vom Typ String oder eines XMI.any-Elements, um einen Datentyp anzugeben, der nicht im Metamodel definiert ist. <!ELEMENT XMI.reference ANY > <!ATTLIST XMI.reference %XMI.link.att; > XMI-Datentypen (wenn vom Metamodell benutzt, wie am Anfang des Abschnitts in der Aufzählung angegeben) können als “feste” oder als durch das Metamodell festgelegte Deklarationen verwendet werden (genauere Informationen hierzu in Abschnitt 3.5.18 der Spezifikation [XMI00]). 3.3 Repräsentation von Metamodell-Klassen in der DTD 3.3.1 Namensbereiche Bei der Produktion einer DTD für ein Metamodell kann ein Namensbereich (namespace) angegeben werden. Alle in der DTD deklarierten Tags des Metamodells beginnen mit diesem „namespace“-Namen, gefolgt von einem Doppelpunkt („:“). Der XML-Element-Name jeder Metamodell-Klasse, jeder Assoziation oder jedes Packages besteht aus seiner Bezeichnung, dem der Name des Namensbereichs gefolgt von einem Doppelpunkt vorangestellt wird (Beispiel: UML:Class). Namen von Tags für Attribute und Referenzen aus dem Metamodell bestehen aus dem XML-Element-Namen der Klasse gefolgt von einem Punkt („.“) gefolgt vom Namen des Attributs oder der Referenz (Beispiel: UML:Association.connection). Der Name von XML-Attributen, die sich auf Metamodell-Referenzen bzw. Metamodell-Attribute beziehen, besteht nur aus dem Namen der Referenz bzw. des Attributs. Jedem Namensbereich wird ein logischer (in der Namensbereichdeklaration des XMI-Elements im XML-Dokument) und ein physikalischer (im XMI.metamodel-Tag) URI zugewiesen (siehe hierzu das Beispiel in Abschnitt 4.1). Der logische URI enthält einen festen Namen für einen Namensbereich (z.B. “org.omg/standards/UML”), der sich für die Benutzung dieses Namensbereichs nicht ändert. Der physikalische URI bezeichnet den Speicherort des Dokuments (z.B. ftp://server.omg.org/resources/xmi/UML13.xml. 3.3.2 Deklaration einer Metamodell-Klasse Jede Metamodell-Klasse wird in drei Teile zerlegt, diese drei werden als „Entities“ für jede Metamodell-Klasse deklariert, wobei der Name der Klasse vorangestellt wird und um „Properties“, „Associations“ bzw. „Compositions“ ergänzt wird. Hier als Beispiel die Deklaration für den einfachsten Fall einer Klasse „c“ ohne Attribute, Assoziationen oder Ist-Enthalten-InBeziehungen: <!ENTITY % cProperties ‘’> <!ENTITY % cAssociations ‘’> <!ENTITY % cCompositions ‘’> <!ELEMENT c (XMI.extension)* > <!ATTLIST c %XMI.element.att; %XMI.link.att; > 24 3.3.3 Vererbung Da in XML kein Vererbungs-Konzept existiert, wird in XMI eine einfache „copy-down“Vererbung spezifiziert. Als Beispiel wird hier eine Klasse „c1“ mit einer direkten Oberklasse „c0“ im Metamodell durch folgende „Entities“ dargestellt: <!ENTITY % c1Properties ‘%c0Properties ; properties for c1, if any...’> <!ENTITY % c1Associations ‘%c0Associations; associations for c1, if any...’ > <!ENTITY % c1Compositions ‘%c0Compositions; compositions for c1, if any...’ > Daraus folgt auch, dass die Oberklassen vor ihren Unterklassen deklariert werden müssen. 3.3.4 Multiplizitäten Multiplizitäten aus dem Metamodell werden bei der Generierung der DTD ignoriert, mit Ausnahme der Deklaration von XML-Attributen zu Metamodell-Assoziationen. 3.3.5 Attribut-Spezifikation Attribute der Metamodellklasse „c“ werden durch XML-Elemente und XML-Attribute definiert. Falls die Metamodell-Attributtypen primitive Datentypen oder Aufzählungen sind, werden sowohl XML-Elemente als auch XML-Attribute deklariert. Die Deklaration jedes Elements mit Namen „a“, das nicht vom Aufzählungstyp ist, enthält die Typspezifikation des Elements, die aus dem Metamodell oder auch außerhalb des Metamodells definiert ist: <!ELEMENT c.a (type specification) > Für den Fall einer Spezifikation außerhalb des Metamodells wird als Typ ein String-Typ angenommen, und die Spezifikation muss folgende Form ausweisen: <!ELEMENT c.a (#PCDATA| XMI.reference)* > Für Attribute, deren Typ ein String-Typ ist, muss ein XML-Attribut in der Attributliste des Elements, das auf die Metamodellklasse „c“ verweist, deklariert werden: a CDATA #IMPLIED Falls „a“ ein Attribut vom Typ Boolean oder vom Aufzählungstyp ist, wird folgende Deklaration (zur Verbesserung der Syntaxkontrolle) verwendet: <!ELEMENT a EMPTY > <!ATTLIST c.a xmi.value (enum1 | enum2 | …) #REQUIRED > Ebenso muss hier ein XML-Attribut in der entsprechenden Attributliste deklariert werden: a (enum1 | enum2 | ...) #IMPLIED Auch ist ein Element vom Aufzählungstyp, wenn in seiner Klasse ein Tag „XMIDataType“ mit Wert „enum“ enthalten ist. Im Tag „XMIEnumSet“ werden die erlaubten Werte getrennt durch Leerzeichen angeben. 25 3.3.6 DTD-Darstellung einer einfachen Klasse Beispiel einer Klasse „c“ mit Attributen „a1“ vom Typ String und „a2“ vom Type Boolean: <!ELEMENT a1 (#PCDATA | XMI.reference) *> <!ELEMENT a2 EMPTY > <!ATTLIST a2 xmi.value (true | false) #REQUIRED > <!ENTITY % cProperties ‘a1 | a2’ > 3.3.7 Assoziationen Jede Assoziation wird in einer XMI-Entity, einem XML-Element und einem XML-Attribut festgelegt, Multiplizitäten werden ignoriert. Die Darstellung einer Assoziation „r“ einer Metamodellklasse „c“ ist: <!ENTITY % cAssociations ‘r’ > <!ELEMENT r ( content)* > Das zu deklarierende XML-Attribut in der Attributliste des zugehörigen XML-Elements der Klasse c wäre folgendermaßen: r IDREFS #IMPLIED „content“ ist so definiert, dass Klassen sowie ihre Subklassen, die an das „associationEnd“ gebunden sind, im XML-Element „r.“ verwendet werden können. 3.3.8 Beispiel einer DTD-Deklaration einer Assoziation Als Beispiel die Deklaration des XML-Elements und des XML-Attributs einer Klasse c1, verbunden mit dem Assoziationende r, die drei Unterklassen c2, c3 und c4 hat (wobei c3 eine abstrakte Klasse ist): <!ELEMENT r (c1 | c2 | c3 | c4)* > r IDREFS #IMPLIED Jedes Assoziationsende, das eine „Enthalten-in“-Beziehung darstellt, wird als eine XMLEntity und eine XML-Element dargestellt. Ist eine Klasse „c“ am „Containerende“ einer Kompositions-Assoziation, und das andere Assoziationsende hat die Rolle „r“ für eine Klasse „c1“ mit Unterklasse „c2“, ergibt das folgende Darstellung in der DTD: <!ELEMENT r (c1 | c2)* > <!ENTITY % cCompositions ‘XMI.extension | r’ > 4. UML-DTD Hier soll die in der Spezifikation verwendete UML-DTD untersucht werden. Dabei wird nur auf die für diese Studienarbeit relevanten Teile der DTD eingegangen, d.h. der Definition der Elemente von Klassenmodellen (Objektdiagramme können mit den verwendeten Tools nicht exportiert werden). Die DTDs der verwendeten Werkzeuge weichen in bestimmten Punkten 26 von dieser hier ab; auf die Darstellung der UML-Konzepte in XMI bei Ameos und Rational Rose wird in Abschnitt IV weiter eingegangen. 4.1 Einfaches Beispiel ( XMI-Dokument mit einer Klasse mit Attribut) Als einführendes Beispiel folgt hier ein UML-Klassenmodell als ein XMI-Dokument. Dieses Modell enthält eine einzige Klasse „C1“ mit einem Attribut „a1“ (mit Sichtbarkeit „private“). Im Element XMI wird die Version und der Namensbereich für UML deklariert (mit einer logischen URI). Das Element XMI.metamodel enthält ebenfalls den Namen („UML“) sowie einen Verweis auf einen physikalischen Speicherort, an dem sich die UML.xml-Datei befindet. Der Modell-Name heißt „example“. XMI.content enthält das Modell, hier nur eine Klasse mit Namen „C1“, die wiederum ein Attribut enthält, das innerhalb des UML-Classifier.feature-Tags in einem UML:Attribute-Tag deklariert ist. <XMI xmi.version="1.1" xmlns:UML="org.omg/standards/UML"> <XMI.header> <XMI.metamodel name="UML" version="1.3" href="UML.xml"/> <XMI.model name="example" version="1" href="example.xml"/> </XMI.header> <XMI.content> <UML:Class name="C1"> <UML:Classifier.feature> <UML:Attribute name="a1" visibility="private"/> </UML:Classifier.feature> </UML:Class> </XMI.content> </XMI> 4.2 Deklaration der verwendeten Elemente 4.2.1 Klasse Die Deklaration für eine Klasse in UML beschreibt, welche Elemente und Attribute in der Beschreibung einer Klasse vorkommen dürfen. In den Attributen kann im XMI-Dokument dann z.B. angegeben werden, ob die Klasse abstrakt ist (Zeile 44), eine Generalisierung (Zeile 61) oder Spezialisierung (Zeile 62) der Klasse kann referenziert werden oder der Name der Klasse wird angegeben (Zeile 40). Alle Attribute sind hier optional. Die Klasse kann weitere Elemente enthalten, z.B. können in UML:Classifier.feature-Tags Attribute enthalten sein. Eine minimale Deklaration einer Klasse gemäß dieser Spezifikation in einem XMI-Dokument wäre <UML:Class />. Auf diese Klasse könnte allerdings nicht referenziert werden, da keinerlei ID angegeben wurde. 1 2 3 4 5 6 7 8 9 10 11 <!ELEMENT UML:Class (UML:ModelElement.name | UML:ModelElement.visibility | UML:GeneralizableElement.isRoot | UML:GeneralizableElement.isLeaf | UML:GeneralizableElement.isAbstract | UML:Class.isActive | XMI.extension | UML:ModelElement.binding | UML:ModelElement.template | UML:ModelElement.templateParameter | UML:ModelElement.implementation | UML:ModelElement.view | 27 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 UML:ModelElement.presentation | UML:ModelElement.namespace | UML:ModelElement.constraint | UML:ModelElement.requirement | UML:ModelElement.provision | UML:ModelElement.stereotype | UML:ModelElement.elementReference | UML:ModelElement.collaboration | UML:ModelElement.behavior | UML:ModelElement.partition | UML:GeneralizableElement.generalization | UML:GeneralizableElement.specialization | UML:Classifier.parameter | UML:Classifier.structuralFeature | UML:Classifier.specification | UML:Classifier.realization | UML:Classifier.associationEnd | UML:Classifier.participant | UML:Classifier.createAction | UML:Classifier.instance | UML:Classifier.collaboration | UML:Classifier.classifierRole | UML:Classifier.classifierInState | UML:ModelElement.taggedValue | UML:Namespace.ownedElement | UML:Classifier.feature)* > <!ATTLIST UML:Class name CDATA #IMPLIED visibility (public | protected | private) #IMPLIED isRoot (false | true) #IMPLIED isLeaf (false | true) #IMPLIED isAbstract (false | true) #IMPLIED isActive (false | true) #IMPLIED binding IDREFS #IMPLIED template IDREFS #IMPLIED templateParameter IDREFS #IMPLIED implementation IDREFS #IMPLIED view IDREFS #IMPLIED presentation IDREFS #IMPLIED namespace IDREFS #IMPLIED constraint IDREFS #IMPLIED requirement IDREFS #IMPLIED provision IDREFS #IMPLIED stereotype IDREFS #IMPLIED elementReference IDREFS #IMPLIED ModelElement.collaboration IDREFS #IMPLIED behavior IDREFS #IMPLIED partition IDREFS #IMPLIED generalization IDREFS #IMPLIED specialization IDREFS #IMPLIED parameter IDREFS #IMPLIED structuralFeature IDREFS #IMPLIED specification IDREFS #IMPLIED realization IDREFS #IMPLIED associationEnd IDREFS #IMPLIED 28 68 69 70 71 72 73 74 75 76 participant IDREFS #IMPLIED createAction IDREFS #IMPLIED instance IDREFS #IMPLIED Classifier.collaboration IDREFS #IMPLIED classifierRole IDREFS #IMPLIED classifierInState IDREFS #IMPLIED %XMI.element.att; %XMI.link.att; > 29 4.2.2 Assoziation Eine Assoziation wird durch das Element UML:Association beschrieben. Dieses kann als Attribut z.B. einen Namen für die Assoziation enthalten. Eine Assoziation zwischen zwei Klassen „Class1“ und „Class2“ in einem XMI-Dokument kann beispielsweise so aussehen: <UML:Association name = 'Association1'> <UML:Association.connection> <UML:AssociationEnd name = 'end1' type = 'Class1'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> <UML:AssociationEnd name = 'end2'> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'Class2'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> Laut der DTD-Deklaration der Assoziation kann ein UML:Association.connection-Element enthalten sein (Zeile 27), dies wiederum kann ein UML:AssociationEnd-Element enthalten (Zeile 58). Nach der DTD-Spezifikation könnte das UML:Association-Element aber auch direkt ein Element UML:Association.associationEnd (Zeile 24) enthalten oder das Assoziationsende als Attribut enthalten (Zeile 53). Die Multiplizität kann im UML:AssociationEndElement beschrieben werden (Zeile 66). Soll eine Komposition dargestellt werden, kann hier z.B. auch das Attribut aggregation (Zeile 97) auf „composite“ gesetzt werden. Das hier von Ameos verwendete Tag UML:AssociationEnd.participant (bei der Beschreibung des 2. Assoziations-Endes) ist in der hier dargestellten Standard-XMI-Spezifikation nicht enthalten. Daher wäre obiges Dokument nach der „Standard“-UML-DTD der XMI-Spezifikation der OMG [XMI00] nicht gültig. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!ELEMENT UML:Association (UML:ModelElement.name | UML:ModelElement.visibility | UML:GeneralizableElement.isRoot | UML:GeneralizableElement.isLeaf | UML:GeneralizableElement.isAbstract | XMI.extension | UML:ModelElement.binding | UML:ModelElement.template | UML:ModelElement.templateParameter | UML:ModelElement.implementation | UML:ModelElement.view | UML:ModelElement.presentation | UML:ModelElement.namespace | UML:ModelElement.constraint | UML:ModelElement.requirement | UML:ModelElement.provision | 30 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 UML:ModelElement.stereotype | UML:ModelElement.elementReference | UML:ModelElement.collaboration | UML:ModelElement.behavior | UML:ModelElement.partition | UML:GeneralizableElement.generalization | UML:GeneralizableElement.specialization | UML:Association.link | UML:Association.associationEnd | UML:ModelElement.taggedValue | UML:Namespace.ownedElement | UML:Association.connection)* > <!ATTLIST UML:Association name CDATA #IMPLIED visibility (public | protected | private) #IMPLIED isRoot (false | true) #IMPLIED isLeaf (false | true) #IMPLIED isAbstract (false | true) #IMPLIED binding IDREFS #IMPLIED template IDREFS #IMPLIED templateParameter IDREFS #IMPLIED implementation IDREFS #IMPLIED view IDREFS #IMPLIED presentation IDREFS #IMPLIED namespace IDREFS #IMPLIED constraint IDREFS #IMPLIED requirement IDREFS #IMPLIED provision IDREFS #IMPLIED stereotype IDREFS #IMPLIED elementReference IDREFS #IMPLIED collaboration IDREFS #IMPLIED behavior IDREFS #IMPLIED partition IDREFS #IMPLIED generalization IDREFS #IMPLIED specialization IDREFS #IMPLIED link IDREFS #IMPLIED associationEnd IDREFS #IMPLIED %XMI.element.att; %XMI.link.att; > <!ELEMENT UML:Association.connection (UML:AssociationEnd | UML:AssociationEndRole)* > <!ELEMENT UML:AssociationEnd (UML:ModelElement.name | UML:ModelElement.visibility | UML:AssociationEnd.isNavigable | UML:AssociationEnd.isOrdered | UML:AssociationEnd.aggregation | UML:AssociationEnd.multiplicity | UML:AssociationEnd.changeable | UML:AssociationEnd.targetScope | XMI.extension | UML:ModelElement.binding | UML:ModelElement.template | UML:ModelElement.templateParameter | 31 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 UML:ModelElement.implementation | UML:ModelElement.view | UML:ModelElement.presentation | UML:ModelElement.namespace | UML:ModelElement.constraint | UML:ModelElement.requirement | UML:ModelElement.provision | UML:ModelElement.stereotype | UML:ModelElement.elementReference | UML:ModelElement.collaboration | UML:ModelElement.behavior | UML:ModelElement.partition | UML:AssociationEnd.type | UML:AssociationEnd.specification | UML:AssociationEnd.association | UML:AssociationEnd.linkEnd | UML:AssociationEnd.associationEndRole | UML:ModelElement.taggedValue | UML:AssociationEnd.qualifier)* > <!ATTLIST UML:AssociationEnd name CDATA #IMPLIED visibility (public | protected | private) #IMPLIED isNavigable (false | true) #IMPLIED isOrdered (false | true) #IMPLIED aggregation (none | shared | composite) #IMPLIED multiplicity CDATA #IMPLIED changeable (none | frozen | addOnly) #IMPLIED targetScope (classifier | instance) #IMPLIED binding IDREFS #IMPLIED template IDREFS #IMPLIED templateParameter IDREFS #IMPLIED implementation IDREFS #IMPLIED view IDREFS #IMPLIED presentation IDREFS #IMPLIED namespace IDREFS #IMPLIED constraint IDREFS #IMPLIED requirement IDREFS #IMPLIED provision IDREFS #IMPLIED stereotype IDREFS #IMPLIED elementReference IDREFS #IMPLIED collaboration IDREFS #IMPLIED behavior IDREFS #IMPLIED partition IDREFS #IMPLIED type IDREFS #IMPLIED specification IDREFS #IMPLIED association IDREFS #IMPLIED linkEnd IDREFS #IMPLIED associationEndRole IDREFS #IMPLIED %XMI.element.att; %XMI.link.att; 32 5. Beispieldiagramm 0..* isInput FunctionCall isCallee 0..* 0..* {ordered} isOutput 0..* 0..* 1 0..* Variable Function -name: String isCaller -name: String 1 Abbildung 3: UML-Klassendiagramm in Ameos (vergleiche auch Abschnitt II.4, [WiKuRi01]) Ein Export des Klassendiagramms aus Abbildung 3 mit Ameos in XMI ergibt die Datei in Anhang A. Eine genauere Erläuterung der Darstellung der einzelnen UML-Konzepte in XMI-Dateien findet sich im folgenden Abschnitt IV. 33 IV. UML-Konzepte für Klassendiagramme in XMI und GXL 1. Einleitung In diesem Abschnitt wird die Umsetzung verschiedener UML-Konzepte bei der textuellen Darstellung mit XMI und deren Umsetzung in Graphen, die mit GXL dargestellt werden können, behandelt. Dabei wird zuerst das entsprechende UML-Konzept graphisch skizziert und dieses in eine XMI-Darstellung überführt. Diese XMI-Umsetzung wird sowohl mit Ameos (Aonix) als auch mit Rational Rose (IBM) vorgenommen, da hier teilweise Unterschiede auftreten. Dann wird dieses UML-Konzept als GXL-Graph dargestellt, der dem GXLMetaschema entspricht. Im Rahmen der Studienarbeit wurde ein Werkzeug entwickelt, das die von Ameos und Rational Rose erzeugten XMI-Dateien in GXL-Graphen umsetzt (XMI2GXL), sowie GXLGraphen in XMI-Dateien umwandelt, die dann von Ameos und Rational Rose eingelesen werden können. Objektdiagramme sollten auch berücksichtigt werden, allerdings wurde im Laufe der Studienarbeit festgestellt, dass Rational Rose keine Objektdiagramme unterstützt und bei Ameos der XMI-Export von Objekten nicht implementiert ist. 2. UML-Konzepte 2.1 Klasse Abbildung 4: Einfache Klasse 2.1.1 Klasse: XMI-Darstellung Eine einfache Darstellung dieser Klasse ohne Attribute als XMI-Dokument ist im folgenden Listing dargestellt. Soll diese einfache Klasse ohne Attribute und Operationen als XMIDokument dargestellt werden, sind ausser den Headerinformationen nur die Informationen in Zeile 7 unbedingt erforderlich. Im Header wird hier auch der Dateiname angegeben (Zeile 3). 1 2 3 4 5 6 7 8 9 <XMI version="1.1" xmlns:UML="org.omg/UML1.3"> <XMI.header> <XMI.model xmi.name="Klasse" href="Klasse.xml"/> <XMI.metamodel xmi.name="UML" href="UML.xml"/> </XMI.header> <XMI.content> <UML:Class name="Class1" xmi.id="Class1"/> </XMI.content> </XMI> 34 2.1.1.1 Ameos Wird diese einfache Klasse mit Ameos modelliert und als XMI-Dokument exportiert, werden dem Dokument einige Informationen hinzugefügt, siehe hierzu das folgende Listing. In den Zeilen 1 bis 5 stehen die Headerinformationen, hier z.B. der verwendete Zeichensatz, die XMI-Version (Ameos unterstützt nur Version 1.1) und das verwendete Metamodell. Die Darstellung der Klasse findet sich in den Zeilen 10 bis 19, hier werden als Attribute die Eigenschaften der Klasse angeführt (Zeile 10 und 14 bis 17). In Zeile 11 wird dem Element eine eindeutige ID zugewiesen, mit der auf das Element von anderen Elementen aus verwiesen werden könnte. Anmerkung: Dies ist die vollständige exportierte Datei, bei den folgenden Listings wird der Übersichtlichkeit wegen nur der Teil zwischen <UML:Namespace.ownedElement> (Zeile 9) und </UML:Namespace.ownedElement> (Zeile 24) aufgeführt. Die Klasse „Container_class_for_objects_and_actors“ wird von Ameos jedem XMI-Dokument hinzugefügt. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?xml version="1.0" encoding= "ISO-8859-1"?> <XMI xmi.version="1.1" xmlns:UML = 'org.omg.xmi.namespace.UML'> <XMI.header> <XMI.metamodel xmi.name="UML" xmi.version="1.4" /> </XMI.header> <XMI.content> <UML:Model> <UML:Namespace.ownedElement> <UML:Class name = 'Class1' visibility = 'public' xmi.id = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' xmi.uuid = 'UID_887D2DBE-1976-4787-BDCFFB37367BE6C7' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Container_class_for_objects_and_actors' visibility = 'public' xmi.id = 'ID_DUMMY_CLASS' isRoot = 'true' isLeaf = 'true' isActive = 'true' /> </UML:Namespace.ownedElement> </UML:Model> </XMI.content> </XMI> 35 2.1.1.2 Rational Rose Auch beim Export aus Rational Rose werden dem Modell diverse Informationen hinzugefügt. In den Zeilen 1 bis 11 stehen die Headerinformationen, hier z.B. der verwendete Zeichensatz, die XMI-Version, das erzeugende Tool mit Versionsangabe und das verwendete Metamodell. Anschließend folgt eine Beschreibung der Eigenschaften des beschriebenen Modells (Zeile 13 bis 17). Die Darstellung der Klasse findet sich in den Zeilen 18 bis 23, hier werden als Attribute die Eigenschaften der Klasse angeführt (analog zum Export bei Ameos). In Zeile 19 wird dem Element eine eindeutige ID zugewiesen, mit der auf das Element von anderen Elementen aus verwiesen werden könnte. Im Gegensatz zu Ameos werden hier keine UUIDs zugewiesen, dies kann beim Export aber eingestellt werden („Generate UUIDs“). Ebenso kann die zu verwendende XMI-Version (1.0 oder 1.1) gewählt werden; im Rahmen dieses Dokuments wurde immer Version 1.1 verwendet. Anmerkung: Dies ist die vollständige exportierte Datei, bei den folgenden Listings wird der Übersichtlichkeit wegen nur der Teil zwischen <UML:Namespace.ownedElement> (Zeile 17) und </UML:Namespace.ownedElement> (Zeile 24) aufgeführt. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <?xml version = '1.0' encoding = 'ISO-8859-1'?> <!-- <!DOCTYPE XMI SYSTEM 'UML1311.dtd' > --> <XMI xmi.version = '1.1' xmlns:UML='href://org.omg/UML/1.3' timestamp = 'Tue Nov 16 23:40:04 2004' > <XMI.header> <XMI.documentation> <XMI.exporter>Unisys.JCR.1</XMI.exporter> <XMI.exporterVersion>1.3.6</XMI.exporterVersion> </XMI.documentation> <XMI.metamodel xmi.name = 'UML' xmi.version = '1.3'/> </XMI.header> <XMI.content> <!-- ==================== Klasse [Model] ==================== --> <UML:Model xmi.id = 'G.0' name = 'Klasse' visibility = 'public' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false' > <UML:Namespace.ownedElement> <!-- ==================== Klasse::Class1 [Class] ==================== --> <UML:Class xmi.id = 'S.320.2339.51.1' name = 'Class1' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> </UML:Namespace.ownedElement> </UML:Model> <UML:TaggedValue xmi.id = 'XX.16.2339.51.2' tag = 'persistence' value = 'transient' modelElement = 'S.320.2339.51.1' /> </XMI.content> </XMI> 36 2.1.2 Klasse: GXL-Darstellung Bei der Umsetzung dieser einfachen Klasse in ein GXL-Dokument ist nur die entsprechende (Knoten-)Klasse als Knoten des entsprechenden Knotentyps darzustellen (Zeile 10 bis 18). Anmerkung: Jedes Schema besitzt einen Knoten vom Typ GraphClass (hier: Zeile 4 bis 9), der mit contains-Kanten mit jedem Knoten des Schemas verbunden ist (hier: Zeile 19 bis 21). Dieser wird in den folgenden Beispielen zur Vereinfachung weggelassen. Ebenso werden in den folgenden Beispielen die Informationen, die den Graphen bezeichnen und sich nicht direkt auf die enthaltenen Elemente beziehen weggelassen; diese sind hier noch mit abgebildet (Zeile 1 bis 3, Zeile 22 und 23), Abbildung 5: Klasse als Graph 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <gxl xmlns:xlink="http://www.w3.org/1999/xlink"> <graph id="class-graph" edgeids="true" hypergraph="false" edgemode="directed"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#gxl-1.0"/> <node id="class-graph"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#GraphClass"/> <attr name="name"> <string>class-graph</string> </attr> </node> <node id="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass"/> <attr name="name"> <string>Class1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <edge id="edge1" from="class-graph" to="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#contains"/> </edge> </graph> </gxl> 37 2.2 Klasse mit Attribut Abbildung 6: Einfache Klasse mit einem Attribut 2.2.1 Klasse mit Attribut: XMI-Darstellung Eine einfache Darstellung gemäß der XMI-Spezifikation folgt im unten stehenden Listing (Header-Informationen wurden der Einfachheit halber wie auch bei den folgenden Beispielen weggelassen). Dabei wird zusätzlich zu den schon in Abschnitt 2.1.1 angeführten Beschreibungen für die Klasse ein UML:Classifier.feature-Tag deklariert, dass die Attribute enthält. Auf den verwendeten Attributstyp wird im type-Attribut verwiesen. 1 2 3 4 5 <UML:Class name="Class1" xmi.id="Class1"> <UML:Classifier.feature> <UML:Attribute xmi.id = “Attr1” name = “Attr1” type=”string”/> </UML:Classifier.feature> </UML:Class> 38 2.2.1.1 Ameos Nachfolgend die Darstellung dieser Klasse beim XMI-Export aus Ameos. In den Zeilen 1 bis 8 wird wie unter 2.1.1.1 die Klasse mit ihren Eigenschaften angegeben, die Zeilen 10 bis 25 enthalten die Daten über das Attribut und dessen Multiplizität. Es wird im UML:ClassifierTag ein Tag UML-Attribute deklariert, dass die Informationen über die verwendeten Attribute enthält. Der Typ des Attributs wird als Datatype (Zeile 28 bis 33) deklariert, auf dessen ID in der Deklaration des Attributs verwiesen wird (Zeile 15). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <UML:Class name = 'Class1' visibility = 'public' xmi.id = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' xmi.uuid = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > <UML:Classifier.feature> <UML:Attribute name = 'Attr1' xmi.id = 'UID_4037C9D1-3C59-4049-89F0-B0DCBA77D3A7' visibility ='public' xmi.uuid = 'UID_4037C9D1-3C59-4049-89F0-B0DCBA77D3A7' comment = '' type = 'TP_UID_4037C9D1-3C59-4049-89F0-B0DCBA77D3A7' ownerScope = 'instance'> <UML:StructuralFeature.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '1' upper = '1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:StructuralFeature.multiplicity> </UML:Attribute> </UML:Classifier.feature> </UML:Class> <UML:DataType xmi.id = 'TP_UID_4037C9D1-3C59-4049-89F0-B0DCBA77D3A7' name ='string' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' /> 39 2.2.1.2 Rational Rose Beim Export dieser Klasse aus Rational Rose wird wie unter 2.1.1.2 die Klasse mit ihren Eigenschaften angegeben (Zeile 1 bis 6), die Zeilen 8 bis 28 enthalten (analog zur Darstellung in Ameos) die Daten über das Attribut. Auch wird bei Rational Rose der hier verwendete Datentyp „String“ als DataType in der XMI-Datei angeführt (Zeile 30 bis 33). Auf diesen Datentyp wird von dem Attribut, dass ihn benötigt, verwiesen (Zeile 14). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <!-- ==================== Klasse::Class1 [Class] ==================== --> <UML:Class xmi.id = 'S.322.1814.55.1' name = 'Class1' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' > <UML:Classifier.feature> <!-- ==================== Klasse::Class1.Attr1 [Attribute] ==================== --> <UML:Attribute xmi.id = 'S.322.1814.55.2' name = 'Attr1' visibility = 'public' isSpecification = 'false' ownerScope = 'instance' changeability = 'changeable' targetScope = 'instance' type = 'G.1' > <UML:StructuralFeature.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.3231714.1' lower = '1' upper = '1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:StructuralFeature.multiplicity> <UML:Attribute.initialValue> <UML:Expression language = '' body = '' /> </UML:Attribute.initialValue> </UML:Attribute> </UML:Classifier.feature> </UML:Class> <!-- ==================== String [DataType] ==================== --> <UML:DataType xmi.id = 'G.1' name = 'String' visibility = 'public' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false' /> 40 2.2.2 Klasse mit Attribut: GXL-Darstellung Bei der Umsetzung in GXL werden Attribute durch Knoten vom entsprechenden Knotentyp umgesetzt, die Klasse selbst wird als Knoten wie in Punkt 2.1.2 beschrieben dargestellt (Zeile 1 bis 9). Das Attribut wird ebenfalls als Knoten vom Type AttributeClass dargestellt (Zeile 10 bis 15) und ist durch eine Kante vom Typ hasAttribute mit der Klasse verbunden (Zeile 19 bis 21). Der Typ des Attributs wird ebenfalls als Knoten dargestellt und mit dem Attributsknoten verbunden (Zeile 16 bis 18, Zeile 22 bis 24). Abbildung 7: Klasse mit Attribut als Graph 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <node id="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass"/> <attr name="name"> <string>Class1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <node id="Attr1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#AttributeClass"/> <attr name="name"> <string>Attr1</string> </attr> </node> <node id="domainString"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#String"/> </node> <edge id="e1" from="Class1" to="Attr1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#hasAttribute"/> </edge> <edge id="e2" from="Attr1" to="domainString"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#hasDomain"/> </edge> 41 2.3 Assoziation Abbildung 8: Assoziation 2.3.1 Assoziation: XMI-Darstellung Eine einfache Darstellung von Abbildung 8 gemäß der XMI-Spezifikation (ohne Beachtung der Multiplizitäten) wäre: <UML:Class name="Class1" xmi.id="Class1"/> <UML:Class name=" Class 2" xmi.id=" Class 2"/> <UML:Association name ="Association1" > <UML:Association.connection> <UML:AssociationEnd type="Class1"/> <UML:AssociationEnd type="Class2"/> </UML:Association.connection> </UML:Association> 2.3.1.1 Ameos Im folgenden Listing folgt das Ergebnis des XMI-Export aus Ameos dieser beiden assoziierten Klassen. Hierbei werden zuerst die beiden Klassen beschrieben (Zeile 1 bis 9 und Zeile 10 bis 18). In den Zeilen 22 bis 70 wird dann die Assoziation dargestellt, die beiden assoziierten Klassen werden anhand ihrer ID referenziert (Zeile 43 bis 45 bzw. Zeile 64 bis 66). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <UML:Class name = 'Class2' visibility = 'public' xmi.id = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' xmi.uuid = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Class1' visibility = 'public' xmi.id = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' xmi.uuid = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Container_class_for_objects_and_actors' visibility = 'public' xmi.id = 'ID_DUMMY_CLASS' isRoot = 'true' isLeaf = 'true' isActive = 'true' /> <UML:Association name = 'Association1' xmi.uuid = 'UID_92C80B8A-0437-45de-A3CC-78ABD5DC2AAF' 42 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 xmi.id = 'UID_92C80B8A-0437-45de-A3CC-78ABD5DC2AAF'> <UML:Association.connection> <UML:AssociationEnd name = '' xmi.id = 'UID_47CD32C3-FA80-4ec4-881C-85C68883DB35' xmi.uuid = 'UID_47CD32C3-FA80-4ec4-881C-85C68883DB35' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_52019E47-3FC0-43d8-A954-77F243351B70'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd name = '' xmi.id = 'UID_C5F1D598-24C4-4c90-B6D6-109FFDBC9605' xmi.uuid = 'UID_C5F1D598-24C4-4c90-B6D6-109FFDBC9605' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> 43 2.3.1.2 Rational Rose Beim XMI-Export aus Rational Rose werden die beiden Klassen wie in Abschnitt 2.1.1.2 beschrieben (Zeile 41 bis 54) dargestellt. In den Zeilen 1 bis 40 wird die Assoziation zwischen diesen beiden Klassen dargestellt, die beiden assoziierten Klassen werden anhand ihrer ID referenziert (Zeile 13 und Zeile 29). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <!-- ==================== Assoziation::Association1{419A87AB003E} [Association] ==================== --> <UML:Association xmi.id = 'G.1' name = 'Association1' visibility = 'public' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false' > <UML:Association.connection> <!-- ==================== Assoziation::Association1{419A87AB003E}.(Role1) [AssociationEnd] ==================== --> <UML:AssociationEnd xmi.id = 'G.2' name = '' visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered' aggregation = 'none' targetScope = 'instance' changeability = 'changeable' type = 'S.321.0019.23.2' > <UML:AssociationEnd.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.3212319.1' lower = '0' upper = '-1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> <!-- ==================== Assoziation::Association1{419A87AB003E}.(Role2) [AssociationEnd] ==================== --> <UML:AssociationEnd xmi.id = 'G.3' name = '' visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered' aggregation = 'none' targetScope = 'instance' changeability = 'changeable' type = 'S.321.0019.23.1' > <UML:AssociationEnd.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.3212319.2' lower = '0' upper = '1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> <!-- ==================== Assoziation::Class1 [Class] ==================== --> <UML:Class xmi.id = 'S.321.0019.23.1' name = 'Class1' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> <!-- ==================== Assoziation::Class2 [Class] ==================== --> <UML:Class xmi.id = 'S.321.0019.23.2' 44 49 50 51 52 name = 'Class2' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> 45 2.3.2 Assoziation: GXL-Darstellung Assoziationen werden bei der Umsetzung in TGraphen zu Knoten vom entsprechenden Typ. Multiplizitäten werden als Attribute der Kanten, die die entsprechenden Knoten (Klasse und Assoziation) verbinden, dargestellt. Class1: NodeClass -name = "Class1" -isAbstract = "false" edge1: from -limits = (0, -1) -isOrdered = "false" Association1: EdgeClass -name = "Association1" -isAbstract = "false" -isDirected = "false" edge2: to -limits = (0,1) -isOrdered = "false" Class2: NodeClass -name = "Class2" -isAbstract = "false" Abbildung 9: Assoziazion als GXL-Graph 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <node id="Association1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#EdgeClass"/> <attr name="name"> <string>Association1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> <attr name="isdirected"> <bool>false</bool> </attr> </node> <node id="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass"/> <attr name="name"> <string>Class1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <node id="Class2"> 46 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass"/> <attr name="name"> <string>Class2</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <edge id="edge1" from="Association1" to="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#from"/> <attr name="limits"> <tup> <int>0</int> <int>-1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> </edge> <edge id="edge2" from="Association1" to="Class2"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#to"/> <attr name="limits"> <tup> <int>0</int> <int>1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> </edge> 47 2.4 Aggregation 1 Class1 Class2 0..* Abbildung 10: Aggregation 2.4.1 Aggregation: XMI-Darstellung Bei der Umsetzung von Abbildung 10 gemäß der XMI-Spezifikation werden zuerst die beiden Klassen definiert (Zeile 1 und 2). Die Aggregation selbst wird als Assoziation dargestellt (Zeile 3 bis 16), dabei wird das entsprechende Attribut aggregation entsprechend dem Ende der Assoziation gesetzt (Zeile 5 und 10). Zur Vereinfachung wurden hier die Multiplizitäten ignoriert. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <UML:Class name="Class1" xmi.id="Class1"/> <UML:Class name=" Class 2" xmi.id="Class 2"/> <UML:Association> <UML:Association.connection> <UML:AssociationEnd xmi.id=”assocEnd1” aggregation = 'aggregate'> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'Class2'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd xmi.id=”assocEnd2”aggregation = 'none'/> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'Class1'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> 48 2.4.1.1 Ameos Beim XMI-Export aus Ameos werden zuerst wieder die beiden Klassen abgebildet (Zeile 1 bis 17), die Aggregation wird als Assoziation dargestellt (ab Zeile 22), deren Attribut aggregation entsprechend gesetzt wird (Zeile 32 und 52). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <UML:Class name = 'Class2' visibility = 'public' xmi.id = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' xmi.uuid = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Class1' visibility = 'public' xmi.id = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' xmi.uuid = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Container_class_for_objects_and_actors' visibility = 'public' xmi.id = 'ID_DUMMY_CLASS' isRoot = 'true' isLeaf = 'true' isActive = 'true' /> <UML:Association name = '' ' xmi.uuid = 'UID_92C80B8A-0437-45de-A3CC-78ABD5DC2AAF' xmi.id = 'UID_92C80B8A-0437-45de-A3CC-78ABD5DC2AAF'> <UML:Association.connection> <UML:AssociationEnd name = '' xmi.id = 'UID_47CD32C3-FA80-4ec4-881C-85C68883DB35' xmi.uuid = 'UID_47CD32C3-FA80-4ec4-881C-85C68883DB35' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'aggregate'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '1' upper = '1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_52019E47-3FC0-43d8-A954-77F243351B70'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd name = '' xmi.id = 'UID_C5F1D598-24C4-4c90-B6D6-109FFDBC9605' xmi.uuid = 'UID_C5F1D598-24C4-4c90-B6D6-109FFDBC9605' visibility = 'public' 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> 50 2.4.1.2 Rational Rose Beim Export aus Rational Rose werden die beiden Klassen wie in den vorangehenden Beispielen dargestellt (Zeile 41 bis 54). Die Aggregation wird als Assoziation dargestellt, das Attribut aggregation wird entsprechend gesetzt (Zeile 11 und 27). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <!-- ==================== Aggregation::{Class2-Class1}{419CF1E70213} [Association] ==================== --> <UML:Association xmi.id = 'G.1' name = '' visibility = 'public' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false' > <UML:Association.connection> <!-- ==================== Aggregation::{Class2-Class1}{419CF1E70213}. (Role1) [AssociationEnd] ==================== --> <UML:AssociationEnd xmi.id = 'G.2' name = '' visibility = 'public' isSpecification = 'false' isNavigable = 'false' ordering = 'unordered' aggregation = 'aggregate' targetScope = 'instance' changeability = 'changeable' type = 'S.322.2005.01.2' > <UML:AssociationEnd.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.3231905.1' lower = '1' upper = '1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> <!-- ==================== Aggregation::{Class2-Class1}{419CF1E70213}. (Role2) [AssociationEnd] ==================== --> <UML:AssociationEnd xmi.id = 'G.3' name = '' visibility = 'public' isSpecification = 'false' isNavigable = 'false' ordering = 'unordered' aggregation = 'none' targetScope = 'instance' changeability = 'changeable' type = 'S.322.2005.01.1' > <UML:AssociationEnd.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.3231905.2' lower = '0' upper = '-1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> <!-- ==================== Aggregation::Class1 [Class] ==================== --> <UML:Class xmi.id = 'S.322.2005.01.1' name = 'Class1' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> <!-- ==================== Aggregation::Class2 [Class] ==================== --> <UML:Class xmi.id = 'S.322.2005.01.2' name = 'Class2' visibility = 'public' isSpecification = 'false' 51 50 51 52 isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> 52 2.4.2 Aggregation: GXL-Darstellung Bei der Umsetzung in GXL wird die Aggregation als Knoten vom Typ „AggregationClass“ dargestellt (Zeile 19 bis 33) und mit Kanten (Zeile 34 bis 57) mit den beteiligten Klassen (Zeile 1 bis 18) verbunden). Diese Kanten enthalten als Attribut die Multiplizität. Abbildung 11: Aggregation als GXL-Graph 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <node id="Class2"> <type xlink:href="#NodeClass"/> <attr name="name"> <string>Class1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <node id="Class1"> <type xlink:href="#NodeClass"/> <attr name="name"> <string>Class2</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> 53 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 <node id="Aggr1"> <type xlink:href="#AggregationClass"/> <attr name="name"> <string></string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> <attr name="isdirected"> <bool>false</bool> </attr> <attr name="aggregate"> <enum>to</enum> </attr> </node> <edge id="edge1" from="Aggr1" to="Class1"> <type xlink:href="#to"/> <attr name="limits"> <tup> <int>0</int> <int>-1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> </edge> <edge id="edge2" from="Aggr1" to="Class2"> <type xlink:href="#from"/> <attr name="limits"> <tup> <int>1</int> <int>1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> </edge> 54 2.5 Komposition Abbildung 12: Komposition 2.5.1 Komposition: XMI-Darstellung Eine einfache Darstellung von Abbildung 12 gemäß der XMI-Spezifikation (analog zur Darstellung der Aggregation in Abschnitt 2.5.1) wäre: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <UML:Class name="Class1" xmi.id="Class1"/> <UML:Class name=" Class 2" xmi.id="Class 2"/> </UML:Association> <UML:Association.connection> <UML:AssociationEnd xmi.id=”assocEnd1” aggregation = “composite”> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = “Class2”/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd xmi.id=”assocEnd2”aggregation = “none”/> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = “Class1”/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> 55 2.5.1.1 Ameos Beim XMI-Export aus Ameos wird die Komposition als Assoziation vom Typ „composite“ dagestellt (Zeile 22 bis 70). Das Attribut aggregate wird hier auf „composite“ gesetzt. Der Rest ergibt sich aus den Erläuterungen zur Aggregation (Abschnitt 2.4.1.1). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 <UML:Class name = 'Class2' visibility = 'public' xmi.id = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' xmi.uuid = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Class1' visibility = 'public' xmi.id = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' xmi.uuid = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Container_class_for_objects_and_actors' visibility = 'public' xmi.id = 'ID_DUMMY_CLASS' isRoot = 'true' isLeaf = 'true' isActive = 'true' /> <UML:Association name = '' ' xmi.uuid = 'UID_92C80B8A-0437-45de-A3CC-78ABD5DC2AAF' xmi.id = 'UID_92C80B8A-0437-45de-A3CC-78ABD5DC2AAF'> <UML:Association.connection> <UML:AssociationEnd name = '' xmi.id = 'UID_47CD32C3-FA80-4ec4-881C-85C68883DB35' xmi.uuid = 'UID_47CD32C3-FA80-4ec4-881C-85C68883DB35' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'composite'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '1' upper = '1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_52019E47-3FC0-43d8-A954-77F243351B70'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd name = '' xmi.id = 'UID_C5F1D598-24C4-4c90-B6D6-109FFDBC9605' xmi.uuid = 56 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 'UID_C5F1D598-24C4-4c90-B6D6-109FFDBC9605' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> 57 2.5.1.2 Rational Rose Beim XMI-Export aus Rational Rose wird die Komposition (zu modellieren als Aggregation und Angabe von „Containment of Class2“ als „by value“) wie bei Ameos als Assoziation von Type „composite“ dargestellt (Zeile 11 und 27). Das Attribut aggregate wird hier auf „composite“ gesetzt. Der Rest ergibt sich aus den Erläuterungen zur Aggregation (Abschnitt 2.4.1.2). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <!-- ==================== komposition::{Class2-Class1}{42614F5C00BB} [Association] ==================== --> <UML:Association xmi.id = 'G.1' name = '' visibility = 'public' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false' > <UML:Association.connection> <!-- ==================== komposition::{Class2-Class1}{42614F5C00BB}. (Role1) [AssociationEnd] ==================== --> <UML:AssociationEnd xmi.id = 'G.2' name = '' visibility = 'public' isSpecification = 'false' isNavigable = 'false' ordering = 'unordered' aggregation = 'composite' targetScope = 'instance' changeability = 'changeable' type = 'S.105.1947.00.2' > <UML:AssociationEnd.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.1061747.1' lower = '0' upper = '-1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> <!-- ==================== komposition::{Class2-Class1}{42614F5C00BB}. (Role2) [AssociationEnd] ==================== --> <UML:AssociationEnd xmi.id = 'G.3' name = '' visibility = 'public' isSpecification = 'false' isNavigable = 'false' ordering = 'unordered' aggregation = 'none' targetScope = 'instance' changeability = 'changeable' type = 'S.105.1947.00.1' > <UML:AssociationEnd.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.1061747.2' lower = '0' upper = '-1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> <!-- ==================== komposition::Class1 [Class] ==================== --> <UML:Class xmi.id = 'S.105.1947.00.1' name = 'Class1' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> <!-- ==================== komposition::Class2 [Class] ==================== --> 58 48 49 50 51 52 <UML:Class xmi.id = 'S.105.1947.00.2' name = 'Class2' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> 59 2.5.2 Komposition: GXL-Darstellung Bei der Umsetzung in GXL wird die Komposition (analog zur Aggregation) als Knoten vom Typ „CompositionClass“ dargestellt (Zeile 19 bis 33) und mit Kanten (Zeile 34 bis 57) mit den beteiligten Klassen (Zeile 1 bis 18) verbunden). Abbildung 13: Komposition als GXL-Graph 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <node id="Class2"> <type xlink:href="#NodeClass"/> <attr name="name"> <string>Class2</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <node id="Class1"> <type xlink:href="#NodeClass"/> <attr name="name"> <string>Class1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> 60 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 </node> <node id="Composition1"> <type xlink:href="#CompositionClass"/> <attr name="name"> <string></string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> <attr name="isdirected"> <bool>true</bool> </attr> <attr name="aggregate"> <enum>to</enum> </attr> </node> <edge id="edge1" from="Composition1" to="Class2"> <type xlink:href="#from"/> <attr name="limits"> <tup> <int>1</int> <int>1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> </edge> <edge id="edge2" from="Composition1" to="Class1"> <type xlink:href="#to"/> <attr name="limits"> <tup> <int>0</int> <int>-1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> </edge> 61 2.6 Generalisierung Abbildung 14: Generalisierung 2.6.1 Generalisierung: XMI-Darstellung Eine einfache Darstellung von Abbildung 14 gemäß der XMI-Spezifikation wäre: <UML:Class name="Class1" xmi.id="Class1" generalization="Class2"/> <UML:Class name=" Class 2" xmi.id=" Class 2" isAbstract=”true”/> 2.6.1.1 Ameos Beim XMI-Export aus Ameos werden die Knoten wie bei den vorigen Beispielen beschrieben dargestellt (hier Zeile 4 bis 31); bei der Darstellung der Generalisierung (Zeile 1 bis 13) wird mittels der ID wieder auf die entsprechenden Elemente verwiesen, dabei wird zwischen Child- und Parent-Element unterschieden. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <UML:Generalization xmi.id = 'UID_0CEC8AC7-6F76-4f17-802B-093BBD13CAE5' xmi.uuid = 'UID_0CEC8AC7-6F76-4f17-802B-093BBD13CAE5' name = '' > <UML:Generalization.child> <UML:GeneralizableElement xmi.idref = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7'/> </UML:Generalization.child> <UML:Generalization.parent> <UML:GeneralizableElement xmi.idref = 'UID_52019E47-3FC0-43d8-A954-77F243351B70'/> </UML:Generalization.parent> </UML:Generalization> <UML:Class name = 'Class2' visibility = 'public' xmi.id = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' xmi.uuid = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' isAbstract = 'true' isRoot = 'true' isLeaf = 'false' isActive = 'false' > </UML:Class> <UML:Class name = 'Class1' visibility = 'public' xmi.id = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' xmi.uuid = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' isAbstract = 'false' isRoot = 'false' isLeaf = 'true' isActive = 'false' > </UML:Class> 62 2.6.1.2 Rational Rose Rational Rose exportiert die zwei Klassen wie in den vorangegangenen Beispielen. Dabei wird zusätzlich als Attribut von „Class1“ ein Verweis auf die Generalisierung (Zeile 8) eingefügt, die innerhalb der Klasse deklariert wird (Zeile 9 bis 14). Dabei verweisen die Attribute child und parent auf die beteiligten Elemente (Zeile 13). In „Class2“ wird das Attribut specialization als ein Verweis auf die Generalisierung deklariert (Zeile 23). Hier zeigt sich ein erster deutlicher Unterschied im Export zu Ameos. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <!-- ==================== Generalisierung::Class1 [Class] ==================== --> <UML:Class xmi.id = 'S.322.1909.23.1' name = 'Class1' visibility = 'public' isSpecification = 'false' isRoot = 'false' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' generalization = 'G.1' > <UML:Namespace.ownedElement> <UML:Generalization xmi.id = 'G.1' name = '' visibility = 'public' isSpecification = 'false' discriminator = '' child = 'S.322.1909.23.1' parent = 'S.322.1909.23.2' /> </UML:Namespace.ownedElement> </UML:Class> <!-- ==================== Generalisierung::Class2 [Class] ==================== --> <UML:Class xmi.id = 'S.322.1909.23.2' name = 'Class2' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'false' isAbstract = 'true' isActive = 'false' namespace = 'G.0' specialization = 'G.1' /> 63 2.6.2 Generalisierung: GXL-Darstellung Bei der Umsetzung der Generalisierung in GXL-Graphen werden die beiden Klassen als Knoten dargestellt, die mit einer Kante vom Typ „isA“ verbunden sind. Class1: NodeClass edge1: isA -name = "Class1" -isAbstract = "false" Class2: NodeClass -name = "Class2" -isAbstract = "true" Abbildung 15: Generalisierung als GXL-Graph 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <node id="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass"/> <attr name="name"> <string>Class1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <node id="Class2"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass"/> <attr name="name"> <string>Class2</string> </attr> <attr name="isabstract"> <bool>true</bool> </attr> </node> <edge id="edge1" from="Class1" to="Class2"> <type xlink:href="#isA"/> </edge> 64 2.7 Package Package1 Class1 Class2 Abbildung 16: Package mit zwei Klassen 2.7.1 Package: XMI-Darstellung 2.7.1.1 Ameos Packages werden unter XMI als UML:Package-Elemente beschrieben; diese enthalten die im Package enthaltenen Elemente (hier also die beiden Klassen). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <UML:Package xmi.id = 'UID_A1CF8ABF-7781-444b-B101-390C3C001ADF' xmi.uuid = 'UID_A1CF8ABF-7781-444b-B101-390C3C001ADF' name = 'Package1' visibility = 'public' isRoot = 'true' isLeaf = 'true'> <UML:Namespace.ownedElement> <UML:Class name = 'Class1' visibility = 'public' xmi.id = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' xmi.uuid = 'UID_887D2DBE-1976-4787-BDCF-FB37367BE6C7' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Class2' visibility = 'public' xmi.id = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' xmi.uuid = 'UID_52019E47-3FC0-43d8-A954-77F243351B70' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> </UML:Namespace.ownedElement> </UML:Package> 65 2.7.1.2 Rational Rose Auch in Rational Rose werden Packages als UML:Package-Elemente beschrieben, in denen dann die enthaltenen Elemente deklariert werden. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <!-- ==================== Package::Package1 [Package] ==================== -> <UML:Package xmi.id = 'S.322.2038.46.1' name = 'Package1' visibility = 'public' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false' namespace = 'G.0' > <UML:Namespace.ownedElement> <!-- ==================== Package::Package1::Class1 [Class] ==================== --> <UML:Class xmi.id = 'S.322.2038.46.2' name = 'Class1' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'S.322.2038.46.1' /> <!-- ==================== Package::Package1::Class2 [Class] ==================== --> <UML:Class xmi.id = 'S.322.2038.46.3' name = 'Class2' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'S.322.2038.46.1' /> </UML:Namespace.ownedElement> </UML:Package> 66 2.7.2 Package: GXL-Darstellung Bei der Umsetzung in GXL werden in einem Package enthaltene Klassen über eine hasAsComponentGraph-Kante (Zeile 34 bis 48) mit einem Knoten vom Typ GraphClass (Zeile 28 bis 33) verbunden, dieser ist über contains-Kanten (Zeile 49 bis 54) mit denen im Package enthaltenen Knoten verbunden. Packages werden in GXL also hier als hierarchische Graphen umgesetzt. Package1: NodeClass edge1: hasAsComponentGraph -name = "Package1" -abstract = "false" innerGraph: GraphClass -name = "packageGraph" edge2: contains edge3: contains Class1: NodeClass Class2: NodeClass -name = "Class1" -abstract = "false" -name = "Class2" -abstract = "false" Abbildung 17: Package als GXL-Darstellung 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <node id="Package1"> <type xlink:href="#NodeClass"/> <attr name="name"> <string>Package1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <node id="Class1"> <type xlink:href="#NodeClass"/> <attr name="name"> <string>Class1</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <node id="Class2"> <type xlink:href="#NodeClass"/> <attr name="name"> <string>Class2</string> </attr> <attr name="isabstract"> <bool>false</bool> </attr> </node> <node id="innerGraph"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#GraphClass"/> <attr name="name"> <string>innerGraph</string> </attr> 67 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 </node> <edge id="edge1" from="Package1" to="innerGraph"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#hasAsComponentGraph"/> <attr name="limits"> <tup> <int>1</int> <int>1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> <attr name="role"> <string></string> </attr> </edge> <edge id="edge2" from="innerGraph" to="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#contains"/> </edge> <edge id="edge3" from="innerGraph" to="Class2"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#contains"/> </edge> 68 2.8 Assoziations-Klasse Abbildung 18: Assoziations-Klasse 2.8.1 Assoziations-Klasse: XMI-Darstellung 2.8.1.2 Ameos Assoziations-Klassen können nach meinem Wissen nicht mit Ameos (Version 9.1.5) modelliert werden. 2.8.1.2 Rational Rose Beim Export aus Rational Rose werden die beiden Klassen wie in den vorangehenden Beispielen dargestellt (Zeile 1 bis 14). In den Zeilen 15 bis 55 wird die Assoziations-Klasse beschrieben, die beiden verbundenen Klassen werden in den Zeilen 22 bis 55 angegeben. Enthält die Assoziations-Klasse Attribute, werden diese wie in UML:Class-Elementen (siehe Abschnitt 2.2.1.2) innerhalb des UML:AssociationClass-Elements als UML:Classifier.featureElemente eingebunden (Zeile 56 bis 76). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <!-- ==================== Assoziationsklasse::Class1 [Class] ==================== --> <UML:Class xmi.id = 'S.109.0133.08.1' name = 'Class1' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> <!-- ==================== Assoziationsklasse::Class2 [Class] ==================== --> <UML:Class xmi.id = 'S.109.0133.08.2' name = 'Class2' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' isActive = 'false' namespace = 'G.0' /> <!-- ==================== Assoziationsklasse::AssociationClass1 [AssociationClass] ==================== --> <UML:AssociationClass xmi.id = 'S.109.0133.08.3' name = 'AssociationClass1' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'true' isActive = 'false' namespace = 'G.0' > <UML:Association.connection> <!-- ==================== Assoziationsklasse::AssociationClass1. 69 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 (Role1) [AssociationEnd] ==================== --> <UML:AssociationEnd xmi.id = 'G.2' name = '' visibility = 'public' isSpecification = 'false' isNavigable = 'true' ordering = 'unordered' aggregation = 'none' targetScope = 'instance' changeability = 'changeable' type = 'S.109.0133.08.2' > <UML:AssociationEnd.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.1092333.2' lower = '0' upper = '-1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> <!-- ==================== Assoziationsklasse::AssociationClass1. (Role2) [AssociationEnd] ==================== --> <UML:AssociationEnd xmi.id = 'G.3' name = '' visibility = 'public' isSpecification = 'false' isNavigable = 'false' ordering = 'unordered' aggregation = 'none' targetScope = 'instance' changeability = 'changeable' type = 'S.109.0133.08.1' > <UML:AssociationEnd.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.1092333.3' lower = '0' upper = '-1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> </UML:AssociationEnd> </UML:Association.connection> <UML:Classifier.feature> <!-- ==================== Assoziationsklasse::AssociationClass1. AssocAttribute1 [Attribute] ==================== --> <UML:Attribute xmi.id = 'S.109.0133.08.4' name = 'AssocAttribute1' visibility = 'private' isSpecification = 'false' ownerScope = 'instance' changeability = 'changeable' targetScope = 'instance' type = 'G.4' > <UML:StructuralFeature.multiplicity> <UML:Multiplicity > <UML:Multiplicity.range> <UML:MultiplicityRange xmi.id = 'id.1092333.1' lower = '1' upper = '1' /> </UML:Multiplicity.range> </UML:Multiplicity> </UML:StructuralFeature.multiplicity> <UML:Attribute.initialValue> <UML:Expression language = '' body = '' /> </UML:Attribute.initialValue> </UML:Attribute> </UML:Classifier.feature> </UML:AssociationClass> 70 2.8.2 Assoziations-Klasse: GXL-Darstellung Bei der Umsetzung in TGraphen werden Assoziations-Klassen als Knoten vom Typ AssociationClass dargestellt (oder entsprechend als AggreationClass bzw. CompositionClass). Attribute werden wie unter 2.2 beschrieben umgesetzt. Abbildung 19: Assoziations-Klasse als GXL-Darstellung (ohne hasDomain-Kante und Knoten für Attributstyp) <node id="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass" /> <attr name="name"> <string>Class1</string> </attr> <attr name="isAbstract"> <bool>false</bool> </attr> </node> <node id="Class2"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass" /> <attr name="name"> <string>Class2</string> </attr> <attr name="isAbstract"> <bool>false</bool> </attr> </node> <node id="AssociationClass1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#EdgeClass" /> <attr name="name"> <string>AssociationClass1</string> 71 </attr> <attr name="isabstract"> <bool>false</bool> </attr> <attr name="isdirected"> <bool>true</bool> </attr> <attr name="aggregate"> <enum>from</enum> </attr> </node> <edge id="edge1" from=" AssociationClass1" to="Class2"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#from" /> <attr name="limits"> <tup> <int>0</int> <int>-1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> </edge> <edge id="edge2" from=" AssociationClass1" to="Class1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#to" /> <attr name="limits"> <tup> <int>0</int> <int>-1</int> </tup> </attr> <attr name="isordered"> <bool>false</bool> </attr> </edge> <node id="AssocAttribute1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#AttributeClass"/> <attr name="name"> <string>AssocAttribute1</string> </attr> </node> <node id="domainString"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#String"/> </node> <edge id="e1" from="Class1" to="Attr1"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#hasAttribute"/> </edge> <edge id="e2" from="Attr1" to="domainString"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#hasDomain"/> </edge> 72 V. JAXP/XSLT 1. Einleitung In diesem Abschnitt sollen kurz die zur Auswahl stehenden Möglichkeiten der Realisierung des XMI↔GXL-Konverters vorgestellt werden. Dabei werden das Java API for XML Parsing (JAXP) sowie XSLT betrachtet. Es wird eine Auswahl getroffen, welche Programmiersprache zur Umsetzung der Konvertierung von (den von Ameos und Rational Rose) erstellten XMIDokumenten in GXL-Dokumente und zurück am effektivsten benutzt werden kann; damit werden dann die in vorangegangenden Dokumenten beschriebenden Umsetzungen realisiert. 2. JAXP Der W3C-Standard, um XML-Daten zu verarbeiten, ist das DOM (Document Object Model). Der Datenzugriff erfolgt hier über einen Objektbaum. Mit DOM können XML-Dokumente gelesen und erzeugt werden. Das API, um über Java auf XML zugreifen zu können, heißt JAXP (Java API for XML Parsing) und umfasst neben DOM auch SAX (Simple API for XML) und XSLT. Im Gegensatz zu DOM wird bei SAX das Dokument sequentiell durchlaufen, außerdem können XML-Dokumente nur gelesen, aber nicht erzeugt werden. JAXP ist ab J2SE 1.4 enthalten. Die folgenden Beispiele wurden aus den Beispielen unter [JAXP04] abgeleitet. 2.1 Benötigte Klassen Die folgenden Klassen sind einzubinden, um das DOM-API zu benutzen: import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; Um Exceptions beim Parsen des XML-Dokuments abfangen zu können, werden folgende Klassen benötigt: import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; Um das XML-Dokument einzulesen und Fehlermeldungen abzufangen, müssen die folgenden Klassen eingebunden werden: import java.io.File; import java.io.IOException; Außerdem sind noch die W3C Definitionen für DOM und DOM-Exceptions zu importieren: import org.w3c.dom.Document; import org.w3c.dom.DOMException; Zur Vereinfachung (und um zusätzlich benötigte Klassen, z.B. zum Zugriff auf einzelne Elemente, hinzuzufügen), kann man auch einfach alle evtl. benötigten Klassen importieren: 73 import java.io.*; import org.xml.sax.*; import org.w3c.dom.*; import javax.xml.parsers.*; Das Zusammenspiel der einzelnen Elemente ist in Abbildung 20 dargestellt. Die vorhandenen XML-Daten werden über den DocumentBuilder (der auf Funktionen der DocumentBuilder Factory zugreift) eingelesen, der daraus eine baumartige Struktur der darin enthaltenen Informationen aufbaut (Document). Abbildung 20: JAXP-API (von [JAXP04])3 2.2 Einlesen der Daten in ein DOM-Objekt Ein DOM wird folgendermaßen deklariert (hier als static, da das Dokument in diesem Beispiel innerhalb von main() verwendet wird): static Document document; Anschließend muss eine DocumentBuilderFactory deklariert werden und eine Instanz erzeugt werden, um die angegebene Datei einzulesen (zu parsen). Die Fehlerbehandlung wird hier noch nicht implementiert, die zu lesende Datei wird als erstes Argument beim Programmaufruf übergeben. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse( new File(argv[0]) ); } catch (SAXParseException spe) { } Um ein neues (leeres) DOM zu erzeugen (anstatt eine vorhandenes XML-Datei einzulesen), müsste die Zeile, in der eine Datei eingelesen wird, durch folgende ersetzt werden: 3 http://java.sun.com/xml/jaxp/dist/1.1/docs/tutorial/overview/images/dom-api.gif 74 document = builder.newDocument(); Die hier erzeugten Objekte werden in Abbildung 21 nochmals dargestellt, ebenso die in den beiden folgenden Abschnitten beim Zugriff auf Elemente und zum Erzeugen neuer Elemente erzeugten Objekte. 2.3 Zugriff auf Elemente Um beispielsweise eine Liste aller Tags, die den Namen „UML:Association“ haben, zu erzeugen (und festzustellen, wie viele dieser Elemente vorhanden sind), sind folgende Befehle zu verwenden: NodeList listOfAssociations =document.getElementsByTagName("UML:Association"); int numberOfAssociations = listOfAssociations.getLength(); Ein Zugriff auf einzelne Elemente (hier das erste Element) erfolgt folgendermaßen: if (numberOfAssociations > 0 ){ Node firstAssociationNode = listOfAssociations.item( 0 ); if( firstAssociationNode.getNodeType() == Node.ELEMENT_NODE ){ Element firstAssociationElement = (Element)firstAssociationNode; } } Um jetzt das erste UML:AssociationEnd-Tag aus diesem Element (firstAssociationElement) herauszufinden, können folgende Befehle verwendet werden: NodeList firstAssocEndList = firstAssociationElement.getElementsByTagName( "UML:AssociationEnd" ); Element firstAssocEndElement = firstAssocEndList.item( 0 ); Ein Element-Objekt repräsentiert ein Element (oder Tag) eines XML-Dokuments. Auf alle Objekte eines DOM-Dokument-Baums kann mit dem Node-Interface (beschrieben in org.w3c.dom.Node) zugegriffen werden. Eine Darstellung dieses Interfaces findet sich in Abbildung 22. 2.4 Erzeugen neuer Elemente Im folgenden ein kleines Beispiellisting, dass das Erzeugen von Elementen für eine leeres DOM aufzeigt. public static void buildDom() { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.newDocument(); Element root = (Element) document.createElement("rootElement"); document.appendChild(root); root.appendChild(document.createTextNode("Some") ); root.appendChild(document.createTextNode(" ") ); root.appendChild(document.createTextNode("text") ); } catch (ParserConfigurationException pce) { // Parser with specified options can't be built 75 pce.printStackTrace(); } Attribute werden durch die setAttribute-Operation hinzugefügt (enthalten im ElementInterface, siehe Abbildung 22). Um einen Knoten zu entfernen, kann die removeChildMethode des Eltern-Knotens aufgerufen werden. Um einen Knoten zu verändern, kann entweder die replaceChild-Operation des Eltern-Knotens aufgerufen werden oder die setNodeValue-Operation des Knotens aufgerufen werden. Abbildung 21: Beispielaufbau des in Abschnitt 2.2 bis 2.4 entwickelten DOM 2.5 Speichern eines DOM als XML-Datei Ein DOM kann mit Hilfe des XSLT-Transform-Packages wiederum als XML-Datei gespeichert werden. Dazu müssen zuerst folgende Klassen importiert werden: 76 import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; Um ein DOM-Dokument im XML-Format auszugeben, sind folgende (leere) „Transformationen“ nötig: TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(document); StreamResult result = new StreamResult(System.out); transformer.transform(source, result); Außerdem müssen noch möglicherweise auftretende Exceptions abgefangen werden: catch (TransformerConfigurationException tce) { } catch (TransformerException te) { } «interface» Node +getNodeName() : string(idl) +getNodeValue() : string(idl) +setNodeValue() +getNodeType() : short(idl) +getParentNode() : Node +getChildNodes() : NodeList +getFirstChild() : Node +appendChild() : Node «interface» Attr +getName() : string(idl) +getValue() : string(idl) +setValue() * «interface» NodeList +getLength() : long(idl) +item() : Node * «interface» Document +createAttribute() : Attr +createComment() +createElement() : Element +getElementsByTagName() : NodeList +createTextNode() «interface» Element +getAttribute() : string(idl) +getAttributeNode() : Attr +getElementsByTagName() : NodeList +hasAttribute() : boolean(idl) +removeAttribute() +setAttribute() «interface» DOMImplementation +createDocument() : Document Abbildung 22: Ausschnitt Package org.w3c.dom 3. XSLT Mit XSLT können XML-Quelltexte nach Belieben verändert werden. XSLT-Templates müssen mit einem xsl:stylesheet-Element beginnen: <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> </xsl:stylesheet> 77 Der XSLT-Prozessor durchläuft eine XML-Datei und sucht nach Übereinstimmungs-Regeln. Werden Übereinstimmungen gefunden, werden die Anweisungen innerhalb der Übereinstimmungs-Regeln ausgeführt. 3.1 Einfaches Beispiel Als Beispiel soll die folgende XML-Datei in eine HTML-kompatible Ausgabe umgewandelt werden (Beispiel aus [XSLT04]). <source> <bold>Hello, world.</bold> <red>I am </red> <italic>fine.</italic> </source> Das folgende XSLT-Stylesheet sucht nach übereinstimmenden Tags und wandelt sie entsprechend um. Die xsl:template match="MatchText"- Tags beinhalten die zu suchenden Übereinstimmungen, danach folgen die Daten, mit denen die entsprechenden Tags ersetzt werden sollen, das xsl:value-of select="."-Tag fügt den Inhalt des Tags zwischen den ursprünglichen Tags ein, ohne ihn weiter zu bearbeiten. Alternativ existiert das xsl:apply-templates-Tag, mit dem alle Elemente, für die eine Vorlage existieren, weiterverarbeitet werden. <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="bold"> <p> <b> <xsl:value-of select="."/> </b> </p> </xsl:template> <xsl:template match="red"> <p style="color:red"> <xsl:value-of select="."/> </p> </xsl:template> <xsl:template match="italic"> <p> <i> <xsl:value-of select="."/> </i> </p> </xsl:template> </xsl:stylesheet> Das Ergebnis ist dann folgende Datei, bei der die bold, italic und red-Tags durch entsprechende HTML-Anweisungen gemäß des Stylesheets ersetzt wurden: <p> <b>Hello, world.</b> </p> <p style="color:red">I am </p> <p> 78 <i>fine.</i> </p> Da in diesem Beispiel keine verschachtelten Tags benutzt werden, ist ein xsl:apply-templatesTag nicht erforderlich. 3.2 Pfadangaben Alle Elemente eines XML-Dokuments können adressiert werden. Die Syntax hierzu wird in der XPATH-Spezifikation erläutert. In einfachen Fällen (die für den vorgesehenen Anwendungsfall ausreichen) sehen die Pfadangaben für das folgender Dokument beispielsweise so aus: /test/aaa/bbb/ccc (dies bezeichnet das „innerste“ Element dieses Dokuments). / bezeichnet das Wurzelelement. <test> <aaa> <bbb name=“Name“> <ccc>Hallo.</ccc> </bbb> </aaa> </test> Die Angabe von „//“ in Pfadangaben bedeutet, das alle Knoten, welche den ersten Teil des Pfades (vor „//“) enthalten, und die das nach „//“ bezeichnete Element enthalten, selektiert werden. Beispiele: /test//ccc selektiert alle Knoten, die im Pfad /test nach einer beliebigen Tiefe ein Element ccc enthalten; //bbb findet alle Elemente bbb an beliebiger Stelle im Dokument. 3.3 Attribute Attribute können ähnlich wie Elemente in Pfadangaben referenziert werden (da Attribute wie Elemente auch als Knoten abgelegt werden), als Kennzeichnung wird im Stylesheet ein „@“ für Attribute benutzt (Beispielpfad: /test/aaa/bbb/@name referenziert das Attribut name im Pfad /test/aaa/bbb (falls vorhanden). Das xsl:text-Tag wird benutzt, um beliebigen Text auszugeben. <xsl:template match="/test/aaa/bbb"> <xsl:text>Test: </xsl:text> <xsl:value-of select="@name"/> </xsl:template> Die Ausgabe wäre: Test: Name 3.4 Einfaches Beispiel zur Umwandlung Das Beispiel in Anhang B sucht nach allen Klassen innerhalb einer XMI-Datei und erstellt ein GXL-Dokument, dass die entsprechenden Klassen als Knoten vom Typ „nodeclass“ enthält. Dabei werden die Attribut-Werte für den Namen und das isAbstract-Attribut übernommen. In Anhang C ist ein einfaches Beispiel eines „übersetzten“ XMI-Dokuments, das zwei Klassen enthält und mit Ameos erzeugt wurde, dargestellt. 79 3.5 Zusätzliche Anmerkungen - Elemente können auch in Abhängigkeit von der Anwesenheit eines Attributs ausgewählt werden (Bsp: <xsl:template match="UML:Class[not(@xmi.uuid)]"> selektiert nur Elemente ohne xmi.uuid-Attribut). - Mit der xsl:for each-Anweisung können Templates für jeden Knoten, der über das selectAttribut ausgewählt wird, angegeben werden (Beispiel: <xsl:for each select= "//UML:Class">). - Mit xsl:if-Abfragen können boolsche Ausdrücke getestet werden. - xsl:when-Anweisungen können innerhalb eines xsl:choose-Tags benutzt werden, um beispielsweise bestimmte Attribute auf Werte zu testen. xsl:otherwise wird ausgeführt, falls keine der innerhalb eines xsl:choose-Tags definierten xsl:when-Anweisungen ausgeführt werden konnte. - Mit der xsl:attribute-Anweisung können Attribut-Elemente erzeugt werden (siehe Anhang B). Weiterhin gibt es u.a. die Anweisungen xsl:copy (Knoten kopieren), xsl:variable (Setzen von Variablen) sowie Funktionen zur Konvertierung zwischen Datentypen (number, string, boolean, not, true, false, concat, ceiling, flor, round, sum etc.). XSLT kann auch innerhalb eines Java-Programms verwendet werden4. 4. Fazit Ich habe mich dazu entschieden, die GXL2XMI- bzw. XMI2GXL-Programme in XSLT zu realisieren. Die Richtung von XMI in GXL ist relativ einfach in XSLT umzusetzen. Es muss hierzu (über verschiedene <xsl:apply-template>-Tags) das XMI-Dokument durchlaufen werden und die verwendeten UML-Konzepte durch die nötigen GXL-Elemente ersetzt werden. Um GXL in XMI umzusetzen, waren komplexere Operationen als ein einfaches Durchlaufen des Dokuments und einfaches Textersetzen notwendig (beispielsweise musste bei nodeElementen geprüft werden, ob ein Knoten mit einer „hasAttribute“-Kante verbunden ist; die Daten dieses Knotens mussten dann in das entsprechende XMI-Klassenelement übernommen werden). Dies musste dann durch entsprechende komplexere Abfragen der anderen Elemente des Dokuments innerhalb der jeweiligen xsl:template match-Abfragen erfolgen. In Java wäre das alles zwar auch möglich gewesen, allerdings denke ich, die Programmierung mit XSLT war aufgrund der wenigen Befehle und der speziellen Ausrichtung dieser Sprache auf die Transformation von XML-Dokumenten in diesem speziellen Fall besser geeignet und die Umsetzung in ein Programm war dadurch schneller zu realisieren (auch, da ich mich in Java und JAXP auch erst wieder hätte einarbeiten müssen; XSLT war in diesem speziellen Fall einfacher und schneller für diese Aufgabe zu erlernen). 4 siehe http://java.sun.com/xml/jaxp/dist/1.1/docs/tutorial/xslt/4_transform.html 80 VI. Teststrategie XMI2GXL und GXL2XMI 1. Einleitung In diesem Abschnitt wird die Strategie zum Testen der korrekten Funktionalität der XMI2GXL- und GXL2XMI-Stylesheets vorgestellt. Dabei sollen alle an Abschnitt IV vorhandenen Fälle berücksichtigt werden. Es wird für die dort aufgezeigten Fälle (d.h. alle mit Ameos und Rational Rose modellierbaren UML-Konzepte) untersucht, ob das Stylesheet das (ebenfalls in diesem Dokument beschriebene) erwartete GXL-Dokument generiert5. In Abbildung 23 sind die vier verschiedenen erstellten Stylesheets dargestellt. GX L2X MI- X Am e os. R L-R GX MI2 xsl .xsl Abbildung 23: erstellte Stylesheets 2. Test XMI2GXL 2.1 Ameos Für die in Kapitel IV.2.1 bis IV.2.7 vorgestellten UML-Konzepte (und ihre Umsetzung in GXL) wurden die entsprechenden Diagramme modelliert, als XMI-Datei exportiert und mittels des XMI2GXL-Stylesheets für Ameos zu GXL-Dokumenten umgewandelt. Außerdem wurde (da Assoziations-Klassen mit Ameos nicht modellierbar sind) die korrekte Umsetzung des implementierten Workaround (falls Assoziation und Klasse den gleichen Namen haben, wird dies als Assoziations-Klasse interpretiert) getestet. Hierbei wurde die korrekte Funktionsweise der Stylesheets erfolgreich verifiziert. 2.2 Rational Rose Alle an Ameos durchgeführten Tests wurden auch mit von Rational Rose exportierten XMIDokumenten durchgeführt (insbesondere zu beachten ist hierbei die Generalisierung, da hier größere Unterschiede zu Ameos im erzeugten XMI-Dokument bestehen, siehe Kapitel IV.2.4.1.2). Zusätzlich wurde die in Kapitel IV.2.8 beschriebene Assoziations-Klasse model5 Eine ausführlichere Dokumentation der durchgeführten Tests findet sich unter http://thebel.gmxhome.de/Studienarbeit-Testszenario-XMI2GXL.pdf und http://thebel.gmxhome.de/Studienarbeit-Testszenario-GXL2XMI.pdf. 81 liert. Hierbei wurde ebenfalls die korrekte Funktion des Stylesheets für diese Dokumente festgestellt. 2.3 Testdokument In Abbildung 24 ist ein größeres Klassendiagramm dargestellt, dass mit Ameos erstellt wurde, anschließend in XMI exportiert wurde und mit dem Stylesheet transformiert wurde. Die Ausgabe des Stylesheets war auch für diesen komplexeren Fall korrekt. Eine Umwandlung des aus diesem Modell erzeugten XMI-Dokuments in GXL ergibt ein Dokument, das in Abbildung 25 (vereinfacht) als Graph dargestellt ist. Class3_Generalization Class1 Generalisierung1 +Attr1 : string -Attr2 : Int = 1 0..1 Association1 0..* 0..* Class2 Class4_Composition Komposition1 1 -AttrClass2: Boolean 0..1 Aggregation1 Abbildung 24: Testdokument 1 (Ameos) 82 0..* Class5_Aggregation Abbildung 25: Testdokument 1, erzeugter GXL-Graph 83 3. Test GXL2XMI 3.1 Ameos Eine Umwandlung der GXL-Dokumente aus Kapitel IV.2 durch Anwenden des GXL2XMIStylesheets für Ameos ergibt Dokumente, die denen in diesem Kapitel beschriebenen XMIDokumenten entsprechen und in Ameos importiert werden können. Das Stylesheet erzeugt für diese Fälle also eine korrekte Ausgabe. 3.2 Rational Rose Auch ein Umwandeln der GXL-Dokumente aus Kapitel IV.2 durch Anwenden des GXL2XMI-Stylesheets für Rational Rose ergibt Dokumente, die in Rational Rose importiert werden können und den erwarteten UML-Konzepten entsprechen. Anmerkung: DataType-Eintragungen werden automatisch von dem Stylesheet generiert, damit in Rational Rose die „Grundtypen“ angezeigt werden. 3.3 Testdokument Als weiteres Testdokument wurde das GXL-Metaschema (d.h. die gxl10.gxl-Datei6) gewählt, da dieses fast alle enthaltenen Konzepte enthält (außer Packages). Eine Umwandlung dieser Datei mittels des GXL2XMI-Stylesheets (für Rational Rose) und anschließender Import dieser Datei zeigte, dass die verwendeten Konzepte korrekt umgesetzt wurden. 6 http://www.gupro.de/GXL/MetaSchema/metaSchema.html 84 VII. Anwendung der erstellten Programme In diesem Abschnitt wird zuerst das Erzeugen von XMI-Dokumenten aus den unterstützten Werkzeugen Ameos und Rational Rose und die Anwendung der XMI2GXL- und GXL2XMIStylesheets erklärt. Außerdem wird der Import von XMI-Dateien dargestellt. Besonderheiten und Fehler, die bei der Benutzung der beiden Tools aufgefallen sind, sind in Anhang D aufgeführt. 1. XMI-Export Als Ausgangszustand für den Export wird mindestens ein vorhandenes Klassendiagramm im verwendeten Tool vorausgesetzt; bei Rational Rose muss dieses abgespeichert werden, bevor ein Export möglich ist. 1.1 Ameos Im Code-Fenster (Abbildung 26, Mitte rechts) muss zuerst die Baumdarstellung unter „Product Scripts/Languages“ erweitert werden; nach Rechtsklick auf XMI muss im Kontextmenu „Run Script“ ausgewählt werden. Die exportierte Datei steht per Default in %AmeosVerzeichnis%\examples\%Systemname%\src_files; dies kann im Parameters-Fenster geändert werden. Ameos speichert die Dateien mit der Endung .xmi. Abbildung 26: Ameos, Export eines XMI-Dokuments 85 Abbildung 27: Ameos, Export eines XMI-Dokuments (Ausschnitt) 1.2 Rational Rose Damit Rational Rose XMI exportieren kann, muss zuerst das „Rational Rose XMI-Plugin“ von Unisys installiert werden7. Abbildung 28: Rational Rose, XMI-Export 7 Download unter http://www-1.ibm.com/support/docview.wss?uid=swg21131368 (17.04.2005) Direktlink (17.04.2005): ftp://www6.software.ibm.com/software/developer/library/rational/2834/Rose/RoseXMLTools1.3.6.01.zip 86 Anschließend kann über das Tools-Menu im Unterpunkt „UML 1.3 XMI Addin“ „UML 1.3 XMI Export“ ausgewählt werden (siehe Abbildung 28). Nach Auswahl der gewünschten Export-Optionen (von mir verwendete Optionen siehe Screenshot in Abbildung 29) muss nur noch ein Dateiname angegeben werden. Achtung: Damit ein Export möglich ist, muss das aktive Modell abgespeichert worden sein. Rational Rose speichert die Dateien mit der Endung .xml. Abbildung 29: Rational Rose, Dialogfenster XMI-Export 2. Umwandlung mit XMI2GXL und GXL2XMI Zur Umwandlung wird ein „XSLT-Prozessor“ benötigt, u.a. wurde der als Freeware verfügbare Unicorn XSLT Processor8 verwendet, es kann aber auch jede andere XSLT-Prozessor/ XML-Parser9-Kombination verwendet werden (zusätzlich getestet: Cooktop 2.5 (Freeware) mit MSXML 3 und 410, Xselerator 2.5 von Marrowsoft (MSXML 3 + 4), oXygen XML Editor von syncRO soft). Der Aufruf des Unicorn XSLT-Prozessors von der Kommandozeile (Linux oder Windows/ DOS) lautet: uxt inputdokument stylesheet outputdokument Allerdings wird bei der von mir verwendeten Version das xmlns:UML-Attribut nicht eingefügt, dies scheint ein Fehler der verwendeten Version zu sein; bei den anderen XSLTProzessoren (z.B. MSXML) tritt dieser Effekt nicht auf. Der Aufruf mit dem MSXML-Prozessor (u.a. in Cooktop und Xselerator enthalten, Windows) von der Kommandozeile lautet: MSXSL inputdokument stylesheet [-o outputdokument] Die Stylesheets können auf der GXL-Website11 heruntergeladen werden. 8 Download unter http://www.unicorn-enterprises.com/products_uxt.html (Stand 24.5.2005) Eine Liste von Parsern gibt es z.B. auf http://www.topxml.com/parsers/other_parsers.asp (Stand 24.5.2005) 10 Download unter http://msdn.microsoft.com/xml (Stand 24.5.2005) 11 http://www.uni-koblenz.de/FB4/Contrib/GUPRO/Site/Downloads/index_html?project=gxl 9 87 3. Import von XMI-Dokumenten 3.1 Ameos Um XMI-Dokumente in Ameos zu importieren, muss im Menu „Code“ „Reverse Engineering“ der Punkt „Import XMI Model…“ ausgewählt werden. Nach Angabe der zu importierenden Datei muss zuerst „Parse XMI file“, dann „Make Model“ angeklickt werden. Abbildung 30: Import von XMI-Dokumenten in Ameos 3.2 Rational Rose Nach Auswahl des Menupunkts „UML 1.3 XMI Import“ (siehe Abbildung 28) wird die zu importierende Datei ausgewählt (das „Create New Model“-Fenster kann mit „Cancel“ abgebrochen werden). Die Import-Optionen können wie in Abbildung 31 gezeigt eingestellt werden. Nach erfolgreichem Import in Rational Rose müssen die enthaltenen Klassen einzeln in die Diagrammansicht gezogen werden (zu finden in der Baumansicht links unter „Logical View“). Abbildung 31: Import-Optionen Rational Rose 88 VIII. Zusammenfassung Im Rahmen dieser Studienarbeit wurden Programme zur Umwandlung von XMI-Dateien (die mit den beiden Tools Ameos und Rational Rose erstellt werden können) in GXL-Dateien und zur Umwandlung von Dateien im GXL-Format in Dateien im XMI-Format erstellt. Somit können erstellte UML-Klassendiagramme in das GXL-Format überführt werden und umgekehrt, wodurch ein Austausch zwischen Programmen, die entweder XMI oder GXL einlesen und exportieren können, möglich ist. Dazu wurden zuerst das GXL- und das XMI-Format analysiert, die beide dem XML-Standard entsprechende Dokumente zur Speicherung von Graphen bzw. UML-Modellen benutzen. Nach einer Analyse des erzeugten XMI-Codes der benutzten Werkzeuge und deren Umsetzung in entsprechende GXL-Graphen musste eine Entscheidung über die zu verwendende Programmiersprache getroffen werden. Hierbei kamen Java (mit der JAXP) und XSLT in Betracht. Aufgrund der speziellen Ausrichtung von XSLT auf die Verarbeitung von XMLDokumenten und dem einfachen Aufbau der Sprache habe ich mich dann zu einer Umsetzung der Umwandlungstools in Form von vier verschiedenen XSL-Stylesheets entschlossen. Durch abschließende Tests konnte die korrekte Funktionalität der Stylesheets nachgewiesen werden. Die Tools sind auf der GXL-Website12 unter „Downloads“ verfügbar. 12 http://www.gupro.de/GXL/ 89 IX. Literaturverzeichnis [GXL02] [GXL04] [HoWi00] [HSSW04] [JAVA02] [JAVA99] [JAXP04] [Jeck04] [WiKuRi01] [Wint01] [XMI00] [XMI02] [XMI03] [XSLT04] GXL (1.0) Document Type Definition (Dagstuhl Edition, April 25, 2002), http://www.gupro.de/GXL/dtd/dtd.html (25.09.2004). http://www.gupro.de/GXL/ (15.11.2004) R.C. Holt, A. Winter: A Short Introduction to the GXL Software Exchange Format, Proceedings 7th Working Conference on Reverse Engineering (WCRE 2000), Panel on Reengineering Exchange Formats, IEEE Computer Society, Los Alamitos, 2000. http://www.gupro.de/winter/Papers/holtwinter2000.pdf (23.08.2004). Richard C. Holt, Andy Schürr, Susan Elliot Sim, Andreas Winter: GXL: A Graph Based Standard Exchange Format for Reengineering, 2004. Preprint. David Flanagan, Java In A Nutshell, Fourth Edition. O´Reilly & Associates, Sebastopol, CA, 2002. Nazmul Idris: XML and Java Tutorial, Part I, http://developerlife.com/xmljavatutorial1/default.htm (06.12.2004) http://java.sun.com (06.12.2004) M. Jeckle, OMG´s XML Metadata Interchange Format XMI, Beitrag zum Workshop XML Interchange Formats for Business Process Management. http://www.jeckle.de/files/xml4bpm.pdf (23.08.2004). Andreas Winter, Bernt Kullbach, Volker Riediger: An Overview of the GXL Graph Exchange Language; aus: S. Diehl (ed.) Software Visualization · International Seminar Dagstuhl Castle, Germany, May 20-25, 2001 Revised Lectures, Springer Verlag Berlin Heidelberg 2002. http://www.gupro.de/GXL/Publications/winter+2002.pdf (23.08.2004). Andreas Winter: Exchanging Graphs with GXL, Fachberichte Informatik 09/2001, Universität Koblenz-Landau, Institut für Informatik, Koblenz, August 2001. http://www.uni-koblenz.de/fb4/publikationen/gelbereihe/RR-92001.pdf (23.08.2004). OMG XML Metadata Interchange (XMI) Specification, Version 1.1, November 2000. http://www.omg.org/cgi-bin/doc?formal/2000-11-02 (11.10.2004). OMG XML Metadata Interchange (XMI) Specification, Version 1.2, January 2002. http://www.omg.org/cgi-bin/doc?formal/2002-01-01 (23.08.2004). XML Metadata Interchange (XMI) Specification, May 2003, Version 2.0, formal/03-05-02. http://www.omg.org/cgi-bin/doc?formal/2003-05-02 (23.08.2004). XSLT Tutorial, http://www.zvon.org/index.php?nav_id=tutorials (06.12.2004) 90 Anhang A: GraphSchema.xmi Die Zeilen 1 bis 6 enthalten die Header-Informationen, ab Zeile 7 folgt die Beschreibung des Modells. Die Zeilen 10 bis 39 enthalten die Beschreibung der Klasse „Variable“ mit ihrem Attribut „name“ (Zeile 19 bis 37). Die Klasse „FunctionCall“ folgt in den Zeilen 46 bis 54, die Klasse „Function“ mit ihrem Attribut folgt in den Zeilen 55 bis 84. Danach werden die enthaltenen Assoziationen dargestellt. In den Zeile 94 bis 137 wird „isOutput“ beschrieben, hierbei wird auf die verknüpften Klassen mit ihren IDs verwiesen (Zeile 113, 114 sowie 132, 133). Die Multiplizitäten werden in den Zeilen 107 und 126 angegeben, „-1“ stellt dabei unendlich dar. Die Zeilen 138 bis 181 beschreiben die „isInput“-Assoziation, Zeile 182 bis 225 die „isCaller“- und Zeile 226 bis 269 die „isCallee“-Assoziation. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?xml version="1.0" encoding= "ISO-8859-1"?> <XMI xmi.version="1.1" xmlns:UML = 'org.omg.xmi.namespace.UML'> <XMI.header> <XMI.metamodel xmi.name="UML" xmi.version="1.4" /> </XMI.header> <XMI.content> <UML:Model> <UML:Namespace.ownedElement> <UML:Class name = 'Variable' visibility = 'public' xmi.id = 'UID_3CAC7F83-8264-486a-8FE5-6F6460F74A76' xmi.uuid = 'UID_3CAC7F83-8264-486a-8FE5-6F6460F74A76' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > <UML:Classifier.feature> <UML:Attribute name = 'name' xmi.id = 'UID_B81B1AF8E295-401c-BAB3-3615E69FF4A2' visibility ='private' xmi.uuid = 'UID_B81B1AF8-E295-401cBAB3-3615E69FF4A2' comment = '' type = 'TP_UID_B81B1AF8-E295-401cBAB3-3615E69FF4A2' ownerScope = 'instance'> 91 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 <UML:StructuralFeature.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '1' upper = '1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:StructuralFeature.multiplicity> </UML:Attribute> </UML:Classifier.feature> </UML:Class> <UML:DataType xmi.id = 'TP_UID_B81B1AF8-E295-401c-BAB3-3615E69FF4A2' name ='String' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' /> <UML:Class name = 'FunctionCall' visibility = 'public' xmi.id = 'UID_B53413A8-E393-43d3-99F4-0E3DEDA7A0CD' xmi.uuid = 'UID_B53413A8-E393-43d3-99F4-0E3DEDA7A0CD' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > </UML:Class> <UML:Class name = 'Function' visibility = 'public' xmi.id = 'UID_DA83D1D1-37BE-4c35-93EC-34FF58605D12' xmi.uuid = 'UID_DA83D1D1-37BE-4c35-93EC-34FF58605D12' isAbstract = 'false' isRoot = 'true' isLeaf = 'true' isActive = 'false' > <UML:Classifier.feature> <UML:Attribute name = 'name' xmi.id = 'UID_A9002D1344F8-4618-8B88-CC9C773B7253' visibility ='private' 92 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 xmi.uuid = 'UID_A9002D13-44F8-4618- 8B88-CC9C773B7253' comment = '' type = 'TP_UID_A9002D13-44F8-46188B88-CC9C773B7253' ownerScope = 'instance'> <UML:StructuralFeature.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '1' upper = '1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:StructuralFeature.multiplicity> </UML:Attribute> </UML:Classifier.feature> </UML:Class> <UML:DataType xmi.id = 'TP_UID_A9002D13-44F8-4618-8B88-CC9C773B7253' name ='String' visibility = 'public' isSpecification = 'false' isRoot = 'true' isLeaf = 'true' isAbstract = 'false' /> <UML:Class name = 'Container_class_for_objects_and_actors' visibility = 'public' xmi.id = 'ID_DUMMY_CLASS' isRoot = 'true' isLeaf = 'true' isActive = 'true' /> <UML:Association name = 'isOutput' comment = '' xmi.uuid = 'UID_223219FD-0863-4dde-B66D-8B2B059EA78A' xmi.id = 'UID_223219FD-0863-4dde-B66D-8B2B059EA78A'> <UML:Association.connection> <UML:AssociationEnd name = '' xmi.id = 'UID_F68EEE82-5138-4cbe-B553-0F665058EBBB' xmi.uuid = 'UID_F68EEE82-5138-4cbe-B553-0F665058EBBB' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'ordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> 93 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_B53413A8-E393-43d3-99F40E3DEDA7A0CD'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd name = '' xmi.id = 'UID_995DE1D8-2274-4edc-8E3B-7BAC88182473' xmi.uuid = 'UID_995DE1D8-2274-4edc-8E3B-7BAC88182473' visibility = 'public' comment = '' isNavigable = 'false' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_3CAC7F83-8264-486a-8FE56F6460F74A76'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> <UML:Association name = 'isInput' comment = '' xmi.uuid = 'UID_427B0BBF-82D8-4cf0-99A5-AEC7790B19D7' xmi.id = 'UID_427B0BBF-82D8-4cf0-99A5-AEC7790B19D7'> <UML:Association.connection> <UML:AssociationEnd name = '' xmi.id = 'UID_EB13436F-4EE1-41a9-85B8-A4757DCE9844' xmi.uuid = 'UID_EB13436F-4EE1-41a9-85B8-A4757DCE9844' visibility = 'public' comment = '' isNavigable = 'false' ordering = 'unordered' 94 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_3CAC7F83-8264-486a-8FE56F6460F74A76'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd name = '' xmi.id = 'UID_2D2CAD67-45B5-4e77-97C5-7A1A8CBBA3A2' xmi.uuid = 'UID_2D2CAD67-45B5-4e77-97C5-7A1A8CBBA3A2' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_B53413A8-E393-43d3-99F40E3DEDA7A0CD'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> <UML:Association name = 'isCaller' comment = '' xmi.uuid = 'UID_DF9E435D-555C-4cd5-84E4-8EA3076744B1' xmi.id = 'UID_DF9E435D-555C-4cd5-84E4-8EA3076744B1'> <UML:Association.connection> <UML:AssociationEnd name = '' xmi.id = 'UID_90B4D624-5C80-470e-909B-B8A8D2947DDE' 95 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 xmi.uuid = 'UID_90B4D624-5C80-470e-909B-B8A8D2947DDE' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_B53413A8-E393-43d3-99F40E3DEDA7A0CD'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd name = '' xmi.id = 'UID_950FC68B-002D-4097-B405-DE5FFE6C265F' xmi.uuid = 'UID_950FC68B-002D-4097-B405-DE5FFE6C265F' visibility = 'public' comment = '' isNavigable = 'false' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '1' upper = '1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_DA83D1D1-37BE-4c35-93EC34FF58605D12'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> </UML:Association.connection> </UML:Association> <UML:Association name = 'isCallee' 96 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 comment = '' xmi.uuid = 'UID_7A1F9AAF-441A-499f-8F7E-728885167966' xmi.id = 'UID_7A1F9AAF-441A-499f-8F7E-728885167966'> <UML:Association.connection> <UML:AssociationEnd name = '' xmi.id = 'UID_E306545A-46BF-42c2-949C-5B82A7EDEC41' xmi.uuid = 'UID_E306545A-46BF-42c2-949C-5B82A7EDEC41' visibility = 'public' comment = '' isNavigable = 'true' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '0' upper = '-1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_B53413A8-E393-43d3-99F40E3DEDA7A0CD'/> </UML:AssociationEnd.participant> </UML:AssociationEnd> <UML:AssociationEnd name = '' xmi.id = 'UID_C8023785-0394-4f5c-BF03-F5E6C9FFCFBF' xmi.uuid = 'UID_C8023785-0394-4f5c-BF03-F5E6C9FFCFBF' visibility = 'public' comment = '' isNavigable = 'false' ordering = 'unordered' aggregation = 'none'> <UML:AssociationEnd.multiplicity> <UML:Multiplicity> <UML:Multiplicity.range> <UML:MultiplicityRange lower = '1' upper = '1'> </UML:MultiplicityRange> </UML:Multiplicity.range> </UML:Multiplicity> </UML:AssociationEnd.multiplicity> <UML:AssociationEnd.participant> <UML:Classifier xmi.idref = 'UID_DA83D1D1-37BE-4c35-93EC34FF58605D12'/> </UML:AssociationEnd.participant> 97 267 268 269 270 271 272 273 </UML:AssociationEnd> </UML:Association.connection> </UML:Association> </UML:Namespace.ownedElement> </UML:Model> </XMI.content> </XMI> 98 Anhang B: Umwandlung UML-Klassen in GXL-Nodes Die Zeilen 1 bis 7 enthalten die Header-Angaben wie benutzte Namespaces und das Ausgabeformat (hier xml). Die ersten beiden Abfragen (Zeilen 9 bis 31) generieren den „Rahmen“ des GXL-Dokuments, Zeile 33 bis 61 enthält dann die Abfrage auf das Tag UML:Class, hierfür wird dann ein Node im GXL-Dokument erzeugt, das Attribut ID wird auf die ID, die im Tag UML:Class ebenfalls als Attribut gespeichert ist, gesetzt (Zeile 35 bis 37). Nach Einfügen des erforderlichen Type-Tags (Zeile 38 bis 42) werden in attr-Tags die Daten der UML-Klasse (hier der Name und die Information, ob die Klasse abstrakt ist) gemäß der GXL-Spezifikation eingefügt. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:UML='org.omg.xmi.namespace.UML' xmlns:xlink="http://www.w3.org/1999/xlink"> <xsl:output method="xml"/> <xsl:template match="/"> <gxl> <xsl:apply-templates/> </gxl> </xsl:template> <xsl:template match="XMI"> <graph> <xsl:attribute name="id"> <xsl:text>class-graph</xsl:text> </xsl:attribute> <xsl:attribute name="edgeids"> <xsl:text>true</xsl:text> </xsl:attribute> <xsl:attribute name="hypergraph"> <xsl:text>false</xsl:text> </xsl:attribute> <xsl:attribute name="edgemode"> <xsl:text>directed</xsl:text> </xsl:attribute> <xsl:apply-templates/> </graph> </xsl:template> <xsl:template match="UML:Class"> <node> <xsl:attribute name="id"> <xsl:value-of select="@xmi.id"/> </xsl:attribute> <type> <xsl:attribute name="xlink:href"> <xsl:text>http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass</xsl:text> </xsl:attribute> </type> <attr> <xsl:attribute name="name"> 99 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 <xsl:text>name</xsl:text> </xsl:attribute> <string> <xsl:value-of select="@name"/> </string> </attr> <attr> <xsl:attribute name="name"> <xsl:text>isAbstract</xsl:text> </xsl:attribute> <bool> <xsl:value-of select="@isAbstract"/> </bool> </attr> </node> </xsl:template> </xsl:stylesheet> 100 Anhang C: XMI-Dokument in GXL transferiert Hier ein einfaches Beispiel eines „übersetzten“ XMI-Dokuments, das zwei Klassen enthält und mit Ameos erzeugt wurde. <?xml version="1.0" encoding="UTF-16"?> <gxl xmlns:UML="org.omg.xmi.namespace.UML" xmlns:xlink="http://www.w3.org/1999/xlink"> <graph id="class-graph" edgeids="true" hypergraph="false" edgemode="directed"> <node id="UID_7852041B-7687-497b-9CC1-B9A912844892"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass" /> <attr name="name"> <string>Class2</string> </attr> <attr name="isAbstract"> <bool>false</bool> </attr> </node> <node id="UID_4B72A452-32F8-4295-9540-5D7023B4CB69"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass" /> <attr name="name"> <string>Class1</string> </attr> <attr name="isAbstract"> <bool>false</bool> </attr> </node> <node id="ID_DUMMY_CLASS"> <type xlink:href="http://www.gupro.de/GXL/gxl-1.0.gxl#NodeClass" /> <attr name="name"> <string>Container_class_for_objects_and_actors</string> </attr> <attr name="isAbstract"> <bool></bool> </attr> </node> </graph> </gxl> 101 Anhang D: Anmerkungen/ Besonderheiten der verwendeten Werkzeuge 1. Ameos13 - In Ameos sind keine Assoziations-Klassen modellierbar. Als Workaround können für eine zu modellierende Assoziations-Klasse eine Assoziation, die den gleichen Namen wie eine vorhandene Klasse hat, modelliert werden; dies wird dann als eine Assoziations-Klasse interpretiert. Ebenso werden im GXL-Dokument vorhandene Darstellungen von AssoziationsKlassen auf diese Weise umgesetzt. - Werden Objekte in Ameos modelliert, werden diese bei XMI-Export ignoriert (Bugreport-Nr.: ECR11667). - Beim Import in Ameos werden die enthaltenen Informationen der XMI-Datei auf verschiedene Diagramme aufgeteilt. - Beim Import in Ameos „verschwinden“ die Multiplizitäten teilweise. - Beim Import in Ameos wird der Typ von Attributen auch als Klasse dargestellt. Beispiel: XMI-Import einer Klasse mit Attribut von Typ „string“ enthält diese Klasse mit einer Assoziation zu einer Klasse mit Namen „string“. - Ameos kann keine Unicode-Dateien importieren, daher wurde beim Erstellen von AmeosXMI-Dokumenten auf eine entsprechende Kodierung geachtet. 2. Rational Rose14 - Beim XMI-Export aus Rational Rose können verschiedene Optionen gesetzt werden; dementsprechend wird dann bei Erzeugung der XMI-Datei eine unterschiedliche UML-DTD verwendet. Die verwendete Einstellung entspricht der Voreinstellung, außer dass die Checkbox „Exports Diagrams“ nicht ausgewählt ist (also wird die visuelle Darstellung nicht gespeichert, ansonsten entspricht die generierte Datei bis zum <UML:Diagram>-Tag aber derjenigen, die ansonsten auch erzeugt würde). - Die Komposition wird in Rational Rose über Auswahl von „aggregate“ und „by value“ (bei Containment of {entsprechende Klasse} unter „Role A Detail“ bzw. „Role B Detail“) modelliert. - Über Rational Rose existiert auf der Homepage von IBM ein Dokument (What information would be lost importing/exporting diagrams with the XMI add-in? http://www1.ibm.com/support/docview.wss?uid=swg21130362), welches festgestellte Fehler beinhaltet. Bisher wurde keine Relevanz für diese Studienarbeit daraus festgestellt. 3. Sonstiges - Die Darstellung und Umsetzung von Operationen in GXL ist nicht definiert; daher werden diese beim Export nicht berücksichtigt. 13 14 verwendete Version: Ameos 9.1.5 (Build 46) verwendete Version: Rose Enterprise Edition, Release Version: 2003.06.12.280.000 102