Skip to content

Commit ac48a3c

Browse files
committed
add event subprocess
1 parent 8ad6a74 commit ac48a3c

14 files changed

Lines changed: 163 additions & 6 deletions

File tree

SpiffWorkflow/bpmn/parser/ProcessParser.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ def _parse(self):
191191
self.spec.start.outputs = [split_task]
192192
split_task.inputs = [self.spec.start]
193193

194+
for node in self.xpath("./bpmn:subProcess[@triggeredByEvent='true']"):
195+
task_spec = self.parse_node(node)
196+
sp_spec = self.parser.process_parsers[task_spec.spec].get_spec()
197+
self.spec.start.connect_or_add_trigger(task_spec, sp_spec)
198+
194199
def parse_data_object(self, obj):
195200
return self.create_data_spec(obj, DataObject)
196201

SpiffWorkflow/bpmn/parser/TaskParser.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
from SpiffWorkflow.bpmn.specs.defaults import (
2424
StandardLoopTask,
2525
SequentialMultiInstanceTask,
26-
ParallelMultiInstanceTask
26+
ParallelMultiInstanceTask,
27+
EventSubprocess,
2728
)
2829
from SpiffWorkflow.bpmn.specs.control import BoundaryEventSplit, BoundaryEventJoin
2930
from SpiffWorkflow.bpmn.specs.event_definitions.simple import CancelEventDefinition
@@ -47,6 +48,8 @@ class TaskParser(NodeParser):
4748
STANDARD_LOOP_CLASS = StandardLoopTask
4849
PARALLEL_MI_CLASS = ParallelMultiInstanceTask
4950
SEQUENTIAL_MI_CLASS = SequentialMultiInstanceTask
51+
# I have to add another attribute here. This parser is so stupid.
52+
EVENT_SUBPROCESS_CLASS = EventSubprocess
5053

