How to convert Python script to JVM in snaplogic

258 Views Asked by At

The below-mentioned code is working fine but I want to integrate the below-mentioned python script to JVM script to run in SnapLogic tool. Any leads will be very helpful.

import os
import sys

def execute():

    file=open("C:/Python27/snaplogic_file.txt","r")
    header=next(file)
    new_file1=open("C:/Python27/snaplogic_processed_file1.txt",mode='w+')
    new_file1.write(header)
    new_file1.close()
    for line in file:
       new_file=open("C:/Python27/snaplogic_processed_file.txt",mode='w+')
       new_file.write(line)


execute()   
1

There are 1 best solutions below

0
On BEST ANSWER

When you select Python in the Script snap it actually means Jython. So, you can, basically, import Java classes in your script.

Following is an implementation where I'm writing a dummy file in the /tmp folder of one of the nodes.

# Import the interface required by the Script snap.
from com.snaplogic.scripting.language import ScriptHook
import java.util
import com.fasterxml.jackson.databind
import java.io

class TransformScript(ScriptHook):
    def __init__(self, input, output, error, log):
        self.input = input
        self.output = output
        self.error = error
        self.log = log

    # The "execute()" method is called once when the pipeline is started
    # and allowed to process its inputs or just send data to its outputs.
    def execute(self):
        self.log.info("Executing Transform script")
        while self.input.hasNext():
            try:
                # Read the next document, wrap it in a map and write out the wrapper
                in_doc = self.input.next()
                wrapper = java.util.HashMap()

                om = com.fasterxml.jackson.databind.ObjectMapper()
                target_file = java.io.File("/tmp/" + in_doc['filename'])
                om.writeValue(target_file, in_doc['content']);

                wrapper['original'] = in_doc
                wrapper['status'] = "success"

                self.output.write(in_doc, wrapper)
            except Exception as e:
                errWrapper = {
                    'errMsg' : str(e.args)
                }
                self.log.error("Error in python script")
                self.error.write(errWrapper)

        self.log.info("Finished executing the Transform script")

# The Script Snap will look for a ScriptHook object in the "hook"
# variable.  The snap will then call the hook's "execute" method.
hook = TransformScript(input, output, error, log)

Following is the input JSON to the Script snap.

[{"filename":"write_test.txt","content":{"id":123,"message":"xyz","valid":true}}]

Check the file in the node.

$ cd /tmp
$ cat write_test.txt
[{"filename":"write_test.txt","content":{"id":123,"message":"xyz","valid":true}}]

Note: I use Jackson's ObjectMapper because I mostly deal with JSONs.