Class: Pione::RuleEngine::FlowHandler
- Inherits:
-
BasicHandler
- Object
- BasicHandler
- Pione::RuleEngine::FlowHandler
- Defined in:
- lib/pione/rule-engine/flow-handler.rb
Overview
FlowHandler is a rule handler for flow elements.
Direct Known Subclasses
Constant Summary
Constants included from Log::MessageLog
Log::MessageLog::MESSAGE_QUEUE
Instance Attribute Summary
Attributes inherited from BasicHandler
#base_location, #caller_id, #digest, #domain_id, #domain_location, #dry_run, #env, #inputs, #outputs, #package_id, #param_set, #plain_env, #rule_condition, #rule_definition, #rule_name
Instance Method Summary collapse
-
#copy_data_into_domain(data, domain) ⇒ DataTuple
Copy the data tuple with the specified domain and return the tuple list.
-
#execute ⇒ void
Start to process flow elements.
-
#lift_output_data(outputs) ⇒ void
Lift output data from this domains to parent domain.
-
#remove_data_from_domain(data, domain) ⇒ Object
Remove the data from the domain.
-
#remove_finished_tuple(domain) ⇒ void
Remove finished tuple.
-
#restore_data_tuples_from_domain_location ⇒ Object
Restore data tuples from the domain location.
- #touch_data_in_domain(data, domain) ⇒ Object
-
#validate_outputs(outputs) ⇒ Object
Validate outputs.
Methods inherited from BasicHandler
#apply_touch_operation, #create_data_by_touch_operation, #find_outputs_from_space, #handle, #initialize, #make_location, #make_output_location, #make_output_tuple, #make_rule_process_record, #make_task_process_record, #publish_outputs, #setup_env, #show_outputs, #update_time_by_touch_operation, #write_data_null
Methods included from Log::MessageLog
#debug_message, #debug_message_begin, #debug_message_end, debug_mode, debug_mode=, debug_mode?, message, quiet_mode, quiet_mode=, quiet_mode?, #show, #user_message, #user_message_begin, #user_message_end
Methods included from TupleSpace::TupleSpaceInterface
#process_log, #processing_error, #read!, #set_tuple_space, #take!, #take_all!, tuple_space_operation, #tuple_space_server, #with_process_log
Constructor Details
This class inherits a constructor from Pione::RuleEngine::BasicHandler
Instance Method Details
#copy_data_into_domain(data, domain) ⇒ DataTuple
Copy the data tuple with the specified domain and return the tuple list.
98 99 100 101 102 103 |
# File 'lib/pione/rule-engine/flow-handler.rb', line 98 def copy_data_into_domain(data, domain) return nil unless data new_data = data.clone.tap {|x| x.domain = domain} write(new_data) return new_data end |
#execute ⇒ void
This method returns an undefined value.
Start to process flow elements.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/pione/rule-engine/flow-handler.rb', line 8 def execute # restore data tuples from domain_location restore_data_tuples_from_domain_location # start rule application rule_set = @rule_definition.flow_context.eval(@env) RuleApplication.new(self).apply(rule_set.rules.pieces) # find outputs outputs = find_outputs_from_space # lift output data from child domains to this domain lift_output_data(outputs) # check output validation validate_outputs(outputs) return outputs end |
#lift_output_data(outputs) ⇒ void
This method returns an undefined value.
Lift output data from this domains to parent domain.
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/pione/rule-engine/flow-handler.rb', line 44 def lift_output_data(outputs) # we cannot lift up if caller id is unknown # NOTE: this is the case that we process root rule return if @caller_id.nil? outputs.flatten.compact.inject([]) do |lifted, output| old_location = output.location new_location = make_output_location(output.name) unless new_location == old_location or lifted.include?(old_location) if old_location.exist? # move data from old to new old_location.move(new_location) # sync cache if the old is cached in this machine System::FileCache.sync(old_location, new_location) # write lift tuple write(TupleSpace::LiftTuple.new(old_location, new_location)) # push history lifted << old_location end end lifted end end |
#remove_data_from_domain(data, domain) ⇒ Object
Remove the data from the domain.
106 107 108 |
# File 'lib/pione/rule-engine/flow-handler.rb', line 106 def remove_data_from_domain(data, domain) take!(TupleSpace::DataTuple.new(name: data.name, domain: domain)) end |
#remove_finished_tuple(domain) ⇒ void
This method returns an undefined value.
Remove finished tuple.
86 87 88 |
# File 'lib/pione/rule-engine/flow-handler.rb', line 86 def remove_finished_tuple(domain) take!(TupleSpace::FinishedTuple.new(domain: domain)) end |
#restore_data_tuples_from_domain_location ⇒ Object
Restore data tuples from the domain location. This reads files in the location and write it as data tuples.
30 31 32 33 34 35 36 37 38 39 |
# File 'lib/pione/rule-engine/flow-handler.rb', line 30 def restore_data_tuples_from_domain_location if @domain_location.exist? @domain_location.file_entries.each do |file| # ignore dot files unless file.basename[0] == "." write(TupleSpace::DataTuple.new(@domain_id, file.basename, file, file.mtime)) end end end end |
#touch_data_in_domain(data, domain) ⇒ Object
110 111 112 113 114 115 116 |
# File 'lib/pione/rule-engine/flow-handler.rb', line 110 def touch_data_in_domain(data, domain) if target = read!(TupleSpace::DataTuple.new(name: data.name, domain: domain)) data = target end new_data = data.clone.tap {|x| x.domain = domain; x.time = Time.now} write(new_data) end |
#validate_outputs(outputs) ⇒ Object
Validate outputs.
69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/pione/rule-engine/flow-handler.rb', line 69 def validate_outputs(outputs) _outputs = outputs.flatten.compact @rule_condition.outputs.each do |condition| _condition = condition.eval(@env) c1 = _condition.accept_nonexistence? c2 = _outputs.any?{|output| _condition.match?(output.name)} unless c1 or c2 raise InvalidOutputError.new(self, outputs) end end end |