SlideShare uma empresa Scribd logo
1 de 82
Combining
Graphics and Text
       in
 Modeling Tools

                    Jan Köhnlein (itemis)
                    Jos Warmer (Ordina)
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
Xtext vs GMF
Xtext
Xtext


 G
  ra
       m
        m
            ar
Xtext


 G
  ra
       m
        m
            ar
Xtext



                                 ar
                              m
                             m
                         ra
                         G
                                       Runtime
 Superclass




 Subclass     Class




 Ecore model          LL(*) Parser    Text editor
Xtext



                                  ar
                               m
                              m
                          ra
                          G
 Semantic
Metamodel                               Runtime
  Superclass




   Subclass    Class




   Ecore model         LL(*) Parser    Text editor
Superclass




GMF   Subclass




      Ecore model
                   Class
Superclass




GMF       Subclass




          Ecore model
                       Class




  Graph
  Model
Superclass




GMF       Subclass




          Ecore model
                       Class




  Graph                         Tool
  Model                        Model
Superclass




GMF       Subclass




          Ecore model
                               Class




  Graph                 Map             Tool
  Model                Model           Model
Superclass




GMF       Subclass




          Ecore model
                               Class




  Graph                 Map             Tool
  Model                Model           Model




                   GMF
                 Generator
                  Model
Superclass




GMF       Subclass




          Ecore model
                               Class




  Graph                 Map             Tool
  Model                Model           Model




                   GMF
                 Generator
                  Model
Runtime Models
      and
Synchronization
Xtext
                    EObject         element




               eAdapters
                  NodeAdapter




                  node
          children AbstractNode
                   offset: int
                   length: int




         CompositeNode          LeafNode
                              text: String
parent
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
GMF
              ResourceSet


GMFResource                 DiagramResource




              Canonical
              EditPolicy
GMF
               ResourceSet


GMFResource                  DiagramResource




              Canonical
              Canonical
              EditPolicy
              EditPolicy
GMF
               ResourceSet


GMFResource                  DiagramResource




              Canonical
              Canonical
              EditPolicy
              EditPolicy
Xtext
Xtext

              Textual Model


        Serializer
                     Parser
                              Node Model



               Ecore Model
                Instance
Xtext
        XtextResource

                     Textual Model


               Serializer
                            Parser
                                     Node Model



                      Ecore Model
                       Instance
Xtext
        XtextResource

                     Textual Model


               Serializer
                            Parser
                                     Node Model



                      Ecore Model
                       Instance




                getContents()
Xtext                load(), save()



        XtextResource

                     Textual Model


               Serializer
                            Parser
                                      Node Model



                      Ecore Model
                       Instance




                getContents()
Xtext                load(), save()



        XtextResource

                     Textual Model


               Serializer
                            Parser
                                          Node Model



                      Ecore Model
                       Instance         FragmentProvider




                getContents()         getURIFragment()
                                      getEObject()
ResourceSet


XtextResource                 DiagramResource
diagram
                                         change

                ResourceSet


XtextResource                 DiagramResource
ResourceSet


XtextResource                 DiagramResource
reparse()
w/ errors

                    ResourceSet


    XtextResource                 DiagramResource
ResourceSet


XtextResource                 DiagramResource
ResourceSet


XtextResource                 DiagramResource




                Canonical
                EditPolicy
ResourceSet


XtextResource                 DiagramResource




                Canonical
                EditPolicy
ResourceSet


XtextResource                 DiagramResource




                Canonical
                EditPolicy
Fi e l
                    od a
                 M xtu
                  le l
                    Te
 ResourceSet                         ResourceSet


XtextResource              XtextResource    DiagramResource
Fi e l
                    od a
                 M xtu
                  le l
                    Te
 ResourceSet                         ResourceSet


XtextResource              XtextResource    DiagramResource
Fi e l
                    od a
                 M xtu
                  le l
                    Te
 ResourceSet                         ResourceSet


XtextResource              XtextResource    DiagramResource
Fi e l
                      od a
                   M xtu
                    le l
                      Te
 ResourceSet                           ResourceSet


XtextResource   save()       XtextResource    DiagramResource
Fi e l
                     od a
                  M xtu
                   le l
                     Te
 ResourceSet                          ResourceSet


