server/executionhandlers/rubyext/connection.rb in cpee-2.1.67 vs server/executionhandlers/rubyext/connection.rb in cpee-2.1.68

- old
+ new

@@ -34,23 +34,19 @@ controller.notify("state/change", :state => newstate) end # }}} def self::inform_syntax_error(arguments,err,code)# {{{ # TODO extract spot (code) where error happened for better error handling (ruby 3.1 only) # https://github.com/rails/rails/pull/45818/commits/3beb2aff3be712e44c34a588fbf35b79c0246ca5 - puts err.message - puts err.backtrace - controller = arguments[0] - mess = err.backtrace ? err.backtrace[0].gsub(/([\w -_]+):(\d+):in.*/,'\\1, Line \2: ') : '' - mess += err.message - controller.notify("description/error", :message => mess) + controller.notify("executionhandler/error", :message => err.backtrace[0].match(/(.*?), Line (\d+):\s(.*)/)[3] + err.message, :line => err.backtrace[0].match(/(.*?), Line (\d+):/)[2], :where => err.backtrace[0].match(/(.*?), Line (\d+):/)[1]) + #mess = err.backtrace ? err.backtrace[0].gsub(/([\w -_]+):(\d+):in.*/,'\\1, Line \2: ') : '' + #mess += err.message + #controller.notify("description/error", :message => err.message, :line => err.backtrace[0].match(/(.*?):(\d+):/)[2], :where => err.backtrace[0].match(/(.*?):(\d+):/)[1]) end# }}} def self::inform_connectionwrapper_error(arguments,err) # {{{ controller = arguments[0] - puts err.message - puts err.backtrace - controller.notify("executionhandler/error", :message => err.backtrace[0].gsub(/([\w -_]+):(\d+):in.*/,'\\1, Line \2: ') + err.message) + controller.notify("executionhandler/error", :message => err.backtrace[0].match(/(.*?), Line (\d+):\s(.*)/)[3] + err.message, :line => err.backtrace[0].match(/(.*?), Line (\d+):/)[2], :where => err.backtrace[0].match(/(.*?), Line (\d+):/)[1]) end # }}} def self::inform_position_change(arguments,ipc={}) # {{{ controller = arguments[0] controller.notify("position/change", ipc) end # }}} @@ -248,13 +244,11 @@ end # }}} def inform_activity_manipulate # {{{ @controller.notify("activity/manipulating", :'activity-uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position) end # }}} def inform_activity_failed(err) # {{{ - puts err.message - puts err.backtrace - @controller.notify("activity/failed", :'activity-uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :message => err.message, :line => err.backtrace[0].match(/(.*?):(\d+):/)[2], :where => err.backtrace[0].match(/(.*?):(\d+):/)[1]) + @controller.notify("activity/failed", :'activity-uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :message => err.backtrace[0].match(/(.*?):(\d+):\s(.*)/)[3], :line => err.backtrace[0].match(/(.*?):(\d+):/)[2], :where => err.backtrace[0].match(/(.*?):(\d+):/)[1]) end # }}} def inform_manipulate_change(status,changed_dataelements,changed_endpoints,dataelements,endpoints) # {{{ unless status.nil? @controller.notify("status/change", :'activity-uuid' => @handler_activity_uuid, :endpoint => @handler_endpoint, :label => @label, :activity => @handler_position, :id => status.id, :message => status.message) end @@ -324,13 +318,25 @@ true end GC.start end #}}} - def prepare(lock,dataelements,endpoints,status,local,additional,code,exec_endpoints,exec_parameters) + def code_error_handling(ret,where,what=RuntimeError) #{{{ + sig = ret.find{|e| e.name == "signal" }.value + sigt = ret.find{|e| e.name == "signal_text" }.value + case sig + when 'Signal::Again'; throw WEEL::Signal::Again + when 'Signal::Error'; raise what, '', [where + ' ' + sigt] + when 'Signal::Stop'; raise WEEL::Signal::Stop + when 'Signal::SyntaxError'; raise SyntaxError, '', [where + ' ' + sigt] + else + raise 'something bad happened, but we dont know what.' + end + end #}}} + def prepare(lock,dataelements,endpoints,status,local,additional,code,exec_endpoints,exec_parameters) #{{{ struct = if code - manipulate(true,lock,dataelements,endpoints,status,local,additional,code,'Parameter') + manipulate(true,lock,dataelements,endpoints,status,local,additional,code,'prepare') else WEEL::ReadStructure.new(dataelements,endpoints,local,additional) end @handler_endpoint = exec_endpoints.is_a?(Array) ? exec_endpoints.map{ |ep| struct.endpoints[ep] }.compact : struct.endpoints[exec_endpoints] if @controller.attributes['twin_engine'] @@ -351,11 +357,11 @@ status, ret, headers = Riddl::Client.new(@controller.url_code).request 'put' => send recv = if status >= 200 && status < 300 ret[0].value else - nil + code_error_handling ret, 'Parameter ' + t.value.code end t.value = recv end t end @@ -371,11 +377,11 @@ status, ret, headers = Riddl::Client.new(@controller.url_code).request 'put' => send recv = if status >= 200 && status < 300 ret[0].value else - nil + code_error_handling ret, 'Condition ' + code, WEEL::Signal::Error end recv = 'false' unless recv recv = (recv == 'false' || recv == 'null' || recv == 'nil' ? false : true) @controller.notify("gateway/decide", :instance_uuid => @controller.uuid, :code => code, :condition => recv) recv @@ -409,10 +415,10 @@ end struct.update(changed_dataelements,changed_endpoints,changed_status) struct else - nil + code_error_handling ret, where end end end #}}} def split_branches(branches) # factual, so for inclusive or [[a],[b],[c,d,e]]{{{