Class: FlowCore::Transition

Inherits:
ApplicationRecord show all
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

Instance Method Details

#can_destroy?Boolean

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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