Skip to content

Exercise 5 - Implementation

Base Transformation

Transformation class containing the MT definition. All rules must be defined in the ruleStore().

package flowchartToHtmlExamples
import static yamtl.dsl.Rule.*
import org.eclipse.emf.ecore.EPackage
import yamtl.core.YAMTLModule
import yamtl.groovy.YAMTLGroovyExtensions
import yamtl.groovy.YAMTLGroovyExtensions_dynamicEMF

class Example5 extends YAMTLModule {
    public Example5(EPackage flowchartPk, EPackage htmlPk) {
        YAMTLGroovyExtensions_dynamicEMF.init(this)

        header().in("in", flowchartPk).out("out", htmlPk)

        ruleStore([
            //TODO: Create a lazy rule

            //TODO: Create a non-lazy/regular rule

            //TODO: Create a rule that fetches the outputs of the first two rules
        ])

    }

}

Solution

The correct transformation definition for this problem is:

package flowchartToHtmlExamples
import static yamtl.dsl.Rule.*
import org.eclipse.emf.ecore.EPackage
import yamtl.core.YAMTLModule
import yamtl.groovy.YAMTLGroovyExtensions
import yamtl.groovy.YAMTLGroovyExtensions_dynamicEMF

class Example5 extends YAMTLModule {
    public Example5(EPackage flowchartPk, EPackage htmlPk) {
        YAMTLGroovyExtensions_dynamicEMF.init(this)

        header().in("in", flowchartPk).out("out", htmlPk)

        ruleStore([
            rule('Node2H1')
                .isLazy()
                .in("in", flowchartPk.Node) 
                .out("out", htmlPk.H1, {
                    out.value = in.name
                }),
            rule('Transition2H1')
                .in("t", flowchartPk.Transition)
                .out("h1", htmlPk.H1, {
                    h1.value = t.name
                }),
            rule('Flowchart2DIV')
                .in('f', flowchartPk.Flowchart)
                .out('div', htmlPk.DIV, {
                    // without LAZY: div.children.addAll(fetch(f.nodes))
                    // with LAZY rules
                    div.children.addAll(fetch(f.nodes, 'out', 'Node2H1'))
                    div.children.addAll(fetch(f.transitions))
                }),

        ])

    }

}