Viele wissen bereits, dass der Enterprise Architect über
eine API verfügt mit der man das gesamte Modell und noch vieles mehr
programmatisch verändern kann.
In diesem Artikel möchte ich gerne die Grundlagen der API beleuchten.
ihr sind alle anderen Modellelemente, etc. enthalten. Das Repository entspricht
der Clientapplikation (dem EA) und dem geladenen Modell (dem EAP-File oder
einem DBMS).
Navigieren durch das Objektmodell
Das Repository enthält „Models“ vom Typ Package (rep.Models
). Das sind alle Root Packages im Enterprise Architect. Für den EA sind das also auch „nur“ Pakete.
Ein Paket kann nun Diagramme (package.Diagrams
), Elemente (package.Elements
) oder wiederum Sub-Pakete enthalten (package.Packages
).
Als Ergebnis erhält man immer eine Collection. Diese Collection ist allerdings kein Programmiersprachen spezifischer Container, sondern ebenfalls Teil der EA API. In dieser Collection findet man immer Elemente vom referenzierten Typ (Package, Element, Diagram, etc.)
Die in der Collection enthaltenen Elemente beinhalten jeweils eine ID des Elements in dem sie selbst enthalten sind. Mit element.PackageID
erhält man z. B. die ID des Paketes, in dem das Element enthalten ist.
Will man wieder das korrespondierende Objekt zur gefundenen ID, verwendet man das Repository. Mit repo.GetPackageByID(element.PackageID)
erhält man die korrespondierende Objektreferenz.
Manipulationen am Objektmodell
Will man das Modell programmatisch manipulieren, tut man dies ebenfalls über die Collection. Neue Elemente werden mittels myCollection.Add(,)
hinzugefügt. Wobei die Parameter in der Regel (abhängig vom zu erstellenden Element) der Name und der Typ sind.
Will man eine neue Klasse in einem Paket anlegen geht man folgendermaßen vor:
myClass = myPackage.Elements.Add( "myNewClassName", "Class")
Über die Collection der Elemente eines Paketes erhält man eine neue Instanz, die in der Variable myClass
gespeichert wird, mit Namen myNewClassName
vom Typ Class.
Will man ein neues Attribut an einem Element hinzufügen verwendet man ebenfalls die Collection der Attribute des Elements:
myNewAttribute = myElement.Attributes.Add( "AttName", "int")
Somit erhält man ein neues Attribut mit dem Namen AttName
vom Typ int
. Mittels des erzeugten Objektes myNewAttribute
können weitere Eigenschaften des Attributes gesetzt werden. Es ist auch möglich, dieses Attribut einer anderen Klasse zuzuweisen. Es quasi umzuhängen:
myNewAttribute.ParentID = 23
(… wobei 23 die ElementID eines anderen Elementes ist, das nun dieses Attribut bekommt)
Wichtig: Durch die oben beschriebenen Aktionen wurde lediglich das Objektmodell das aktuell geladenen Repositoriums geändert. Die Änderungen wurden noch nicht persistiert (in die DB geschrieben).
Zum Speichern der Änderungen bietet jedes Element eine Update() Operation. Damit wird das geänderte/neue Objekt persistiert.
Neben dem Schreiben der Änderungen ist es notwendig, das restliche Objektmodell neu zu laden. Dies geschieht durch den Aufruf von Refresh()
. Folgendes Beispiel zeigt ein Beispiel in JScript wie ein neues Attribut am Element theElement
hinzugefügt werden kann.
var attributes as EA.Collection; attributes = theElement.Attributes; var newAttribute as EA.Attribute; newAttribute = attributes.AddNew( "m_newAttribute", "string" ); newAttribute.Update(); attributes.Refresh();
Elemente löschen
Vorhandene Elemente können natürlich auch gelöscht werden. Dies geschieht über die collection.DeleteAt(index)
Operation. Dabei muss die Collection durchlaufen werden, wurde das zu löschende Element gefunden, kann mittels DeleteAt
und den gefundenen Index gelöscht werden:
// Delete the attribute we just added ' List attributes for i = 0 to attributes.Count - 1 dim currentAttribute as EA.Attribute set currentAttribute = attributes.GetAt( i ) ' Delete the attribute we added if currentAttribute.AttributeID = addedAttributeID then attributes.DeleteAt i, false end if next
Mit diesem Überblick sollte es kein Problem mehr sein, seine Modelle programmatisch zu manipulieren.
Hier finden Sie das oben gezeigte Klassendiagramm in einem EA-Repositorium (.eapx).
Falls Sie mehr über das Enterprise Architect Objektmodell erfahren möchten, können Sie uns gerne kontaktieren.
Wir bieten individuelle Schulungen an.
Danke für die Beschreibung des EA-Datenmodells.
Gibt es dieses Datenmodell auch als EAP-, XMI- File zum Download?
Ist eventuell ein Header-File oder allgemein die Klassendefinition auch als Source-Code vorhanden?
Die API ist auch in der EA Hilfe beschrieben. Dort sind auch die einzelnen Operationen im Detail erklärt. Das oben dargestellte Klassendiagramm ist auch nur ein Auschnitt des EA Objektmodelles. Eventuell werde ich es noch erweitern und dann auch als EAP File zur Verfügung stellen.
Druch Model Scripts kann man sich auch sehr gut in das EA Objektmodell einarbeiten.
Ich habe den Artikel aktualisiert und einen Download-Link zu einem EAP hinzugefügt. In dem EAP ist das API Modell und das DB-Schema enthalten.