SlideShare ist ein Scribd-Unternehmen logo
1 von 73
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

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (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
 

Ähnlich wie Workshop On Xtext

Improving the java type system
Improving the java type systemImproving the java type system
Improving the java type system
João Loff
 
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docxsrcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
srcArtifact.javasrcArtifact.javaclassArtifactextendsCave{pub.docx
whitneyleman54422
 

Ähnlich wie 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
 

Mehr von Dr. Jan Köhnlein

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

Mehr von 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
 

Kürzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Kürzlich hochgeladen (20)

Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 

Workshop On Xtext

  • 1. Software Installation • You‘ll find a CD with the required software on your desk • Unzip the Eclipse distribution matching your OS Windows users: Use a location close to the root directory • Run the Eclipse executable • Choose File -> Import -> Existing projects into workspace • Select Archive file and choose workspace.zip from the CD
  • 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.