Thema 2 Acceleo-MTL- Sprachmittel - Ilse Schmiedecke mit... · 2014. 10. 13. · Thema 2...

21
Thema 2 Acceleo-MTL- Sprachmittel SE Vertiefung Beuth-Hochschule Berlin

Transcript of Thema 2 Acceleo-MTL- Sprachmittel - Ilse Schmiedecke mit... · 2014. 10. 13. · Thema 2...

  • Thema 2 Acceleo-MTL- Sprachmittel

    SE – Vertiefung Beuth-Hochschule Berlin

  • Sprachstruktur

    (c) schmiedecke 13 SE3-1-Einführung

    Template-Sprache

    implementiert MOFM2T

    Bausteine:

    Modul Generator-Kapsel; ein "Main" pro Projekt

    Template Textschablone mit Literalen, Acceleo-Operationen,

    Kontrollstrukturen, OCL-Operationen, Queries

    Query Wertliefernde Acceleo-Funktion mit OCL-Operationen oder Java-Services

    Block Syntaktische Einheit, umfasst z.B. Iterationen, Abfragen, Definitionen

    Protected Area Für manuelle Codeergänzungen, Wird beim Generieren nicht überschreiben

    2

  • Acceleo-Sprachstruktur

    Module

    – Quell-Metamodell festgelegt [module

    generateEcoreAnalysis('http://www.eclipse.org/emf/2002/Ecore')/]

    – Module enthalten Templates und Queries

    – Pro Projekt ein Main-Modul mit einem Main-Template [comment @main /]

    (c) schmiedecke 13 SE3-1-Einführung 3

  • Acceleo-Sprachstruktur

    Kontrollstrukturen

    – Schleifen über Collections:

    [for (eattribute:EAttribute | eclass.eAllAttributes) ] … [/for]

    – Fallunterscheidungen

    [if (e.oclIsKindOf(EReference)] …

    [else] … [/else]

    [/if]

    OCL-Funktionen

    – arithmetische und logische Operatoren +, *, >, ,…

    – select, sortedBy, …

    – oclIsUndefined, oclIsKindOf …

    – das EMF kennt sie alle!

    (c) schmiedecke 13 SE3-1-Einführung 4

  • Acceleo-Templates

    Templates

    – benannt und paramterisiert:

    [template public generateEcoreAnalysis(epackage :

    EPackage)]

    – Bestehen aus Tags und Ausgabetext

    – Tags in [ ], Abschluss durch [/ ]:

    Navigation/Selektion, Kontrollstrukturen, Template- und Query-

    Aufrufe

    – in Tags Navigation über das Metamodel [class.EType.name/]

    – in Tags direkter Aufruf von Templates und Queries

    [generateGetterSetter(eAttr)/]

    – Ausgabetext außerhalb Tags ohne Quotes,

    innerhalb von Tags als Parameter in 'Quotes'

    (c) schmiedecke 13 SE3-1-Einführung 5

  • MTL-HelloWorld für Ecore-Modelle

    [module

    generate('http://www.eclipse.org/emf/2002/Ecore')/]

    [template public generate(aEClass : EClass)]

    [comment @main /]

    [file (aEClass.name, false, 'UTF-8')]

    Hello, class [aEClass.name/]

    [/file]

    [/template] (c) schmiedecke 13 SE3-1-Einführung 6

  • Templates definieren und benutzen

    [template public classToJava(c : Class)]

    class [c.name/] {

    // Attribute declarations

    [attributeToJava(c.attribute)/]

    // Constructor

    [c.name/]() {}

    }

    [/template]

    [template public attributeToJava(a : Attribute)]

    [a.type.name/] [a.name/];

    [/template]

    (c) schmiedecke 13 SE3-1-Einführung 7

  • Query definieren und benutzen

    [query public getJavaFileName (name : String) : String =

    name.concat('.java')

    /]

    [query public getJavaFileName (class : Class) : String =

    getJavaFileName(class.name)

    /]

    [query public isVoidOperation(op : Operation) : Boolean =

    o.ownedParameter ->select

    (p : Parameter | p.direction = ParameterDirectionKind::return

    and not p.type.oclIsUndefined())

    ->size() = 0

    /]

    (c) schmiedecke 13 SE3-1-Einführung 8

  • Query mit Java-Service

    [query public reqReturnTypeName

    (anOperation : Operation) : String =

    invoke('uml2.gen.java.services.TypesServices',

    'returnTypeName(uml2.uml.Operation)',

    Sequence{anOperation})

    /]

    (wird verwendet, wenn der Acceleo-Weg nicht funktioniert oder

    sehr kompliziert ist)

    (c) schmiedecke 13 SE3-1-Einführung 9

  • Queries aus dem Getting-Started-Tutorial

    (c) schmiedecke 13 SE3-1-Einführung 10

  • Module importieren

    [module

    generateEcoreAnalysis('http://www.eclipse.org/emf/2002/

    Ecore')/]

    [import eReferenceAnalysis /]

    [import eClassAnalysis /]

    [import eOperationAnalysis /]

    Besser:

    [import de::bht_smi_se3::ecore2java::eOperationAnalysis /]

    (c) schmiedecke 13 SE3-1-Einführung 11

  • Acceleo-Operationen

    Templating-Kern:

    Navigation durch das Modell mit "."

    enum.EPackage.name (Meta-Kardinal.1 Einzelelement enum.eLiterals (Meta-Kardinal.* Set

    c.attribute (Meta-Kardinal.* Set !)

    Kontrollstrukturen: if, else, for, (?:) s. nächste Folie

    Operations-Anwendung ->

    Standard-String-Operationen

    concat, substring, size, … s. Acceleo-Referenz

    (c) schmiedecke 13 SE3-1-Einführung 12

  • Kontrollstrukturen

    [for (att : Attribute | eclass.eAttributes) ]

    // output some text

    [/for]

    [if (eclass.eAttributes -> size() = 0 ]

    // output some text

    [elseif … ]

    [else …]

    [/if]

    (eclass.eAttributes -> size() = 0) ? none : generateAttributes(eclass)

    (c) schmiedecke 13 SE3-1-Einführung 13

  • OCL-Operationen

    OCL ergänzt die Semantik durch

    Operationen auf Collections und Standard-Datentypen:

    http://wiki.eclipse.org/Acceleo/OCL_Operations_Reference

    Allgemeine Abfragen [.]

    oclIsKindOf, oclIsUndifined, oclAsType, allInstances,…

    Alle üblichen String-Operationen

    Alle grundsätzlichen Operationen auf Collections, Sets,

    Sequences [->]

    asSequence, collect, select, reject, exists, count…

    Operationen auf Zahlen und booleschen Werten (c) schmiedecke 13 SE3-1-Einführung 14

  • Zusätzliche Acceleo-Operationen

    OCL-Bibliothek für M2T - "Komfort-Operationen"

    http://wiki.eclipse.org/Acceleo/Acceleo_Operations_Reference

    Operationen auf Strings, Zahlen und booleschen Werten

    Operationen auf EObject

    eAllContents, eContents, econtainer, eGet, ancestors, siblings …

    Allgemeine Operationen (auf OclAny)

    current, getProperty, invoke …

    Spezielle Collection-Operationen

    sep, reverse, filter,…

    (c) schmiedecke 13 SE3-1-Einführung 15

  • Was ist OCL?

    OCL – Object Constraint Language

    ursprünglich zum semantisch wohldefinierten Ergänzen von UML-

    Diagrammen durch Einschränkungen

    Heute Lingua Franca der Modellierung

    Sprachmittel: Boolesche und Prädikatenlogik

    Ursprünglich zwei Constraint-Basisformen

    – Klassenkontext: Invarianten ('inv')

    – Prozedurkontext: Pre- und Postconditions ('pre', 'post')

    In Modellen beliebige überprüfbare Bedingungen oder

    Kontextaussagen

    (c) schmiedecke 13 SE3-1-Einführung 16

  • OCL im Modell

    hier sind die Mehrfachassoziationen Teilmengen voneinander.

    (c) schmiedecke 13 SE3-1-Einführung 17

    class Class Model

    PropertyAssociation

    +association

    0..1

    {subsets member, ordered}

    +memberEnd

    2..*

    0..1

    {subsets ownedEnd}

    +navigableOwnedEnd

    0..*

    +ownedEnd

    *

    {subsets memberEnd, ordered}+owningAssociation

    0..1

  • Ausdrucksreichtum

    Mit der Punktnotation kann man die Attribute und

    Assoziationen des Metamodells nutzen

    Mit den OCL- oder Acceleo-Operationen lassen sich

    beliebige Mengen konstruieren, überprüfen und

    transformieren.

    [query public allOperations(c: Class) : Set ( Operation ) =

    c.operation->union( c.superClass

    ->select(sc|sc.isAbstract=false)

    - >iterate(ac : Class; os:Set(Operation) = Set{}|

    os->union(allOperations(ac)))) /]

    (c) schmiedecke 13 SE3-1-Einführung 18

    kapiert?

  • Sprachreferenzen:

    Acceleo-Operationen

    http://wiki.eclipse.org/Acceleo/Acceleo_Operations_Referen

    ce

    OCL-Operationen

    http://wiki.eclipse.org/Acceleo/OCL_Operations_Reference

    (c) schmiedecke 13 SE3-1-Einführung 19

    Nächste

    Woche im

    Detail

  • Mit dieser Kletterausrüstung können wir uns

    in dass Ecore-Metamodell und die UML-

    Superstructure wagen…

  • Metamodell-URI (hier nicht UML oder Ecore, sondern eine DSL)

    [module generate('http://bestellung/1.0')/]

    (c) schmiedecke 13 SE3-1-Einführung 21