Example: MDD-TIF complete case study


  • Competition2TVApp.xml
  • Competition2TVApp.etl
  • ValidateCompetition.evl
  • Get it!
<?xml version="1.0"?>
<project default="main">
  
  <epsilon.emf.register file="../metamodels/CompetitionDsl.ecore"/>
  <epsilon.emf.register file="../metamodels/TVAppDsl.ecore"/>
    
  <epsilon.loadModel name="Competition" type="EMF">
    <parameter name="modelFile" file="models/WorldCup.model"/>
    <parameter name="metamodelUri" value="CompetitionDsl"/>
    <parameter name="isMetamodelFileBased" value="false"/>
    <parameter name="readOnLoad" value="true"/>
  </epsilon.loadModel>
  
  <epsilon.loadModel name="TVApp" type="EMF">
    <parameter name="modelFile" file="models/TVApp3.model"/>
    <parameter name="metamodelUri" value="TVAppDsl"/>
    <parameter name="isMetamodelFileBased" value="false"/>
    <parameter name="readOnLoad" value="false"/>
  </epsilon.loadModel>

  <target name="main">

    <epsilon.evl src="ValidateCompetition.evl">
      <model ref="Competition"/>
    </epsilon.evl>    
    
    <epsilon.etl src="Competition2TVApp.etl">
      <model ref="TVApp"/>
      <model ref="Competition"/>
    </epsilon.etl>
    
    <epsilon.storeModel model="TVApp"/>
    
  </target>
  
</project>
						
rule Competition2Application
  transform c : Competition!Competition
  to a : TVApp!Application, v : TVApp!Vote {

  a.name := c.name + ' Application';
  v.name := 'Who will win the ' + c.name + '?';  
  a.contents.add(v);
  
  for (g in c.groups) {
    v.contents.add(g.equivalent());
    for (comp in g.competitors) {
      v.contents.add(comp.equivalent());
    }
  }
}

rule Competitor2Choice
  transform co : Competition!Competitor
  to ch : TVApp!Choice {

  ch.name := co.name;
  
}

rule Group2Label
  transform g : Competition!Group
  to l : TVApp!Label {
  
  l.name := 'Group ' + g.name;
}
context Competition!NamedElement {
  
  constraint NameSpecified {
    
    check : self.name.isDefined() and self.name.trim().length > 0
    
    message : self.eClass().name + ' must provide a name'
    
  }
  
}

context Competition!Group {
  
  constraint NotEmpty {
    
    guard : self.satisfies('NameSpecified')
    
    check : self.competitors.size() > 0
    
    message : 'Group ' + self.name + ' contains no competitors'
    
  }
  
}

context Competition!Competitor {
  
  constraint InUniqueGroup {
    
    guard : self.satisfies('NameSpecified')
    
    check : Competition!Group.allInstances.
      select(g|g.competitors.includes(self)).size() <= 1
    
    message : 'Competitor ' + self.name + ' exists in more than one groups.'
  }
  
}

There are two ways to get the code of this example:

  1. download the following zip archive(s), extract them and import them as new Eclipse projects
  2. or check out the code from the SVN
    • go to the SVN repository
    • navigate to trunk/examples
    • check out the org.eclipse.epsilon.examples.mddtif project

Once you have checked out/imported the code, to run the example you need to go through the following steps:

  1. right click the .launch file in the org.eclipse.epsilon.examples.mddtif project
  2. select Run as... and click the first item in the menu that pops up