Class: FlowCore::Transition
- Inherits:
-
ApplicationRecord
- Object
- ActiveRecord::Base
- ApplicationRecord
- FlowCore::Transition
- Defined in:
- app/models/flow_core/transition.rb
Constant Summary collapse
- FORBIDDEN_ATTRIBUTES =
%i[workflow_id created_at updated_at].freeze
Instance Method Summary collapse
- #can_destroy? ⇒ Boolean
- #create_task_if_needed(token:) ⇒ Object
- #create_tokens_for_output(task:) ⇒ Object
- #input_and_join? ⇒ Boolean
- #input_sequence? ⇒ Boolean
- #on_task_enable(task) ⇒ Object
- #on_task_errored(task, error) ⇒ Object
- #on_task_finish(task) ⇒ Object
- #on_task_rescue(task) ⇒ Object
- #on_task_resume(task) ⇒ Object
- #on_task_suspend(task) ⇒ Object
- #on_task_terminate(task) ⇒ Object
- #output_and_split? ⇒ Boolean
- #output_explicit_or_split? ⇒ Boolean
- #output_sequence? ⇒ Boolean
- #verify(violations:) ⇒ Object
Instance Method Details
#can_destroy? ⇒ Boolean
124 125 126 |
# File 'app/models/flow_core/transition.rb', line 124 def can_destroy? workflow.instances.empty? end |
#create_task_if_needed(token:) ⇒ Object
50 51 52 53 54 55 56 57 58 |
# File 'app/models/flow_core/transition.rb', line 50 def create_task_if_needed(token:) instance = token.instance candidate_tasks = instance.tasks.created.where(transition: self) # TODO: Is it possible that a input place has more than one free tokens? if YES we should handle it if candidate_tasks.empty? token.instance.tasks.create! transition: self, created_by_token: token end end |
#create_tokens_for_output(task:) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'app/models/flow_core/transition.rb', line 60 def create_tokens_for_output(task:) instance = task.instance arcs = output_arcs.includes(:place, :guards).to_a end_arc = arcs.find { |arc| arc.place.is_a? EndPlace } if end_arc if end_arc.guards.empty? || end_arc.guards.map { |guard| guard.permit? task }.reduce(&:&) instance.tokens.create! created_by_task: task, place: end_arc.place return end arcs.delete(end_arc) end candidate_arcs = arcs.select do |arc| arc.guards.empty? || arc.guards.map { |guard| guard.permit? task }.reduce(&:&) end if candidate_arcs.empty? # TODO: find a better way on_task_errored task, FlowCore::NoNewTokenCreated.new return end candidate_arcs.each do |arc| instance.tokens.create! created_by_task: task, place: arc.place end end |
#input_and_join? ⇒ Boolean
34 35 36 |
# File 'app/models/flow_core/transition.rb', line 34 def input_and_join? input_arcs.size > 1 end |
#input_sequence? ⇒ Boolean
38 39 40 |
# File 'app/models/flow_core/transition.rb', line 38 def input_sequence? input_arcs.size == 1 end |
#on_task_enable(task) ⇒ Object
89 90 91 92 |
# File 'app/models/flow_core/transition.rb', line 89 def on_task_enable(task) trigger&.on_task_enable(task) callbacks.each { |callback| callback.call task } end |
#on_task_errored(task, error) ⇒ Object
104 105 106 107 |
# File 'app/models/flow_core/transition.rb', line 104 def on_task_errored(task, error) trigger&.on_task_errored(task, error) callbacks.each { |callback| callback.call task, error } end |
#on_task_finish(task) ⇒ Object
94 95 96 97 |
# File 'app/models/flow_core/transition.rb', line 94 def on_task_finish(task) trigger&.on_task_finish(task) callbacks.each { |callback| callback.call task } end |
#on_task_rescue(task) ⇒ Object
109 110 111 112 |
# File 'app/models/flow_core/transition.rb', line 109 def on_task_rescue(task) trigger&.on_task_rescue(task) callbacks.each { |callback| callback.call task } end |
#on_task_resume(task) ⇒ Object
119 120 121 122 |
# File 'app/models/flow_core/transition.rb', line 119 def on_task_resume(task) trigger&.on_task_resume(task) callbacks.each { |callback| callback.call task } end |
#on_task_suspend(task) ⇒ Object
114 115 116 117 |
# File 'app/models/flow_core/transition.rb', line 114 def on_task_suspend(task) trigger&.on_task_suspend(task) callbacks.each { |callback| callback.call task } end |
#on_task_terminate(task) ⇒ Object
99 100 101 102 |
# File 'app/models/flow_core/transition.rb', line 99 def on_task_terminate(task) trigger&.on_task_terminate(task) callbacks.each { |callback| callback.call task } end |
#output_and_split? ⇒ Boolean
26 27 28 |
# File 'app/models/flow_core/transition.rb', line 26 def output_and_split? output_arcs.includes(:guards).all? { |arc| arc.guards.empty? } end |
#output_explicit_or_split? ⇒ Boolean
30 31 32 |
# File 'app/models/flow_core/transition.rb', line 30 def output_explicit_or_split? output_arcs.includes(:guards).select { |arc| arc.guards.any? } < output_arcs.size end |
#output_sequence? ⇒ Boolean
42 43 44 |
# File 'app/models/flow_core/transition.rb', line 42 def output_sequence? output_arcs.size == 1 end |
#verify(violations:) ⇒ Object
46 47 48 |
# File 'app/models/flow_core/transition.rb', line 46 def verify(violations:) trigger&.on_verify(self, violations) end |