XtextResource   reload()    XtextResource    DiagramResource
Fi e l
                     od a
                  M xtu
                   le l
                     Te
 ResourceSet                          ResourceSet


XtextResource   reload()    XtextResource    DiagramResource
Fi e l
                    od a
                 M xtu
                  le l
                    Te
 ResourceSet                         ResourceSet


XtextResource              XtextResource    DiagramResource
Fi e l
                    od a
                 M xtu
                  le l
                    Te
 ResourceSet                         ResourceSet


XtextResource              XtextResource    DiagramResource
Alignment
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];
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];
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];
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];
Xtext
Xtext
        Implement a
         Formatter
Xtext
        Implement a
         Formatter


             Implement a
          FragmentProvider
Xtext
           Implement a
            Formatter


                 Implement a
              FragmentProvider



        Implement a
        JavaValidator
GMF
GMF

 Initialize
mandatory
properties
GMF

         Initialize
        mandatory
        properties



Avoid Phantom
    Nodes
Add a
transaction on
                                 GMF
     load



                    Initialize
                   mandatory
                   properties



           Avoid Phantom
               Nodes
Glue Code
Glue Code
• Prevent conflicting modifications
Glue Code
• Prevent conflicting modifications
• Navigate
 • diagram ➜ text
Glue Code
• Prevent conflicting modifications
• Navigate
 • diagram ➜ text
 • text ➜ diagram
    (needs index)
Glue Code
• Prevent conflicting modifications
• Navigate
 • diagram ➜ text
 • text ➜ diagram
    (needs index)
• Parser wrapper
Glue Code
• Prevent conflicting modifications
• Navigate
 • diagram ➜ text
 • text ➜ diagram
    (needs index)
• Parser wrapper
• Popup editor
Demo Time
Combining Graphical and Textual
Combining Graphical and Textual
Combining Graphical and Textual
Combining Graphical and Textual
Combining Graphical and Textual
Combining Graphical and Textual
Combining Graphical and Textual
Combining Graphical and Textual

Mais conteúdo relacionado

Mais procurados

Mais procurados (13)

Hacking Your Way To Better Security
Hacking Your Way To Better SecurityHacking Your Way To Better Security
Hacking Your Way To Better Security
 
Php Security - OWASP
Php  Security - OWASPPhp  Security - OWASP
Php Security - OWASP
 
iBATIS
iBATISiBATIS
iBATIS
 
Writing Mirror API and Native Apps for Google Glass
Writing Mirror API and Native Apps for Google GlassWriting Mirror API and Native Apps for Google Glass
Writing Mirror API and Native Apps for Google Glass
 
The Ring programming language version 1.6 book - Part 46 of 189
The Ring programming language version 1.6 book - Part 46 of 189The Ring programming language version 1.6 book - Part 46 of 189
The Ring programming language version 1.6 book - Part 46 of 189
 
Web Security - Hands-on
Web Security - Hands-onWeb Security - Hands-on
Web Security - Hands-on
 
Javascript & jQuery: A pragmatic introduction
Javascript & jQuery: A pragmatic introductionJavascript & jQuery: A pragmatic introduction
Javascript & jQuery: A pragmatic introduction
 
PHP webboard
PHP webboardPHP webboard
PHP webboard
 
PHP cart
PHP cartPHP cart
PHP cart
 
Exceptional exceptions
Exceptional exceptionsExceptional exceptions
Exceptional exceptions
 
Xamarin: Introduction to iOS 8
Xamarin: Introduction to iOS 8Xamarin: Introduction to iOS 8
Xamarin: Introduction to iOS 8
 
The Ring programming language version 1.2 book - Part 32 of 84
The Ring programming language version 1.2 book - Part 32 of 84The Ring programming language version 1.2 book - Part 32 of 84
The Ring programming language version 1.2 book - Part 32 of 84
 
Using arrays with PHP for forms and storing information
Using arrays with PHP for forms and storing informationUsing arrays with PHP for forms and storing information
Using arrays with PHP for forms and storing information
 

Semelhante a Combining Graphical and Textual

Improving the java type system
Improving the java type systemImproving the java type system
Improving the java type system
João Loff
 
