UML Modellierung mit Eclipse Papyrus

In diesem Artikel soll es um die Erstellung von UML Modellen mit Eclipse Papyrus gehen.

Eclipse Papyrus [4] ist ein Open Source Plugin für die Eclipse IDE [5] der Eclipse Foundation zur Modellierung und Unterstützung modellgetriebener Entwicklungsansätze. Es verwendet als Basis das Eclipse Modeling Framework [6]. Neben UML werden auch zahlreiche andere Modellierungssprachen unterstützt. Außerdem gibt es die Möglichkeit, für nicht unterstützte Sprachen und Domain Specific Languages (DSL) eigene Profile zu erstellen. Eclipse Papyrus wird auch in der Industrie eingesetzt. Eine Liste mit konkreten Use Case Stories ist auf der Seite von Papyrus einsehbar [1].

Erstellung eines UML Klassendiagramms

Nachdem Papyrus installiert und gestartet, sowie die Papyrus Perspective geöffnet ist, kann ein neues Papyrus Project erstellt werden. Dazu reicht ein Rechtsklick auf den Project Explorer -> New -> Papyrus Project. Um ein UML-Diagramm zu erstellen, wird im Wizard zunächst UML als Diagram Language ausgewählt. Nach einem Klick auf Next kann nun ein Name für das neue Projekt und ein Name für die Modell-Datei eingegeben werden. Nach einem weiteren Klick auf Next kann der Diagrammtyp ausgewählt werden. Um ein Klassendiagramm zu erstellen, wird Class Diagram ausgewählt. Auch nach Erstellung des Projekts können weitere Diagrammtypen hinzugefügt werden. Zusätzlich wird die Checkbox zum Hinzufügen der primitiven Typen (A UML model with basic primitive types) angehakt, sofern diese Typen später verwendet werden sollen. Primitive Typen sind beispielweise String oder Integer. Nach einem Klick auf Finish wird nun ein neues Projekt im Project Explorer angelegt.

Nachdem dieses Projekt ausgewählt wurde, kann nun in den Model Explorer gewechselt werden. Sofern noch kein ClassDiagram-Element vorhanden ist, kann mit einem Rechtsklick auf das Modell -> New Diagram -> Class Diagram ein neues UML Klassendiagramm erstellt werden (siehe Abbildung 1). Eine Übersicht über die verschiedenen Views in der Papyrus Perspective ist im offiziellen User Guide zu Eclipse Papyrus zu finden [2].

Erstellung eines UML Klassendiagramms im Model Explorer

Abbildung 1: Erstellung eines UML Klassendiagramms im Model Explorer

Hinzufügen einer Klasse

In diesem Beispiel erstellen wir ein Mitarbeiterobjekt mit Vorname, Nachname, Einstellungsdatum, Position im Unternehmen, sowie Gehalt.

Um eine Klasse hinzuzufügen genügt ein Rechtsklick auf das Root Element -> New Child -> Class. Danach erscheint eine neue Klasse im Model Explorer. Diese kann nun per Drag-and-Drop auf das Editorfenster in der Mitte visualisiert werden. Wenn die Klasse ausgewählt ist, erscheinen die Eigenschaften in der Properties-View. Hier wird nun im Feld Name der Klassenname Employee eingetragen (vgl. Abbildung 2).

Hinzufügen einer Klasse

Abbildung 2: Hinzufügen einer Klasse

Es macht Sinn, die Synchronisation der Modelle im Model Editor mit den Modellen im Model Explorer zu aktivieren. Dazu kann in der Properties-View unter dem Tab Appearence zu Synchronization gescrollt werden. Dort kann die Option Sync with model aktiviert werden (Abbildung 3). Daraufhin bleiben die Modelle in Model Editor und Explorer identisch. Beim Export wird im Übrigen nur der Inhalt des Modelleditors als Bild exportiert. Da die erstellten Modelle sehr schnell sehr komplex werden, kann es Sinn ergeben, die Synchronisation abzuschalten. Anschließend können dann triviale Methoden, wie getter und setter über den Modelleditor aus der Abbildung entfernt werden, um die Lesbarkeit zu erhöhen. Dies geschieht dann, ohne das Modell selbst zu verändern.

