71 return std::make_unique<DataStore>(dataStore);
75 return std::make_unique<Process>(process);
79 return std::make_unique<EventSubProcess>(subProcess,parent);
93 assert(
false &&
"Flow node is neither activity, event, nor gateway");
110 assert(
false &&
"Activity is neither subprocess, call activity, nor task");
122 return std::make_unique<SubProcess>(subProcess,parent);
126 return std::make_unique<AdHocSubProcess>(adHocSubProcess,parent);
130 return std::make_unique<Transaction>(transaction,parent);
134 return std::make_unique<CallActivity>(callActivity,parent);
139 return std::make_unique<SendTask>(sendTask,parent);
142 return std::make_unique<ReceiveTask>(receiveTask,parent);
145 return std::make_unique<UserTask>(userTask,parent);
148 return std::make_unique<ManualTask>(manualTask,parent);
151 return std::make_unique<ScriptTask>(scriptTask,parent);
154 return std::make_unique<BusinessRuleTask>(businessRuleTask,parent);
161 return std::make_unique<AbstractTask>(task,parent);
165 return std::make_unique<SendTask>(sendTask,parent);
169 return std::make_unique<ReceiveTask>(receiveTask,parent);
173 return std::make_unique<UserTask>(userTask,parent);
177 return std::make_unique<ManualTask>(manualTask,parent);
181 return std::make_unique<ScriptTask>(scriptTask,parent);
185 return std::make_unique<BusinessRuleTask>(businessRuleTask,parent);
199 throw std::logic_error(
"Model: Event is neither boundary, catch, nor throw event");
207 if ( eventDefinitions.empty() ) {
208 throw std::runtime_error(
"Model: Boundary event '" + boundaryEvent->
id.value().get().value.value +
"' has no event definition");
210 else if ( eventDefinitions.size() > 1 ) {
211 throw std::runtime_error(
"Model: Multiple event definitions are not yet supported");
214 if ( eventDefinitions[0].get().is<XML::bpmn::tCancelEventDefinition>() ) {
217 else if ( eventDefinitions[0].get().is<XML::bpmn::tCompensateEventDefinition>() ) {
220 else if ( eventDefinitions[0].get().is<XML::bpmn::tConditionalEventDefinition>() ) {
223 else if ( eventDefinitions[0].get().is<XML::bpmn::tErrorEventDefinition>() ) {
226 else if ( eventDefinitions[0].get().is<XML::bpmn::tEscalationEventDefinition>() ) {
229 else if ( eventDefinitions[0].get().is<XML::bpmn::tMessageEventDefinition>() ) {
232 else if ( eventDefinitions[0].get().is<XML::bpmn::tSignalEventDefinition>() ) {
235 else if ( eventDefinitions[0].get().is<XML::bpmn::tTimerEventDefinition>() ) {
239 throw std::logic_error(
"Model: Failed determining event definition for boundary event '" + boundaryEvent->
id.value().get().value.value +
"'");
245 return std::make_unique<CancelBoundaryEvent>(boundaryEvent,parent);
249 return std::make_unique<CompensateBoundaryEvent>(boundaryEvent,parent);
253 return std::make_unique<ConditionalBoundaryEvent>(boundaryEvent,parent);
257 return std::make_unique<ErrorBoundaryEvent>(boundaryEvent,parent);
261 return std::make_unique<EscalationBoundaryEvent>(boundaryEvent,parent);
265 return std::make_unique<MessageBoundaryEvent>(boundaryEvent,parent);
269 return std::make_unique<SignalBoundaryEvent>(boundaryEvent,parent);
273 return std::make_unique<TimerBoundaryEvent>(boundaryEvent,parent);
278 if ( eventDefinitions.empty() ) {
281 else if ( eventDefinitions.size() > 1 ) {
282 throw std::runtime_error(
"Model: Multiple event definitions are not yet supported");
289 if ( eventDefinitions[0].get().is<XML::bpmn::tConditionalEventDefinition>() ) {
292 else if ( eventDefinitions[0].get().is<XML::bpmn::tMessageEventDefinition>() ) {
295 else if ( eventDefinitions[0].get().is<XML::bpmn::tSignalEventDefinition>() ) {
298 else if ( eventDefinitions[0].get().is<XML::bpmn::tTimerEventDefinition>() ) {
301 else if ( eventDefinitions[0].get().is<XML::bpmn::tLinkEventDefinition>() ) {
305 throw std::logic_error(
"Model: Failed determining event definition for catching event '" + catchEvent->
id.value().get().value.value +
"'");
311 return std::make_unique<ConditionalCatchEvent>(catchEvent,parent);
316 return std::make_unique<MessageCatchEvent>(catchEvent,parent);
320 return std::make_unique<SignalCatchEvent>(catchEvent,parent);
324 return std::make_unique<TimerCatchEvent>(catchEvent,parent);
328 return std::make_unique<LinkTargetEvent>(catchEvent,parent);
354 throw std::logic_error(
"Model: Failed determining event definition for typed start event '" + startEvent->
id.value().get().value.value +
"'");
360 return std::make_unique<CompensateStartEvent>(startEvent,parent);
364 return std::make_unique<ErrorStartEvent>(startEvent,parent);
368 return std::make_unique<EscalationStartEvent>(startEvent,parent);
372 return std::make_unique<ConditionalStartEvent>(startEvent,parent);
376 return std::make_unique<MessageStartEvent>(startEvent,parent);
380 return std::make_unique<SignalStartEvent>(startEvent,parent);
384 return std::make_unique<TimerStartEvent>(startEvent,parent);
388 return std::make_unique<UntypedStartEvent>(catchEvent,parent);
393 if ( eventDefinitions.empty() ) {
396 else if ( eventDefinitions.size() > 1 ) {
397 throw std::runtime_error(
"Model: Multiple event definitions are not yet supported");
400 if ( eventDefinitions[0].get().is<XML::bpmn::tCancelEventDefinition>() ) {
403 else if ( eventDefinitions[0].get().is<XML::bpmn::tCompensateEventDefinition>() ) {
406 else if ( eventDefinitions[0].get().is<XML::bpmn::tErrorEventDefinition>() ) {
409 else if ( eventDefinitions[0].get().is<XML::bpmn::tEscalationEventDefinition>() ) {
412 else if ( eventDefinitions[0].get().is<XML::bpmn::tMessageEventDefinition>() ) {
415 else if ( eventDefinitions[0].get().is<XML::bpmn::tSignalEventDefinition>() ) {
418 else if ( eventDefinitions[0].get().is<XML::bpmn::tTerminateEventDefinition>() ) {
421 else if ( eventDefinitions[0].get().is<XML::bpmn::tLinkEventDefinition>() ) {
425 throw std::logic_error(
"Model: Failed determining event definition for throwing event '" + throwEvent->
id.value().get().value.value +
"'");
431 return std::make_unique<CancelEndEvent>(throwEvent,parent);
435 return std::make_unique<CompensateThrowEvent>(throwEvent,parent);
439 return std::make_unique<ErrorEndEvent>(throwEvent,parent);
443 return std::make_unique<EscalationThrowEvent>(throwEvent,parent);
447 return std::make_unique<MessageThrowEvent>(throwEvent,parent);
451 return std::make_unique<SignalThrowEvent>(throwEvent,parent);
455 return std::make_unique<TerminateEvent>(throwEvent,parent);
459 return std::make_unique<LinkSourceEvent>(throwEvent,parent);
463 return std::make_unique<UntypedEndEvent>(throwEvent,parent);
484 assert(
false &&
"Gateway is neither parallel, exclusive, inclusive, complex, nor event-based gateway");
490 return std::make_unique<ParallelGateway>(parallelGateway,parent);
494 return std::make_unique<ExclusiveGateway>(exclusiveGateway,parent);
498 return std::make_unique<InclusiveGateway>(inclusiveGateway,parent);
502 return std::make_unique<EventBasedGateway>(eventBasedGateway,parent);
506 return std::make_unique<ComplexGateway>(complexGateway,parent);
510 return std::make_unique<SequenceFlow>(sequenceFlow,scope);
514 return std::make_unique<DataObject>(dataObject);
518 return std::make_unique<MessageFlow>(messageFlow);
533 (
bool)subProcess->triggeredByEvent->get().value
551 if (
auto childScope = childNode->represents<
Scope>() ) {
566 for (
auto flowNode: scope->
flowNodes ) {
573 if (
auto activityScope = activity->represents<
Scope>() ) {
579 auto it = std::find_if(
582 [](
auto& eventSubProcess) ->
bool {
583 TypedStartEvent* startEvent = eventSubProcess->startEvent;
584 return startEvent && startEvent->represents<CompensateStartEvent>();
600 if ( sequenceFlow->id.size() && inflow.get().textContent == sequenceFlow->id ) {
601 flowNode->
incoming.push_back(sequenceFlow.get());
610 if (
auto subProcess = untypedStartEvent->parent->represents<
SubProcess>() ) {
611 if ( subProcess->startEvent ) {
612 throw std::runtime_error(
"Model: more than one start event provided for '" + subProcess->id +
"'");
614 subProcess->startEvent = untypedStartEvent;
618 throw std::runtime_error(
"Model: untyped start event provided for event subprocess '" + untypedStartEvent->parent->id +
"'");
622 throw std::runtime_error(
"Model: start event provided for adhoc subprocess '" + untypedStartEvent->parent->id +
"'");
627 if (
auto eventSubProcess = typedStartEvent->parent->represents<
EventSubProcess>() ) {
628 if ( eventSubProcess->startEvent ) {
629 throw std::runtime_error(
"Model: more than one start event provided for '" + eventSubProcess->id +
"'");
631 eventSubProcess->startEvent = typedStartEvent;
633 if ( eventSubProcess->parent->compensationEventSubProcess ) {
634 throw std::runtime_error(
"Model: more than one compensation event subprocess provided for '" + eventSubProcess->parent->id +
"'");
636 eventSubProcess->parent->compensationEventSubProcess = eventSubProcess;
639 else if ( typedStartEvent->parent->represents<
SubProcess>() ) {
640 throw std::runtime_error(
"Model: typed start event provided for subprocess '" + typedStartEvent->parent->id +
"'");
642 else if ( typedStartEvent->parent->represents<
Process>() &&
645 throw std::runtime_error(
"Model: compensation start event provided for process '" + typedStartEvent->parent->id +
"'");
658 if ( sequenceFlow->element->id.has_value() && outflow.get().textContent == sequenceFlow->id ) {
659 flowNode->
outgoing.push_back(sequenceFlow.get());
665 id.value().
get().value.value == sequenceFlow->id
668 exclusiveGateway->defaultFlow = sequenceFlow.get();
671 inclusiveGateway->defaultFlow = sequenceFlow.get();
674 complexGateway->defaultFlow = sequenceFlow.get();
689 std::unordered_map< std::string, Activity*> compensationActivityMap;
690 std::unordered_map< std::string, CompensateBoundaryEvent*> compensateBoundaryEventMap;
693 compensationActivityMap[compensationActivity->id] = compensationActivity;
699 compensateBoundaryEventMap[compensateBoundaryEvent->id] = compensateBoundaryEvent;
705 auto it1 = compensateBoundaryEventMap.find(association.sourceRef.value);
706 auto it2 = compensationActivityMap.find(association.targetRef.value);
707 if ( it1 != compensateBoundaryEventMap.end() && it2 != compensationActivityMap.end() ) {
708 it1->second->attachedTo->compensatedBy = it2->second;
716 if (
auto childScope = childNode->represents<
Scope>() ) {
723 std::vector<CompensateThrowEvent*> compensateThrowEvents;
724 std::vector<Activity*> compensatedActivities;
728 compensateThrowEvents.push_back(compensateThrowEvent);
733 auto context = scope;
740 context = eventSubProcess->parent;
741 if (
auto subProcess = context->represents<
SubProcess>() ) {
742 subProcess->compensatedBy = eventSubProcess;
746 for (
auto& childNode: context->childNodes ) {
749 auto activity = compensateBoundaryEvent->attachedTo->as<
Activity>();
750 compensatedActivities.push_back(activity);
757 compensatedActivities.push_back(scope->
as<
SubProcess>());
763 for (
auto compensateThrowEvent : compensateThrowEvents ) {
766 std::string activityRef;
769 if ( eventDefinition.activityRef.has_value() ) {
770 activityRef = eventDefinition.activityRef.value().get().value.value;
773 if ( !activityRef.empty() ) {
774 auto it = std::find_if(
775 compensatedActivities.begin(),
776 compensatedActivities.end(),
777 [&activityRef](
const Activity* activity) {
778 return activity && activity->id == activityRef;
780 if ( it == compensatedActivities.end() ) {
781 throw std::runtime_error(
"Model: Cannot find activity '" + activityRef +
"' to be compensated");
783 compensateThrowEvent->activity = *it;
785 else if ( compensateThrowEvent->name.has_value() && !compensateThrowEvent->name.value().empty() ) {
787 auto activityName = compensateThrowEvent->name.value();
788 auto it = std::find_if(
789 compensatedActivities.begin(),
790 compensatedActivities.end(),
791 [&activityName](
const Activity* activity) {
792 return activity && activity->name.has_value() && activity->name.value() == activityName;
794 if ( it == compensatedActivities.end() ) {
795 throw std::runtime_error(
"Model: Cannot find activity with name '" + activityName +
"' to be compensated");
797 compensateThrowEvent->activity = *it;
805 std::vector<LinkSourceEvent*> linkSources;
806 std::vector<LinkTargetEvent*> linkTargets;
810 linkSources.push_back(linkSource);
813 linkTargets.push_back(linkTarget);
817 if (
auto childScope = childNode->represents<
Scope>() ) {
822 for (
auto linkSource: linkSources ) {
823 for (
auto linkTarget: linkTargets ) {
824 if ( linkSource->name == linkTarget->name ) {
825 if ( linkSource->target ) {
826 throw std::runtime_error(
"Model: Link event '" + linkSource->id +
"' has multiple targets");
828 linkSource->target = linkTarget;
829 linkTarget->sources.push_back(linkSource);
832 if ( !linkSource->target ) {
833 throw std::runtime_error(
"Model: Link event '" + linkSource->id +
"' has no target");
841 std::unordered_map<std::string,std::string> participantMap;
844 collaboration && collaboration.has_value()
849 if ( participant.processRef.has_value() ) {
850 participantMap[participant.id->get().value] = participant.processRef->get().value;
862 messageFlow->initialize(
processes,participantMap);
864 auto& [sourceProcess,sourceFlowNode] = messageFlow->source;
865 if ( sourceFlowNode ) {
866 sourceFlowNode->sending.push_back(messageFlow.get());
868 else if ( sourceProcess ) {
869 sourceProcess->sending.push_back(messageFlow.get());
874 auto& [targetProcess,targetFlowNode] = messageFlow->target;
875 if ( targetFlowNode ) {
876 targetFlowNode->receiving.push_back(messageFlow.get());
878 else if ( targetProcess ) {
879 targetProcess->receiving.push_back(messageFlow.get());
XML::bpmn::tBaseElement * element
T * get()
Casts the element to the specified type T.
Base class for all boundary events attached to an Activity.
Scope * parent
Reference to the parent node.
T * as()
Casts the element to the specified type T.
T * represents()
Attempts to cast the element to the specified type T.
TypedStartEvent * startEvent
Base class for BPMN elements that may contain incoming and outgoing sequence flows.
std::vector< SequenceFlow * > incoming
Vector containing all incoming sequence flows of the node.
XML::bpmn::tFlowNode * element
std::vector< SequenceFlow * > outgoing
Vector containing all outgoing sequence flows of the node.
virtual std::unique_ptr< FlowNode > createEscalationStartEvent(XML::bpmn::tStartEvent *startEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createInclusiveGateway(XML::bpmn::tInclusiveGateway *inclusiveGateway, Scope *parent)
virtual void createSequenceFlows(Scope *scope)
virtual std::unique_ptr< FlowNode > createUntypedStartEvent(XML::bpmn::tCatchEvent *catchEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createAdHocSubProcess(XML::bpmn::tAdHocSubProcess *adHocSubProcess, Scope *parent)
virtual std::unique_ptr< FlowNode > createTimerStartEvent(XML::bpmn::tStartEvent *startEvent, Scope *parent)
std::vector< std::unique_ptr< Process > > processes
virtual std::unique_ptr< EventSubProcess > createEventSubProcess(XML::bpmn::tSubProcess *subProcess, Scope *parent)
virtual std::unique_ptr< FlowNode > createParallelGateway(XML::bpmn::tParallelGateway *parallelGateway, Scope *parent)
virtual std::unique_ptr< FlowNode > createLinkSourceEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createTerminateEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual void createLinks(Scope *scope)
virtual std::unique_ptr< MessageFlow > createMessageFlow(XML::bpmn::tMessageFlow *messageFlow)
virtual std::unique_ptr< FlowNode > createTimerCatchEvent(XML::bpmn::tCatchEvent *catchEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createEscalationBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
virtual void createFlowReferences(FlowNode *flowNode)
virtual std::unique_ptr< FlowNode > createUntypedEndEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createFlowNode(XML::bpmn::tFlowNode *flowNode, Scope *parent)
virtual void createCompensations(Scope *scope)
virtual std::unique_ptr< FlowNode > createSignalThrowEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createEventBasedGateway(XML::bpmn::tEventBasedGateway *eventBasedGateway, Scope *parent)
virtual std::unique_ptr< FlowNode > createCompensateStartEvent(XML::bpmn::tStartEvent *startEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createTransaction(XML::bpmn::tTransaction *transaction, Scope *parent)
virtual void createNestedReferences(Scope *scope)
virtual std::unique_ptr< FlowNode > createManualTask(XML::bpmn::tManualTask *manualTask, Scope *parent)
virtual void build()
Builds processes, nodes, sequence flows, message flows, links, and data stores from root....
virtual void createChildNodes(Scope *scope)
virtual std::unique_ptr< DataStore > createDataStore(XML::bpmn::tDataStore *dataStore)
virtual std::unique_ptr< FlowNode > createCatchEvent(XML::bpmn::tCatchEvent *catchEvent, Scope *parent)
virtual std::unique_ptr< Process > createProcess(XML::bpmn::tProcess *process)
virtual std::unique_ptr< FlowNode > createMessageBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
virtual void createProcesses()
std::vector< std::unique_ptr< MessageFlow > > messageFlows
virtual std::unique_ptr< FlowNode > createGateway(XML::bpmn::tGateway *gateway, Scope *parent)
virtual std::unique_ptr< FlowNode > createCallActivity(XML::bpmn::tCallActivity *callActivity, Scope *parent)
virtual std::unique_ptr< FlowNode > createUserTask(XML::bpmn::tUserTask *userTask, Scope *parent)
virtual std::unique_ptr< FlowNode > createTypedStartEvent(XML::bpmn::tStartEvent *startEvent, XML::bpmn::tEventDefinition &eventDefinition, Scope *parent)
virtual std::unique_ptr< DataObject > createDataObject(XML::bpmn::tDataObject *dataObject, BPMN::Scope *scope)
virtual std::unique_ptr< FlowNode > createErrorEndEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createConditionalBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createMessageStartEvent(XML::bpmn::tStartEvent *startEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createSignalBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createErrorBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createMessageCatchEvent(XML::bpmn::tCatchEvent *catchEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createMessageThrowEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createActivity(XML::bpmn::tActivity *activity, Scope *parent)
virtual void createDataStores()
virtual std::unique_ptr< FlowNode > createSubProcess(XML::bpmn::tSubProcess *subProcess, Scope *parent)
virtual std::unique_ptr< FlowNode > createExclusiveGateway(XML::bpmn::tExclusiveGateway *exclusiveGateway, Scope *parent)
virtual std::unique_ptr< FlowNode > createThrowEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createErrorStartEvent(XML::bpmn::tStartEvent *startEvent, Scope *parent)
virtual std::unique_ptr< XML::XMLObject > createRoot(const std::string &filename)
Parses filename into the model root and returns it. Virtual hook: derived classes may override it to ...
virtual std::unique_ptr< FlowNode > createSendTask(XML::bpmn::tSendTask *sendTask, Scope *parent)
virtual std::unique_ptr< FlowNode > createCompensateBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createAbstractTask(XML::bpmn::tTask *task, Scope *parent)
virtual std::unique_ptr< FlowNode > createCompensateThrowEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual void createMessageFlows()
virtual std::unique_ptr< FlowNode > createLinkTargetEvent(XML::bpmn::tCatchEvent *catchEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createScriptTask(XML::bpmn::tScriptTask *scriptTask, Scope *parent)
virtual std::unique_ptr< FlowNode > createSignalCatchEvent(XML::bpmn::tCatchEvent *catchEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createEvent(XML::bpmn::tEvent *event, Scope *parent)
virtual std::unique_ptr< FlowNode > createCancelEndEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual std::unique_ptr< SequenceFlow > createSequenceFlow(XML::bpmn::tSequenceFlow *sequenceFlow, Scope *scope)
virtual std::unique_ptr< FlowNode > createReceiveTask(XML::bpmn::tReceiveTask *receiveTask, Scope *parent)
virtual std::unique_ptr< FlowNode > createComplexGateway(XML::bpmn::tComplexGateway *complexGateway, Scope *parent)
virtual void createCompensationReferences(Scope *scope)
virtual std::unique_ptr< FlowNode > createBusinessRuleTask(XML::bpmn::tBusinessRuleTask *businessRuleTask, Scope *parent)
virtual std::unique_ptr< FlowNode > createBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createSignalStartEvent(XML::bpmn::tStartEvent *startEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createConditionalCatchEvent(XML::bpmn::tCatchEvent *catchEvent, Scope *parent)
std::unique_ptr< XML::XMLObject > root
virtual std::unique_ptr< FlowNode > createEscalationThrowEvent(XML::bpmn::tThrowEvent *throwEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createTimerBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
virtual std::unique_ptr< FlowNode > createCancelBoundaryEvent(XML::bpmn::tBoundaryEvent *boundaryEvent, Scope *parent)
std::vector< std::unique_ptr< DataStore > > dataStores
virtual std::unique_ptr< FlowNode > createTask(XML::bpmn::tTask *task, Scope *parent)
virtual std::unique_ptr< FlowNode > createConditionalStartEvent(XML::bpmn::tStartEvent *startEvent, Scope *parent)
Base class for BPMN elements that may contain a ChildNode elements.
std::vector< FlowNode * > startNodes
Vector containing all flow nodes that may start execution of the scope.
std::vector< Activity * > compensationActivities
Vector containing pointers to all compensation activities within the scope.
EventSubProcess * compensationEventSubProcess
Pointer to compensation event subprocess of the scope.
std::vector< EventSubProcess * > eventSubProcesses
Vector containing pointers to all event subprocesses within the scope of the nodes.
std::vector< FlowNode * > flowNodes
Vector containing pointers to all flow nodes within the scope of the nodes.
void add(std::unique_ptr< Node > node)
std::vector< std::unique_ptr< SequenceFlow > > sequenceFlows
Vector containing all sequence flows within the scope.
std::vector< std::unique_ptr< Node > > childNodes
Vector containing all child nodes within the scope of the nodes.
Base class for all start events with an event definition.
auto * get(this Self &&self)
Attempt to cast the current instance to the specified type T.
static XMLObject * createFromFile(const std::string &filename)
Create an XMLObject from an XML file.
auto getChildren(this Self &&self)
Get all children of type T.
auto getOptionalAttributeByName(this Self &&self, const AttributeName &name)
Get an optional attribute with the specified attribute name.
auto * is(this Self &&self)
Returns a pointer of type T of the object, const-qualified to match the receiver.
std::optional< std::reference_wrapper< Attribute > > id
Attribute value can be expected to be of type 'std::string'.
std::vector< std::reference_wrapper< XMLObject > > outgoing
std::vector< std::reference_wrapper< XMLObject > > incoming
std::optional< std::reference_wrapper< Attribute > > triggeredByEvent
Attribute value can be expected to be of type 'bool'.
The BPMN namespace contains linked classes representing a BPMN model.