5154
def __init__(self, process_parser, spec_class, node, nsmap=None, lane=None):
5255
"""

SpiffWorkflow/bpmn/parser/task_parsers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,11 @@ class SubWorkflowParser(TaskParser):
9494

9595
def create_task(self):
9696
subworkflow_spec = SubprocessParser.get_subprocess_spec(self)
97-
return self.spec_class(self.spec, self.bpmn_id, subworkflow_spec=subworkflow_spec, **self.bpmn_attributes)
97+
if self.attribute('triggeredByEvent'):
98+
spec_class = self.EVENT_SUBPROCESS_CLASS
99+
else:
100+
spec_class = self.spec_class
101+
return spec_class(self.spec, self.bpmn_id, subworkflow_spec=subworkflow_spec, **self.bpmn_attributes)
98102

99103

100104
class CallActivityParser(TaskParser):

SpiffWorkflow/bpmn/serializer/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
SubWorkflowTask,
3838
CallActivity,
3939
TransactionSubprocess,
40+
EventSubprocess,
4041
StartEvent,
4142
EndEvent,
4243
IntermediateCatchEvent,
@@ -128,6 +129,7 @@
128129
SubWorkflowTask: SubWorkflowConverter,
129130
CallActivity: SubWorkflowConverter,
130131
TransactionSubprocess: SubWorkflowConverter,
132+
EventSubprocess: SubWorkflowConverter,
131133
BoundaryEventSplit: BpmnTaskSpecConverter,
132134
BoundaryEventJoin: EventJoinConverter,
133135
ExclusiveGateway: ExclusiveGatewayConverter,

SpiffWorkflow/bpmn/specs/defaults.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
SubWorkflowTaskMixin,
3434
CallActivityMixin,
3535
TransactionSubprocessMixin,
36+
EventSubprocessMixin,
3637
StartEventMixin,
3738
EndEventMixin,
3839
IntermediateCatchEventMixin,
@@ -88,6 +89,9 @@ class CallActivity(CallActivityMixin, BpmnSpecMixin):
8889
class TransactionSubprocess(TransactionSubprocessMixin, BpmnSpecMixin):
8990
pass
9091

92+
class EventSubprocess(EventSubprocessMixin, BpmnSpecMixin):
93+
pass
94+
9195
class StartEvent(StartEventMixin, BpmnSpecMixin):
9296
pass
9397

SpiffWorkflow/bpmn/specs/mixins/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
SubWorkflowTask as SubWorkflowTaskMixin,
3636
CallActivity as CallActivityMixin,
3737
TransactionSubprocess as TransactionSubprocessMixin,
38+
EventSubprocess as EventSubprocessMixin,
3839
)
3940

4041
from .events.start_event import StartEvent as StartEventMixin
@@ -46,4 +47,4 @@
4647
EventBasedGateway as EventBasedGatewayMixin,
4748
SendTask as SendTaskMixin,
4849
ReceiveTask as ReceiveTaskMixin,
49-
)
50+
)

SpiffWorkflow/bpmn/specs/mixins/subworkflow_task.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,7 @@ class TransactionSubprocess(SubWorkflowTask):
131131

132132
def __init__(self, wf_spec, bpmn_id, subworkflow_spec, **kwargs):
133133
super().__init__(wf_spec, bpmn_id, subworkflow_spec, True, **kwargs)
134+
135+
class EventSubprocess(SubWorkflowTask):
136+
pass
137+

SpiffWorkflow/bpmn/util/event.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,3 @@ def get_or_create_subprocess(task_spec, wf_spec):
6868
if ts.event_definition == event.event_definition:
6969
subprocess = get_or_create_subprocess(ts.name, sp_spec.name)
7070
subprocess.correlations.update(event.correlations)
71-

SpiffWorkflow/spiff/parser/task_spec.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
SequentialMultiInstanceTask,
3030
BusinessRuleTask,
3131
UserTask,
32+
EventSubprocess,
3233
)
3334

3435
SPIFFWORKFLOW_NSMAP = {'spiffworkflow': 'http://spiffworkflow.org/bpmn/schema/1.0/core'}
@@ -39,6 +40,7 @@ class SpiffTaskParser(TaskParser):
3940
STANDARD_LOOP_CLASS = StandardLoopTask
4041
PARALLEL_MI_CLASS = ParallelMultiInstanceTask
4142
SEQUENTIAL_MI_CLASS = SequentialMultiInstanceTask
43+
EVENT_SUBPROCESS_CLASS = EventSubprocess
4244

4345
def parse_extensions(self, node=None):
4446
if node is None:
@@ -154,13 +156,18 @@ def create_task(self):
154156
prescript = extensions.get('preScript')
155157
postscript = extensions.get('postScript')
156158
subworkflow_spec = SubprocessParser.get_subprocess_spec(self)
157-
return self.spec_class(
159+
if self.attribute('triggeredByEvent'):
160+
spec_class = self.EVENT_SUBPROCESS_CLASS
161+
else:
162+
spec_class = self.spec_class
163+
return spec_class(
158164
self.spec,
159165
self.bpmn_id,
160166
subworkflow_spec=subworkflow_spec,
161167
prescript=prescript,
162168
postscript=postscript,
163-
**self.bpmn_attributes)
169+
**self.bpmn_attributes
170+
)
164171

165172

166173
class ScriptTaskParser(SpiffTaskParser):

SpiffWorkflow/spiff/serializer/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
ScriptTask as DefaultScriptTask,
3030
SubWorkflowTask as DefaultSubWorkflowTask,
3131
TransactionSubprocess as DefaultTransactionSubprocess,
32+
EventSubprocess as DefaultEventSubprocess,
3233
CallActivity as DefaultCallActivity,
3334
StandardLoopTask as DefaultStandardLoopTask,
3435
ParallelMultiInstanceTask as DefaultParallelMultiInstanceTask,
@@ -46,6 +47,7 @@
4647
ServiceTask,
4748
SubWorkflowTask,
4849
TransactionSubprocess,
50+
EventSubprocess,
4951
CallActivity,
5052
StandardLoopTask,
5153
ParallelMultiInstanceTask,
@@ -88,6 +90,7 @@
8890
SPIFF_CONFIG.pop(DefaultReceiveTask)
8991
SPIFF_CONFIG.pop(DefaultSubWorkflowTask)
9092
SPIFF_CONFIG.pop(DefaultTransactionSubprocess)
93+
SPIFF_CONFIG.pop(DefaultEventSubprocess)
9194
SPIFF_CONFIG.pop(DefaultCallActivity)
9295
SPIFF_CONFIG.pop(DefaultStandardLoopTask)
9396
SPIFF_CONFIG.pop(DefaultParallelMultiInstanceTask)
@@ -104,6 +107,7 @@
104107
SPIFF_CONFIG[SubWorkflowTask] = SubWorkflowTaskConverter
105108
SPIFF_CONFIG[CallActivity] = SubWorkflowTaskConverter
106109
SPIFF_CONFIG[TransactionSubprocess] = SubWorkflowTaskConverter
110+
SPIFF_CONFIG[EventSubprocess] = SubWorkflowTaskConverter
107111
SPIFF_CONFIG[ParallelMultiInstanceTask] = SpiffMultiInstanceConverter
108112
SPIFF_CONFIG[SequentialMultiInstanceTask] = SpiffMultiInstanceConverter
109113
SPIFF_CONFIG[StandardLoopTask] = StandardLoopTaskConverter

0 commit comments

Comments
 (0)