SlideShare a Scribd company logo
Software Installation
•   You‘ll find a CD with the required software on your desk

•   Unzip the Eclipse distribution matching your OS
    Windows users: Use a location close to the root directory

•   Run the Eclipse executable

•   Choose File -> Import -> Existing projects into workspace

•   Select Archive file and choose workspace.zip from the CD
Workshop
Moritz Eysholdt, Sebastian Zarnekow, Jan Köhnlein
Moritz Eysholdt                    Jan Köhnlein



              Sebastian Zarnekow
Moritz Eysholdt                    Jan Köhnlein



              Sebastian Zarnekow
Moritz Eysholdt                    Jan Köhnlein



              Sebastian Zarnekow
What is a
Domain Specific
Language (DSL)?
A domain-specific language (DSL)
     is a formal, processable language
targeting at a specific viewpoint or aspect
                of a system.
A domain-specific language (DSL)
        is a formal, processable language
   targeting at a specific viewpoint or aspect
                   of a system.


 Its semantics, flexibility and notation is designed
in order to support working with that viewpoint
                as good as possible.
Why would I
want to use a
   DSL?
GPL vs DSL
GPL vs DSL
GPL vs DSL
Abstraction
Why isn‘t
everybody using
     DSLs?
Complicated   Expensive
Isn‘t text a
little bit old-
  fashioned?
}
           	
           	   protected String getErrorMessage() {
           	   	    return errorMessage.toString();
           	   }



Graphics
           	
           	   public boolean isSameStructure(EObject left, EObject right) {
           	   	    counter = 0;
           	   	    return internalIsSameStructure(left, right);
           	   }
           	
           	   public boolean internalIsSameStructure(EObject left, EObject right) {
           	   	    ++counter;
           	   	    if (!isSameClass(left.eClass(), right.eClass())) {
           	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri
           	   	    	     return false;
           	   	    }
           	   	    List<EObject> leftChildren = getRelevantChildren(left);
           	   	    List<EObject> rightChildren = getRelevantChildren(right);
           	   	    if(leftChildren.size() != rightChildren.size()) {
           	   	    	     errorMessage.append("Number of children differs " + left + " " + r
           	   	    	     return false;
           	   	    }
           	   	    for (int i = 0; i < leftChildren.size(); ++i) {
           	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
           	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
           	   	    	     	    return false;
           	   	    	     }
           	   	    }




                              Text
           	   	    return true;
           	   }

           	   protected boolean isSameClass(EClass left, EClass right) {
           	   	    return left.getName().equals(right.getName())
           	   	    	     	    && left.getEPackage().getNsURI().equals(right.getEPackage().g
           	   }

           	   protected List<EObject> getRelevantChildren(EObject _this) {
           	   	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
           	   	    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
           	   	    	     EObject next = i.next();
           	   	    	     if (!isRelevantChild(_this, next)) {
           	   	    	     	    i.remove();
           	   	    	     }
           	   	    }
           	   	    return relevantChildren;
           	   }

           	   protected boolean isRelevantChild(EObject container, EObject child) {
           	   	    return true;
}
                       	
                       	   protected String getErrorMessage() {
                       	   	    return errorMessage.toString();
                       	   }



Graphics
                       	
                       	   public boolean isSameStructure(EObject left, EObject right) {
                       	   	    counter = 0;
                       	   	    return internalIsSameStructure(left, right);
                       	   }

•   High-level views   	
                       	
                       	
                           public boolean internalIsSameStructure(EObject left, EObject right) {
                           	    ++counter;
                       	   	    if (!isSameClass(left.eClass(), right.eClass())) {
                       	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri
                       	   	    	     return false;
                       	   	    }
                       	   	    List<EObject> leftChildren = getRelevantChildren(left);
                       	   	    List<EObject> rightChildren = getRelevantChildren(right);
                       	   	    if(leftChildren.size() != rightChildren.size()) {
                       	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                       	   	    	     return false;
                       	   	    }
                       	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                       	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                       	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                       	   	    	     	    return false;
                       	   	    	     }
                       	   	    }




                                          Text
                       	   	    return true;
                       	   }

                       	   protected boolean isSameClass(EClass left, EClass right) {
                       	   	    return left.getName().equals(right.getName())
                       	   	    	     	    && left.getEPackage().getNsURI().equals(right.getEPackage().g
                       	   }

                       	   protected List<EObject> getRelevantChildren(EObject _this) {
                       	   	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                       	   	    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                       	   	    	     EObject next = i.next();
                       	   	    	     if (!isRelevantChild(_this, next)) {
                       	   	    	     	    i.remove();
                       	   	    	     }
                       	   	    }
                       	   	    return relevantChildren;
                       	   }

                       	   protected boolean isRelevantChild(EObject container, EObject child) {
                       	   	    return true;
}
                       	
                       	   protected String getErrorMessage() {
                       	   	    return errorMessage.toString();
                       	   }



