MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

32
Folie 1 Entwicklungsbegleitender Test mechatronischer Systeme > Dr. Olaf Maibaum > 071022Praesenation > 22.10.2007 MDA in der Praxis Modelltransformation und Code-Generierung mit dem Enterprise Architect Dr. Olaf Maibaum, DLR Simulations- und Softwaretechnik

description

TechTalk von Olaf Maibaum (DLR Braunschweig, 21.10.2008).

Transcript of MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

Page 1: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 2: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 3: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 4: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 5: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 6: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 7: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 8: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 9: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 10: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 11: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 12: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 13: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 14: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008

Folie 14

Template Editor (1)

Auswahl eines Sprachpakets

Page 15: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008

Folie 15

Template Editor (2)

Anlegen von neuen Sprachpaketen

Page 16: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 17: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

MDA in der Praxis > Dr. Olaf Maibaum > MDA_Praxis_081021 > 21.10.2008

Folie 17

Template Editor (4)

Mit Stereotypen überschriebeneTemplates

Page 18: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 19: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 20: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 21: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 22: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 23: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 24: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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"%

Page 25: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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 }}

Page 26: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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%}

Page 27: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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»

Page 28: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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 }

Page 29: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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 }}

Page 30: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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%)

Page 31: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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

Page 32: MDA in der Praxis - Modelltransformation und Code-Generierung mit dem Enterprise Architect

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