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_output_tokens_for(task) ⇒ Object
- #create_task_if_needed(token:) ⇒ 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
147 148 149 |
# File 'app/models/flow_core/transition.rb', line 147 def can_destroy? workflow.instances.empty? end |
#create_output_tokens_for(task) ⇒ Object
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'app/models/flow_core/transition.rb', line 77 def create_output_tokens_for(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 unless end_arc.fallback_arc? arcs.delete(end_arc) end end candidate_arcs = case output_token_create_strategy when "match_one_or_fallback" find_output_arcs_with_match_one_or_fallback_strategy(arcs, task) else find_output_arcs_with_petri_net_strategy(arcs, task) 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 |
#create_task_if_needed(token:) ⇒ Object
67 68 69 70 71 72 73 74 75 |
# File 'app/models/flow_core/transition.rb', line 67 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 |
#input_and_join? ⇒ Boolean
51 52 53 |
# File 'app/models/flow_core/transition.rb', line 51 def input_and_join? input_arcs.size > 1 end |
#input_sequence? ⇒ Boolean
55 56 57 |
# File 'app/models/flow_core/transition.rb', line 55 def input_sequence? input_arcs.size == 1 end |
#on_task_enable(task) ⇒ Object
112 113 114 115 |
# File 'app/models/flow_core/transition.rb', line 112 def on_task_enable(task) trigger&.on_task_enable(task) callbacks.each { |callback| callback.call task } end |
#on_task_errored(task, error) ⇒ Object
127 128 129 130 |
# File 'app/models/flow_core/transition.rb', line 127 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
117 118 119 120 |
# File 'app/models/flow_core/transition.rb', line 117 def on_task_finish(task) trigger&.on_task_finish(task) callbacks.each { |callback| callback.call task } end |
#on_task_rescue(task) ⇒ Object
132 133 134 135 |
# File 'app/models/flow_core/transition.rb', line 132 def on_task_rescue(task) trigger&.on_task_rescue(task) callbacks.each { |callback| callback.call task } end |
#on_task_resume(task) ⇒ Object
142 143 144 145 |
# File 'app/models/flow_core/transition.rb', line 142 def on_task_resume(task) trigger&.on_task_resume(task) callbacks.each { |callback| callback.call task } end |
#on_task_suspend(task) ⇒ Object
137 138 139 140 |
# File 'app/models/flow_core/transition.rb', line 137 def on_task_suspend(task) trigger&.on_task_suspend(task) callbacks.each { |callback| callback.call task } end |
#on_task_terminate(task) ⇒ Object
122 123 124 125 |
# File 'app/models/flow_core/transition.rb', line 122 def on_task_terminate(task) trigger&.on_task_terminate(task) callbacks.each { |callback| callback.call task } end |
#output_and_split? ⇒ Boolean
43 44 45 |
# File 'app/models/flow_core/transition.rb', line 43 def output_and_split? output_arcs.includes(:guards).all? { |arc| arc.guards.empty? } end |
#output_explicit_or_split? ⇒ Boolean
47 48 49 |
# File 'app/models/flow_core/transition.rb', line 47 def output_explicit_or_split? output_arcs.includes(:guards).select { |arc| arc.guards.any? } < output_arcs.size end |
#output_sequence? ⇒ Boolean
59 60 61 |
# File 'app/models/flow_core/transition.rb', line 59 def output_sequence? output_arcs.size == 1 end |
#verify(violations:) ⇒ Object
63 64 65 |
# File 'app/models/flow_core/transition.rb', line 63 def verify(violations:) trigger&.on_verify(self, violations) end |