<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>DATAWEAVE on DecipherMiddleware</title><link>https://blog.deciphermiddleware.in/tags/dataweave/</link><description>Recent content in DATAWEAVE on DecipherMiddleware</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 08 Oct 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.deciphermiddleware.in/tags/dataweave/index.xml" rel="self" type="application/rss+xml"/><item><title>Logging within DataWeave Script</title><link>https://blog.deciphermiddleware.in/posts/dataweave-logging/</link><pubDate>Wed, 08 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/dataweave-logging/</guid><description>&lt;p&gt;With the release of Mule runtime &lt;strong&gt;4.10&lt;/strong&gt; edge version, a new version of DataWeave, i.e. 2.10, is also &lt;a href="https://docs.mulesoft.com/release-notes/dataweave/dataweave-2.10.0-release-notes"&gt;released&lt;/a&gt;. One of the new features introduced in this release is &lt;strong&gt;&lt;a href="https://docs.mulesoft.com/dataweave/latest/dataweave-logging-configuration"&gt;DataWeave Logging Configuration&lt;/a&gt;&lt;/strong&gt;. The feature facilitates the developer to have granular control over logging. This leads to faster development and debugging.&lt;/p&gt;
&lt;p&gt;There might be a question: loggers are there; Why can’t we just put a log connector and log the variable or payload? What benefits do we get by logging within DataWeave? Where can I use this feature?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔭&lt;/strong&gt; Let’s explore DataWeave examples of varying complexities.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-old-way-of-debugging"&gt;👴🏼 Old way of debugging &lt;a href="#-old-way-of-debugging" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Let&amp;rsquo;s consider simple Mule flow which outputs a &lt;strong&gt;hello world!&lt;/strong&gt;, using a transform message.&lt;/p&gt;
&lt;div class="mermaid"&gt;---
config:
theme: 'neutral'
---
flowchart LR
A["HTTP(s)"] --&gt; B["Transform"]&lt;/div&gt;
&lt;h3 id="dataweave"&gt;DataWeave &lt;a href="#dataweave" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Difficulty level | ⭐️⚝⚝⚝⚝&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Print &amp;ldquo;hello world!&amp;rdquo;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output text/plain
---
&amp;#34;hello world!&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="output"&gt;Output &lt;a href="#output" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;hello world!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To analyze the value of payload in logs; the best way would be to add a logger after the transform message.&lt;/p&gt;
&lt;div class="mermaid"&gt;---
config:
theme: 'neutral'
---
flowchart LR
A["HTTP(s)"] --&gt; B["Transform"] --&gt; C["Logger"]&lt;/div&gt;
&lt;h3 id="console-output"&gt;Console Output &lt;a href="#console-output" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO 2025-10-07 23:50:57,309 &lt;span class="o"&gt;[[&lt;/span&gt;MuleRuntime&lt;span class="o"&gt;]&lt;/span&gt;.uber.01: &lt;span class="o"&gt;[&lt;/span&gt;dataweave-logs&lt;span class="o"&gt;]&lt;/span&gt;.dataweave-logsFlow.CPU_INTENSIVE @6198f22a&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;processor: dataweave-logsFlow/processors/1&lt;span class="p"&gt;;&lt;/span&gt; event: 5e704830-a3aa-11f0-bf2a-beeb1f9526e2&lt;span class="o"&gt;]&lt;/span&gt; org.mule.runtime.core.internal.processor.LoggerMessageProcessor: hello world!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pretty simple and easy 🫠&amp;hellip; ❌ Not anymore, let&amp;rsquo;s increase the difficulty of the DataWeave script.&lt;/p&gt;
&lt;h3 id="dataweave-1"&gt;DataWeave &lt;a href="#dataweave-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Difficulty level | ⭐️⭐️⚝⚝⚝&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Factorial of a number&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
---
(1 to payload.inp) reduce $ * $$
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="input"&gt;Input &lt;a href="#input" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;inp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output-1"&gt;Output &lt;a href="#output-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Considering the same flow, logger output will be as follows:&lt;/p&gt;
&lt;h4 id="console-output-1"&gt;Console Output &lt;a href="#console-output-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO 2025-10-08 10:38:31,654 &lt;span class="o"&gt;[[&lt;/span&gt;MuleRuntime&lt;span class="o"&gt;]&lt;/span&gt;.uber.07: &lt;span class="o"&gt;[&lt;/span&gt;dataweave-logs&lt;span class="o"&gt;]&lt;/span&gt;.dataweave-logsFlow.CPU_INTENSIVE @1d9d48be&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;processor: dataweave-logsFlow/processors/1&lt;span class="p"&gt;;&lt;/span&gt; event: d569a3a0-a404-11f0-bf2a-beeb1f9526e2&lt;span class="o"&gt;]&lt;/span&gt; org.mule.runtime.core.internal.processor.LoggerMessageProcessor: &lt;span class="m"&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yuhhuuu!!! We did it, we got the factorial of the number printed in the logs, and the same has been sent to the calling API.&lt;/p&gt;
&lt;p&gt;Now, if we need to know the value on each iteration of the reduce function, how are the values updated at every iteration? 🤔🤔🤔&lt;/p&gt;
&lt;p&gt;If it were any other programming language, such as Java, Python, Go, etc. The print command would suffice for the needs. But in DataWeave, how do we do so?&lt;/p&gt;
&lt;p&gt;We are still in the old way of debugging 😞. Let&amp;rsquo;s modify the code to get the desired outcome.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
---
(1 to payload.inp) reduce(it,acc=[1]) -&amp;gt; acc + acc[it-1]*it
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="output-2"&gt;Output &lt;a href="#output-2" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="console-output-2"&gt;Console Output &lt;a href="#console-output-2" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO 2025-10-08 11:12:32,863 &lt;span class="o"&gt;[[&lt;/span&gt;MuleRuntime&lt;span class="o"&gt;]&lt;/span&gt;.uber.06: &lt;span class="o"&gt;[&lt;/span&gt;dataweave-logs&lt;span class="o"&gt;]&lt;/span&gt;.dataweave-logsFlow.CPU_INTENSIVE @1bbba791&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;processor: dataweave-logsFlow/processors/1&lt;span class="p"&gt;;&lt;/span&gt; event: 961820f0-a409-11f0-bf2a-beeb1f9526e2&lt;span class="o"&gt;]&lt;/span&gt; org.mule.runtime.core.internal.processor.LoggerMessageProcessor: &lt;span class="o"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 6,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 24,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;payload[-1]&lt;/code&gt; will be desired output sent to the client.&lt;/p&gt;
&lt;p&gt;By doing this, we have significantly altered the dwl script and made it heavier, catering to the use case.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Simple task and complicated solution 😢😢😢&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="-new-way-of-debugging"&gt;😎 New way of debugging &lt;a href="#-new-way-of-debugging" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Starting with DataWeave 2.10, logging can be configured to control the verbosity of log messages using standard log levels: Debug, Info, Warn, and Error.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with an example and remove the logger connector to make the flow simpler.&lt;/p&gt;
&lt;div class="mermaid"&gt;---
config:
theme: 'neutral'
---
flowchart LR
A["HTTP(s)"] --&gt; B["Transform"]&lt;/div&gt;
&lt;h3 id="dataweave-2"&gt;DataWeave &lt;a href="#dataweave-2" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Difficulty level | ⭐️⚝⚝⚝⚝&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Print &amp;ldquo;hello world!&amp;rdquo;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output text/plain
---
logInfo(&amp;#34;hello world!&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="console-output-3"&gt;Console Output &lt;a href="#console-output-3" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO 2025-10-08 19:27:55,625 &lt;span class="o"&gt;[[&lt;/span&gt;MuleRuntime&lt;span class="o"&gt;]&lt;/span&gt;.uber.06: &lt;span class="o"&gt;[&lt;/span&gt;dataweave-logs&lt;span class="o"&gt;]&lt;/span&gt;.dataweave-logsFlow.CPU_INTENSIVE @ae03158&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;processor: &lt;span class="p"&gt;;&lt;/span&gt; event: ca3bdad0-a44e-11f0-bf2a-beeb1f9526e2&lt;span class="o"&gt;]&lt;/span&gt; org.mule.weave.v2.model.service.DefaultLoggingService$: &lt;span class="s2"&gt;&amp;#34;hello world!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yeah!!! We did it&amp;hellip;&lt;/p&gt;
&lt;img src="https://blog.deciphermiddleware.in/images/blogger/33b97e90f7.gif" width="250px"/&gt;
&lt;p&gt;Let&amp;rsquo;s look a little closer 🔎&lt;/p&gt;
&lt;h3 id="difference-in-packages-used-for-logging"&gt;Difference in packages used for logging &lt;a href="#difference-in-packages-used-for-logging" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Logger Connector:&lt;/strong&gt; org.mule.runtime.core.internal.processor.LoggerMessageProcessor&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DataWeave:&lt;/strong&gt; org.mule.weave.v2.model.service.DefaultLoggingService$&lt;/p&gt;
&lt;p&gt;In above example, info level is used, for different log levels, different DataWeave logging functions are available.&lt;/p&gt;
&lt;h3 id="dataweave-logging-functions"&gt;DataWeave Logging Functions &lt;a href="#dataweave-logging-functions" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;logWith&amp;lt;T&amp;gt;(level: LogLevel, prefix: String, value: T): T
logDebug&amp;lt;T&amp;gt;(prefix: String = &amp;#34;&amp;#34;, value: T): T
logInfo&amp;lt;T&amp;gt;(prefix: String = &amp;#34;&amp;#34;, value: T): T
logWarn&amp;lt;T&amp;gt;(prefix: String = &amp;#34;&amp;#34;, value: T): T
logError&amp;lt;T&amp;gt;(prefix: String = &amp;#34;&amp;#34;, value: T): T
log&amp;lt;T&amp;gt;(prefix: String = &amp;#34;&amp;#34;, value: T): T
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;More info on each function at &lt;a href="https://docs.mulesoft.com/dataweave/latest/dataweave-logging-configuration#dataweave-logging-functions"&gt;official docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now let&amp;rsquo;s increase DataWeave complexity&amp;hellip;&lt;/p&gt;
&lt;img src="https://blog.deciphermiddleware.in/images/blogger/955bcc363e.gif"/&gt;
&lt;h3 id="dataweave-3"&gt;DataWeave &lt;a href="#dataweave-3" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;Difficulty level | ⭐️⭐️⚝⚝⚝&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Factorial of a number&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
---
(1 to payload.inp) reduce logInfo($ * $$)
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="input-1"&gt;Input &lt;a href="#input-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;inp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output-3"&gt;Output &lt;a href="#output-3" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="console-output-4"&gt;Console Output &lt;a href="#console-output-4" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO 2025-10-08 20:16:32,412 &lt;span class="o"&gt;[[&lt;/span&gt;MuleRuntime&lt;span class="o"&gt;]&lt;/span&gt;.uber.06: &lt;span class="o"&gt;[&lt;/span&gt;dataweave-logs&lt;span class="o"&gt;]&lt;/span&gt;.dataweave-logsFlow.CPU_INTENSIVE @46ac5059&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;processor: &lt;span class="p"&gt;;&lt;/span&gt; event: 94c8ac00-a455-11f0-bf2a-beeb1f9526e2&lt;span class="o"&gt;]&lt;/span&gt; org.mule.weave.v2.model.service.DefaultLoggingService$: &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO 2025-10-08 20:16:32,413 &lt;span class="o"&gt;[[&lt;/span&gt;MuleRuntime&lt;span class="o"&gt;]&lt;/span&gt;.uber.06: &lt;span class="o"&gt;[&lt;/span&gt;dataweave-logs&lt;span class="o"&gt;]&lt;/span&gt;.dataweave-logsFlow.CPU_INTENSIVE @46ac5059&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;processor: &lt;span class="p"&gt;;&lt;/span&gt; event: 94c8ac00-a455-11f0-bf2a-beeb1f9526e2&lt;span class="o"&gt;]&lt;/span&gt; org.mule.weave.v2.model.service.DefaultLoggingService$: &lt;span class="m"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO 2025-10-08 20:16:32,413 &lt;span class="o"&gt;[[&lt;/span&gt;MuleRuntime&lt;span class="o"&gt;]&lt;/span&gt;.uber.06: &lt;span class="o"&gt;[&lt;/span&gt;dataweave-logs&lt;span class="o"&gt;]&lt;/span&gt;.dataweave-logsFlow.CPU_INTENSIVE @46ac5059&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;processor: &lt;span class="p"&gt;;&lt;/span&gt; event: 94c8ac00-a455-11f0-bf2a-beeb1f9526e2&lt;span class="o"&gt;]&lt;/span&gt; org.mule.weave.v2.model.service.DefaultLoggingService$: &lt;span class="m"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;INFO 2025-10-08 20:16:32,413 &lt;span class="o"&gt;[[&lt;/span&gt;MuleRuntime&lt;span class="o"&gt;]&lt;/span&gt;.uber.06: &lt;span class="o"&gt;[&lt;/span&gt;dataweave-logs&lt;span class="o"&gt;]&lt;/span&gt;.dataweave-logsFlow.CPU_INTENSIVE @46ac5059&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;processor: &lt;span class="p"&gt;;&lt;/span&gt; event: 94c8ac00-a455-11f0-bf2a-beeb1f9526e2&lt;span class="o"&gt;]&lt;/span&gt; org.mule.weave.v2.model.service.DefaultLoggingService$: &lt;span class="m"&gt;120&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the above log, we can infer that 4 times computation was performed, and the values were printed by the DataWeave logger. It helps in debugging script a lot.&lt;/p&gt;
&lt;p&gt;The story doesn&amp;rsquo;t end here&amp;hellip; Let&amp;rsquo;s make the script a little more complex&amp;hellip; But Scope for this blog ends here&amp;hellip; 😔😔😔&lt;/p&gt;
&lt;h2 id="part-2"&gt;Part 2 &lt;a href="#part-2" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Part 2 coming soon&amp;hellip;.&lt;/p&gt;
&lt;img src="https://blog.deciphermiddleware.in/images/blogger/bad297b70d.gif"/&gt;
&lt;hr&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&amp;hellip;&lt;/p&gt;</description></item><item><title>Experimenting Recursion in DataWeave - Fibonacci Series</title><link>https://blog.deciphermiddleware.in/posts/experimenting-recursion-in-dataweave/</link><pubDate>Tue, 13 Jun 2023 17:20:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/experimenting-recursion-in-dataweave/</guid><description>&lt;p&gt;In various programming languages, &lt;strong&gt;recursion&lt;/strong&gt; is a process in which a method or function calls itself to simplify a complicated problem. Understanding recursive solution sometimes become difficult. Let&amp;rsquo;s try to solve a mathematical problem through recursion with a twist by using &lt;strong&gt;&lt;a href="https://docs.mulesoft.com/dataweave/2.4/"&gt;DataWeave&lt;/a&gt;&lt;/strong&gt;. The Fibonacci series is a generic use case that recursion can solve. This is a very generic question in programming interviews.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEgMCAzoIcrFJGsoVYBmoNgx1holseJ--eU4AlGaAEYcvIeVknXZU_1-9XCSKPhdQ1kys0BPwLs1qXHbSB_9tIZZ8HFd2iYE8uQZlOFmZCePE_n0sZIi4O90K1do27hOCY-U_NvwLPoo-YC57NbivLu3t2n1a3oM1bbAtx73xjOF8to424pDOLZunjLs"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/18b1df67c9.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Photo by &lt;a href="https://unsplash.com/ko/@naletu?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Natalya Letunova&lt;/a&gt; on &lt;a href="https://unsplash.com/photos/nJ07EiRkMUY?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-is-fibonacci-series"&gt;What is Fibonacci Series? &lt;a href="#what-is-fibonacci-series" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;A Fibonacci series is a set of integers starting with 0 followed by 1, and a series continuing with the sum of the preceding two integers in the sequence. For example,&lt;/p&gt;
&lt;p&gt;$$
F_n = 0,1,1,2,3,5,8,13,21,34&amp;hellip;
$$&lt;/p&gt;
&lt;h3 id="mathematically"&gt;Mathematically, &lt;a href="#mathematically" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;$$
\begin{align*}
&amp;amp; F_0 = 0 \\
&amp;amp; F_1 = 1 \\
&amp;amp; F_n = F_{(n-1)} + F_{(n-2)}
\end{align*}
$$&lt;/p&gt;
&lt;p&gt;Now transforming the above logic in the form of a recursive function to find the nth digit in the Fibonacci series.&lt;/p&gt;
&lt;h3 id="dataweave-recursive-function"&gt;DataWeave Recursive Function: &lt;a href="#dataweave-recursive-function" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
fun fib_r(n)=
if (n&amp;lt;=0) 0
else if (n==1) 1
else
fib_r(n-1) + fib_r(n-2)
---
{
recursive:fib_r(9)
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/c78f1ed507.gif"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/c78f1ed507.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Testing on dataweave playground and increasing the value of &lt;strong&gt;n&lt;/strong&gt;. The moment we increase the value beyond &lt;strong&gt;27&lt;/strong&gt; , we get an &lt;strong&gt;ERROR&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/94b548fae8.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/94b548fae8.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="error"&gt;ERROR? &lt;a href="#error" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;The error shows the execution time taken by dataweave is more than 2.5 seconds. But how do we know how much time is taken by the recursive function? Is there a way to capture the execution time within DataWeave without any custom code/java modules? It&amp;rsquo;s a yes, The DataWeave has a utility module &lt;a href="https://docs.mulesoft.com/dataweave/2.4/dw-timer"&gt;Timer&lt;/a&gt;, which can be used to capture execution time as well as the result of the functions.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import * from dw::util::Timer
output application/json
fun fib_r(n)=
if (n&amp;lt;=0) 0
else if (n==1) 1
else
fib_r(n-1) \+ fib_r(n-2)
---
{
recursive:time(()-&amp;gt;fib_r(27)),
recursive_d:duration(()-&amp;gt;fib_r(27))
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:33:29.053017Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;610&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:33:29.059367Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive_d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;610&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Duration gives us the time taken by function execution in milliseconds and the time function output the start and end timestamp of the execution. With this, the execution time can be measured easily.&lt;/p&gt;
&lt;p&gt;Now, the real issue is if we need to find the &lt;strong&gt;nth&lt;/strong&gt; digit(greater than &lt;strong&gt;27&lt;/strong&gt;) in the Fibonacci series by optimizing space and time. &lt;strong&gt;How can that be done?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/50e6e3c1da.gif"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/50e6e3c1da.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Going back to programming days, there is a way of using &lt;strong&gt;Tail Recursion&lt;/strong&gt;. Now what exactly is tail recursion?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tail recursion&lt;/strong&gt; is using the recursive function as the last statement of the function. The benefit of this approach is it optimises the space as the function doesn&amp;rsquo;t need to keep the track of last 2 execution results. Since the result is populated as part of the last execution statement of the function. Putting the coding hats again for the DataWeave.&lt;/p&gt;
&lt;p&gt;With the new function let&amp;rsquo;s find out the &lt;strong&gt;500 th digit in the Fibonacci series&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import * from dw::util::Timer
output application/json
fun fib_r(n)=
if (n&amp;lt;=0) 0
else if (n==1) 1
else
fib_r(n-1) \+ fib_r(n-2)
//tail recursion
fun fib_tr(n, x=0, y=1)=
if(n&amp;lt;=0)
x
else if (n==1)
y
else
fib_tr(n-1,y,x+y)
---
{
recursive:time(()-&amp;gt;fib_r(5)),
tailRecursive:time(()-&amp;gt;fib_tr(500))
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:48:46.007784Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:48:46.007897Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tailRecursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:48:46.007902Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T16:48:46.010339Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In nearly 4 milliseconds, the new tail recursive function can give results for the **500 th digit **in the series.&lt;/p&gt;
&lt;h2 id="can-we-improve-the-timings-further"&gt;Can we improve the timings further? &lt;a href="#can-we-improve-the-timings-further" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/86807ebb0c.gif"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/86807ebb0c.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In dataweave, we have a &amp;ldquo;&lt;a href="https://docs.mulesoft.com/dataweave/2.4/dw-core-functions-reduce"&gt;reduce&lt;/a&gt;&amp;rdquo; function, which can be used to get output for the Fibonacci series even faster. Re-writing the logic with the &amp;ldquo;reduce&amp;rdquo; function is kind of challenging. After multiple trials and errors, one way is as below.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import * from dw::util::Timer
output application/json
fun fib_r(n)=
if (n&amp;lt;=0) 0
else if (n==1) 1
else
fib_r(n-1) \+ fib_r(n-2)
//tail recursion
fun fib_tr(n, x=0, y=1)=
if(n&amp;lt;=0)
x
else if (n==1)
y
else
fib_tr(n-1,y,x+y)
//with reduce
fun fib_rr(n)=
if(n&amp;lt;=0)
0
else
if(n==1)
1
else
([2 to n][0] reduce ((i,acc=[0, 1]) -&amp;gt; acc + (acc[i-1] + acc[i-2])))[n]
---
{
recursive:time(()-&amp;gt;fib_r(5)),
tailRecursive:time(()-&amp;gt;fib_tr(500)),
reduce:time(()-&amp;gt;fib_rr(500))
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.724469Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.72455Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;tailRecursive&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.724555Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.726913Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;reduce&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.726923Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2023-06-13T17:04:41.729307Z&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The above DataWeave script is one of the many ways to solve the problem. On comparing all three approaches, the solution using &lt;strong&gt;reduce&lt;/strong&gt; function performs &lt;strong&gt;best of all&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/b8229ff19e.gif"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/b8229ff19e.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item><item><title>[Mule 4]Catch numeric exceptions inside DataWeave</title><link>https://blog.deciphermiddleware.in/posts/mule-4-catch-numeric-exceptions-inside/</link><pubDate>Sat, 16 Jul 2022 04:32:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/mule-4-catch-numeric-exceptions-inside/</guid><description>&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/6602156a7f.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/6602156a7f.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Numbers are a simple data type, but become complex in real-time integration transformation scenarios. Number data type, we consider number system in base 10 and perform all kinds of arithmetic operations e.g. +, -, *, / etc. We do this starting in childhood: multiply two numbers, divide one number by another, or add two numbers. Now, where is the tricky part 🤔? Let’s start with, various tricky aspects and possible remedies to these.&lt;/p&gt;
&lt;p&gt;This article is published on the &lt;a href="https://www.linkedin.com/showcase/mulesoftcommunity/"&gt;MuleSoft Community&lt;/a&gt; LinkedIn page.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To continue reading please visit the below link.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/pulse/mule-4catch-numeric-exceptions-inside-dataweave-mulesoftcommunity"&gt;https://www.linkedin.com/pulse/mule-4catch-numeric-exceptions-inside-dataweave-mulesoftcommunity&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item><item><title>Number System Conversion in MuleSoft(Mule 4) using Dataweave</title><link>https://blog.deciphermiddleware.in/posts/number-system-conversion-in/</link><pubDate>Wed, 23 Mar 2022 05:51:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/number-system-conversion-in/</guid><description>&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLRSAAywglfL2Fz-Bc4zejQDmJYqCtXAb1AaOKT7QjmyAbX7oYbxYjAPQe9Q5iLjlakiVTPyx5NyZ414VuQfJgXW3kSmqjzn7hMnfW62uDX5Od6dqro11WkBLAJYRIusrzx6bhzyeQzoNMdIUd8osWejojTr6bTHMaGPUkJdRkfUNEEXWELE0TEQMv/s5471/hao-wang-pVq6YhmDPtk-unsplash.jpg"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/03c2d348e7.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The number 11, we call it eleven in the decimal system. Still, it can be a representation of three in a binary system or it can be seventeen in a hexadecimal system. The actual value of a number depends on the base it is calculated. It is interesting changing the base changes the value of the representation. Let us assume in some integration flow we are getting values in binary number system but target system accepts values in a decimal system or hexadecimal system or vice versa.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Examples depicting values in various number systems:&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;DECIMAL&lt;/th&gt;
&lt;th&gt;BINARY&lt;/th&gt;
&lt;th&gt;HEXADECIMAL&lt;/th&gt;
&lt;th&gt;OCTAL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;BASE 10&lt;/td&gt;
&lt;td&gt;BASE 2&lt;/td&gt;
&lt;td&gt;BASE 16&lt;/td&gt;
&lt;td&gt;BASE 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;II&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;III&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;110110&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IV&lt;/td&gt;
&lt;td&gt;123&lt;/td&gt;
&lt;td&gt;1111011&lt;/td&gt;
&lt;td&gt;7B&lt;/td&gt;
&lt;td&gt;173&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V&lt;/td&gt;
&lt;td&gt;240&lt;/td&gt;
&lt;td&gt;11110000&lt;/td&gt;
&lt;td&gt;F0&lt;/td&gt;
&lt;td&gt;360&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In our engineering days, we have studied a lot about number systems. Below is the mathematical representation of conversion logic.&lt;/p&gt;
&lt;p&gt;Let us assume:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;d&lt;/strong&gt;, represents the nth digit.&lt;br&gt;
&lt;strong&gt;b&lt;/strong&gt;, represents the base.&lt;br&gt;
&lt;strong&gt;n&lt;/strong&gt;, represents the number of digits&lt;/p&gt;
&lt;p&gt;Value(&lt;strong&gt;V&lt;/strong&gt;) of number with base b in the decimal system will be:&lt;/p&gt;
&lt;p&gt;$$
V_{10} = (Σd*b(n-1))_{10}
$$&lt;/p&gt;
&lt;p&gt;Let us take example number &lt;strong&gt;7B&lt;/strong&gt; in hexadecimal(&lt;strong&gt;base 16&lt;/strong&gt;) and use the above formula to convert to decimal.&lt;/p&gt;
&lt;p&gt;\(V_{10} = (7 * 16^{(2-1)} + 11 * 16^{(1-1)})_{10}\)&lt;/p&gt;
&lt;p&gt;\(V_{10} = (112 + 11)_{10}\)&lt;/p&gt;
&lt;p&gt;\(V_{10} = (123)_{10}\)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The above conversion was through pen and paper but how to do this in Mule?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dataweave has built-in functions under the &lt;strong&gt;dw::core::Numbers&lt;/strong&gt; module, which can help us to perform these conversions without writing complex logic. To convert to decimal values we have below 3 functions. Let&amp;rsquo;s see usage one by one.&lt;/p&gt;
&lt;h2 id="1-fromhex"&gt;1. fromHex() &lt;a href="#1-fromhex" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This function helps to convert &lt;strong&gt;hexadecimal&lt;/strong&gt; value to &lt;strong&gt;decimal&lt;/strong&gt;. This function takes a &lt;strong&gt;hexadecimal&lt;/strong&gt; string as input and gives &lt;strong&gt;decimal&lt;/strong&gt; value as output. Example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import fromHex from dw::core::Numbers
output application/json
---
fromHex(&amp;#34;7B&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;123
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="2-frombinary"&gt;2. fromBinary() &lt;a href="#2-frombinary" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This function helps to convert the &lt;strong&gt;binary&lt;/strong&gt; string value to decimal value. This function takes a &lt;strong&gt;binary&lt;/strong&gt; string as input and gives &lt;strong&gt;decimal&lt;/strong&gt; value as output. Example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import fromBinary from dw::core::Numbers
output application/json
---
fromBinary(&amp;#34;110110&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;54
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="3-fromradixnumber"&gt;3. fromRadixNumber() &lt;a href="#3-fromradixnumber" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This function helps to convert the &lt;strong&gt;numeric value&lt;/strong&gt; in &lt;strong&gt;any base&lt;/strong&gt; to &lt;strong&gt;decimal&lt;/strong&gt; value. This function takes a &lt;strong&gt;number string&lt;/strong&gt; and &lt;strong&gt;base&lt;/strong&gt; as input and gives &lt;strong&gt;decimal&lt;/strong&gt; value as output. Example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import fromRadixNumber from dw::core::Numbers
output application/json
---
fromRadixNumber(&amp;#34;360&amp;#34;,8)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here, 360 is the number in octal (base 8) and 8 represents the base.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;240
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;The above three ways were to convert numeric values from any base to decimal values. Dataweave also provides functions to do the reverse which is converting a decimal number to any base.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="4-tohex"&gt;4. toHex() &lt;a href="#4-tohex" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This function helps to convert a &lt;strong&gt;decimal&lt;/strong&gt; value to a &lt;strong&gt;hexadecimal&lt;/strong&gt; value. This function takes a &lt;strong&gt;decimal&lt;/strong&gt; number as input and gives a &lt;strong&gt;hexadecimal&lt;/strong&gt; string value as output. Example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import toHex from dw::core::Numbers
output application/json
---
toHex(54)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;36&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="5-tobinary"&gt;5. toBinary() &lt;a href="#5-tobinary" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This function helps to convert a &lt;strong&gt;decimal&lt;/strong&gt; value to a &lt;strong&gt;binary&lt;/strong&gt; string value. This function takes a &lt;strong&gt;decimal&lt;/strong&gt; number as input and gives a &lt;strong&gt;binary&lt;/strong&gt; string value as output. Example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import toBinary from dw::core::Numbers
output application/json
---
toBinary(54)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;110110&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="6-toradixnumber"&gt;6. toRadixNumber() &lt;a href="#6-toradixnumber" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This function helps to convert a &lt;strong&gt;decimal&lt;/strong&gt; value to a &lt;strong&gt;numeric string&lt;/strong&gt; value as per the specified &lt;strong&gt;base&lt;/strong&gt;. This function takes a &lt;strong&gt;decimal&lt;/strong&gt; number and &lt;strong&gt;base&lt;/strong&gt; as input and gives a string output of decimal value in the &lt;strong&gt;specified base&lt;/strong&gt;. Example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
import toRadixNumber from dw::core::Numbers
output application/json
---
toRadixNumber(54,8)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;66&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The above output is in base 8 or in octal.&lt;/p&gt;
&lt;h2 id="direct-conversion"&gt;Direct Conversion &lt;a href="#direct-conversion" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;What if we want to convert numeric value in &lt;strong&gt;base 4&lt;/strong&gt; directly to numeric value with &lt;strong&gt;base 3&lt;/strong&gt;. In such a case, we can use a combination of &lt;strong&gt;fromRadixNumber&lt;/strong&gt; and &lt;strong&gt;toRadixNumber&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;$$
(54)_{10} = (312)_{4} = (2000)_{3}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dataweave&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;%dw 2.0
import * from dw::core::Numbers
output application/json
---
toRadixNumber(fromRadixNumber(312,4),3)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;2000&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="references"&gt;References: &lt;a href="#references" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href="https://docs.mulesoft.com/dataweave/2.4/dw-numbers"&gt;https://docs.mulesoft.com/dataweave/2.4/dw-numbers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item><item><title>Creating and Using Key-Value Lookups in MuleSoft (Mule 4)</title><link>https://blog.deciphermiddleware.in/posts/creating-and-using-key-value-lookups-in/</link><pubDate>Wed, 16 Feb 2022 17:59:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/creating-and-using-key-value-lookups-in/</guid><description>&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/99f34eaa76.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/99f34eaa76.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lookups or key-value pairs are really helpful while developing integrations. Suppose, we get a value from the source system but the target system requires a corresponding value for that key(incoming data). One way is to store such &lt;strong&gt;cross-reference&lt;/strong&gt; in a database table and fetch values. What if, these values are not changed frequently, and accessing a database will probably pose an overhead. A better approach would be to have a static lookup file included within the Mule application. This lookup file can be a .csv, JSON, XML, Excel, etc. file. For simplicity, in this blog, we will be using &lt;strong&gt;CSV&lt;/strong&gt; files as an example for creating and using lookups in Mule 4. A CSV file is easy to maintain and use. Let&amp;rsquo;s start with the below use case.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a use case of Country codes. From the source system, the country field contains &lt;strong&gt;Country Name&lt;/strong&gt; e.g. &lt;strong&gt;India&lt;/strong&gt; but our target system requires 2 character &lt;strong&gt;Country Code&lt;/strong&gt; e.g. &lt;strong&gt;IN&lt;/strong&gt; as input in one of the fields. Now such fields will hardly change in a real-time scenario. We can create a csv file(country_codes.csv) as shown below.&lt;/p&gt;
&lt;h3 id="csv-file--country_codescsv"&gt;CSV File- country_codes.csv &lt;a href="#csv-file--country_codescsv" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Country&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;CountryCode &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;India&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;IN &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Indonesia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;ID &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Philippines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;PH &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;United States&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;US &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Russia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;RU &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Netherlands&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;NL &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Czech Republic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;CZ &lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From the source system, we are getting an address payload as shown below.&lt;/p&gt;
&lt;h3 id="source-payload"&gt;Source Payload &lt;a href="#source-payload" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;streetAdd&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;street1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;streetAdd2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;address2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;City1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;State1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;country&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Indonesia&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;zip&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;123456&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our target system expects only country code to be sent in the payload. Below are the steps to accomplish this&lt;/p&gt;
&lt;h2 id="steps"&gt;STEPS: &lt;a href="#steps" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;1. Place the file country_codes.csv under &lt;strong&gt;src/main/resources&lt;/strong&gt;. In this example, we will place it inside a folder named &lt;strong&gt;lookup&lt;/strong&gt;. If you are using a different folder update classpath accordingly.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/fc5d237652.png"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/fc5d237652.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. Now, we can refer to the file inside the dataweave using the &lt;strong&gt;readUrl()&lt;/strong&gt; dataweave function.&lt;/p&gt;
&lt;p&gt;3. Let us assume input data is stored in payload, our &lt;strong&gt;dataweave transformation&lt;/strong&gt; will look as below.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
var csvData = readUrl(&amp;#34;classpath://lookup/country_codes.csv&amp;#34;,&amp;#34;application/csv&amp;#34;)
fun lookupCC(country: String) : String =
(csvData filter ((item, index) -&amp;gt; item.Country == country))[0].CountryCode as String
---
add:{
addressLine: payload.address.streetAdd ++ &amp;#34; &amp;#34; ++ payload.address.streetAdd2,
city: payload.address.city,
state: payload.address.state,
countryCode: lookupCC(payload.address.country)
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4. We have created a function called &lt;strong&gt;lookupCC()&lt;/strong&gt; which will take one &lt;strong&gt;String input&lt;/strong&gt; and match the incoming value of &lt;strong&gt;Country&lt;/strong&gt; in the lookup csv file and give the &lt;strong&gt;country code&lt;/strong&gt; as output. The output of the above code will look like this:&lt;/p&gt;
&lt;h3 id="output-payload"&gt;Output Payload &lt;a href="#output-payload" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;add&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;addressLine&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;street1 address2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;City1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;State1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;countryCode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ID&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;5. What if the country name is not available in the csv file, the output will come as &lt;strong&gt;null&lt;/strong&gt;. In such cases, we can update the &lt;strong&gt;function&lt;/strong&gt; and provide the &lt;strong&gt;default&lt;/strong&gt; value. For example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;fun lookupCC(country: String) : String =
(csvData filter ((item, index) -&amp;gt; item.Country == country))[0].CountryCode as String default &amp;#34;--&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If we don&amp;rsquo;t find any matching value in the lookup file it will default country code as &amp;ldquo;&amp;ndash;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Similarly, we can extend the function and the csv file to fetch values with multiple inputs and conditions.&lt;/p&gt;
&lt;h2 id="references"&gt;References: &lt;a href="#references" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.mulesoft.com/dataweave/2.3/dw-core-functions-readurl"&gt;https://docs.mulesoft.com/dataweave/2.3/dw-core-functions-readurl&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.mulesoft.com/dataweave/2.4/dataweave-cookbook-csv-lookup"&gt;https://docs.mulesoft.com/dataweave/2.4/dataweave-cookbook-csv-lookup&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item><item><title>Playing with XML Namespaces in Mule 4 Dataweave</title><link>https://blog.deciphermiddleware.in/posts/playing-with-xml-namespaces-in-mule-4/</link><pubDate>Sat, 22 Jan 2022 15:52:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/playing-with-xml-namespaces-in-mule-4/</guid><description>&lt;p&gt;&lt;a href="https://blog.deciphermiddleware.in/images/blogger/1ce3dc9433.jpg"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/1ce3dc9433.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Today, the world is full of REST APIs which use JSON as a major message type. But we have a lot of applications and APIs in the middleware world which rely on XML message structures. XML messages are a bit more complex than JSON messages, as in XML messages namespaces play a vital role. A miss in the namespace can lead to errors that are sometimes unseen to normal eyes. In this blog, we will discuss various ways by which we can handle the transformation of XML messages with or without namespaces in Mule 4 using Dataweave.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#1-transforming-xml-messages-without-namespaces"&gt;Transforming XML messages without namespaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-transforming-xml-messages-with-namespaces"&gt;Transforming XML messages with namespaces &lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="1-transforming-xml-messages-without-namespaces"&gt;1. Transforming XML messages without namespaces &lt;a href="#1-transforming-xml-messages-without-namespaces" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;This conversion is pretty simple, all we need to consider is XPath and do the mapping accordingly. This is similar to the JSON data transformation Let&amp;rsquo;s take an example of 2 XMLs, wherein both input and output XMLs don&amp;rsquo;t have namespaces. The output we need to specify is &lt;strong&gt;application/xml&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;INPUT:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;InputRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;contact&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;firstName&amp;gt;&lt;/span&gt;Test&lt;span class="nt"&gt;&amp;lt;/firstName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;lastName&amp;gt;&lt;/span&gt;Data&lt;span class="nt"&gt;&amp;lt;/lastName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;address&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;street1&amp;gt;&lt;/span&gt;Street1&lt;span class="nt"&gt;&amp;lt;/street1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;street2&amp;gt;&lt;/span&gt;Street2&lt;span class="nt"&gt;&amp;lt;/street2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;city&amp;gt;&lt;/span&gt;City&lt;span class="nt"&gt;&amp;lt;/city&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;state&amp;gt;&lt;/span&gt;State&lt;span class="nt"&gt;&amp;lt;/state&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;country&amp;gt;&lt;/span&gt;Country&lt;span class="nt"&gt;&amp;lt;/country&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/address&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/contact&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/InputRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Suppose we want to extract the value of country from the above XML message. All we need to do is traverse to the node as we do in the case of JSON transformations i.e. (Assuming data is in the payload variable) &lt;strong&gt;&lt;em&gt;payload.InputRoot.contact.address.country&lt;/em&gt;&lt;/strong&gt; . Below is the dataweave file for the transformation transforming the data to a different XML format.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DATAWEAVE&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/xml
---
OutputRoot:{
Contact:{
Name: payload.InputRoot.contact.firstName ++ payload.InputRoot.contact.lastName,
Address :{
Street: payload.InputRoot.contact.address.street1 ++ payload.InputRoot.contact.address.street2 ,
City: payload.InputRoot.contact.address.city,
State:payload.InputRoot.contact.address.state
}
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;OutputRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Contact&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Name&amp;gt;&lt;/span&gt;TestData&lt;span class="nt"&gt;&amp;lt;/Name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Address&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Street&amp;gt;&lt;/span&gt;Street1Street2&lt;span class="nt"&gt;&amp;lt;/Street&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;City&amp;gt;&lt;/span&gt;City&lt;span class="nt"&gt;&amp;lt;/City&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;State&amp;gt;&lt;/span&gt;State&lt;span class="nt"&gt;&amp;lt;/State&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/Address&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/Contact&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/OutputRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Above is the output for the dataweave file.&lt;/p&gt;
&lt;h2 id="2-transforming-xml-messages-with-namespaces"&gt;2. Transforming XML messages with namespaces. &lt;a href="#2-transforming-xml-messages-with-namespaces" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Namespaces are really important for various systems to understand the element and its data. As the same element name with a different namespace corresponds to 2 different meanings. For example element &lt;strong&gt;name&lt;/strong&gt; in an XML message with a namespace corresponding to the account namespace, is different from the element name corresponding to the &lt;strong&gt;contact&lt;/strong&gt; namespace. So the business meaning of an element differs and so does the representation. An element belonging to a particular namespace will have a target namespace denoted by &lt;strong&gt;xmlns&lt;/strong&gt; attribute. In some cases, namespaces are declared as attributes of elements and are referenced as prefixes like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;acc:name&lt;/span&gt; &lt;span class="na"&gt;xmlns:acc=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://deciphermiddleware.in/ns/account&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;cont:name&lt;/span&gt; &lt;span class="na"&gt;xmlns:cont=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;****http://deciphermiddleware.in/ns/contact&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s take the below example:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;INPUT:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;InputRoot&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://deciphermiddleware.in/ns/sample/data&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cont:contact&lt;/span&gt; &lt;span class="na"&gt;xmlns:cont=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://deciphermiddleware.in/ns/sample/contact&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cont:firstName&amp;gt;&lt;/span&gt;Test&lt;span class="nt"&gt;&amp;lt;/cont:firstName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cont:lastName&amp;gt;&lt;/span&gt;Data&lt;span class="nt"&gt;&amp;lt;/cont:lastName&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cont:address&lt;/span&gt; &lt;span class="na"&gt;xmlns:add=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://deciphermiddleware.in/ns/sample/address&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add:street1&amp;gt;&lt;/span&gt;Street1&lt;span class="nt"&gt;&amp;lt;/add:street1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add:street2&amp;gt;&lt;/span&gt;Street2&lt;span class="nt"&gt;&amp;lt;/add:street2&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add:city&amp;gt;&lt;/span&gt;City&lt;span class="nt"&gt;&amp;lt;/add:city&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add:state&amp;gt;&lt;/span&gt;State&lt;span class="nt"&gt;&amp;lt;/add:state&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add:country&amp;gt;&lt;/span&gt;Country&lt;span class="nt"&gt;&amp;lt;/add:country&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/cont:address&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/cont:contact&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/InputRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, in the above case, we have multiple namespaces. To deal with such scenarios we need to declare namespaces in the Dataweave file.&lt;/p&gt;
&lt;p&gt;We can declare the namespace in the following way.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/xml
ns ns0 http://deciphermiddleware.in/ns/sample/data
ns cont http://deciphermiddleware.in/ns/sample/contact
ns add http://deciphermiddleware.in/ns/sample/address
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In dataweave, an element with namespace will be denoted by &lt;strong&gt;ns# Element&lt;/strong&gt; (&lt;strong&gt;ns&lt;/strong&gt; denotes namespace prefix as declared, &lt;strong&gt;Element&lt;/strong&gt; is the name of node or element of XML and, &lt;strong&gt;#&lt;/strong&gt; acts as separator)&lt;/p&gt;
&lt;p&gt;Suppose we need to extract data of the country, now dataweave expression for the same will be &amp;ldquo;&lt;strong&gt;&lt;em&gt;payload.ns0#InputRoot.cont#contact.cont#address.add#country&lt;/em&gt;&lt;/strong&gt; &amp;quot;&lt;/p&gt;
&lt;p&gt;Combining the above parameters, below is a sample dataweave file that will output the XML message generated from the above sample input XML, having different namespaces.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DATAWEAVE:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/xml
ns ns0 http://deciphermiddleware.in/ns/sample/data
ns cont http://deciphermiddleware.in/ns/sample/contact
ns add http://deciphermiddleware.in/ns/sample/address
ns ns1 http://deciphermiddleware.in/ns/sample/data1
ns cont1 http://deciphermiddleware.in/ns/sample/contact1
ns add1 http://deciphermiddleware.in/ns/sample/address1
---
ns1#OutputRoot:{
cont1#Contact:{
cont1#Name: payload.ns0#InputRoot.cont#contact.cont#firstName ++ payload.ns0#InputRoot.cont#contact.cont#lastName,
add1#Address :{
add1#Street: payload.ns0#InputRoot.cont#contact.cont#address.add#street1 ++ payload.ns0#InputRoot.cont#contact.cont#address.add#street2 ,
add1#City: payload.ns0#InputRoot.cont#contact.cont#address.add#city,
add1#State:payload.ns0#InputRoot.cont#contact.cont#address.add#state,
add1#Country:payload.ns0#InputRoot.cont#contact.cont#address.add#country
}
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Below is the output for the above dataweave.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OUTPUT:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;ns1:OutputRoot&lt;/span&gt; &lt;span class="na"&gt;xmlns:ns1=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://deciphermiddleware.in/ns/sample/data1&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cont1:Contact&lt;/span&gt; &lt;span class="na"&gt;xmlns:cont1=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://deciphermiddleware.in/ns/sample/contact1&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;cont1:Name&amp;gt;&lt;/span&gt;TestData&lt;span class="nt"&gt;&amp;lt;/cont1:Name&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add1:Address&lt;/span&gt; &lt;span class="na"&gt;xmlns:add1=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;http://deciphermiddleware.in/ns/sample/address1&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add1:Street&amp;gt;&lt;/span&gt;Street1Street2&lt;span class="nt"&gt;&amp;lt;/add1:Street&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add1:City&amp;gt;&lt;/span&gt;City&lt;span class="nt"&gt;&amp;lt;/add1:City&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add1:State&amp;gt;&lt;/span&gt;State&lt;span class="nt"&gt;&amp;lt;/add1:State&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;add1:Country&amp;gt;&lt;/span&gt;Country&lt;span class="nt"&gt;&amp;lt;/add1:Country&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/add1:Address&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/cont1:Contact&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/ns1:OutputRoot&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references"&gt;References: &lt;a href="#references" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href="https://docs.mulesoft.com/dataweave/2.3/dataweave-cookbook-include-xml-namespaces"&gt;https://docs.mulesoft.com/dataweave/2.3/dataweave-cookbook-include-xml-namespaces&lt;/a&gt;&lt;a href="https://docs.mulesoft.com/dataweave/2.3/dataweave-cookbook-include-xml-namespaces"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item><item><title>Tips and tricks to handle dateTime formats in Mule 4</title><link>https://blog.deciphermiddleware.in/posts/tips-and-tricks-to-handle-datetime/</link><pubDate>Sun, 12 Dec 2021 17:17:00 +0000</pubDate><guid>https://blog.deciphermiddleware.in/posts/tips-and-tricks-to-handle-datetime/</guid><description>&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOqRM05QNLd-r4LoUJExyBw-0OKplrdEfChQWiqfLzkdwYIbJSFUbYetD_blClKT_IXz1-9xj8uDyAYiPcHqhFQvamQPkfMJjdiNFr0Ke6wTvsbDTrNo-WPfA-M2th_hR3t2IzT4y-srw/"&gt;&lt;img src="https://blog.deciphermiddleware.in/images/blogger/9bb41644ca.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We generally come across various scenarios while developing integrations, wherein we have to deal with multiple formats of date, time, or DateTime. Sometimes source systems can send date data in only one format which may or may not be accepted by target systems, which we have to handle using dataweave expressions. In this blog, we will be going through a couple of generic scenarios which we come across frequently. For example, if we use &lt;strong&gt;now()&lt;/strong&gt; in dataweave, we get an output as below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DataWeave expression:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
---
now()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;2021-12-12T14:27:48.064709Z&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The above output is in the format of DateTime, and from this, it is easy to convert or extract and date or time values.&lt;/p&gt;
&lt;h2 id="scenario-1"&gt;Scenario #1 &lt;a href="#scenario-1" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;What if we get date time in some different format, for e.g. &amp;ldquo;&lt;strong&gt;2021/12/12 14.27.48&lt;/strong&gt; &amp;quot; and we just need to extract date and time in a different format as &amp;ldquo;&lt;strong&gt;12-12-2021 14:27:48&lt;/strong&gt; &amp;ldquo;. The best way is to cast the input date string to &lt;strong&gt;LocalDateTime&lt;/strong&gt; by providing format and then convert to the &lt;strong&gt;string&lt;/strong&gt; by providing the desired format.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DataWeave expression:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
---
&amp;#34;2021/12/12 14.27.48&amp;#34; as LocalDateTime {format:&amp;#34;yyyy/MM/dd HH.mm.ss&amp;#34;} as String {format:&amp;#34;dd-MM-yyyy HH:mm:ss&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;12-12-2021 14:27:48&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="scenario-2"&gt;Scenario #2 &lt;a href="#scenario-2" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Sometimes, we have to insert dateTime to databases like SQL Server, Oracle database, etc. The generally accepted format for the database date column through Mule4 is &amp;ldquo;&lt;strong&gt;yyyy-MM-dd HH:mm:ss&lt;/strong&gt; &amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DataWeave expression:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
---
now() as String {format:&amp;#34;yyyy-MM-dd HH:mm:ss&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;2021-12-12 14:27:48&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="scenario-3"&gt;Scenario #3 &lt;a href="#scenario-3" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;What if we want to extract year and append Y in the end to output for example &amp;ldquo;2021Y&amp;rdquo;. If we use the format as &amp;ldquo;yyyyY&amp;rdquo; or &amp;ldquo;yY&amp;rdquo;, the output will come as a year repeated 2 times. The reason is y or Y is formatting character. If we want explicit Y to be displayed, one way could be to extract Year and then concatenate year with Y. Another way is to escape the formatting character by enclosing it in &amp;lsquo;&amp;rsquo;. For example:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DataWeave expression:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dw" data-lang="dw"&gt;%dw 2.0
output application/json
---
now() as String {format:&amp;#34;yyyy&amp;#39;Y&amp;#39;&amp;#34;}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;#34;2021Y&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tabular representation of various formatting characters that can be used.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DateTime:&lt;/strong&gt; &amp;ldquo;2021-08-09T15:37:29.519633+05:30&amp;rdquo;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Character(s)&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;y&lt;/td&gt;
&lt;td&gt;Year of the era (BCE or CE) or calendar year&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yy&lt;/td&gt;
&lt;td&gt;Calendar Year limit to 2 digits&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Y&lt;/td&gt;
&lt;td&gt;Week based year&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YY&lt;/td&gt;
&lt;td&gt;Week based year limit to 2 digits&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;u&lt;/td&gt;
&lt;td&gt;Calendar Year without era (BCE or CE)&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uu&lt;/td&gt;
&lt;td&gt;Calendar Year limit to 2 digits&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;The month with no leading 0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MM&lt;/td&gt;
&lt;td&gt;The month with leading 0&lt;/td&gt;
&lt;td&gt;08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMM&lt;/td&gt;
&lt;td&gt;Month name with 3 characters&lt;/td&gt;
&lt;td&gt;Aug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMMM&lt;/td&gt;
&lt;td&gt;Complete Month name&lt;/td&gt;
&lt;td&gt;August&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;d&lt;/td&gt;
&lt;td&gt;Day of the Month&lt;/td&gt;
&lt;td&gt;09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Day of the Year&lt;/td&gt;
&lt;td&gt;221&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;Abbreviated day of the Week&lt;/td&gt;
&lt;td&gt;Mon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EEEE&lt;/td&gt;
&lt;td&gt;Day of the Week&lt;/td&gt;
&lt;td&gt;Monday&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;h&lt;/td&gt;
&lt;td&gt;An hour in 12 hour clock (1-12)&lt;/td&gt;
&lt;td&gt;03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H&lt;/td&gt;
&lt;td&gt;An hour in 24 hour clock (0-23)&lt;/td&gt;
&lt;td&gt;03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m&lt;/td&gt;
&lt;td&gt;Minute of the hour&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;s&lt;/td&gt;
&lt;td&gt;Second of the Minute&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Fraction of the second&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;AM/PM&lt;/td&gt;
&lt;td&gt;PM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Z&lt;/td&gt;
&lt;td&gt;Timezone Offset&lt;/td&gt;
&lt;td&gt;+0530&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZZZZ&lt;/td&gt;
&lt;td&gt;Timezone Offset&lt;/td&gt;
&lt;td&gt;GMT+05:30&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="references"&gt;References: &lt;a href="#references" class="anchor"&gt;🔗&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://docs.mulesoft.com/dataweave/2.3/dataweave-cookbook-format-dates"&gt;https://docs.mulesoft.com/dataweave/2.3/dataweave-cookbook-format-dates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please share your valuable feedback 😊😊😊&lt;/p&gt;</description></item></channel></rss>