Aktivierung der Synchronisation

Abbildung 3: Aktivierung der Synchronisation

Erstellung von Attributen

Nachdem die erste Klasse erstellt ist, sollen jetzt Attribute hinzugefügt werden. Dazu genügt ein Rechtsklick auf Employee im Model Explorer, New Child -> Property. Als Namen für das Attribut wird firstName festgelegt. Nach einem Klick auf die drei Punkte (siehe Abbildung 4) neben Type öffnet sich ein Dialogfeld (Abbildung 5), in welchem UML Primitive Types -> String ausgewählt werden kann.

Hinzufügen des Variablentyps

Abbildung 4: Hinzufügen des Variablentyps

Erstellung von Attributen

Abbildung 5: Erstellung von Attributen

Nach einem Klick auf OK wird der Typ der Variable auf String gesetzt.
Dieser Vorgang kann für Nachname und Position wiederholt werden. Beim Gehalt muss darauf geachtet werden als Typ Real auszuwählen.
Für das Einstellungsdatum wird als Typ Ecore Primitive Types -> Date ausgewählt. Falls die Ecore Primitive Types im Dialogfenster nicht verfügbar sind, müssen sie mit einem Rechtsklick auf das Root Element -> Import -> Import Registered Package -> EcorePrimitiveTypes importiert werden.

Nachdem nun alle Variablen hinzugefügt wurden, können diese im Model Explorer ausgewählt werden und per Drag and Drop auf das Employee-Objekt im Editor gezogen werden (sofern die automatische Synchronisation abgeschaltet ist). Das Resultat ist in Bild 6 zu sehen.

Hinzufügen der Attribute zur Klasse

Abbildung 6: Hinzufügen der Attribute zur Klasse

Erstellung einer Enumeration

Da die Position im Unternehmen nur einige fixe Werte annehmen kann würde es Sinn machen, dafür eine Enumeration zu verwenden. Diese lässt sich ähnlich der Klasse mit einem Rechtsklick auf das Root Element -> New Child -> Enumeration erstellen.

In der Properties-View können nun Literale für die Enumeration hinzugefügt werden. Um ein Literal hinzuzufügen, wird auf die Schaltfläche mit dem grünen Plus ganz rechts neben Owned Literal geklickt (siehe Abbildung 7).

Erstellung einer Enumeration

Abbildung 7: Erstellung einer Enumeration

Daraufhin öffnet sich ein Dialogfenster, in welchem ein Name für das Literal eingegeben werden kann.

Nachdem so alle Positionen im Unternehmen eingetragen wurden, können diese wieder vom ModelExplorer in den grafischen Editor auf die Enumeration geschoben werden.

Erstellung einer Assoziation

Abschließend kann das String-Attribut position der Employee-Klasse gelöscht werden und stattdessen eine Assoziation von Employee zu Position eingefügt werden. Dazu wird Association (zu finden unter Edges in der Palette rechts, vgl. Abbildung 8) angeklickt. Anschließend wird zunächst auf Position und danach auf Employee im grafischen Editor geklickt. Daraufhin wird ein Assoziationspfeil mit den Multiplizitäten und dem Variablennamen eingefügt.

Erstellung einer Assoziation

Abbildung 8: Erstellung einer Assoziation

Auch die Assoziation kann in der Properties-View bearbeitet werden.

Erstellung von Methoden

Nun wird eine neue Klasse EmployeeManager hinzugefügt. Diese soll später die Objekte vom Typ Employee verwalten. Dazu sollen die Methoden addEmployee(…), removeEmployee(…) und getEmployeeByName(…) hinzugefügt werden. Dazu wird zunächst auf die Schaltfläche mit dem grünen Plus neben Owned operation geklickt (vgl. Abbildung 9).