I cant figure out why I keep getting an -Exception in thread -main- ja.pdf
I cant figure out why I keep getting an -Exception in thread -main- ja.pdfI cant figure out why I keep getting an -Exception in thread -main- ja.pdf
I cant figure out why I keep getting an -Exception in thread -main- ja.pdf
GordonF2XPatersonh
 
Given the following codepackage data1;import java.util.;p.pdf
Given the following codepackage data1;import java.util.;p.pdfGiven the following codepackage data1;import java.util.;p.pdf
Given the following codepackage data1;import java.util.;p.pdf
illyasraja7
 
Modern JavaScript Engine Performance
Modern JavaScript Engine PerformanceModern JavaScript Engine Performance
Modern JavaScript Engine Performance
Catalin Dumitru
 
L04 - Control Structuresjhgjhgjhgjhgfjgfjhgfjgf.pptx
L04 - Control Structuresjhgjhgjhgjhgfjgfjhgfjgf.pptxL04 - Control Structuresjhgjhgjhgjhgfjgfjhgfjgf.pptx
L04 - Control Structuresjhgjhgjhgjhgfjgfjhgfjgf.pptx
EliasPetros
 
Opa presentation at GamesJs
Opa presentation at GamesJsOpa presentation at GamesJs
Opa presentation at GamesJs
Henri Binsztok
 

Semelhante a Combining Graphical and Textual (14)

04 Advanced Javascript
04 Advanced Javascript04 Advanced Javascript
04 Advanced Javascript
 
Introduccion a Jasmin
Introduccion a JasminIntroduccion a Jasmin
Introduccion a Jasmin
 
jQuery Data Manipulate API - A source code dissecting journey
jQuery Data Manipulate API - A source code dissecting journeyjQuery Data Manipulate API - A source code dissecting journey
jQuery Data Manipulate API - A source code dissecting journey
 
Improving the java type system
Improving the java type systemImproving the java type system
Improving the java type system
 
I cant figure out why I keep getting an -Exception in thread -main- ja.pdf
I cant figure out why I keep getting an -Exception in thread -main- ja.pdfI cant figure out why I keep getting an -Exception in thread -main- ja.pdf
I cant figure out why I keep getting an -Exception in thread -main- ja.pdf
 
Discontinuing Reader Matches
Discontinuing Reader MatchesDiscontinuing Reader Matches
Discontinuing Reader Matches
 
Creating an Uber Clone - Part XXXIX.pdf
Creating an Uber Clone - Part XXXIX.pdfCreating an Uber Clone - Part XXXIX.pdf
Creating an Uber Clone - Part XXXIX.pdf
 
Given the following codepackage data1;import java.util.;p.pdf
Given the following codepackage data1;import java.util.;p.pdfGiven the following codepackage data1;import java.util.;p.pdf
Given the following codepackage data1;import java.util.;p.pdf
 
The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)
 
Modern JavaScript Engine Performance
Modern JavaScript Engine PerformanceModern JavaScript Engine Performance
Modern JavaScript Engine Performance
 
L04 - Control Structuresjhgjhgjhgjhgfjgfjhgfjgf.pptx
L04 - Control Structuresjhgjhgjhgjhgfjgfjhgfjgf.pptxL04 - Control Structuresjhgjhgjhgjhgfjgfjhgfjgf.pptx
L04 - Control Structuresjhgjhgjhgjhgfjgfjhgfjgf.pptx
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using Room
 
Opa presentation at GamesJs
Opa presentation at GamesJsOpa presentation at GamesJs
Opa presentation at GamesJs
 
Before there was Hoop Dreams, there was McDonald's: Strange and Beautiful
Before there was Hoop Dreams, there was McDonald's: Strange and BeautifulBefore there was Hoop Dreams, there was McDonald's: Strange and Beautiful
Before there was Hoop Dreams, there was McDonald's: Strange and Beautiful
 

Mais de Dr. Jan Köhnlein

A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
Dr. Jan Köhnlein
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
Dr. Jan Köhnlein
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
Dr. Jan Köhnlein
 

Mais de Dr. Jan Köhnlein (20)

The Eclipse Layout Kernel sirius con 2017
The Eclipse Layout Kernel   sirius con 2017The Eclipse Layout Kernel   sirius con 2017
The Eclipse Layout Kernel sirius con 2017
 
