Download - Xbase Am Beispiel des Domain Model Examples
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
●●
Am Beispiel des Domain Model Examples
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
Agenda
Xbase
Anwendungsfälle
Xbase im Domain Model Example
Links
2
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
“Xbase is a partial programming language implemented in Xtext
and is meant to be embedded and xtended within other programming languages
and domain-specific languages (DSL) written in Xtext.”
Quelle: Sven Efftinge - Xbase - A new programming language?
Xbase – Am Beispiel des Domain Model Examples
Was ist Xbase?
3
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Expression-Grammatik
• JVMTypes
• Extensions (Bibliothek von Funktionen, die für Typen bereitgestellt werden)
• Xbase Compiler (zu Java Code) / Xbase Interpreter
Xbase – Am Beispiel des Domain Model Examples
Generelle Bestandteile von Xbase
4
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Xbase.xtext
• Typen: Arrays, einfache Typ-Referenzen, Funktionstypen (Lambda-Ausdrücke), parametrisierte Typ-
Referenzen, Java-Primitive -> Xbase implementiert Java Typsystem und ist konform zur Java Lang
Spec
• Expressions (1)
• Literale: String, Nummer (entspricht Integer), Boolean, Null, Typ (entspricht .class)
• Operatoren: fest eingebaute boolsche / arithmetische Operatoren sowie with-Operator für Lambda
• binär: +=, ||, &&, ==, !=, <, >, <=, >=, ->, .., =>, <<, >>, <<<, >>>, <>, ?:, <=>, +, -, *, /, %, **
• unär: !, -
• Zuweisungen (Assignments)
• Feature Calls (property access, null safe feature Call, static feature call)
• Constructor Call
• Lambda Ausdrücke (aka Closures): z.B. myList.findFirst([ e | e.name==null ])
Xbase – Am Beispiel des Domain Model Examples
Xbase im Detail (1)
5
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Expressions (ctd.)
• If Expression (if, else if, else)
• Switch Expression (switch, case)
• Variable Declarations (nur in Blocks erlaubt)
• Blocks, entspricht Container für imperative Code-Sequenzen
• For Loop
• While Loop
• Do-While Loop
• Return Expression
• Throwing Exceptions
• try-catch-finally expression
• Implizite Variablen 'this‘ und 'it‘: Referenz auf den aktuellen Kontext, it kann auch innerhalb von
Funktionen verwendet werden
Xbase – Am Beispiel des Domain Model Examples
Xbase im Detail (2)
6
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
Xbase – Am Beispiel des Domain Model Examples
Xbase Extensions
7
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Standard-Generator für Xbase Expressions, der Java-Code generiert
• wie man Xbase erweitert, und was man alles anpassen muss, ist hier beschrieben: Extending Xbase
• Expressions können meist beliebig miteinander und beliebig tief kombiniert und verschachtelt sein: ein
Expressions Compiler sollte unabhängig davon in der Lage sein, validen Code zu generieren
Xbase – Am Beispiel des Domain Model Examples
Xbase Compiler
8
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Runs on the JVM
• Compiles to Java
• Statically Typed
• Full Java Generics
• No built-in types
• Closures
• Type Inference
• Operator Overloading
• Simplicity over Syntactical Flexibility
• Everything is an Expression
Xbase – Am Beispiel des Domain Model Examples
Eigenschaften von Xbase
9
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• extends
• implements
• invokes
• maps to
• model instances/assigments (with type checks)
• invariants/boolean expressions
• decisions/switch/cases
• calculation
Xbase – Am Beispiel des Domain Model Examples
Abstrakte Anwendungsfälle
10
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Integration/Verwebung mit bestehendem Code
• Model-Checks durch Typsystem(e)
• durch Typsystem unterstützte Code-Generierung (Expressions an mehreren Stellen)
Xbase – Am Beispiel des Domain Model Examples
Konkretere Anwendungsfälle
11
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Model inferrer
• JDT Integration
• Transparenz Java/DSL
• Tracing
• Debugging
• Type inferrer
• Typisierung von in die DSL eingebauten Expression -> Angabe des erwarteten Rückgabetyps
Xbase – Am Beispiel des Domain Model Examples
Model inferrer & Type inferrer
12
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Ableiten von (Teil-)Artefakten, die sich weiterhin mit DSL integrieren sollen -> Model inferrer
• Reines Erzeugen von Artefakten, die nichts von der DSL wissen müssen -> Generator
• Ausführungshäufigkeit
• Generator: Beim Speichern der DSL
• Model inferrer: Live beim Editieren der DSL-Datei
• Aufruf-Reihenfolge und Build Abhängigkeiten beachten
• DSL referenziert auf Java-Elemente, die noch nicht generiert worden sind bzw. zwar schon
generiert wurden aber noch nicht kompiliert worden sind (Java Compiler lief noch nicht)
• Unterschiedliches Verhalten vom Builder in der IDE und im automatisierten Build -> im
automatisierten Build müssen unter Umständen erst Stubs erzeugt werden, damit zunächst alle
Referenzen aufgelöst werden können und so trotz wechselseitiger Abhängigkeit alle Artefakte
kompiliert werden können
Xbase – Am Beispiel des Domain Model Examples
Model inferrer / Generator / Builder Participant
13
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• sich über die Zielgruppe(n) der DSL klar werden
• sich über die Auswertungsziele der DSL klar werden
• Generatoren/Interpreter, welche Informationen müssen dazu in den DSLs erfasst werden?
• sich über die Chancen und Risiken der Entscheidung klar werden
• Pro
• bekommt vieles Out-Of-The-Box (Standard Editor und Generator/Compiler-Verhalten, Typ-Checks)
• Contra
• eine fachliche DSL wird zu technisch
• DSL wird mit Informationen überfrachtet
• Ziel-Artefakte: Code, Konfiguration, Dokumentation, Testdaten, Tests, Datenbankskripte,
Buildskripte, ...
• immer dran denken: man kann Xbase auch ohne JVMTypes verwenden, und die Xbase
Expression-Struktur auch ohne den Standard-Xbase-Compiler nutzen
Xbase – Am Beispiel des Domain Model Examples
Wann sollte man Xbase/JVMTypes verwenden, wann nicht?
14
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Grammatik-Definition
• grammar … with org.eclipse.xtext.xbase.Xbase die Sprache muss von Xbase erben
• import 'http://www.eclipse.org/xtext/common/JavaVMTypes' as types optional
• MWE2 Grammar Generator
• Registrieren der neuen EPackages und GenModels + URI-Mapping
• fragment = types.TypesGeneratorFragment {} für JDT Integration u.a. in Proposals
• fragment = xbase.XbaseGeneratorFragment {} für ModelInferrer
• public class …ScopeProvider extends XbaseScopeProvider für Scopen der Expressions
• class …JvmModelInferrer extends AbstractModelInferrer für Mapping auf JvmTypes
• public class SprayTypeProvider extends XbaseTypeProvider Typisieren von Expresssions
• …RuntimeModule: @Override public Class<? extends ITypeProvider> bindITypeProvider() { … }
• Im Scope-Provider localScope definieren für Expressions (it, this)
Xbase – Am Beispiel des Domain Model Examples
Änderungen durch Xbase
15
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
Xbase – Am Beispiel des Domain Model Examples
Xbase in Spray
16
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
Xbase – Am Beispiel des Domain Model Examples
Xbase in Spray
17
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
18
Xbase – Am Beispiel des Domain Model Examples
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
19
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• DSL definieren, um das Mapping zwischen Fachmodell und Persistenz-Modell zu definieren
• dabei müssen durch das Typsystem invalide Zuweisungen erkannt werden bzw. erst gar nicht angeboten
werden
• Zuweisungen können auch durch Verknüpfungen erfolgen, z.B. Name = Vorname + ” “ + Nachname
• Zuweisungen können Guards enthalten, z.B. Anrede = if(gender == ‘female’) “Frau” else “Herr”
• Analog zu Jnario eine Test-Beschreibungs-Sprache definieren, um
• Test-Datensätze auszudrücken, also defacto Instanzieren des Domänen-Modells
• Erwartungen auszudrücken: Wenn Eingabe diese Belegung Dann Ausgabe diese Belegung
• Abfrage-Sprache definieren
Xbase – Am Beispiel des Domain Model Examples
Erweiterungen für das Domain Model Example
20
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Xbase - A new programming language?
• Xbase Language Reference
• Xtext and Java
• Xbase - Implementing domainspecific languages for Java
• Xtext 2.1: using Xbase variables
• The JvmModelInferrer, the debugger and Xbase in Xtext 2.3
• Extending Xbase
• Pragmatic DSL Design with Xtext, Xbase and Xtend 2
• Five simple steps to your JVM language
• Using JVM Types in Xtext 2.1 and the ImportManager
• Xtext casts: Debug-support, Number literals, 7 languages, Jnario
• XREPL
Xbase – Am Beispiel des Domain Model Examples
Links: Dokumentation & Blogs
21
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Xbase.xtext
• JvmModelGenerator.xtend
• XbaseCompiler.java
• XbaseCompiler2.java (benutzt das neue Typsystem)
• AbstractXbaseCompiler.java
• XbaseInterpreter.java
• JvmModelAssociator.java
• JvmTypesBuilder.java
• TypeConvertingCompiler.java
Xbase – Am Beispiel des Domain Model Examples
Links: Xbase Source Code
22
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Xtend (see Xtend.xtext)
• Sigasi - VHDL editor (closed source)
• openHAB (see Rules.xtext, Script.xtext)
• Spray (see Spray.xtext, Shape.xtext, Style.xtext)
• Jnario (see Spec.xtext)
• Tocea - Architecture-Designer (see QueryDsl.xtext)
• Xsemantics (see Documentation, see Xsemantics.xtext)
• EMF-IncQuery (see PatternLanguage.xtext)
• JST (see Jst.xtext)
• eLang (see EL.xtext)
• MQL (see ModelQueryLanguage.xtext)
• Demonstratoren: Fowlers statemachine with expressions (see MyDsl.xtext), LorenzoBettini - Xtext2
experiments, Meinte Boersma - Xtext2-DSLs
Xbase – Am Beispiel des Domain Model Examples
Links: Xbase nutzende Projekte
23
●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
© itemis AG
• Example auf dem aktuellen Juno Stand: File -> New -> Other -> Examples/Xtext Examples/Xtext
Domain Model Example
• Example auf dem Indigo-Stand
• Language Workbench Competetion 2011 – Xtext
• Schritt für Schritt Anleitung (pdf)
• Doownload-Sektion mit Screencasts und den Projekt-Stände nach jedem Kapitel
• XbaseIntegrationTest.java
Xbase – Am Beispiel des Domain Model Examples
Links: Domain Model Example
24