Archives of Support Questions (Read Only)

This is an archived board for historical reference. Information and links may no longer be available or relevant
Announcements
This board is archived and read-only for historical reference. To ask a new question, please post a new topic on the appropriate active board.

JavaScript in ExecuteScript in Nifi

avatar

I am trying to write and execute a Java script in Nifi. Below is all I have defined in the body of Execute script processor. token_value is an attribute and the value for it is - { "Tokens": [ "12345acdb4567", "98765acdb1111" ] }

Flow File Content is - { "customer-accounts": [ { "company_identifier": "074", "product_code": "CCD", "account_number": "222222222222", "relationship_code": "JOF", "primary_ownership_indicator": "Y" }, { "company_identifier": "674", "product_code": "CCD", "account_number": "111111111111", "relationship_code": "EOD", "primary_ownership_indicator": "N" } ] }

Script I am using is as below. I am not familiar with JavaScript. Trying to get this to work.

ScriptBody :

var flowFile = session.get() ;

if (flowFile != null) { var TokenAttr = flowFile.getAttribute('token_value') ; }

function convert(flowFile, TokenAttr)

{ let accounts = flowFile['customer-accounts']; let convertedAccounts = accounts.map((account, index) => { account['account_number'] = TokenAttr.Tokens[index]; return account; }); return { 'customer-accounts' : convertedAccounts } }

flowFile = session.write(flowFile,console.log(JSON.stringify(convert(flowFile,TokenAttr))))

session.transfer(flowFile, REL_SUCCESS)

your help will be appreciated. Thanks in advance.

1 ACCEPTED SOLUTION

avatar

I am able to resolve this.

var flowFile = session.get(); if (flowFile != null) { var StreamCallback = Java.type("org.apache.nifi.processor.io.StreamCallback") var IOUtils = Java.type("org.apache.commons.io.IOUtils") var StandardCharsets = Java.type("java.nio.charset.StandardCharsets") var JString = Java.type("java.lang.String") var TokenAttr = flowFile.getAttribute('token_value') var JsonTokenAttr = JSON.parse(TokenAttr) ; flowFile = session.write(flowFile, new StreamCallback(function(inputStream, outputStream) { var text = IOUtils.toString(inputStream, StandardCharsets.UTF_8) var obj = JSON.parse(text) var accounts = obj['customer-accounts']; var convertedAccounts = accounts.map(function(account, index) { account['account_number'] = JsonTokenAttr.Tokens[index];return account; }); var newObj = {'customer-accounts' : convertedAccounts } var builder = new JString() outputStream.write(JSON.stringify(newObj, null, '\t').getBytes(StandardCharsets.UTF_8)) })) session.transfer(flowFile, REL_SUCCESS) }

View solution in original post

1 REPLY 1

avatar

I am able to resolve this.

var flowFile = session.get(); if (flowFile != null) { var StreamCallback = Java.type("org.apache.nifi.processor.io.StreamCallback") var IOUtils = Java.type("org.apache.commons.io.IOUtils") var StandardCharsets = Java.type("java.nio.charset.StandardCharsets") var JString = Java.type("java.lang.String") var TokenAttr = flowFile.getAttribute('token_value') var JsonTokenAttr = JSON.parse(TokenAttr) ; flowFile = session.write(flowFile, new StreamCallback(function(inputStream, outputStream) { var text = IOUtils.toString(inputStream, StandardCharsets.UTF_8) var obj = JSON.parse(text) var accounts = obj['customer-accounts']; var convertedAccounts = accounts.map(function(account, index) { account['account_number'] = JsonTokenAttr.Tokens[index];return account; }); var newObj = {'customer-accounts' : convertedAccounts } var builder = new JString() outputStream.write(JSON.stringify(newObj, null, '\t').getBytes(StandardCharsets.UTF_8)) })) session.transfer(flowFile, REL_SUCCESS) }