Das Modeling-Framework Eclipse Graphiti

Domain Model

Das Domain Model enthält die Daten, die grafisch visualisiert werden sollen. Beispielsweise würde man für einen grafischen Ecore-Editor das Ecore Metamodel verwenden. Ein Editor für BPM (Business Process Management) würde die Business Process Modeling Notation verwenden. Es ist von Vorteil (aber nicht zwingend erforderlich), wenn dieses Modell ebenso wie das Pictogram Model in EMF zur Verfügung steht. Graphiti kann natürlich auch mit Modellen außerhalb von EMF umgehen. Die Daten des Domain Models werden in Graphiti auch als Business Objects bezeichnet.

Pictogram Model

Das Pictogram Model enthält die vollständige Information zur Darstellung eines Diagramms. Das bedeutet, dass jedes Diagramm auch ohne Vorhandensein der Domaindaten dargestellt werden kann. Das erfordert eine teilweise redundante Ablage von Daten, die sowohl im Pictogram Model als auch im Domain Model vorhanden sind. Man denke im Fall eines Ecore-Editors an die Klassennamen. Da Datenredundanz stets die Problematik der Synchronisation nach sich zieht, bietet Graphiti ein Konzept, um Daten abzugleichen. Mithilfe von so genannten Updatefeatures können Datenschiefstände sowohl grafisch angezeigt als auch halb- oder vollautomatisch korrigiert werden. Das ermöglicht ein Editieren von Domaindaten mit unterschiedlichen Tools und ein nachträgliches Aktualisieren von bereits existierenden Diagrammen. Eine ausführliche Besprechung des Pictogram Metamodels würde den Rahmen dieses Artikels sprengen. Wer weitere Informationen haben möchte, kann das Metamodel im Plug-in org.eclipse.graphiti.mm finden, das einige Diagramme enthält, die man sich mithilfe des Ecore-Tooling ansehen kann [4]. Später wird im Beispiel gezeigt, wie Daten für eine grafische Darstellung im Pictogram Model erzeugt werden.

Link Model

Das Link Model ist zuständig für die Verbindung der Daten aus dem Domain Model und der grafischen Darstellung (also den Daten aus dem Pictogram Model). Diese Verbindungen werden bei vielen Aktionen im grafischen Editor wieder benötigt. Beispielsweise wird beim Löschen oder Verschieben eines grafischen Objekts auch das zugehörige Objekt des Domain Models benötigt, um auch in diesem Modell die notwendigen Änderungen vornehmen zu können.

Aufgaben des Diagram Type Agents

Am besten werden diese anhand eines kleinen Beispiels (in diesem Fall eine Create-Operation) erklärt. Diese wird durch den Benutzer über die Interaction Component ausgelöst. Der Benutzer klickt also in die Palette des grafischen Editors und zieht dann mit der Maus im angezeigten Diagramm ein Rechteck auf, das bestimmt, wo das neue Objekt erzeugt werden soll. Der Diagram Type Agent macht jetzt Folgendes:

  • Erzeugen des neuen Objekts im Domain Model
  • Die grafische Darstellung im Pictogram Model erzeugen, d. h. Grafikalgorithmen wie z. B. RoundedRectangle und Text anlegen, sie mit Farben und Fonts versehen und das Ganze entsprechend anordnen.
  • Eine Verknüpfung von Grafik- und Domain Model Object erzeugen (Link Model)
Das Featurekonzept

Abbildung 2 zeigt den inneren Aufbau des Diagram Type Agents.

Abb. 2: Aufbau des Diagram Type Agent

Die hier dargestellten Akteure sind vom Entwickler zu erstellen. Dazu gehört eine Menge von sogenannten Features, die sehr gut mit Operationen zu vergleichen sind. Hier einige typische Beispiele zu Graphiti-Features:

  • Add Features erzeugen grafische Darstellungen im Pictogram Model.
  • Create Features erzeugen neue Objekte im Domain Model sowie die entsprechende grafische Repräsentation. Hier macht es Sinn, vorhandene Add Features zu nutzen.
  • Remove Features löschen eine grafische Darstellung aus dem Pictogram Model.
  • Delete Features löschen sowohl ein Domain-Objekt als auch dessen grafische Darstellung.
  • Ein Feature Provider liefert unter Berücksichtigung eines übergebenen Kontexts den oder die jeweils benötigten Features. Die Abarbeitung der Features führt zu den oben genannten Modifikationen der entsprechenden Daten.

Weitere Diagrammtyp- und damit toolspezifische Anfragen der Interaction Component werden vom Diagram Type Provider beantwortet. Dazu gehört unter anderem die jeweilige Update-Strategie, d. h. die Entscheidung, wann Synchronisationen zwischen Domain und Pictogram Model durchgeführt werden.

Beispiel

In diesem Beispiel realisieren wir einen einfachen Ecore-Editor für Metamodelle, mit dem wir die grafische Repräsentation einer EClass erzeugen können. Diese soll als abgerundetes Rechteck dargestellt werden, das im oberen Teil eine separierende Linie enthält, über der der Name der EClass als Text erscheint. Wir erstellen den Diagram Type Agent in vier Schritten: Als Erstes implementieren wir einen Diagram Type Provider, dann registrieren wir ihn für unseren neuen Diagram Type. Im dritten Schritt wird ein Feature-Provider erstellt, für den wir als Letztes ein Add Feature implementieren. Für unseren MyTutorialDiagramTypeProvider nutzen wir die Standardimplementierung AbstractDiagramTypeProvider:

package org.eclipse.graphiti.examples.tutorial.diagram;
public class MyTutorialDiagramTypeProvider extends AbstractDiagramTypeProvider {
public MyTutorialDiagramTypeProvider() {
       super();
}

Der zweite Schritt besteht in der Definition des Diagram Type mytutorial, der mithilfe des Extension Points diagramType in der plugin.xml erfolgt (vgl. Listing 1). Die Zuordnung von mytutorial zu MyTutorialDiagramTypeProvider und der Registrierung dieser Kombination beim Framework realisiert der Extension Point diagramTypeProviders. Damit ist der Beispieleditor in Eclipse registriert.

Listing 1: Registrieren des Diagram Type Providers und des Diagram Type

Für den Feature-Provider greifen wir im dritten Schritt erneut auf eine Standardimplementierung zurück:

public class TutorialFeatureProvider extends DefaultFeatureProvider {
public TutorialFeatureProvider(IDiagramTypeProvider dtp) {
        super(dtp);
    }
}

Abschließend müssen wir noch den TutorialFeatureProvider unserem MyTutorialDiagramProvider bekannt machen (Abb. 2), das geschieht mit der Methode setFeatureProvider:

public MyTutorialDiagramTypeProvider() {
       super();
       setFeatureProvider(new TutorialFeatureProvider(this));
    }
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.