In my case, I tried to convert the below Mule Expression Language (MEL) script to DataWeave 2.0.
MEL script on Mule 3:
import java.util.Iterator;
import org.dom4j.*;
import java.util.logging.Logger;
import java.util.*;
faultstring = xpath3('/Envelope/Body/Fault/faultstring',payload).replaceFirst("rating failed:","");
faults = faultstring.split("rating failed:");
appNode = domPayload.selectSingleNode("/DTOApplication[1]");
for (fault : faults) {
appNode.addElement('ValidationError')
.addAttribute("TypeCd","Validation")
.addAttribute("Name","Rate Service Error")
.addAttribute("Msg","Rating Service Error (" + flowVars.ratingModule + "). Message: " + fault.trim())
.addAttribute("SubTypeCd","ERROR");
}
The logic is to append the fault message payload to the dompayload (it's nothing but an input request).
I was able to append the single child node for the returned fault message:
<?xml version="1.0" encoding="UTF-8"?>
<DTOApplication id="Application-1660258480-1493174910">
<ValidationError TypeCd="Validation" Name="Rate Service Error" Msg="Rate Service Error (TPCL)" Message=", Policy.Class='424490C' not in list , Policy.Industry='WHOL' not in list " SubTypeCd="ERROR"/>
</DTOApplication>
Expected output :
<?xml version="1.0" encoding="UTF-8"?>
<DTOApplication id="Application-1660258480-1493174910">
<ValidationError TypeCd="Validation" Name="Rate Service Error" Msg="Rating Service Error (TPCL). Message: Policy.Class='424490C' not in list" SubTypeCd="ERROR"/>
<ValidationError TypeCd="Validation" Name="Rate Service Error" Msg="Rating Service Error (TPCL). Message: Policy.Industry='WHOL' not in list" SubTypeCd="ERROR"/>
</DTOApplication>
I tried DataWeave 2.0 :
%dw 2.0
var errormessage = (vars.fault replace "rating failed:" with ", ")
var ratingModule= vars.faultPayload.Envelope.Body.Fault.faultstring
output application/xml writeDeclaration=false
---
payload mapObject ((value, key, index) ->
(key): value ++ {
ValidationError @(TypeCd: "Validation", Name:"Rate Service Error" ,Msg: "Rate Service Error (" ++ ratingModule ++ ")" , Message: errormessage, SubTypeCd: "ERROR"): null
}
)
Fault payload :
{Envelope={Body={rateResponse=null, Fault={faultcode=FcgiSvc.16.rateHASH.service.exception, faultstring=rating failed:Policy.Class='424490C' not in list rating failed:Policy.Industry='WHOL' not in list }}}}
I want to do something equivalent to for (fault : faults) in DataWeave 2.0.