Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Data weave
1.
2. In Anypoint Studio, you can place
a Transform Message element in a
flow to create transformations
using the DataWeave language.
The editor helps you do this by
offering intelligent autocomplete
suggestions, an output preview
that is updated in real time as you
make changes.
This generates
a .dwl transformation file (or
several of them) that stores your
code and is packaged with your
Mule application.
3. When adding a Transform Message element to a Mule Flow, it takes the elements
from the incoming Mule Message as its inputs. It then performs the necessary
actions to produce a Mule message as output for the next element in the flow
4. The DataWeave Text Editor GUI
The Transform Message element allows you to freely write DataWeave code.
If you click on an instance of the Transform Message element in your flow, its
properties editor will be displayed. This editor is divided into three sections:
Input
Transform
Output
5. Input Section
In the main tab, a tree view shows the known metadata contents of the incoming
Mule Message, allowing you to explore it and know what data is available for using as
an input, and how to reference each part of it.
If the Mule flow doesn’t expose Metadata about the elements you need from the
incoming message, you can manually specify it. To do so, select the element of the
input you desire to define, note that the pencil icon at the top right is no longer
grayed out. Click this icon to open a new tab in your input section where you can
define a sample with the structure of this data.
6. When the input is of JSON or XML types, the sample input contains plain XML or JSON code.
When the input is of type POJO or DataWeave, the sample input is written in DataWeave for
more simplicity. In these cases the sample DataWeave code is merely a way to display the
sample data, not a transformation in itself.
7. Some input formats, like CSV, allow you to define a
reader with specific properties that make DataWeave
parse inputs differently. Select the input element you
wish to configure on the tree view of the input
section, then click the gear icon.
8. you write the
actual DataWeave code that carries
out the transform. Notice that
changing the type of your output
directive changes the output
section of the editor.
Although DataWeave as a language
supports adding input directives
and naming these by any name
you like, in Studio the elements of
the input message are implicitly
considered input directives and so
they don’t need to be defined in
the header.
9. If Studio has any metadata about the components that are upstream or downstream
from your Transform Message element at the time when you add the component to
your flow, a scaffolding for your DataWeave code is written out automatically, with as
much depth as Studio can intelligently deduce. In some cases, this code may be
enough to carry out the transformation you need, and no additional coding is needed.
Sometimes, all you need to do is fill in the blank spaces in the scaffolding with
references to the input fields, other times you may want to carry out more complex
operations that involve aggregation, filtering, calculations, defining custom functions,
etc and there you must write this out in DataWeave code.
10. Once you’ve added the Transform Message element to your flow, any further changes
you make to the surrounding message processors and their metadata won’t affect
your `.dw`l file. You may still click the Scaffolding button on the top left of the DataWeave
properties editor any time you want and have a new scaffolding built, note that this will
erase anything you’ve written in the DataWeave body. Doing this won’t affect any
directives you defined in your header (except for the output directive). Use this button if
you’ve made any changes to elements that come after the Transform Message element
on the flow that expose metadata and don’t mind loosing what you’ve already written
into the transform’s body.
11. Instead of defining a new .dwl file, you can reference an existing one by clicking
theData Source button, selecting On File as the source and referencing the correct file.
12. Handling Multiple Outputs
A single Transform Message element can give shape to several different components
of the output Mule message. Each of these output components must be defined in a
separate .dwl file, written out in a separate tab of the Transform section. For example
in one tab you may be defining the payload contents, in another those of an outbound
property, and these will both be parts of the same output Mule message
13. To add a new output, click the Plus sign at the bottom
right of the section:new+output.png[image]
A new tab will then appear, there you can specify
where in the output Mule message to place the output
of this DataWeave transform. In case you’re creating a
new variable or property, you must also set a name for
it.
14. In the XML editor you can do the same by adding multiple child elements inside
thedw:transform-message component.
<dw:transform-message>
<dw:set-payload resource="classpath:path/transform.dwl"/> <dw:set-
variable variableName="myVariable"
resource="classpath:path/transform.dwl"/> <dw:set-session-variable
variableName="mySessionVariable" resource="classpath:path/transform.dwl"/>
</dw:transform-message>
15. This section has two tabs, one of
them shows you a neat expandable
tree view of the output data
structure, the other shows you a
preview of what the actual output
looks like, built from any sample data
you provide in the input section. As
you make changes in the transport
section, notice how the data
structure changes. The output of the
transformer is made into the
selected component of the output
mule message. If your transformer
has multiple outputs,
the Preview tab will display the one
corresponding to the currently
selected transform.
16. All components in Mule that
support Mule Expression
Language also support expressions
written in DataWeave Language. To
invoke an expression written in
DataWeave language, simply invoke
the dw() function, the expression will
return whatever the transform
outputs.
DataWeave expressions defined
within this function work just as
those defined within a Transform
Message element, the only
difference is that the output is
returned into the expression’s result,
wherever it may be.
17. For example, you can define a custom object and populate it with elements from the
payload:
That same expression could be added inside a Logger,
within a MEL expression, to print out its result:
dw(myobject:{id:payload.accountid, user:payload.user})
#[`dw(myobject:{id:payload.accountid, user:payload.user})`]