# [GEF] gespeicherte Dateien des generierten Editor



## Christoph.R (7. Mai 2010)

Hallo,

ich bin gerade dabei eine Server/Client-Anwendung zu schreiben, bei der der Server eine Baumstruktur an den Client übermitteln soll, welche der Client dann darstellen soll.
Weil später noch andere Knoten und Blätter hinzukommen können, wäre ein modelgetriebener Ansatz sinnvoll und da der Baum auf Clientseite bearbeitet werden soll, hat sich für mich GEF angeboten.
Die Verbindung zwischen Server und Client wollte ich über ein Plugin realisieren, das die entsprechenden Daten via Socket bekommt und dann eine Art automatisches Öffnen durchführt, also anstatt eine Diagrammdatei zu öffnen, die Daten vom Server bekommt.

Als einführendes Beispiel in das GEF habe ich das Tutorial Homepage Ralf Vandenhouten durchgearbeitet, was soweit auch geklappt hab.

Da GEF nicht nur die eigentlich Baumstruktur abspeichert, sondern auch Daten zum Layout des Diagramms, wollte ich auf Serverseite ein vereinfachte Form generieren lassen und die Koordinaten der Elemente im Client berechnen und hinzufügen lassen. Jedoch beinhaltet das gespeicherte Diagramm z.B. auch irgendeine ID, bei der ich nicht weiß wo sie herkommt und daher kann ich sie nicht im Nachhinein hinzufügen.

(Lange rede kurzer Sinn)
Gibt es eine einfach Möglichkeit einer einfache Baumstruktur( als "XML") von dem generierten Ecore-Model und den anderen Model, die beim Generieren des Editors anfallen, auf die gespeicherten Daten(ohne Koorinaten) zu kommen?

Ich bin über jeden Vorschlag und jede Idee dankbar!

Mfg
Christoph


----------



## Wildcard (8. Mai 2010)

Du meinst GMF, nicht GEF, richtig?
GMF stülpt ein Notational Model um dein Domain Model. Du willst nur das Domain Model übertragen, nicht das Notational GMF Model das die Koordination enthält.
Im gmfgen kannst du einstellen ob Domain und Notation in der gleichen Resource gespeichert werden sollen (default), oder separat. Du möchtest vermutlich letzteres.
Aber auch wenn du beide in der gleichen Resource speicherst kannst du einfach die Resource laden, dir den Root Knoten holen (das ist dann ein Notational Knoten), dir dessen Domain Element geben lassen (der Root deines Ecores) und nur dieses Objekt versenden.


----------



## Christoph.R (8. Mai 2010)

Das ist richtig, der Editor speichert die Informationen in zwei verschiedenen Dateien,
eine mit dem reinen Domainmodel und eine mit Informationen zum Layout.
Ich hatte aber einen Fehler in der genmap, der dazugeführt hat, dass das Domainmodel nicht richtig gespeichert wurde.
Es hatten immer die Verbindungen der Elemente (Knoten) gefehlt. 

Außerdem habe ich nun gemerkt, dass der generierte Diagrameditor von hause aus eine Öffnenfunktion besitzt,
die genau das macht, was ich will. Sie heißt "Initialize ...-diagram diagram file".


----------



## Wildcard (8. Mai 2010)

Genau, das entscheidende ist nur das Domain Modell. Ist deine Frage damit beantwortet, oder fehlt noch etwas?
Übrigens, da (so wie ich dich verstehe) die grafische Repräsentation primär zur Visualisierung dient und weniger zum Editieren kommst du vermutlich schneller zum Ziel (und optisch ansprechender) wenn du einfach nur einen Zest Viewer für den EMF Modell schreibst. Das ist üblicherweise mit einigen wenigen Zeilen (ContentProvider + LabelProvider) erledigt wenn es nur um eine einfache visualisierung geht.
Zest: The Eclipse Visualization Toolkit


----------



## Christoph.R (8. Mai 2010)

Danke für den Tip mit Zest, aber das Diagram soll auf Clientseite auch bearbeitet werden können
und auch wieder an den Server gesendet werden können.

Eine Frage hätte ich noch.
Ich möchte verschiedene Baumknoten darstellen können, die unterschiedliche Anzahl von Kindknoten haben können.
Dies bekomme ich jedoch nicht realisiert.
Ich habe das Ganze mit dem EcoreDiagram von Ecplise modelliert und daraus meine Ecoredatei erzeugen lassen.

Hier das EcoreDiagram.






Wie man sieht soll jede Connection ihren Quell- und Zielknoten enthalten.
Desweiteren soll es zwei verschiedene Arten von Knoten geben.
Einen der einen Ein- und einen Ausgang hat und einen weiteren der Zwei Ein- und einen Ausgang besitzt.
Im daraus generierten Editor macht es aber keinen unterschied, ich kann soviele Connections in einen Node reinstecken wie ich will.

Muss ich hierfür noch bestimmte Einstellungen machen, im Model oder der gmfmap oder sonst wo.

Habt ihr hierzu irgendwelche Ideen oder ein Tutorial wo dies gemacht wird?


----------



## Wildcard (8. Mai 2010)

Einschränkungen der Kardinalität werden vom Editor nicht forciert, das ist eine Aufgabe für die Validierung. Du kannst das entweder direkt per GMF mit OCL erledigen, oder im Code.
Übrigens, was genau  möchtest du eigentlich modellieren?
Ein Domain Modell das aus Knoten und Kanten besteht ist etwas unüblich. Normalerweise repräsentiert das Ecore deine Domain und kümmert sich nicht darum das es in einem Graph angezeigt wird.
Objekte wie Connections muss man auch nicht explizit als EClass modellieren, GMF kann die Kanten des Graph einfach aus den Beziehungen des Modells (EReferences) inferieren.
Also angenommen du willst etwas wie ein Organigramm machen.
Du hast eine EClass Person die zwei EReferences hat:
supervisor : Person (genau eine)
subordinates : Person (0..n)

supervisor ist EOpposite von subordinates.
Wenn du nun einer Person A den Supervisor B setzt, dann ist A automatisch in der Liste der subordinates von B. Im GMF Diagramm werden dann aus diesen Referenzen Connections abgeleitet.
In diesem Fall würde zum Beispiel eine gerichtete Kante von A nach B entstehen (oder andersherum, je nachdem wie du es interpretieren möchtest). Und all das geht komplett ohne explizit Knoten oder Kanten zu modellieren, du arbeitest nur auf deinem Domain Modell das die Business Logik enthält.


----------

