11import ast
22import json
3+ import os
34import shlex
5+ import tempfile
46
57from flowable .external_worker_client import ExternalWorkerAcquireJobResponse , WorkerResultBuilder
68from flowable .robocorp_client .call_robocorp import call_robocorp
@@ -18,6 +20,18 @@ def extract_action_and_parameters(job):
1820 return action , params
1921
2022
23+ def extract_action_and_parameters_map (job ):
24+ action = None
25+ params = {}
26+ for variable in job .variables :
27+ if variable .name == '__robocorpTaskName' :
28+ action = variable .value
29+ else :
30+ if variable .value is not None :
31+ params [variable .name ] = variable .value
32+ return action , params
33+
34+
2135def extract_result (results ):
2236 result_item = None
2337 lines = results .strip ().splitlines ()
@@ -35,8 +49,7 @@ def create_output_dir(job):
3549 return 'output/' + job .id + '-' + (job .scope_id or job .process_instance_id ) + '-' + job .element_id
3650
3751
38- def add_variables_to_result (work_result , result ):
39- json_result = ast .literal_eval (result )
52+ def add_variables_to_result (work_result , json_result ):
4053
4154 if isinstance (json_result , dict ):
4255 for key in json_result :
@@ -78,7 +91,8 @@ def handle_task(self, job: ExternalWorkerAcquireJobResponse, worker_result_build
7891 result = extract_result (results .stdout )
7992 print ('---> Job execution done for "' + job .id + '" with result ' + result + '". Output saved to ' + output_dir , robocorp_args )
8093 work_result = worker_result_builder .success ()
81- return add_variables_to_result (work_result , result )
94+ json_result = ast .literal_eval (result )
95+ return add_variables_to_result (work_result , json_result )
8296
8397
8498class RobocorpTaskHandler :
@@ -100,3 +114,38 @@ def handle_task(self, job: ExternalWorkerAcquireJobResponse, worker_result_build
100114 return worker_result_builder .failure ().error_message ('failed with status code ' + str (results .returncode )).error_details (results .stderr + results .stdout )
101115 print ('---> Job execution done for "' + job .id + '". Output saved to ' + output_dir , robocorp_args )
102116 return worker_result_builder .success ()
117+
118+
119+ class RobocorpRobotHandler :
120+ def __init__ (self , robocorp_action_file : str ):
121+ self .robocorp_action_file = robocorp_action_file
122+
123+ def handle_task (self , job : ExternalWorkerAcquireJobResponse , worker_result_builder : WorkerResultBuilder ):
124+ action , params = extract_action_and_parameters_map (job )
125+ if action is None :
126+ return worker_result_builder .failure ().error_message ('failed to find robocorp action name' )
127+
128+ output_dir = create_output_dir (job )
129+ robocorp_args = ['--rpa' , '--name' , action .__str__ (), '--report' , 'NONE' , '--outputdir' , output_dir , self .robocorp_action_file ]
130+ print ('---> Execute job "' + job .id + '"' , robocorp_args )
131+ tmp = tempfile .NamedTemporaryFile (delete = False )
132+ tmp .close ()
133+ new_env = os .environ .copy ()
134+ new_env ["FLOWABLE_INPUT_VARIABLES" ] = json .dumps (params )
135+ new_env ["FLOWABLE_OUTPUT_FILE" ] = tmp .name
136+ results = call_robocorp (robocorp_args , mod_name = 'robot' , env = new_env )
137+
138+ if results .returncode != 0 :
139+ print ('---> Job execution failed for "' + job .id + '". Output saved to ' + output_dir )
140+ os .unlink (tmp .name )
141+ return worker_result_builder .failure ().error_message ('failed with status code ' + str (results .returncode )).error_details (results .stderr + results .stdout )
142+ print ('---> Job execution done for "' + job .id + '". Output saved to ' + output_dir , robocorp_args )
143+
144+ with open (tmp .name , 'r' ) as content_file :
145+ content = json .loads (content_file .read ())
146+ os .unlink (tmp .name )
147+
148+ if content is None :
149+ return worker_result_builder .success ()
150+ else :
151+ return add_variables_to_result (worker_result_builder .success (), content )
0 commit comments