View
1
Download
0
Category
Preview:
Citation preview
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
Recommended