Metamodel API Generator

Ein Metamodel API ist ein Programmierinterface um von einem Visual Studio Applikationsprojekt auf die Inhalte eines Modells in Meta Genius zuzugreifen.

Über dieses API können alle Inhalte eines Models sowohl ausgelesen, als auch neu erstellt oder verändert werden. Ein Metamodel API stellt damit die elementare Grundlage für die Entwicklung von Generatoren bzw. Modell-Transformatoren dar. Auch der Transformator Framework Generator baut auf diese APIs auf.

Die Generierung eines Metamodel APIs ist mit Meta Genius denkbar einfach. MetaModel auswählen, Prefix, Namespace und Target Folder festlegen und los gehts.

Wirklich interessant wird es jedoch erst bei einem Blick in den generierten C# Code. Hierfür werden wir das Metamodel API aus dem „Beispiel: Modellierung eines Einstellungsmenüs“ näher betrachten.

Zugriffsfunktionen auf Datenelemente

Der generierte Code für den Zugriff auf ein Datenelement besteht im einfachsten Fall aus folgendem Getter und Setter:

public String Title
{
   get { /*...*/ }
   set { /*...*/ }
}

Für Datenelemente mit einer Multiplicity > 1 werden alternativ folgende Zugriffsfunktionen generiert:

public SdeMenu[] SubMenus
{
   get { /* ... */ }
}

public void AddSubMenu( SdeMenu _subMenu )
{
   /* ... */
}

public void InsertSubMenu( SdeMenu _subMenu, Int32 index)
{
   /* ... */
}

public SdeMenu RemoveSubMenu( Int32 index )
{
   /* ... */
}

public void ClearSubMenus()
{
   /* ... */
}

Modell-Traversierung durch Anwendung des Visitor Patterns

In einem Codegenerator muss üblicherweise für jedes einzelne Objekt des Input-Modells eine gewisse Generierungs-Aktivität durchgeführt werden, die am Ende zum generierten Source Code als Output führt. Um zu allen Objekten des Input-Modells zu gelangen, ist eine sogenannte Modell-Traversierung erforderlich. Hierfür gibt es verschiedene Strategien, wie z. B. Top-Down-Traversierung oder Bottom-Up-Traversierung.

Um diese Traversierung nicht immer wieder aufs neue Codieren zu müssen, haben sich kluge Köpfe das Visitor Pattern überlegt, bei dem der Traversierungscode gezielt getrennt wird – von dem Code, der als Aktivität für die einzelnen Objekte ausführt werden soll. Perfekt für die Anwendung in Codegeneratoren.

Die von Meta Genius generierten Metamodel APIs unterstützen die Anwendung des Visitor Patterns und enthalten den hierfür erforderlichen Traversierungscode.

Um damit auch noch die größtmögliche Flexibilität zu bieten, wird die Traversierung in den Metamodel APIs über drei verschiedene Strategien unterstützt: Top-Down, Bottom-Up oder Top-Down-Bottom-Up als Kombination von beiden.

Das generierte API enthält für jede MetaClass eine entsprechende accept(...) Funktion, um die Traversierung mit einem Visitor zu starten:

public override void AcceptTopDownBottomUp( Sde_ITopDownBottomUpVisitor topDownBottomUpVisitor )
{
   /* ... */
}

Als Vorlage für entsprechende Visitors wird eine Visitor Basisklasse generiert, die für jede MetaClass entsprechende visit(...) und leave(...) Funktionen enthält:

public virtual void VisitMenu( SdeMenu ipMenu )
{
}

public virtual void LeaveMenu( SdeMenu ipMenu )
{
}

Die visit(...) Funktionen werden jeweils in der Top-Down Richtung aufgerufen, die leave(...) Funktionen entsprechend in der Bottom-Up Richtung. Diese können dann ganz einfach mit eigenen Visitor-Klassen überladen und entsprechend implementiert werden.

Mit Hilfe des Transformator Framework Generators kann man sich beispielsweise eine einstellbare Anzahl von diesen Visitors generieren lassen.