Graphics
                       	
                       	   public boolean isSameStructure(EObject left, EObject right) {
                       	   	    counter = 0;
                       	   	    return internalIsSameStructure(left, right);
                       	   }

•   High-level views   	
                       	
                       	
                           public boolean internalIsSameStructure(EObject left, EObject right) {
                           	    ++counter;
                       	   	    if (!isSameClass(left.eClass(), right.eClass())) {
                       	   	    	     errorMessage.append("Classes are not equal: " + left + " != " + ri
                       	   	    	     return false;
                       	   	    }
                       	   	    List<EObject> leftChildren = getRelevantChildren(left);
                       	   	    List<EObject> rightChildren = getRelevantChildren(right);
                       	   	    if(leftChildren.size() != rightChildren.size()) {
                       	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                       	   	    	     return false;
                       	   	    }
                       	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                       	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                       	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                       	   	    	     	    return false;
                       	   	    	     }
                       	   	    }




                                          Text
                       	   	    return true;
                       	   }

                       	   protected boolean isSameClass(EClass left, EClass right) {
                       	   	    return left.getName().equals(right.getName())
                       	
                       	
                           	
                           }
                                	     	
                                         •     Detailed views
                                           && left.getEPackage().getNsURI().equals(right.getEPackage().g



                       	   protected List<EObject> getRelevantChildren(EObject _this) {
                       	   	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                       	   	    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                       	   	    	     EObject next = i.next();
                       	   	    	     if (!isRelevantChild(_this, next)) {
                       	   	    	     	    i.remove();
                       	   	    	     }
                       	   	    }
                       	   	    return relevantChildren;
                       	   }

                       	   protected boolean isRelevantChild(EObject container, EObject child) {
                       	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);
                             	   	    List<EObject> rightChildren = getRelevantChildren(right);
                             	   	    if(leftChildren.size() != rightChildren.size()) {
                             	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                             	   	    	     return false;
                             	   	    }
                             	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	   protected List<EObject> getRelevantChildren(EObject _this) {
                             	   	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	   	    for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                             	   	    	     EObject next = i.next();
                             	   	    	     if (!isRelevantChild(_this, next)) {
                             	   	    	     	    i.remove();
                             	   	    	     }
                             	   	    }
                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);
                             	   	    List<EObject> rightChildren = getRelevantChildren(right);
                             	   	    if(leftChildren.size() != rightChildren.size()) {
                             	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                             	   	    	     return false;
                             	   	    }
                             	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	
                             	
                                 	
                                 	
                                               •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                      List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                             	   	    	     EObject next = i.next();
                             	   	    	     if (!isRelevantChild(_this, next)) {
                             	   	    	     	    i.remove();
                             	   	    	     }
                             	   	    }
                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);
                             	   	    List<EObject> rightChildren = getRelevantChildren(right);
                             	   	    if(leftChildren.size() != rightChildren.size()) {
                             	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                             	   	    	     return false;
                             	   	    }
                             	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	
                             	
                                 	
                                 	
                                               •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                      List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                             	   	    	     EObject next = i.next();
                             	   	    	     if (!isRelevantChild(_this, next)) {
                             	   	    	     	    i.remove();
                             	   	    	     }
                             	   	    }
                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);
                             	   	    List<EObject> rightChildren = getRelevantChildren(right);
                             	   	    if(leftChildren.size() != rightChildren.size()) {
                             	   	    	     errorMessage.append("Number of children differs " + left + " " + r
                             	   	    	     return false;
                             	   	    }
                             	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	                 •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                 	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               •     Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	   	    	     	    i.remove();
                             	   	    	     }
                             	   	    }
                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);