Hinzufügen einer Methode zu einer Klasse

Abbildung 9: Hinzufügen einer Methode zu einer Klasse

In dem sich daraufhin öffnenden Dialogfenster können Parameter mit einem Klick rechts auf die Schaltfläche mit dem grünen Plus neben Owned parameters hinzugefügt werden. Daraufhin öffnet sich ein weiteres Dialogfenster Edit Parameter (siehe Abbildung 10). Dort kann als Name der Name des Parameters festgelegt werden.

Hinzufügen eines Parameters zu einer Methode

Abbildung 10: Hinzufügen eines Parameters zu einer Methode

Außerdem kann die Direction eingestellt werden. Für Eingangsparameter wird in festgelegt, für Rückgabeparameter return. Mittels inout kann ein Parameter sowohl angenommen, als auch zurückgegeben werden. Im Feld Visibility kann die Sichtbarkeit zwischen public, package, protected und private ausgewählt werden. Des Weiteren kann unter Multiplicity die Multiplizität eingestellt werden. Beispielsweise 1 für ein einzelnes Attribut oder 0..* für ein Set oder eine Liste. Beim Type kann der Variablentyp ausgewählt werden. Mit einem Klick auf die Schaltfläche mit den drei Punkten (siehe Abbildung 10) öffnet sich ein weiteres Dialogfenster Type (siehe Abbildung 11).

Auswahl des Parametertyps

Abbildung 11: Auswahl des Parametertyps

Hier kann in unserem Fall die oben erstellte Klasse Employee des Employee-Management-Projektes als Variablentyp ausgewählt werden.
Anschließend wird der gleiche Prozess noch einmal für die Methode removeEmployee(…) durchlaufen.

Für die Methode getEmployeesByName(…) müssen dagegen zwei Parameter definiert werden. Der erste Parameter employeeName hat als Richtung in, als Multiplizität 1 und als Typ String. Der zweite Parameter ist vom Typ Employee, hat als Richtung return und als Multiplizität 0..*. Da die Klasse EmployeeManager intern eine Liste mit den registrierten Mitarbeitern vorhalten soll, wird nun noch eine Association von EmployeeManager zu Employee eingefügt. Dabei ist darauf zu achten, die Multiplizität an Employee auf 0..* zu stellen (vgl. Abbildung 12).

Einstellung der Multiplizität

Abbildung 12: Einstellung der Multiplizität

Vererbung

Nun soll zusätzlich zur Domain-Klasse Employee noch die Klasse ExternalConsultant erstellt werden. Dazu soll eine Oberklasse Person mit den Attributen firstName und lastName erstellt werden. Die Klassen Employee und ExternalConsultant sollen beide von dieser Person-Klasse erben.

Nachdem also die beiden neuen Klassen Person und ExternalConsultant erstellt wurden, können die beiden Attribute firstName und lastName im Model Explorer einfach in die Person-Klasse verschoben werden. Anschließend können sie im Diagramm markiert und über den Kontextmenüeintrag Delete From diagram entfernt werden. Schließlich können sie per Drag and Drop ins Diagramm zu der Person-Klasse hinzugefügt werden. Gerade an Stellen wie hier macht die automatische Synchronisation zwischen dem Model Explorer und dem grafischen Model Editor Sinn.

Um nun die Vererbung einzufügen, wird in der Palette unter Edges der Generalization-Pfeil ausgewählt (siehe Abblidung 13).

Vererbung

Abbildung 13: Vererbung

Anschließend wird wie beim Erstellen von Assoziationen einmal auf die Employee-Klasse und dann auf die Person-Klasse geklickt. Dieser Vorgang wird für die ExternalConsultant-Klasse wiederholt.

Anordnung und Formatierung

