<?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:
Once you have checked out/imported the code, to run the example you need to go through the following steps:
In this example, we implement the requirements set in the MDD-TIF workshop. This example demonstrates how different languages in Epsilon (EVL, EGL, EML, ETL and ECL) can be combined to implement more complex operations using the workflow. A detailed discussion on this example is provided here.
.emf files are Ecore metamodels expressed using the Emfatic textual syntax.
More examples are available in the examples folder of the SVN repository.