Benutzer:Strittm/RefactoringHiwi/DokumentationPCMMitGraphiti

Aus SDQ-Wiki

Dokumentation zur Implementierung eines Graphiti Editors mit modularisiertem PCM

Installation

Das Beispielprojekt, welches für das PoC sowie die Experimente verwendet wurde ist im SVN unter https://svnserver.informatik.kit.edu/i43/svn/stud/MarioWieser/HiWi/Graphiti zu finden.

Damit das Projekt verwendet werden kann, muss Eclipse mit den Modeling Tools sowie Graphiti installiert sein.

Projektaufbau

Das Projekt besteht aus zwei Teilprojekten: Das "Core"-Projekt enthält den Kern der Anwendung wohingegen das "Ext"-Projekt eine Erweiterung des "Core"-Projektes beschreibt.

Projektaufbau

Ziel ist es, dass das "Core"-Projekt ähnlich einer Plugin-Schnittstelle beliebig um beliebige Erweiterungen erweitert werden kann.

Beschreibung des Metamodells

Das Projekt besteht insgesamt aus zwei Metamodellen, welche einfach gehalten sind. Das Core Metamodell hat eine Container-Klasse, die alle anderen Klassen beinhaltet. Außerdem eine abstrakte Klasse von der die konkrete Klasse ExtensionZero ableitet. Ziel ist es ein modulares Metamodell zu entwickeln, welches aus dem Core sowie beliebig vielen weiteren Modellen besteht. Aus diesem Grund leiten alle neuen Metamodelle vom initialen Core Metamodell ab.

Metamodell des Editors

Implementierung

Realisierung des grafischen Editors

Zur Realisierung wurde das Graphiti Framework eingesetzt. Die grafischen Elemente des Editors wurden mit dem Pattern Konzept erstellt.

Aufbau des Editors:

  • CoreDiagramTypeProvider: Kern des Editors, setzt alle nötigen Provider, wie beispielsweise den Feature Provider.
  • CoreFeatureProvider: Fügt alle Features und Pattern hinzu. Externe Feature von Plugins werden mit einem ExtensionPoint geladen.
  • CoreToolBehaviorProvider: Blendet die Palette im Read-Only Fall aus und kann z.B. das ContextMenü manipulieren.
  • *.Properties Klassen sind für die realisierung des Property-Sheets verantwortlich
  • CoreDiagramWizard und CreateNewCoreDiagramPage erstellen ein neues Core Diagram
  • CoreDiagramEditor: überschriebene Editor Klasse um die Read-Only-Funktionalität zu realisieren (s.u.)
  • *Pattern: Diese klassen sind die grafische Repräsentation zum darunterliegenden Metamodell.

Installieren von externen Plugins

Das Installieren von externen Plugin wurde über einen selbst definierten ExtensionPoint realisiert.

Implementierung auf Plugin Seite

  • dem Projekt die Extension edu.kit.ipd.sdq.extensionpoint.feature hinzufügen
  • Klasse erstellen, welche das Interface IPluginFeature implementiert.
    • innerhalb der getPluginPattern()- Methode kann das neu erzeugte Pattern übergeben werden.

Implementierung auf Core Seite

  • in der plugin.xml ist der ExtensionPoint edu.kit.ipd.sdq.extensionpoint.feature mit dem Interface IPluginFeature definiert
  • zur Auswertung der extensionPoints wurde die Klasse EvaluateIPluginExtensionPoint implementiert
  • beim Start des Editors wird innerhalb des CoreFeatureProvider der extensionPoint ausgewertet und alle verfügbaren Pattern dem Core Editor hinzugefügt.

Realisierung der Read-Only Eigenschaften

Falls ein Benutzer Diagramme öffnet, welche Komponenten aus nichtinstallierten Plugins enthalten, so wird das Diagram auf Read-Only gesetzt. Der Mechanismus wurde wie folgt implementiert.

  • Zunächst wurde eine Registry "FeatureRegistry" implementiert.
    • Diese fügt alle installierten externen Komponenten hinzu
    • Dazu wird der Name der Komponente, beim Hinzufügen in den FeatureProvider, in der Registry gespeichert.
  • Im zweiten Schritt wurde die setInput()-Methode der Editor-Klasse von Graphiti überschrieben
    • Wenn der Input gesetzt wird (sprich die Daten des zu ladenden Diagrammes), dann werden die Komponenten des Diagrammes mit den installierten Komponenten aus der Registry abgeglichen.
    • Wenn nicht alle Komponenten installiert sind, dann wird das Read-Only-Flag in FeatureProvider und ToolBehaviorProvider auf true gesetzt.
  • Flag in FeatureProvider auf true
    • In diesem Fall werden alle features durch leere Dummy-Features ersetzt, sodass keine Operation auf dem Diagramm mehr ausgeführt werden kann.
  • Flag in ToolBehaviorProvider true
    • Dann wird innerhalb des Diators die Palette rechts ausgeblendet, da durch Realisierung des Pattern-Konzeptes trotz der Dummy-Features noch die Komponenten des Core verwendet werden können.

Probleme

  • Read-Only über setVisible(false) in Pictogramm-Elementen von Graphiti
    • Leider nicht bzw. nur schwer möglich
    • Hierzu muss an einem Punkt angesetzt werden, an welchem das Diagram modifiziert wird
    • Idee: Ansetzen am DiagramChangeListener/ModelChangeListener
    • Nicht möglich, da keine Schreibberechtigung aufgrund von Nebenläufigkeit -> das Pictogramm-Element kann nicht auf false gesetzt werden
  • Realisierung von Metamodell Erweiterungen
    • Damit eine Erweiterung des Metamodell auch dass Kern-Metamodell kennt, wird diese Abhängigkeit über eine Metamodell-Referenz in der Erweiterung realisiert.
  • Erkennung nicht-installierter Komponenten
    • Vergleich zwischen grafischen Komponenten in der gespeicherten Instanz (welche geöffnet werden soll) sowie den Pictogramm-Elementen, die beim Start der Applikation in den Editor geladen werden.
  • Implementierung von Property-Sheets in Extensions
    • Implementierung innerhalb der Extensions. Die Property-Sheets werden geladen, wenn das Plugin installiert wird.