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);

   }