Transform a Financial Message by Streaming
Following is an example dynamic logic to transform a financial message in a streaming way:
writer = outputWriters.getDataFileOutputWriter().xmlWriter() writer.writeStartElement("root") genFinMessOutput.dataFiles.each { df -> reader = fileReader.xmlReader(df) while (reader.hasNext() { finMess = reader.read('financialMessage') // this iterates the reader until the next 'financialMessage' object: No need to call reader.next() if (finMess != null) { log.debug('financialMessage found with id ' + finMess.@id.text()) transform(finMess, writer) } } writer.writeEndElement() // root
Here, the transform(finMess, writer) method is used to read the data from the financial message, and write it to another datafile. An example of this method, which reads some attributes:
transform(finMess, writer) { writer.writeStartElement("messageID") writer.writeCharacters(finMess.@id.text()) writer.writeEndElement() writer.writeStartElement("sourceSystemSourceID") writer.writeCharacters(finMess.invoices.invoice[0].@attribute1.text()) writer.writeEndElement() finMess.invoices.invoice.invoiceLines.invoiceLine.each { invoiceLine -> writer.writeStartElement("premiumRateList") def tempRoot = new XmlSlurper().parseText(invoiceLine.@attribute1.text()) tempRoot.premiumRateList.each { premiumRateList -> writer.writeStartElement("premiumRate") writer.writeStartElement("policyNumber") writer.writeCharacters(premiumRateList.policyNumber.text()) writer.writeEndElement() // policyNumber writer.writeStartElement("premiumAmount") def roundedPremiumAmount = new BigDecimal(premiumRateList.premiumAmount.text()) writer.writeCharacters(roundedPremiumAmount.toString()) writer.writeEndElement() // premiumAmount writer.writeEndElement() // premiumRate } writer.writeEndElement() // premiumRateList } }