Tata AIG General Insurance Company - Insurer Innovation Award 2024
Workshop On Xtext
1. Software Installation
• You‘ll find a CD with the required software on your desk
• Unzip the Eclipse distribution matching your OS
Windows users: Use a location close to the root directory
• Run the Eclipse executable
• Choose File -> Import -> Existing projects into workspace
• Select Archive file and choose workspace.zip from the CD
9. A domain-specific language (DSL)
is a formal, processable language
targeting at a specific viewpoint or aspect
of a system.
10. A domain-specific language (DSL)
is a formal, processable language
targeting at a specific viewpoint or aspect
of a system.
Its semantics, flexibility and notation is designed
in order to support working with that viewpoint
as good as possible.
20. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
public boolean internalIsSameStructure(EObject left, EObject right) {
++counter;
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
}
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
i.remove();
}
}
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
21. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
++counter;
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
}
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
i.remove();
}
}
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
22. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
++counter;
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
i.remove();
}
}
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
23. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
•
++counter;
Suggests non-formalism
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
i.remove();
}
}
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
24. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
•
++counter;
Suggests non-formalism
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
• Formal
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
i.remove();
}
}
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
25. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
•
++counter;
Suggests non-formalism
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
• Individual tools
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
• Formal
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
i.remove();
}
}
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
26. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
•
++counter;
Suggests non-formalism
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
• Individual tools
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
• Formal
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
• Well established tools
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
i.remove();
}
}
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
27. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
•
++counter;
Suggests non-formalism
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
• Individual tools
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
• Hard to evolve
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
• Formal
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
• Well established tools
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
i.remove();
}
}
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
28. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
•
++counter;
Suggests non-formalism
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
• Individual tools
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
• Hard to evolve
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
• Formal
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
• Well established tools
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
}
} • Easy to evolve
i.remove();
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
29. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
•
++counter;
Suggests non-formalism
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
• Individual tools
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
• Hard to evolve
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
• Editing with mouse
}
return false;
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
• Formal
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
• Well established tools
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
}
} • Easy to evolve
i.remove();
return relevantChildren;
}
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
30. }
protected String getErrorMessage() {
return errorMessage.toString();
}
Graphics
public boolean isSameStructure(EObject left, EObject right) {
counter = 0;
return internalIsSameStructure(left, right);
}
• High-level views
public boolean internalIsSameStructure(EObject left, EObject right) {
•
++counter;
Suggests non-formalism
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + ri
• Individual tools
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
• Hard to evolve
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + r
• Editing with mouse
}
return false;
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
errorMessage.append("Children differ " + left + " " + right +
return false;
}
}
Text
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
}
• Detailed views
&& left.getEPackage().getNsURI().equals(right.getEPackage().g
• Formal
protected List<EObject> getRelevantChildren(EObject _this) {
List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
• Well established tools
for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
EObject next = i.next();
if (!isRelevantChild(_this, next)) {
} • Easy to evolve
i.remove();
•
}
} Editing with keyboard
return relevantChildren;
protected boolean isRelevantChild(EObject container, EObject child) {
return true;
31. Showtime !
• In your Eclipse workbench
• Choose Run->Run configurations...
• Double click on Eclipse Application
• Go to the Arguments tab and add
-XX:MaxPermSize=128m
to the VM arguments
• Click on Run
32. A Guided Example
entity Conference {
property Name : String
on
Attendees refs many Pers
Sp eakers refs many Speaker
}
entity Person {
property Name : String
}
{
enti ty Speaker extends Person
n
Sessions refs many Sessio
}
entity Session {
property Title: String
property IsTutorial : Bool
}
44. Problem:
Names may not be ambiguous.
Solution:
Implement a ScopeProvider!
45. Problem:
Names may not be ambiguous.
Solution:
Implement a ScopeProvider!
A Scope is a context specific, hierarchical
collection of all reachable model elements
and their respective names.
50. Validate Your
Conference
1. Have a look at the generated Validator-Stub.
2. Implement some checks for your language.
3. Check out the results.
@Check
public void checkSpeakersName(Speaker speaker) {
assertTrue("Speaker's name is to short.",
ConferencesLanguagePackage.SPEAKER__NAME,
speaker.getName().length() >= 2);
}
56. Formatting
Pretty Printing
Code Beautification
import
<Literature.entities> entity
City {Int id; String
name;}
entity Store { Int
id; String name;
Int
city
references
City.
id; }
57. Formatting
Pretty Printing
Code Beautification
import
<Literature.entities> entity
City {Int id; String
name;}
entity Store { Int
id; String name;
Int import <Literature.entities>
city
references entity City {
City. Int id;
id; } String name;
}
entity Store {
Int id;
String name;
Int city references
City.id;
}
58. Formatting
Pretty Printing
Code Beautification
import
<Literature.entities> entity
City {Int id; String
name;}
entity Store { Int
id; String name;
Int import <Literature.entities>
city
references entity City {
City. Int id;
id; } String name;
}
entity Store {
Int id;
String name;
Int city references
City.id;
}
59. Formatting
Pretty Printing Code Beautification
import
<Literature.entities> entity
City {Int id; String
name;}
entity Store { Int
id; String name;
Int import <Literature.entities>
city
references entity City {
City. Int id;
id; } String name;
}
entity Store {
Int id;
String name;
Int city references
City.id;
§ 1. At ... do ...
}
§ 2. At ... do ...
§ 3. At ... do ...
§ 4. At ... do ...
...
61. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
62. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
<<abstract>>
XMIResource
Resource
63. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
<<abstract>>
XMIResource
Resource
64. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
<<abstract>> XMI
XMIResource
Resource
65. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
<<abstract>> XMI
XMIResource
Resource
66. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
<<abstract>> XMI
XMIResource
Resource
XtextResource
67. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
<<abstract>> XMI
XMIResource
Resource
XtextResource
68. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
<<abstract>> XMI
XMIResource
Resource
XtextResource Text
69. Integration with EMF
eclipse
Any EMF-based modeling
Code Generator GMF Editor P R O J E C T
Component
<<abstract>> XMI
XMIResource
Resource
XtextResource Text
Parser Linker Serializer
ValueConverter ScopeProvider Formatter
70. EMF Index
• Indexes all resources in workspace
• Query elements and cross-references
• Efficient scoping
71. EMF Index
• Indexes all resources in workspace
• Query elements and cross-references
• Efficient scoping
Load
Resources