Abschließend können die Elemente im Diagramm noch automatisch angeordnet werden. Dazu wird auf die Schaltfläche mit dem Pfeil neben der Schaltfläche mit den drei Rechtecken geklickt. Im Kontextmenü wird dann Arrange All angeklickt (Siehe Abbildung 14).

Automatische Anordnung

Abbildung 14: Automatische Anordnung

Zusätzlich können die Elemente im Diagramm auch von Hand verschoben werden. Auch das Aussehen der Kästen, Schriftarten und die Symbole können über Stylesheets verändert werden [3] oder manuell in der Properties View im Tab Appearence.

Ein Beispiel, wie das finale Diagramm aussehen könnte ist in Abbildung 15 zu sehen.

Finales Diagramm

Abbildung 15: Finales Diagramm

Das Diagramm exportieren

Das Diagramm kann als Bild oder als PDF-Datei exportiert werden. Dabei wird neben gängigen Bildformaten, wie BMP, GIF, JPG und PNG auch das Vektorgrafikformat SVG unterstützt.

Um das Diagramm zu exportieren, wird mit der rechten Maustaste auf das Projekt im Model Explorer geklickt. Im Kontextmenü wird anschließend Export -> Export All Diagrams ausgewählt. Im sich öffnenden Dialogfenster können nun Ausgabeverzeichnis und das Exportformat eingestellt werden.

Fazit

Es fällt auf, dass die hier vorgestellten Funktionen von Eclipse Papyrus recht austauschbar mit denen eines beliebigen UML-Tools (zum Beispiel Umlet [7]) sind. Zusätzlich ist Papyrus jedoch deutlich komplexer zu bedienen und es lassen sich sehr viele Feinheiten einstellen, die in einem einfachen UML-Klassendiagramm ohnehin nicht angezeigt werden. Im Vergleich zu beispielsweise MagicDraw ist die Komplexität der Bedienung von Papyrus jedoch auch nicht über die Maße hoch.

Wer ein reines UML-Modelling-Tool sucht, für den ist Eclipse Papyrus wahrscheinlich etwas zu anspruchsvoll und aufwendig. Aber reines UML-Modelling ist auch gar nicht die Hauptaufgabe von Papyrus. Viel mehr stellt Papyrus eine integrierte Softwaresuite zur Unterstützung modellgetriebener Entwicklungsansätze dar. So kann nächsten Schritt beispielsweise Quellcode in unterschiedlichsten Programmiersprachen aus dem nun erstellten UML-Modell erzeugt werden. Darauf wird in einem weiteren Blogartikel eingegangen.

Quellen

[1] Eclipse Foundation. 2017. Papyrus Use Case Stories. Papyrus Use Case Stories. Retrieved from https://eclipse.org/papyrus/testimonials.html
[2] Eclipse Foundation. 2017. Papyrus User Guide. Papyrus User Guide. Retrieved from http://wiki.eclipse.org/Papyrus_User_Guide#Papyrus_Perspective
[3] Eclipse Foundation. 2017. Papyrus Stylesheet Guide. MDT/Papyrus/UserGuide/CSS. Retrieved from https://wiki.eclipse.org/MDT/Papyrus/UserGuide/CSS#Editing_a_StyleSheet
[4] Eclipse Foundation. 2017. Papyrus. Eclipse. Retrieved from https://eclipse.org/papyrus/
[5] Eclipse Foundation. 2017. Eclipse. Eclipse. Retrieved from https://eclipse.org/
[6] Eclipse Foundation. 2017. Eclipse Modeling Framework EMF. Eclipse Modeling Project. Retrieved from https://eclipse.org/modeling/emf/
[7] Martin Auer et. al. 2017. UMLet – Free UML Tool for Fast UML Diagrams. UMLet – Free UML Tool for Fast UML Diagrams. Retrieved from http://www.umlet.com/

Short URL for this post: https://wp.me/p4nxik-2QT
This entry was posted in Eclipse Universe, MDSD and tagged , , , , , . Bookmark the permalink.

Leave a Reply