Wiki

Clone wiki

scenariotools-sml / Xtext: Tips, Tricks & Tutorials

Xtext: Tips, Tricks & Tutorials

This section is for useful tips about implementing or debugging with Xtext. It contains code examples and links to interesting tutorials.


Printing out constraint messages in correct order

The constraint messages are contained in 4 individual lists in the meta model. So if you want to get the messages in the correct order, you have to concider the Nodemodel of the Xtext document. This was necessary for the LaTeX diagram generator. The following example shows how to print constraint messages in the correct order:

  • Code:

    #!xtend
    def printConstraintMessages(Scenario scenario) {
        if (scenario.ownedInteraction.constraints != null) {
            println("Constraints for Scenario " + scenario.name + " in correct order:")
            val constraints = scenario.ownedInteraction.constraints
            val node = NodeModelUtils.getNode(constraints)
            val children = node.children // children of the node: messages, keywords, whitespaces, etc
            for (var i = 0; i < children.size - 1; i++) {
                val leaf = children.get(i) // keywords: consider, interrupt, etc
                val composite = children.get(i + 1) // the actual message
                // Filter out whitespaces, etc
                if (leaf instanceof LeafNode && composite instanceof CompositeNodeWithSemanticElement) {
                    println(leaf.text + composite.text)
                }
            }
        }
    }
    

  • Example Scenario:

    #!sml
    specification scenario MyScenario {
        message env -> controller.request()
        message strict requested controller -> env.response()
    } constraints [
        consider message env -> controller.request()
        forbidden message env -> controller.request()
        ignore message env -> controller.request()
        interrupt message env -> controller.request()
        interrupt message env -> controller.request()
        ignore message env -> controller.request()
        forbidden message env -> controller.request()
        consider message env -> controller.request()
    ]
    

  • Output:

    #!txt
    Constraints for Scenario MyScenario in correct order:
    consider message env -> controller.request()
    forbidden message env -> controller.request()
    ignore message env -> controller.request()
    interrupt message env -> controller.request()
    interrupt message env -> controller.request()
    ignore message env -> controller.request()
    forbidden message env -> controller.request()
    consider message env -> controller.request()
    


Updated