How to run evl rules against a UML Model
Step 1
Import the required POM.xml dependencies (remember to check the version on maven website)
<dependency>
<groupId>org.eclipse.emf</groupId>
<artifactId>org.eclipse.emf.ecore</artifactId>
<version>2.35.0</version>
</dependency>
<dependency>
<groupId>org.eclipse.epsilon</groupId>
<artifactId>org.eclipse.epsilon.emc.uml</artifactId>
<version>2.4.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.eclipse.epsilon</groupId>
<artifactId>org.eclipse.epsilon.evl.engine</artifactId>
<version>2.4.0</version>
</dependency>
Step 2
Create the java to run the EVL (this uses the In Memory Models)
public static void main(String[] args) {
String modelContents = """
<?xml version="1.0" encoding="ASCII"?>
<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML">
<uml:Class name="Participant">
<ownedAttribute name="name" visibility="private"/>
<ownedOperation name="join" visibility="public">
<ownedParameter name="vc"/>
<ownedParameter name="boolean" direction="return"/>
</ownedOperation>
</uml:Class>
<uml:DataType/>
<uml:Class name="VideoCall"/>
<uml:Class name="ZoomCall"/>
<uml:Class name="TeamsCall"/>
<uml:Association/>
<uml:Generalization/>
<uml:Generalization/>
</xmi:XMI>
""":
//this can also be stored in a file if required (example check if there is a parameter named vc)
String evlCode = """
context Model {
constraint checkParamExists{
check: Parameter.all.exists(p|p.name = \"vc\")
message: \"Error X: Parameter may have wrong name. Expected = vc\"
}} """;
EPackage.Registry.INSTANCE.put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
EvlModule module = new EvlModule();
module.parse(evlCode);
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(UMLPackage.eNS_URI, UMLPackage.eINSTANCE);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new UMLResourceFactoryImpl());
Resource resource = resourceSet.createResource(URI.createURI(UMLPackage.eNS_URI));
resource.load(new ByteArrayInputStream(modelContents), null);
InMemoryEmfModel modelMem = new InMemoryEmfModel(resource);
modelMem.setName("Model");
System.out.println("Problems found:"+module.getParseProblems());
module.getContext().getModelRepository().addModel(modelMem);
module.execute();
var results = module.getContext().getUnsatisfiedConstraints();
System.out.println(results);
}