Mais conteúdo relacionado Semelhante a Combining Graphical and Textual (14) Mais de Dr. Jan Köhnlein (20) Combining Graphical and Textual2. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
}
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 + " != " + right).append('n');
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
3. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
•
}
Detailed views
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 + " != " + right).append('n');
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
4. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
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 + " != " + right).append('n');
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
5. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
• Very formal syntax
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 + " != " + right).append('n');
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
6. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
}
• Very formal syntax
counter = 0;
return internalIsSameStructure(left, right);
• Suggests non-formalism
public boolean internalIsSameStructure(EObject left, EObject right) {
++counter;
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + right).append('n');
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
7. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
}
• Very formal syntax
counter = 0;
return internalIsSameStructure(left, right);
• Suggests non-formalism
• Standard text editor
public boolean internalIsSameStructure(EObject left, EObject right) {
++counter;
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + right).append('n');
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
8. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
}
• Very formal syntax
counter = 0;
return internalIsSameStructure(left, right);
• Suggests non-formalism
•
++counter;
Standard text editor
public boolean internalIsSameStructure(EObject left, EObject right) { • Custom editor
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + right).append('n');
return false;
}
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
9. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
}
• Very formal syntax
counter = 0;
return internalIsSameStructure(left, right);
• Suggests non-formalism
• Standard text editor
public boolean internalIsSameStructure(EObject left, EObject right) { • Custom editor
•
++counter;
Standard versioning /
if (!isSameClass(left.eClass(), right.eClass())) {
errorMessage.append("Classes are not equal: " + left + " != " + right).append('n');
return false;
}
multi-user support
List<EObject> leftChildren = getRelevantChildren(left);
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
10. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
}
• Very formal syntax
counter = 0;
return internalIsSameStructure(left, right);
• Suggests non-formalism
• Standard text editor
public boolean internalIsSameStructure(EObject left, EObject right) { • Custom editor
• •
++counter;
Standard versioning /
if (!isSameClass(left.eClass(), right.eClass())) {
Custom versioning /
errorMessage.append("Classes are not equal: " + left + " != " + right).append('n');
return false;
}
multi-user support
List<EObject> leftChildren = getRelevantChildren(left);
multi-user support
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
11. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
}
• Very formal syntax
counter = 0;
return internalIsSameStructure(left, right);
• Suggests non-formalism
• Standard text editor
public boolean internalIsSameStructure(EObject left, EObject right) { • Custom editor
• •
++counter;
Standard versioning /
if (!isSameClass(left.eClass(), right.eClass())) {
Custom versioning /
errorMessage.append("Classes are not equal: " + left + " != " + right).append('n');
return false;
}
multi-user support
List<EObject> leftChildren = getRelevantChildren(left);
multi-user support
• Editing with keyboard
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
12. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
}
• Very formal syntax
counter = 0;
return internalIsSameStructure(left, right);
• Suggests non-formalism
• Standard text editor
public boolean internalIsSameStructure(EObject left, EObject right) { • Custom editor
• •
++counter;
Standard versioning /
if (!isSameClass(left.eClass(), right.eClass())) {
Custom versioning /
errorMessage.append("Classes are not equal: " + left + " != " + right).append('n');
return false;
}
multi-user support
List<EObject> leftChildren = getRelevantChildren(left);
multi-user support
• Editing with keyboard
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
• Editing with mouse
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
13. public void assertSameStructure(EObject left, EObject right) {
if(!isSameStructure(left, right)) {
log.error(getErrorMessage());
Assert.fail(getErrorMessage());
}
Text Graphics
//logger.debug("" + counter + " elements compared");
}
protected String getErrorMessage() {
return errorMessage.toString();
• •
}
Detailed views
public boolean isSameStructure(EObject left, EObject right) {
High-level views
}
• Very formal syntax
counter = 0;
return internalIsSameStructure(left, right);
• Suggests non-formalism
• Standard text editor
public boolean internalIsSameStructure(EObject left, EObject right) { • Custom editor
• •
++counter;
Standard versioning /
if (!isSameClass(left.eClass(), right.eClass())) {
Custom versioning /
errorMessage.append("Classes are not equal: " + left + " != " + right).append('n');
return false;
}
multi-user support
List<EObject> leftChildren = getRelevantChildren(left);
multi-user support
• Editing with keyboard
List<EObject> rightChildren = getRelevantChildren(right);
if(leftChildren.size() != rightChildren.size()) {
• Editing with mouse
errorMessage.append("Number of children differs " + left + " " + right + " " + leftChildren.size() + " <> " + rightChildren.size()).append('n')
return false;
}
for (int i = 0; i < leftChildren.size(); ++i) {
if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get(i))) {
errorMessage.append("Children differ " + left + " " + right + " with children " + leftChildren.get(i) + " " + rightChildren.get(i)).append
return false;
}
}
Why not have both?
return true;
}
protected boolean isSameClass(EClass left, EClass right) {
return left.getName().equals(right.getName())
&& left.getEPackage().getNsURI().equals(right.getEPackage().getNsURI());
}
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();
18. Xtext
ar
m
m
ra
G
Runtime
Superclass
Subclass Class
Ecore model LL(*) Parser Text editor
19. Xtext
ar
m
m
ra
G
Semantic
Metamodel Runtime
Superclass
Subclass Class
Ecore model LL(*) Parser Text editor
23. Superclass
GMF Subclass
Ecore model
Class
Graph Map Tool
Model Model Model
24. Superclass
GMF Subclass
Ecore model
Class
Graph Map Tool
Model Model Model
GMF
Generator
Model
25. Superclass
GMF Subclass
Ecore model
Class
Graph Map Tool
Model Model Model
GMF
Generator
Model
28. Xtext
EObject element
eAdapters
NodeAdapter
node
children AbstractNode
offset: int
length: int
CompositeNode LeafNode
text: String
parent
29. Xtext GMF
EObject element EObject
element
eAdapters
NodeAdapter View
node
children AbstractNode Node Edge
offset: int
length: int
layoutConstraints bendpoints
CompositeNode LeafNode Bounds Bendpoints
text: String x: int
parent y: int
width: int
height: int
30. GMF
ResourceSet
GMFResource DiagramResource
Canonical
EditPolicy
31. GMF
ResourceSet
GMFResource DiagramResource
Canonical
Canonical
EditPolicy
EditPolicy
32. GMF
ResourceSet
GMFResource DiagramResource
Canonical
Canonical
EditPolicy
EditPolicy
34. Xtext
Textual Model
Serializer
Parser
Node Model
Ecore Model
Instance
35. Xtext
XtextResource
Textual Model
Serializer
Parser
Node Model
Ecore Model
Instance
36. Xtext
XtextResource
Textual Model
Serializer
Parser
Node Model
Ecore Model
Instance
getContents()
37. Xtext load(), save()
XtextResource
Textual Model
Serializer
Parser
Node Model
Ecore Model
Instance
getContents()
38. Xtext load(), save()
XtextResource
Textual Model
Serializer
Parser
Node Model
Ecore Model
Instance FragmentProvider
getContents() getURIFragment()
getEObject()
40. diagram
change
ResourceSet
XtextResource DiagramResource
47. Fi e l
od a
M xtu
le l
Te
ResourceSet ResourceSet
XtextResource XtextResource DiagramResource
48. Fi e l
od a
M xtu
le l
Te
ResourceSet ResourceSet
XtextResource XtextResource DiagramResource
49. Fi e l
od a
M xtu
le l
Te
ResourceSet ResourceSet
XtextResource XtextResource DiagramResource
50. Fi e l
od a
M xtu
le l
Te
ResourceSet ResourceSet
XtextResource save() XtextResource DiagramResource
51. Fi e l
od a
M xtu
le l
Te
ResourceSet ResourceSet
XtextResource reload() XtextResource DiagramResource
52. Fi e l
od a
M xtu
le l
Te
ResourceSet ResourceSet
XtextResource reload() XtextResource DiagramResource
53. Fi e l
od a
M xtu
le l
Te
ResourceSet ResourceSet
XtextResource XtextResource DiagramResource
54. Fi e l
od a
M xtu
le l
Te
ResourceSet ResourceSet
XtextResource XtextResource DiagramResource
56. grammar org.xtext.cg2009.Entities
with org.eclipse.xtext.common.Terminals
generate entities "http://www.xtext.org/cg2009/Entities"
Model :
{Model} (entities += Entity)*;
Entity returns Entity:
'entity' (name=ID)? ('extends' superType=[Entity])? '{'
(properties+=Property)*
'}';
Property:
SimpleProperty | ReferenceProperty;
SimpleProperty:
'property' (name=ID)? ':' type=('String'|'Number'|'Bool');
ReferenceProperty :
(name=ID)? 'refs' ('one' | many?='many')? type=[Entity];
57. grammar org.xtext.cg2009.Entities
with org.eclipse.xtext.common.Terminals
Avoid empty
generate entities "http://www.xtext.org/cg2009/Entities"
models
Model :
{Model} (entities += Entity)*;
Entity returns Entity:
'entity' (name=ID)? ('extends' superType=[Entity])? '{'
(properties+=Property)*
'}';
Property:
SimpleProperty | ReferenceProperty;
SimpleProperty:
'property' (name=ID)? ':' type=('String'|'Number'|'Bool');
ReferenceProperty :
(name=ID)? 'refs' ('one' | many?='many')? type=[Entity];
58. grammar org.xtext.cg2009.Entities
with org.eclipse.xtext.common.Terminals
Avoid empty
generate entities "http://www.xtext.org/cg2009/Entities"
models
Model :
{Model} (entities += Entity)*;
Entity returns Entity:
'entity' (name=ID)? ('extends' superType=[Entity])? '{'
(properties+=Property)*
'}';
Property:
Cover mandatory
SimpleProperty | ReferenceProperty;
properties in
SimpleProperty:
validation
'property' (name=ID)? ':' type=('String'|'Number'|'Bool');
ReferenceProperty :
(name=ID)? 'refs' ('one' | many?='many')? type=[Entity];
59. grammar org.xtext.cg2009.Entities
with org.eclipse.xtext.common.Terminals
Avoid empty
generate entities "http://www.xtext.org/cg2009/Entities"
Carefully select
models
Model : containment or cross
{Model} (entities += Entity)*; references
Entity returns Entity:
'entity' (name=ID)? ('extends' superType=[Entity])? '{'
(properties+=Property)*
'}';
Property:
Cover mandatory
SimpleProperty | ReferenceProperty;
properties in
SimpleProperty:
validation
'property' (name=ID)? ':' type=('String'|'Number'|'Bool');
ReferenceProperty :
(name=ID)? 'refs' ('one' | many?='many')? type=[Entity];
61. Xtext
Implement a
Formatter
62. Xtext
Implement a
Formatter
Implement a
FragmentProvider
63. Xtext
Implement a
Formatter
Implement a
FragmentProvider
Implement a
JavaValidator
66. GMF
Initialize
mandatory
properties
Avoid Phantom
Nodes
71. Glue Code
• Prevent conflicting modifications
• Navigate
• diagram ➜ text
• text ➜ diagram
(needs index)
72. Glue Code
• Prevent conflicting modifications
• Navigate
• diagram ➜ text
• text ➜ diagram
(needs index)
• Parser wrapper
73. Glue Code
• Prevent conflicting modifications
• Navigate
• diagram ➜ text
• text ➜ diagram
(needs index)
• Parser wrapper
• Popup editor