Folie 1Entwicklungsbegleitender Test mechatronischer Systeme > Dr. Olaf Maibaum > 071022Praesenation > 22.10.2007
MDA in der Praxis
Modelltransformation und Code-Generierung mit dem Enterprise ArchitectDr. Olaf Maibaum, DLR Simulations- und Softwaretechnik
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 2
Übersicht
Profile
Transformationen
UML -> UML
UML -> Source Code
Schreiben von Transformationen
Transformationen am Beispiel Rodos
Fazit
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 3
Profile
Profile reichern die UML mit eigenen spezifischen Sprachinhalte an
Kapseln von Modell-Abstraktionen
Wiederverwenden von Elementen aus einem Entwicklungs-Framework
Modellieren der Elemente einer GUI
Profile definieren Stereotypen für UML-Elemente
Jeder Stereotyp kann mit Tagged Values versehen werden
Stereotypen und Tagged Values steuern Transformationen
UML -> UML
UML -> Code
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 4
Profile erstellen
Öffnen eines Klassendiagramms
Aus den Tools UML-Profile auswählen
Das Profile-Element aus der Toolbox in das Klassendiagramm ziehen und das Profile benennen
EA erweitert das Projekt um einen Namensraum mit Stereotyp „profile“
In dem Namensraum können nun Klassendiagramme angelegt werden
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 5
Stereotypen anlegen
Jeder Stereotyp ist einem UML-Element zugeordnet
Als erstes ist eine Meta-Klasse in ein Klassendiagramm zu ziehen
In der erscheinenden Auswahlbox sind die entsprechenden Elemente zu wählen, welche mit Stereotypen angereichert werden sollen
Einen Konnektor von der Meta-Klasse aus ziehen und die Extend-Beziehung wählen, um einen Stereotypen zu definieren
Alternativ Toolbox nutzen
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 6
Stereotypen um Tagged Values erweitern
Der Stereotyp kann durch den Eigenschaftsdialog entsprechend bearbeitet werden
Tagged Values werden als Attribute eines Stereotypen definiert
Diese Daten können später im Editor durch den Nutzer bearbeitet werden
Im Beispiel eines Thread-Stereotypen:
Name
Priorität
Timingwerte
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 7
Constraints
Jedem Stereotypen oder Tagged Value können Bedingungen für eine Validierung im Reiter Constraints gegeben werden
Beispiel:
Eine Assoziation mit Stereotyp send ist immer auf eine Klasse mit Stereotypen Message gerichtet
Einem Tagged Value priority des Stereotypen Thread ist definiert
OCL-Beispiel ist fa
lsch
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 8
Profile speichern
Kontextmenü zum Namensraum des Stereotypen „Save Package as UML Modell
Als UML 2.0 speicher!
Gegebenenfalls Stereotypen noch sortieren für eine einfachere Nutzung
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 9
Profil laden
Vom Projekt-Browser in Ressourcen wechseln
Im Kontext-Menü des „UML Profile“ „Import Profile“ wählen
XML-Datei mit dem Profile wird importiert
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 10
Profile nutzen
Drag und Drop der Elemente aus dem Ressourcen-Bereich des Editors in ein Diagramm
Auswahl des Profiles aus der Tool-Auswahl und dann Drag und Drop aus der Toolbox
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 11
TransformationenUML -> UML
Auflösen einer Abstraktionsebene
Hinzufügen von Hilfsklassen oder Modellpatterns
Hinzufügen von Assoziationen
Hinzufügen von Attributen und Operationen
Ändern genereller Elemente-Einstellungen
Eigenschaft Containment im Ziel einer Aggregation wird mit „Value“ versehen (Standard für eingebetteten System)
Spezifizieren auf ein Framework
Hinzufügen von Standardattributen und -operationen des verwendeten Frameworks
Hinzufügen von Modellpatterns
Überführen von Stereotypen in Stereotypen eines Frameworks
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 12
TransformationenUML -> Code
Eigentlich Code-Generator
Standardüberführung von UML-Klassendiagrammen in die Zielsprache
Erstellen von spezialisierten Code aus Stereotypen und Tagged Values
Ererbung von Schnittstellen und Ableiten von Basisklassen
Erweitern der Attribute und Methoden
Erzeugen von ausführbaren Code für Helfermethoden des verwendeten Framework, z. B.
Initialisierung
Anmeldung
Abmeldung
Standardoperationen
Parametrisieren durch Tagged Values
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 13
Zugriff auf Templates
Unter dem Menü „Settings“
Code Generation Templates
UML -> Code
Transformation Templates
UML -> UML
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 14
Template Editor (1)
Auswahl eines Sprachpakets
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 15
Template Editor (2)
Anlegen von neuen Sprachpaketen
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 16
Template Editor (3)
Templates einer Sprache
Die Spalte Modified gibt an, ob das Template angepasst wurde
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 17
Template Editor (4)
Mit Stereotypen überschriebeneTemplates
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 18
Template Editor (5)
Anlegen neuer Templates:-komplett neu-Mit Stereotypen überschrieben
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 19
Template Editor (6)
Speichern oder Löschen desausgewählten Template
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 20
Template ergänzen
Zum Anlegen eines neuen Templates
Das betreffende UML-Element als Template Type wählen
Einen Namen vergeben
EA vergibt als Namen immer <UMLType>__<Name> (Zwei ´_´ ! )
Das erzeugte Template ist leer
Zum Überschreiben eines Template mit einem Stereotypen
Die entsprechenden Stereotypen wählen (Class, Feature)
Das erzeugte Template ist eine Kopie des überschriebenen Templates
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 21
Ablauf einer Transformation
Für jede Klasse wird eine Transformation durchgeführt
Es wird immer mit dem Template File begonnen
Für Sprachen mit getrennter Definition und Implementierung
File für Definition
File Impl für Implementierung
Alle anderen Templates müssen direkt oder indirekt durch File aufgerufen werden
Mit Stereotypen überschrieben Templates werden implizit ausgewählt, falls das zu übersetzende Objekt den Stereotypen besitzt
Ergebnis einer Transformation ist ein Text
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 22
Exportieren/Importieren
Im Menü Tools:
Export Reference Data
Import Reference Data
Eine xml Datei kann einen ganzen Satz an Transformationen beinhalten
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 23
Beispiel RODOSUML -> UML
class RODOS_Test
«Thread»Sender
tagsname = Bobpriorit y = 50startAt = 100startEvery = 500
«Thread»Rece iv er
tagsname = Alicepriority = 51startAt = 90startEvery =
«Message»Data gram
- cmd: int32+ parameter: int32 [0..8]
tagsexecute = 1identificat ion = MyMsg
Da ta
- att1: int- att2: int
«receive»{connectorDest}
«send»{connectorDest}
class RODOS_Test
Da ta
- att1: int- att2: int
«Message»Data gram
- cmd: int32+ parameter: int32 [0..8]
«Thread»Rece iv er
«Thread»Sender
«receive» «send»
class Configuration
«enumeration»ThreadConfiguration
PRIORITY_RECEIVER = 51 PRIORITY_SENDER = 50 TIMING_START_ RECEIVER = 90 TIMING_PERIOD_RECEIVER TIMING_START_ SENDER = 100 TIMING_PERIOD_SENDER = 500
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 24
Class Template für Stereotypen Thread
%elemType%{ %TRANSFORM_REFERENCE("Class")% %TRANSFORM_CURRENT()%%list="ClassParameter" @separator="\n" @indent=" "%%list="ClassBase" @separator="\n" @indent=" "%%list="ClassInterface" @separator="\n" @indent=" "%%list="InnerClass" @separator="\n" @indent=" "%%list="Attribute" @separator="\n" @indent=" "%%list="Operation" @separator="\n" @indent=" "% stereotype = "Thread" notes = %qt%%classNotes%%qt% Tag { name = "name" value = %qt%%classTag:"name"%%qt% }}%list="Connector" @separator="\n"%
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 25
Ergänzung zu Template Namespace
$threadPriorities=%list="Class__ThreadPriorities" @separator="\n" @indent=" "%$threadTimings=%list="Class__ThreadTiming" @separator="\n" @indent=" "%Package{ name = "Configuration" Class { notes = "Defines the priority, start and period time of threads" stereotype = "enumeration" Tag { $comment = "name = asCppDefintion falls #define erzeugt werden soll" name = "suppressUndefined" value = "T" } name = "ThreadConfiguration" $threadPriorities $threadTimings }}
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 26
Neues Template ClassThread__Timing
%if classStereotype!="Thread"%%endTemplate%
$startName = "TIMING_START_"+%TO_UPPER(className)%$periodName = "TIMING_PERIOD_"+%TO_UPPER(className)%
Attribute{ type = "Nanoseconds" name = %qt%$startName%qt% default = %qt%%classTag:"startAt"%%qt%}Attribute{ type = "Nanoseconds" name = %qt%$periodName%qt% default = %qt%%classTag:"startEvery"%%qt%}
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 27
Beispiel RODOSUML -> Code
[--- snip ---]
/**
* Body of the thread Alice
*/
void run()
{
// Define thread timing
setPeriodicBeat(Configuration::TIMING_START_RECEIVER,Configuration::TIMING_PERIOD_RECEIVER);
while(1)
{
waitUntilNextBeat();
// fill in your thread body here
}
class RODOS_Test
Da ta
- att1: int- att2: int
«Message»Data gram
- cmd: int32+ parameter: int32 [0..8]
«Thread»Rece iv er
«Thread»Sender
«receive» «send»
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 28
Überladung für Stereotyp „Thread“ von „Class Body Impl“ (1)
%if classTag:"name" != ""% $threadName = %classTag:"name"%%else% $threadName = %className%%endIf%
$startName = "Configuration::TIMING_START_"+%TO_UPPER(className)%$periodName = "Configuration::TIMING_PERIOD_"+%TO_UPPER(className)%
// Initialization of thread $threadNamevoid init(){ // fill in your initializations here }
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 29
Überladung für Stereotyp „Thread“ von „Class Body Impl“ (2)
/* * Body of the thread $threadName */void run(){ // Define thread timing setPeriodicBeat($startName,$periodName); while(1) { waitUntilNextBeat(); // fill in your thread body here }}
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 30
Statt „enumeration“ ein „#define“ verwenden
Ergänzen enumeration-Überladung einer Klasse:
%ClassNotes%
%if classTag:"asCppDefintion"=="T"%
%list="Attribute__asCppDefinition" @separator="\n\n"%
%endTemplate%
Neues Template Attribute__asCppDefinition
%if attInitial!=""%
#define %attName% (%attInitial%)
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 31
Hilfe zur Erstellung von Transformationen
Abschnitt MDA Transforms
Code Engineering
Code Template Framework
Extend Enterprise Architect - Software Developers Kit
Code Template Framework in SDK
MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008
Folie 32
Fazit
Positiv
Anwendung der MDA erspart Modellierungszeit
Immer wiederkehrender Code kann automatisch erzeugt werden
Negativ
Schreiben der Templates ist recht komplex
Dokumentation der Template-Syntax ist dürftig
Debugging der Templates ist schwierig
Es gibt implizite Regeln für die Code-Erzeugung, welche sich nicht beeinflussen lassen
Bsp: Bei Stereotyp <<enumeration>> wird „file impl“ nicht aufgerufen, ansonsten immer