•   Hard to evolve           	
                             	
                             	
                                 	
                                 	
                                 	
                                      List<EObject> rightChildren = getRelevantChildren(right);
                                      if(leftChildren.size() != rightChildren.size()) {
                                      	     errorMessage.append("Number of children differs " + left + " " + r
                             	   	    	     return false;
                             	   	    }
                             	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	                 •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                 	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               •     Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	   	    	     	    i.remove();
                             	   	    	     }
                             	   	    }
                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);


•   Hard to evolve           	
                             	
                             	
                                 	
                                 	
                                 	
                                      List<EObject> rightChildren = getRelevantChildren(right);
                                      if(leftChildren.size() != rightChildren.size()) {
                                      	     errorMessage.append("Number of children differs " + left + " " + r
                             	   	    	     return false;
                             	   	    }
                             	   	    for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	                 •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                 	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               •     Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                      }
                                            	
                                            }  •     Easy to evolve
                                                 i.remove();



                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);


•   Hard to evolve           	
                             	
                             	
                                 	
                                 	
                                 	
                                      List<EObject> rightChildren = getRelevantChildren(right);
                                      if(leftChildren.size() != rightChildren.size()) {
                                      	     errorMessage.append("Number of children differs " + left + " " + r

•   Editing with mouse       	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      }
                                            return false;

                                      for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	                 •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                 	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               •     Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                      }
                                            	
                                            }  •     Easy to evolve
                                                 i.remove();



                             	   	    return relevantChildren;
                             	   }

                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
}
                             	
                             	   protected String getErrorMessage() {
                             	   	    return errorMessage.toString();
                             	   }



Graphics
                             	
                             	   public boolean isSameStructure(EObject left, EObject right) {
                             	   	    counter = 0;
                             	   	    return internalIsSameStructure(left, right);
                             	   }

