Expander Mapping

The mapping file can contain a number of different mappings. This chapter will explain each mapping available.

Value

The value mapping is most simple mapping. It creates a variable to use in the template by defining a name and an expression to calculate it:

<value name="component" eval="dataElement.component.name"/>

ConditionalValue

A conditionalValue will allow you to define a value which differs based on a set of conditions:

In this example, the value fileName can be overwritten by defining the option ‘demo.filename’.

<conditionalValue name="fileName">
  <option if="dataElement.getOption('demo.fileName').defined" eval="dataElement.getOption('demo.fileName').value"/>
  <defaultOption eval="dataElement.name"/>
</conditionalValue>

A conditionalValue can contains multiple options. The expander will resolve the conditions top-down. Once a condition returns true, the value will be calculated with the eval expression.

Group

A group mapping will group values into a object. E.g. in this example the values in the group can be accessed in the template as <targetElement.packageName> and <targetElement.name:

<group name="targetElement" if="field.fieldType.name.equals('LINK_FIELD')">
  <value name="name" eval="field.linkField.targetElement.name"/>
  <value name="packageName" eval="field.linkField.targetElement.packageName"/>
</group>

An if condition can be added to only create the group if that condition is fulfilled.

List

The list mapping iterates over a collection and creates a list of mapped objects. It defines a param, which defines the name for the variable representing each object in the collection.

<list name="fields" eval="dataElement.fields"
      param="field"
      filter="not field.fieldType.equals('CALCULATED_FIELD')">
  <value name="name" eval="field.name"/>
</list>

A list can also define a filter and a unique expression. The filter will filter out all objects that do not match the condition.

The unique expression will filter out duplicates based on the result of the expression. E.g. unique="field.valueField.valueFieldType" will generate a list of objects that each have a unique valueFieldType.

Let

The let mapping does not have any direct effect on the template. Rather, it’s used to define variables which can be used in other mappings.

E.g. the mapping

<value name="name" eval="field.linkField.targetElement.name"/>
<value name="packageName" eval="field.linkField.targetElement.packageName"/>

can be simplified to:

<let name="targetElement" eval="field.linkField.targetElement"/>
<value name="name" eval="targetElement.name"/>
<value name="packageName" eval="targetElement.packageName"/>

The let mapping can also be used to instantiate helper classes:

<let name="nameConverter" eval="new net.democritus.naming.ElementNameConverter()"/>
<value name="nameDashed" eval="nameConverter.getDashed(dataElement.name)"/>

Include

Lastly, the include mapping will include another mapping file and add it to the mapping.

<include path="SomeCommonMapping.xml"/>
<!-- or -->
<include path="/path/to/SomeCommonMapping.xml"/>

Next

Learn about Features