Skip to main content

Mapping Syntax

Scope of variables in mapping

Mapping files describe how an element should be mapped to the Expander template. Thus, values cannot be used in other expressions. Instead, a variable must be defined with <let> to be reused.

Values

<!-- Bind a single value -->
<value name="className" eval="dataElement.name"/>

<!-- ... with switch-case -->
<conditionalValue name="fieldName">
<option
if="field.getOption('prefix').defined"
eval="'m' + field.name.firstToUpper"/>
<defaultOption eval="field.name"/>
</conditionalValue>

Groups

<!-- Bind object -->
<group name="header">
<value name="title"
eval="dataElement.name"/>
<value name="subtitle"
eval="dataElement.packageName"/>
</group>

<!-- ... with a condition -->
<group name="tooltip"
if="not dataElement.description.empty">
<value name="description"
eval="dataElement.description"/>
</group>

Utility

<!-- Define a variable -->
<let name="targetElement"
eval="taskElement.targetElement"/>
<value name="targetClass" eval="targetElement.name"/>

<!-- Assert a precondition -->
<assert name="packageName_required"
message="PackageName should be defined"
eval="not dataElement.packageName.empty"/>

<!-- Include another mapping -->
<include path="/net/demo/example/CommonMapping.xml"/>

Imports

<!-- Declare current artifact + import strategy -->
<artifact this="dataElement.qualifiedName + 'Data'"
importStrategy="java"/>

<!-- Declare used import -->
<uses eval="'java.util.List'"/>
<uses eval="field.javaType"/>

Lists

<!-- Bind a list of items -->
<list name="fields">
<foreach name="field" in="dataElement.fields"/>
<value name="name" eval="field.name"/>
</list>

<!-- Filter items -->
<list name="fields">
<foreach name="field" in="dataElement.fields"/>
<filter eval="field.linkField != null"/>
</list>
<!-- Filter Duplicates -->
<list name="fieldTypes">
<foreach name="field" in="dataElement.fields"/>
<distinct eval="field.javaType"/>
</list>
<!-- Sort -->
<list name="fieldsSorted">
<foreach name="field" in="dataElement.fields"/>
<sorted eval="field.name" direction="ascending"/>
</list>

Lists Combinations

<!-- Add single item -->
<list name="interfaces">
<item>
<value name="className" eval="'Serializable'"/>
</item>
<!-- ... with condition -->
<item
if="dataElement.getOption('compare').defined">
<value name="className" eval="'Comparable'"/>
</item>
</list>

<!-- Concatenate -->
<list name="members">
<items>
<foreach name="field"
in="dataElement.fields"/>
<value name="name" eval="field.name"/>
</items>
<items>
<foreach name="command"
in="dataElement.dataCommands"/>
<value name="name" eval="command.name"/>
</items>
</list>