•   High-level views         	
                             	   public boolean internalIsSameStructure(EObject left, EObject right) {


•
                             	   	    ++counter;

    Suggests non-formalism   	
                             	
                                 	
                                 	
                                      if (!isSameClass(left.eClass(), right.eClass())) {
                                      	     errorMessage.append("Classes are not equal: " + left + " != " + ri


•   Individual tools
                             	   	    	     return false;
                             	   	    }
                             	   	    List<EObject> leftChildren = getRelevantChildren(left);


•   Hard to evolve           	
                             	
                             	
                                 	
                                 	
                                 	
                                      List<EObject> rightChildren = getRelevantChildren(right);
                                      if(leftChildren.size() != rightChildren.size()) {
                                      	     errorMessage.append("Number of children differs " + left + " " + r

•   Editing with mouse       	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      }
                                            return false;

                                      for (int i = 0; i < leftChildren.size(); ++i) {
                             	   	    	     if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get
                             	   	    	     	    errorMessage.append("Children differ " + left + " " + right +
                             	   	    	     	    return false;
                             	   	    	     }
                             	   	    }




                                                Text
                             	   	    return true;
                             	   }

                             	   protected boolean isSameClass(EClass left, EClass right) {
                             	   	    return left.getName().equals(right.getName())
                             	
                             	
                                 	
                                 }
                                      	     	
                                               •     Detailed views
                                                 && left.getEPackage().getNsURI().equals(right.getEPackage().g



                             	
                             	                 •     Formal
                                 protected List<EObject> getRelevantChildren(EObject _this) {
                                 	    List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents(
                             	
                             	
                             	
                                 	
                                 	
                                 	
                                      	
                                      	
                                               •     Well established tools
                                      for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) {
                                            EObject next = i.next();
                                            if (!isRelevantChild(_this, next)) {
                             	
                             	
                                 	
                                 	
                                      	
                                      	
                                            	
                                            }  •     Easy to evolve
                                                 i.remove();




                                               •
                             	   	    }
                             	
                             	
                                 	
                                 }                   Editing with keyboard
                                      return relevantChildren;



                             	   protected boolean isRelevantChild(EObject container, EObject child) {
                             	   	    return true;
Showtime !
• In your Eclipse workbench
 • Choose Run->Run configurations...
 • Double click on Eclipse Application
 • Go to the Arguments tab and add
    -XX:MaxPermSize=128m
    to the VM arguments
  • Click on Run
A Guided Example
entity Conference {
  property Name : String
                           on
  Attendees refs many Pers
  Sp eakers refs many Speaker
}

entity Person {
  property Name : String
}
                               {
enti ty Speaker extends Person
                            n
  Sessions refs many Sessio
}

 entity Session {
   property Title: String
   property IsTutorial : Bool
 }
Grammar Language

  grammar org.xtext.cg2009.Entities
     with org.eclipse.xtext.common.Terminals

  generate entities "http://www.xtext.org/cg2009/Entities"

  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];
Edit SQL with Xtext
                        CREATE TABLE Conferences (
                          id INTEGER NOT NULL PRIMARY KEY,
•   Only
                        )
                          name CHAR(50)
    Create-Statements

•   List of columns
Edit SQL with Xtext
                   CREATE TABLE Conferences (
                     id INTEGER NOT NULL PRIMARY KEY,
                     name CHAR(50)

•   Enhance with
                   )

    Foreign Keys   CREATE TABLE Speaker (
                     name CHAR(50),
                     id INTEGER,
                     FOREIGN KEY (id)
                      REFERENCES Conference(id)
                   )
What’s wrong with it?
Cross References
Cross References




    Model Element
Cross References


    Element Name




    Model Element
Cross References


          Element Name


resolve


          Model Element
Cross References


          Element Name


resolve                   determin


          Model Element
Problem:
 Names may not be ambiguous.
Problem:
 Names may not be ambiguous.


Solution:
 Implement a ScopeProvider!
Problem:
  Names may not be ambiguous.


Solution:
  Implement a ScopeProvider!

A Scope is a context specific, hierarchical
collection of all reachable model elements
and their respective names.
Scope Provider

                       Make Foreign Keys work!




public IScope scope_ForeignKey_from(
                     ForeignKey context, EReference reference) {
   Table fromTable = (Table) context.eContainer();
   return createTableScope(fromTable);
}
Meta-Model Inference
grammar org.xtext.codeGeneration.Entities
   with org.eclipse.xtext.common.Terminals

generate entities "http://www.xtext.org/CG2009/Entities"

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];
Model Conferences
   with Xtext


  How do I create a language
  for an existing meta-model?
Model Conferences
   with Xtext
Validate Your
              Conference
1. Have a look at the generated Validator-Stub.
2. Implement some checks for your language.
3. Check out the results.


@Check
public void checkSpeakersName(Speaker speaker) {
   assertTrue("Speaker's name is to short.",
          ConferencesLanguagePackage.SPEAKER__NAME,
          speaker.getName().length() >= 2);
}
Convention
over
Configuration
Configured with
         Google Guice



class MyDslRuntimeModule extends DefaultRuntimeModule {
   Class<? extends ServiceInterface> bindService() {
      return MyServiceImplementation.class;
   }
}
Extensible Language
         Generator
• Generates a lot of Java code
• Composed of fragments
 • Customizable
 • Add your own
    fragments!
http://www.wordle.net/
Formatting
                       Pretty Printing
                                Code Beautification

           import
<Literature.entities> entity
City {Int    id;       String
name;}
     entity Store { Int
id;       String       name;
Int
city
    references
City.
id;    }
Formatting
                       Pretty Printing
                                Code Beautification

           import
<Literature.entities> entity
City {Int    id;       String
name;}
     entity Store { Int
id;       String       name;
Int                                        import <Literature.entities>
city
    references                             entity City {
City.                                      	   Int id;
id;    }                                   	   String name;
                                           }

                                           entity Store {
                                           	   Int id;
                                           	   String name;
                                           	   Int city references
                                                    City.id;
                                           }
Formatting
                       Pretty Printing
                                Code Beautification

           import
<Literature.entities> entity
City {Int    id;       String
name;}
     entity Store { Int
id;       String       name;
Int                                        import <Literature.entities>
city
    references                             entity City {
City.                                      	   Int id;
id;    }                                   	   String name;
                                           }

                                           entity Store {
                                           	   Int id;
                                           	   String name;
                                           	   Int city references
                                                    City.id;
                                           }
Formatting
                       Pretty Printing                 Code Beautification

           import
<Literature.entities> entity
City {Int    id;       String
name;}
     entity Store { Int
id;       String       name;
Int                                                               import <Literature.entities>
city
    references                                                    entity City {
City.                                                             	   Int id;
id;    }                                                          	   String name;
                                                                  }

                                                                  entity Store {
                                                                  	   Int id;
                                                                  	   String name;
                                                                  	   Int city references
                                                                           City.id;
                                § 1.   At ... do ...
                                                                  }
                                § 2.   At ... do ...
                                § 3.   At ... do ...
                                § 4.   At ... do ...
                                         ...
Integration with EMF
Integration with EMF
                                              eclipse

                              Any EMF-based   modeling
Code Generator   GMF Editor                             P R O J E C T
                               Component
Integration with EMF
                                                eclipse

                                Any EMF-based   modeling
Code Generator    GMF Editor                              P R O J E C T
                                 Component




                 <<abstract>>
                                XMIResource
                  Resource
Integration with EMF
                                                eclipse

                                Any EMF-based   modeling
Code Generator    GMF Editor                              P R O J E C T
                                 Component




                 <<abstract>>
                                XMIResource
                  Resource
Integration with EMF
                                                eclipse

                                Any EMF-based   modeling
Code Generator    GMF Editor                              P R O J E C T
                                 Component




                 <<abstract>>                   XMI
                                XMIResource
                  Resource
Integration with EMF
                                                eclipse

                                Any EMF-based   modeling
Code Generator    GMF Editor                              P R O J E C T
                                 Component




                 <<abstract>>                   XMI
                                XMIResource
                  Resource
Integration with EMF
                                                 eclipse

                                 Any EMF-based   modeling
Code Generator    GMF Editor                               P R O J E C T
                                  Component




                 <<abstract>>                    XMI
                                 XMIResource
                  Resource




                 XtextResource
Integration with EMF
                                                 eclipse

                                 Any EMF-based   modeling
Code Generator    GMF Editor                               P R O J E C T
                                  Component




                 <<abstract>>                    XMI
                                 XMIResource
                  Resource




                 XtextResource
Integration with EMF
                                                  eclipse

                                 Any EMF-based   modeling
Code Generator    GMF Editor                                P R O J E C T
                                  Component




                 <<abstract>>                    XMI
                                 XMIResource
                  Resource




                 XtextResource                   Text
Integration with EMF
                                                  eclipse

                                 Any EMF-based   modeling
Code Generator    GMF Editor                                P R O J E C T
                                  Component




                 <<abstract>>                    XMI
                                 XMIResource
                  Resource




                 XtextResource                   Text




    Parser          Linker         Serializer




ValueConverter   ScopeProvider     Formatter
EMF Index
• Indexes all resources in workspace
• Query elements and cross-references
• Efficient scoping
EMF Index
• Indexes all resources in workspace
• Query elements and cross-references
• Efficient scoping
                               Load
                             Resources
Learn more at
http://www.xtext.org

More Related Content

What's hot

Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnCon
Rafael Dohms
 
Candidacy
CandidacyCandidacy
Candidacy
Adrian Schroeter
 
50 Laravel Tricks in 50 Minutes
50 Laravel Tricks in 50 Minutes50 Laravel Tricks in 50 Minutes
50 Laravel Tricks in 50 Minutes
Azim Kurt
 
Object oriented javascript
Object oriented javascriptObject oriented javascript
Object oriented javascript
Shah Jalal
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
Rafael Dohms
 
Introduction to JCR
Introduction to JCR Introduction to JCR
Introduction to JCR
David Nuescheler
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
Rafael Dohms
 
FrOScamp Zurich: Introducing JCR - 2010
FrOScamp Zurich: Introducing JCR - 2010FrOScamp Zurich: Introducing JCR - 2010
FrOScamp Zurich: Introducing JCR - 2010
David Nuescheler
 
Database handling with room
Database handling with roomDatabase handling with room
Database handling with room
Sergi Martínez
 

What's hot (11)

Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnCon
 
Candidacy
CandidacyCandidacy
Candidacy
 
50 Laravel Tricks in 50 Minutes
50 Laravel Tricks in 50 Minutes50 Laravel Tricks in 50 Minutes
50 Laravel Tricks in 50 Minutes
 
Spine JS
Spine JSSpine JS
Spine JS
 
Object oriented javascript
Object oriented javascriptObject oriented javascript
Object oriented javascript
 
Separation of concerns - DPC12
Separation of concerns - DPC12Separation of concerns - DPC12
Separation of concerns - DPC12
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHPKonf
 
Introduction to JCR
Introduction to JCR Introduction to JCR
Introduction to JCR
 
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
“Writing code that lasts” … or writing code you won’t hate tomorrow. - PHP Yo...
 
FrOScamp Zurich: Introducing JCR - 2010
FrOScamp Zurich: Introducing JCR - 2010FrOScamp Zurich: Introducing JCR - 2010
FrOScamp Zurich: Introducing JCR - 2010
 
Database handling with room
Database handling with roomDatabase handling with room
Database handling with room
 

Similar to Workshop On Xtext

FITC CoffeeScript 101
FITC CoffeeScript 101FITC CoffeeScript 101
FITC CoffeeScript 101
Faisal Abid
 
OBJECTS IN Object Oriented Programming .ppt
OBJECTS IN Object Oriented Programming .pptOBJECTS IN Object Oriented Programming .ppt
OBJECTS IN Object Oriented Programming .ppt
SaadAsim11
 
04 Advanced Javascript
04 Advanced Javascript04 Advanced Javascript
04 Advanced Javascript
crgwbr
 
Beautiful java script
Beautiful java scriptBeautiful java script
Beautiful java script
Ürgo Ringo
 
The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)
Aaron Gustafson
 
Improving the java type system
Improving the java type systemImproving the java type system
Improving the java type systemJoão Loff
 
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
Huiyi Yan
 
ES2015 New Features
ES2015 New FeaturesES2015 New Features
ES2015 New Features
Giacomo Zinetti
 
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docxsrcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
whitneyleman54422
 

Similar to Workshop On Xtext (10)

FITC CoffeeScript 101
FITC CoffeeScript 101FITC CoffeeScript 101
FITC CoffeeScript 101
 
OBJECTS IN Object Oriented Programming .ppt
OBJECTS IN Object Oriented Programming .pptOBJECTS IN Object Oriented Programming .ppt
OBJECTS IN Object Oriented Programming .ppt
 
Introduccion a Jasmin
Introduccion a JasminIntroduccion a Jasmin
Introduccion a Jasmin
 
04 Advanced Javascript
04 Advanced Javascript04 Advanced Javascript
04 Advanced Javascript
 
Beautiful java script
Beautiful java scriptBeautiful java script
Beautiful java script
 
The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)The Future of JavaScript (SXSW '07)
The Future of JavaScript (SXSW '07)
 
Improving the java type system
Improving the java type systemImproving the java type system
Improving the java type system
 
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
 
ES2015 New Features
ES2015 New FeaturesES2015 New Features
ES2015 New Features
 
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docxsrcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
 

More from Dr. Jan Köhnlein

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
Dr. Jan Köhnlein
 
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
Dr. Jan Köhnlein
 
Responsiveness
ResponsivenessResponsiveness
Responsiveness
Dr. Jan Köhnlein
 
Getting rid of backtracking
Getting rid of backtrackingGetting rid of backtracking
Getting rid of backtracking
Dr. Jan Köhnlein
 
Graphical Views For Xtext With FXDiagram
Graphical Views For Xtext With FXDiagramGraphical Views For Xtext With FXDiagram
Graphical Views For Xtext With FXDiagram
Dr. Jan Köhnlein
 
XRobots
XRobotsXRobots
Diagrams, Xtext and UX
Diagrams, Xtext and UXDiagrams, Xtext and UX
Diagrams, Xtext and UX
Dr. Jan Köhnlein
 
Scoping
ScopingScoping
Xtext, diagrams and ux
Xtext, diagrams and uxXtext, diagrams and ux
Xtext, diagrams and ux
Dr. Jan Köhnlein
 
Diagram Editors - The FXed Generation
Diagram Editors - The FXed GenerationDiagram Editors - The FXed Generation
Diagram Editors - The FXed Generation
Dr. Jan Köhnlein
 
Code Generation With Xtend
Code Generation With XtendCode Generation With Xtend
Code Generation With Xtend
Dr. Jan Köhnlein
 
Graphical Views For Xtext
Graphical Views For XtextGraphical Views For Xtext
Graphical Views For Xtext
Dr. Jan Köhnlein
 
The Xtext Grammar Language
The Xtext Grammar LanguageThe Xtext Grammar Language
The Xtext Grammar Language
Dr. Jan Köhnlein
 
Eclipse Diagram Editors - An Endangered Species
Eclipse Diagram Editors - An Endangered SpeciesEclipse Diagram Editors - An Endangered Species
Eclipse Diagram Editors - An Endangered Species
Dr. Jan Köhnlein
 
Java DSLs with Xtext
Java DSLs with XtextJava DSLs with Xtext
Java DSLs with Xtext
Dr. Jan Köhnlein
 
DSLs for Java Developers
DSLs for Java DevelopersDSLs for Java Developers
DSLs for Java Developers
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 editingDr. 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 editingDr. Jan Köhnlein
 
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
Dr. Jan Köhnlein
 

More from 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
 

Recently uploaded

Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
g2nightmarescribd
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
DianaGray10
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 

Recently uploaded (20)

Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 

Workshop On Xtext

  • 1. Software Installation • You‘ll find a CD with the required software on your desk • Unzip the Eclipse distribution matching your OS Windows users: Use a location close to the root directory • Run the Eclipse executable • Choose File -> Import -> Existing projects into workspace • Select Archive file and choose workspace.zip from the CD
  • 2. Workshop Moritz Eysholdt, Sebastian Zarnekow, Jan Köhnlein
  • 3.
  • 4. Moritz Eysholdt Jan Köhnlein Sebastian Zarnekow
  • 5. Moritz Eysholdt Jan Köhnlein Sebastian Zarnekow
  • 6. Moritz Eysholdt Jan Köhnlein Sebastian Zarnekow
  • 7. What is a Domain Specific Language (DSL)?
  • 8.
  • 9. A domain-specific language (DSL) is a formal, processable language targeting at a specific viewpoint or aspect of a system.
  • 10. A domain-specific language (DSL) is a formal, processable language targeting at a specific viewpoint or aspect of a system. Its semantics, flexibility and notation is designed in order to support working with that viewpoint as good as possible.
  • 11. Why would I want to use a DSL?
  • 17. Complicated Expensive
  • 18.
  • 19. Isn‘t text a little bit old- fashioned?
  • 20. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } public boolean internalIsSameStructure(EObject left, EObject right) { ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) && left.getEPackage().getNsURI().equals(right.getEPackage().g } protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 21. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) && left.getEPackage().getNsURI().equals(right.getEPackage().g } protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 22. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { ++counter; if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 23. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 24. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 25. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 26. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 27. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); • Hard to evolve List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { i.remove(); } } return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 28. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); • Hard to evolve List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r return false; } for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { } } • Easy to evolve i.remove(); return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 29. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); • Hard to evolve List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r • Editing with mouse } return false; for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { } } • Easy to evolve i.remove(); return relevantChildren; } protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 30. } protected String getErrorMessage() { return errorMessage.toString(); } Graphics public boolean isSameStructure(EObject left, EObject right) { counter = 0; return internalIsSameStructure(left, right); } • High-level views public boolean internalIsSameStructure(EObject left, EObject right) { • ++counter; Suggests non-formalism if (!isSameClass(left.eClass(), right.eClass())) { errorMessage.append("Classes are not equal: " + left + " != " + ri • Individual tools return false; } List<EObject> leftChildren = getRelevantChildren(left); • Hard to evolve List<EObject> rightChildren = getRelevantChildren(right); if(leftChildren.size() != rightChildren.size()) { errorMessage.append("Number of children differs " + left + " " + r • Editing with mouse } return false; for (int i = 0; i < leftChildren.size(); ++i) { if(!internalIsSameStructure(leftChildren.get(i), rightChildren.get errorMessage.append("Children differ " + left + " " + right + return false; } } Text return true; } protected boolean isSameClass(EClass left, EClass right) { return left.getName().equals(right.getName()) } • Detailed views && left.getEPackage().getNsURI().equals(right.getEPackage().g • Formal protected List<EObject> getRelevantChildren(EObject _this) { List<EObject> relevantChildren = new ArrayList<EObject>(_this.eContents( • Well established tools for (Iterator<EObject> i = relevantChildren.iterator(); i.hasNext();) { EObject next = i.next(); if (!isRelevantChild(_this, next)) { } • Easy to evolve i.remove(); • } } Editing with keyboard return relevantChildren; protected boolean isRelevantChild(EObject container, EObject child) { return true;
  • 31. Showtime ! • In your Eclipse workbench • Choose Run->Run configurations... • Double click on Eclipse Application • Go to the Arguments tab and add -XX:MaxPermSize=128m to the VM arguments • Click on Run
  • 32. A Guided Example entity Conference { property Name : String on Attendees refs many Pers Sp eakers refs many Speaker } entity Person { property Name : String } { enti ty Speaker extends Person n Sessions refs many Sessio } entity Session { property Title: String property IsTutorial : Bool }
  • 33. Grammar Language grammar org.xtext.cg2009.Entities with org.eclipse.xtext.common.Terminals generate entities "http://www.xtext.org/cg2009/Entities" 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];
  • 34. Edit SQL with Xtext CREATE TABLE Conferences ( id INTEGER NOT NULL PRIMARY KEY, • Only ) name CHAR(50) Create-Statements • List of columns
  • 35. Edit SQL with Xtext CREATE TABLE Conferences ( id INTEGER NOT NULL PRIMARY KEY, name CHAR(50) • Enhance with ) Foreign Keys CREATE TABLE Speaker ( name CHAR(50), id INTEGER, FOREIGN KEY (id) REFERENCES Conference(id) )
  • 38. Cross References Model Element
  • 39. Cross References Element Name Model Element
  • 40. Cross References Element Name resolve Model Element
  • 41. Cross References Element Name resolve determin Model Element
  • 42.
  • 43. Problem: Names may not be ambiguous.
  • 44. Problem: Names may not be ambiguous. Solution: Implement a ScopeProvider!
  • 45. Problem: Names may not be ambiguous. Solution: Implement a ScopeProvider! A Scope is a context specific, hierarchical collection of all reachable model elements and their respective names.
  • 46. Scope Provider Make Foreign Keys work! public IScope scope_ForeignKey_from( ForeignKey context, EReference reference) { Table fromTable = (Table) context.eContainer(); return createTableScope(fromTable); }
  • 47. Meta-Model Inference grammar org.xtext.codeGeneration.Entities with org.eclipse.xtext.common.Terminals generate entities "http://www.xtext.org/CG2009/Entities" 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];
  • 48. Model Conferences with Xtext How do I create a language for an existing meta-model?
  • 49. Model Conferences with Xtext
  • 50. Validate Your Conference 1. Have a look at the generated Validator-Stub. 2. Implement some checks for your language. 3. Check out the results. @Check public void checkSpeakersName(Speaker speaker) { assertTrue("Speaker's name is to short.", ConferencesLanguagePackage.SPEAKER__NAME, speaker.getName().length() >= 2); }
  • 51.
  • 53. Configured with Google Guice class MyDslRuntimeModule extends DefaultRuntimeModule { Class<? extends ServiceInterface> bindService() { return MyServiceImplementation.class; } }
  • 54. Extensible Language Generator • Generates a lot of Java code • Composed of fragments • Customizable • Add your own fragments!
  • 56. Formatting Pretty Printing Code Beautification import <Literature.entities> entity City {Int id; String name;} entity Store { Int id; String name; Int city references City. id; }
  • 57. Formatting Pretty Printing Code Beautification import <Literature.entities> entity City {Int id; String name;} entity Store { Int id; String name; Int import <Literature.entities> city references entity City { City. Int id; id; } String name; } entity Store { Int id; String name; Int city references City.id; }
  • 58. Formatting Pretty Printing Code Beautification import <Literature.entities> entity City {Int id; String name;} entity Store { Int id; String name; Int import <Literature.entities> city references entity City { City. Int id; id; } String name; } entity Store { Int id; String name; Int city references City.id; }
  • 59. Formatting Pretty Printing Code Beautification import <Literature.entities> entity City {Int id; String name;} entity Store { Int id; String name; Int import <Literature.entities> city references entity City { City. Int id; id; } String name; } entity Store { Int id; String name; Int city references City.id; § 1. At ... do ... } § 2. At ... do ... § 3. At ... do ... § 4. At ... do ... ...
  • 61. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component
  • 62. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMIResource Resource
  • 63. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMIResource Resource
  • 64. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource
  • 65. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource
  • 66. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource XtextResource
  • 67. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource XtextResource
  • 68. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource XtextResource Text
  • 69. Integration with EMF eclipse Any EMF-based modeling Code Generator GMF Editor P R O J E C T Component <<abstract>> XMI XMIResource Resource XtextResource Text Parser Linker Serializer ValueConverter ScopeProvider Formatter
  • 70. EMF Index • Indexes all resources in workspace • Query elements and cross-references • Efficient scoping
  • 71. EMF Index • Indexes all resources in workspace • Query elements and cross-references • Efficient scoping Load Resources
  • 72.