135 lines
4.2 KiB
Python
Raw Normal View History

# -*- coding: utf-8 -*-
from SpiffWorkflow.specs.ExclusiveChoice import ExclusiveChoice
from SpiffWorkflow.specs.Join import Join
from SpiffWorkflow.specs.MultiChoice import MultiChoice
from SpiffWorkflow.specs.MultiInstance import MultiInstance
from SpiffWorkflow.specs.Simple import Simple
from SpiffWorkflow.specs.WorkflowSpec import WorkflowSpec
from SpiffWorkflow.operators import Attrib, Equal, NotEqual
class TestWorkflowSpec(WorkflowSpec):
def __init__(self):
WorkflowSpec.__init__(self)
# Build one branch.
a1 = Simple(self, 'task_a1')
self.start.connect(a1)
a2 = Simple(self, 'task_a2')
a1.connect(a2)
# Build another branch.
b1 = Simple(self, 'task_b1')
self.start.connect(b1)
b2 = Simple(self, 'task_b2')
b1.connect(b2)
# Merge both branches (synchronized).
synch_1 = Join(self, 'synch_1')
a2.connect(synch_1)
b2.connect(synch_1)
# If-condition that does not match.
excl_choice_1 = ExclusiveChoice(self, 'excl_choice_1')
synch_1.connect(excl_choice_1)
c1 = Simple(self, 'task_c1')
excl_choice_1.connect(c1)
c2 = Simple(self, 'task_c2')
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute2'))
excl_choice_1.connect_if(cond, c2)
c3 = Simple(self, 'task_c3')
excl_choice_1.connect_if(cond, c3)
# If-condition that matches.
excl_choice_2 = ExclusiveChoice(self, 'excl_choice_2')
c1.connect(excl_choice_2)
c2.connect(excl_choice_2)
c3.connect(excl_choice_2)
d1 = Simple(self, 'task_d1')
excl_choice_2.connect(d1)
d2 = Simple(self, 'task_d2')
excl_choice_2.connect_if(cond, d2)
d3 = Simple(self, 'task_d3')
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute1'))
excl_choice_2.connect_if(cond, d3)
# If-condition that does not match.
multichoice = MultiChoice(self, 'multi_choice_1')
d1.connect(multichoice)
d2.connect(multichoice)
d3.connect(multichoice)
e1 = Simple(self, 'task_e1')
multichoice.connect_if(cond, e1)
e2 = Simple(self, 'task_e2')
cond = Equal(Attrib('test_attribute1'), Attrib('test_attribute2'))
multichoice.connect_if(cond, e2)
e3 = Simple(self, 'task_e3')
cond = Equal(Attrib('test_attribute2'), Attrib('test_attribute2'))
multichoice.connect_if(cond, e3)
# StructuredSynchronizingMerge
syncmerge = Join(self, 'struct_synch_merge_1', 'multi_choice_1')
e1.connect(syncmerge)
e2.connect(syncmerge)
e3.connect(syncmerge)
# Implicit parallel split.
f1 = Simple(self, 'task_f1')
syncmerge.connect(f1)
f2 = Simple(self, 'task_f2')
syncmerge.connect(f2)
f3 = Simple(self, 'task_f3')
syncmerge.connect(f3)
# Discriminator
discrim_1 = Join(self,
'struct_discriminator_1',
'struct_synch_merge_1',
threshold=1)
f1.connect(discrim_1)
f2.connect(discrim_1)
f3.connect(discrim_1)
# Loop back to the first exclusive choice.
excl_choice_3 = ExclusiveChoice(self, 'excl_choice_3')
discrim_1.connect(excl_choice_3)
cond = NotEqual(Attrib('excl_choice_3_reached'), Attrib('two'))
excl_choice_3.connect_if(cond, excl_choice_1)
# Split into 3 branches, and implicitly split twice in addition.
multi_instance_1 = MultiInstance(self, 'multi_instance_1', times=3)
excl_choice_3.connect(multi_instance_1)
# Parallel tasks.
g1 = Simple(self, 'task_g1')
g2 = Simple(self, 'task_g2')
multi_instance_1.connect(g1)
multi_instance_1.connect(g2)
# StructuredSynchronizingMerge
syncmerge2 = Join(self, 'struct_synch_merge_2', 'multi_instance_1')
g1.connect(syncmerge2)
g2.connect(syncmerge2)
# Add a final task.
last = Simple(self, 'last')
syncmerge2.connect(last)
# Add another final task :-).
end = Simple(self, 'End')
last.connect(end)