A New Approach Towards Web-based IDEs
A New Approach Towards Web-based IDEsA New Approach Towards Web-based IDEs
A New Approach Towards Web-based IDEs
 
Responsiveness
ResponsivenessResponsiveness
Responsiveness
 
Getting rid of backtracking
Getting rid of backtrackingGetting rid of backtracking
Getting rid of backtracking
 
Graphical Views For Xtext With FXDiagram
Graphical Views For Xtext With FXDiagramGraphical Views For Xtext With FXDiagram
Graphical Views For Xtext With FXDiagram
 
XRobots
XRobotsXRobots
XRobots
 
Diagrams, Xtext and UX
Diagrams, Xtext and UXDiagrams, Xtext and UX
Diagrams, Xtext and UX
 
Scoping
ScopingScoping
Scoping
 
Xtext, diagrams and ux
Xtext, diagrams and uxXtext, diagrams and ux
Xtext, diagrams and ux
 
Diagram Editors - The FXed Generation
Diagram Editors - The FXed GenerationDiagram Editors - The FXed Generation
Diagram Editors - The FXed Generation
 
Code Generation With Xtend
Code Generation With XtendCode Generation With Xtend
Code Generation With Xtend
 
Graphical Views For Xtext
Graphical Views For XtextGraphical Views For Xtext
Graphical Views For Xtext
 
The Xtext Grammar Language
The Xtext Grammar LanguageThe Xtext Grammar Language
The Xtext Grammar Language
 
Eclipse Diagram Editors - An Endangered Species
Eclipse Diagram Editors - An Endangered SpeciesEclipse Diagram Editors - An Endangered Species
Eclipse Diagram Editors - An Endangered Species
 
Java DSLs with Xtext
Java DSLs with XtextJava DSLs with Xtext
Java DSLs with Xtext
 
DSLs for Java Developers
DSLs for Java DevelopersDSLs for Java Developers
DSLs for Java Developers
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
 
A fresh look at graphical editing
A fresh look at graphical editingA fresh look at graphical editing
A fresh look at graphical editing
 
Pragmatic DSL Design with Xtext, Xbase and Xtend 2
Pragmatic DSL Design with Xtext, Xbase and Xtend 2Pragmatic DSL Design with Xtext, Xbase and Xtend 2
Pragmatic DSL Design with Xtext, Xbase and Xtend 2
 

Último

Último (20)

ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 

Combining Graphical and Textual

  • 1. Combining Graphics and Text in Modeling Tools Jan Köhnlein (itemis) Jos Warmer (Ordina)
  • 2. 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();
  • 15. Xtext
  • 16. Xtext G ra m m ar
  • 17. Xtext G ra m m ar
  • 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
  • 20. Superclass GMF Subclass Ecore model Class
  • 21. Superclass GMF Subclass Ecore model Class Graph Model
  • 22. Superclass GMF Subclass Ecore model Class Graph Tool Model Model
  • 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
  • 26. Runtime Models and Synchronization
  • 27.
  • 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
  • 33. Xtext
  • 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()
  • 39. ResourceSet XtextResource DiagramResource
  • 40. diagram change ResourceSet XtextResource DiagramResource
  • 41. ResourceSet XtextResource DiagramResource
  • 42. reparse() w/ errors ResourceSet XtextResource DiagramResource
  • 43. ResourceSet XtextResource DiagramResource
  • 44. ResourceSet XtextResource DiagramResource Canonical EditPolicy
  • 45. ResourceSet XtextResource DiagramResource Canonical EditPolicy
  • 46. ResourceSet XtextResource DiagramResource Canonical EditPolicy
  • 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];
  • 60. Xtext
  • 61. Xtext Implement a Formatter
  • 62. Xtext Implement a Formatter Implement a FragmentProvider
  • 63. Xtext Implement a Formatter Implement a FragmentProvider Implement a JavaValidator
  • 64. GMF
  • 66. GMF Initialize mandatory properties Avoid Phantom Nodes
  • 67. Add a transaction on GMF load Initialize mandatory properties Avoid Phantom Nodes
  • 69. Glue Code • Prevent conflicting modifications
  • 70. Glue Code • Prevent conflicting modifications • Navigate • diagram ➜ text
  • 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