51 return std::make_unique<Process>(process);
55 return std::make_unique<EventSubProcess>(subProcess,parent);
69 assert(!
"Flow node is neither activity, event, nor gateway");
86 assert(!
"Activity is neither subprocess, call activity, nor task");
98 return std::make_unique<SubProcess>(subProcess,parent);
102 return std::make_unique<AdHocSubProcess>(adHocSubProcess,parent);
106 return std::make_unique<Transaction>(transaction,parent);
110 return std::make_unique<CallActivity>(callActivity,parent);
115 return std::make_unique<SendTask>(sendTask,parent);
118 return std::make_unique<ReceiveTask>(receiveTask,parent);
121 return std::make_unique<UserTask>(userTask,parent);
124 return std::make_unique<ManualTask>(manualTask,parent);
127 return std::make_unique<ScriptTask>(scriptTask,parent);
130 return std::make_unique<BusinessRuleTask>(businessRuleTask,parent);
137 return std::make_unique<AbstractTask>(task,parent);
141 return std::make_unique<SendTask>(sendTask,parent);
145 return std::make_unique<ReceiveTask>(receiveTask,parent);
149 return std::make_unique<UserTask>(userTask,parent);
153 return std::make_unique<ManualTask>(manualTask,parent);
157 return std::make_unique<ScriptTask>(scriptTask,parent);
161 return std::make_unique<BusinessRuleTask>(businessRuleTask,parent);
175 throw std::logic_error(
"Model: Event is neither boundary, catch, nor throw event");
183 if ( eventDefinitions.empty() ) {
184 throw std::runtime_error(
"Model: Boundary event '" + boundaryEvent->
id.value().get().value.value +
"' has no event definition");
186 else if ( eventDefinitions.size() > 1 ) {
187 throw std::runtime_error(
"Model: Multiple event definitions are not yet supported");
190 if ( eventDefinitions[0].get().is<XML::bpmn::tCancelEventDefinition>() ) {
193 else if ( eventDefinitions[0].get().is<XML::bpmn::tCompensateEventDefinition>() ) {
196 else if ( eventDefinitions[0].get().is<XML::bpmn::tConditionalEventDefinition>() ) {
199 else if ( eventDefinitions[0].get().is<XML::bpmn::tErrorEventDefinition>() ) {
202 else if ( eventDefinitions[0].get().is<XML::bpmn::tEscalationEventDefinition>() ) {
205 else if ( eventDefinitions[0].get().is<XML::bpmn::tMessageEventDefinition>() ) {
208 else if ( eventDefinitions[0].get().is<XML::bpmn::tSignalEventDefinition>() ) {
211 else if ( eventDefinitions[0].get().is<XML::bpmn::tTimerEventDefinition>() ) {
215 throw std::logic_error(
"Model: Failed determining event definition for boundary event '" + boundaryEvent->
id.value().get().value.value +
"'");
221 return std::make_unique<CancelBoundaryEvent>(boundaryEvent,parent);
225 return std::make_unique<CompensateBoundaryEvent>(boundaryEvent,parent);
229 return std::make_unique<ConditionalBoundaryEvent>(boundaryEvent,parent);
233 return std::make_unique<ErrorBoundaryEvent>(boundaryEvent,parent);
237 return std::make_unique<EscalationBoundaryEvent>(boundaryEvent,parent);
241 return std::make_unique<MessageBoundaryEvent>(boundaryEvent,parent);
245 return std::make_unique<SignalBoundaryEvent>(boundaryEvent,parent);
249 return std::make_unique<TimerBoundaryEvent>(boundaryEvent,parent);
254 if ( eventDefinitions.empty() ) {
257 else if ( eventDefinitions.size() > 1 ) {
258 throw std::runtime_error(
"Model: Multiple event definitions are not yet supported");
265 if ( eventDefinitions[0].get().is<XML::bpmn::tConditionalEventDefinition>() ) {
268 else if ( eventDefinitions[0].get().is<XML::bpmn::tMessageEventDefinition>() ) {
271 else if ( eventDefinitions[0].get().is<XML::bpmn::tSignalEventDefinition>() ) {
274 else if ( eventDefinitions[0].get().is<XML::bpmn::tTimerEventDefinition>() ) {
277 else if ( eventDefinitions[0].get().is<XML::bpmn::tLinkEventDefinition>() ) {
281 throw std::logic_error(
"Model: Failed determining event definition for catching event '" + catchEvent->
id.value().get().value.value +
"'");
287 return std::make_unique<ConditionalCatchEvent>(catchEvent,parent);
292 return std::make_unique<MessageCatchEvent>(catchEvent,parent);
296 return std::make_unique<SignalCatchEvent>(catchEvent,parent);
300 return std::make_unique<TimerCatchEvent>(catchEvent,parent);
304 return std::make_unique<LinkTargetEvent>(catchEvent,parent);
330 throw std::logic_error(
"Model: Failed determining event definition for typed start event '" + startEvent->
id.value().get().value.value +
"'");
336 return std::make_unique<CompensateStartEvent>(startEvent,parent);
340 return std::make_unique<ErrorStartEvent>(startEvent,parent);
344 return std::make_unique<EscalationStartEvent>(startEvent,parent);
348 return std::make_unique<ConditionalStartEvent>(startEvent,parent);
352 return std::make_unique<MessageStartEvent>(startEvent,parent);
356 return std::make_unique<SignalStartEvent>(startEvent,parent);
360 return std::make_unique<TimerStartEvent>(startEvent,parent);
364 return std::make_unique<UntypedStartEvent>(catchEvent,parent);
369 if ( eventDefinitions.empty() ) {
372 else if ( eventDefinitions.size() > 1 ) {
373 throw std::runtime_error(
"Model: Multiple event definitions are not yet supported");
376 if ( eventDefinitions[0].get().is<XML::bpmn::tCancelEventDefinition>() ) {
379 else if ( eventDefinitions[0].get().is<XML::bpmn::tCompensateEventDefinition>() ) {
382 else if ( eventDefinitions[0].get().is<XML::bpmn::tErrorEventDefinition>() ) {
385 else if ( eventDefinitions[0].get().is<XML::bpmn::tEscalationEventDefinition>() ) {
388 else if ( eventDefinitions[0].get().is<XML::bpmn::tMessageEventDefinition>() ) {
391 else if ( eventDefinitions[0].get().is<XML::bpmn::tSignalEventDefinition>() ) {
394 else if ( eventDefinitions[0].get().is<XML::bpmn::tTerminateEventDefinition>() ) {
397 else if ( eventDefinitions[0].get().is<XML::bpmn::tLinkEventDefinition>() ) {
401 throw std::logic_error(
"Model: Failed determining event definition for throwing event '" + throwEvent->
id.value().get().value.value +
"'");
407 return std::make_unique<CancelEndEvent>(throwEvent,parent);
411 return std::make_unique<CompensateThrowEvent>(throwEvent,parent);
415 return std::make_unique<ErrorEndEvent>(throwEvent,parent);
419 return std::make_unique<EscalationThrowEvent>(throwEvent,parent);
423 return std::make_unique<MessageThrowEvent>(throwEvent,parent);
427 return std::make_unique<SignalThrowEvent>(throwEvent,parent);
431 return std::make_unique<TerminateEvent>(throwEvent,parent);
435 return std::make_unique<LinkSourceEvent>(throwEvent,parent);
439 return std::make_unique<UntypedEndEvent>(throwEvent,parent);
460 assert(!
"Gateway is neither parallel, exclusive, inclusive, complex, nor event-based gateway");
466 return std::make_unique<ParallelGateway>(parallelGateway,parent);
470 return std::make_unique<ExclusiveGateway>(exclusiveGateway,parent);
474 return std::make_unique<InclusiveGateway>(inclusiveGateway,parent);
478 return std::make_unique<EventBasedGateway>(eventBasedGateway,parent);
482 return std::make_unique<ComplexGateway>(complexGateway,parent);
486 return std::make_unique<SequenceFlow>(sequenceFlow,scope);
490 return std::make_unique<DataObject>(dataObject);
494 return std::make_unique<MessageFlow>(messageFlow);
509 (bool)subProcess->triggeredByEvent->get().value
527 if (
auto childScope = childNode->represents<
Scope>() ) {
542 for (
auto flowNode: scope->
flowNodes ) {
549 if (
auto activityScope = activity->represents<
Scope>() ) {
555 auto it = std::find_if(
558 [](
auto& eventSubProcess) ->
bool {
559 TypedStartEvent* startEvent = eventSubProcess->startEvent;
560 return startEvent && startEvent->represents<CompensateStartEvent>();
576 if ( sequenceFlow->id.size() && inflow.get().textContent == sequenceFlow->id ) {
577 flowNode->
incoming.push_back(sequenceFlow.get());
586 if (
auto subProcess = untypedStartEvent->parent->represents<
SubProcess>() ) {
587 if ( subProcess->startEvent ) {
588 throw std::runtime_error(
"Model: more than one start event provided for '" + subProcess->id +
"'");
590 subProcess->startEvent = untypedStartEvent;
594 throw std::runtime_error(
"Model: untyped start event provided for event subprocess '" + untypedStartEvent->parent->id +
"'");
598 throw std::runtime_error(
"Model: start event provided for adhoc subprocess '" + untypedStartEvent->parent->id +
"'");
603 if (
auto eventSubProcess = typedStartEvent->parent->represents<
EventSubProcess>() ) {
604 if ( eventSubProcess->startEvent ) {
605 throw std::runtime_error(
"Model: more than one start event provided for '" + eventSubProcess->id +
"'");
607 eventSubProcess->startEvent = typedStartEvent;
609 if ( eventSubProcess->parent->compensationEventSubProcess ) {
610 throw std::runtime_error(
"Model: more than one compensation event subprocess provided for '" + eventSubProcess->parent->id +
"'");
612 eventSubProcess->parent->compensationEventSubProcess = eventSubProcess;
615 else if ( typedStartEvent->parent->represents<
SubProcess>() ) {
616 throw std::runtime_error(
"Model: typed start event provided for subprocess '" + typedStartEvent->parent->id +
"'");
618 else if ( typedStartEvent->parent->represents<
Process>() &&
621 throw std::runtime_error(
"Model: compensation start event provided for process '" + typedStartEvent->parent->id +
"'");
634 if ( sequenceFlow->element->id.has_value() && outflow.get().textContent == sequenceFlow->id ) {
635 flowNode->
outgoing.push_back(sequenceFlow.get());
641 id.value().
get().value.value == sequenceFlow->id
644 exclusiveGateway->defaultFlow = sequenceFlow.get();
647 inclusiveGateway->defaultFlow = sequenceFlow.get();
650 complexGateway->defaultFlow = sequenceFlow.get();
665 std::unordered_map< std::string, Activity*> compensationActivityMap;
666 std::unordered_map< std::string, CompensateBoundaryEvent*> compensateBoundaryEventMap;
669 compensationActivityMap[compensationActivity->id] = compensationActivity;
675 compensateBoundaryEventMap[compensateBoundaryEvent->id] = compensateBoundaryEvent;
681 auto it1 = compensateBoundaryEventMap.find(association.sourceRef.value);
682 auto it2 = compensationActivityMap.find(association.targetRef.value);
683 if ( it1 != compensateBoundaryEventMap.end() && it2 != compensationActivityMap.end() ) {
684 it1->second->attachedTo->compensatedBy = it2->second;
692 if (
auto childScope = childNode->represents<
Scope>() ) {
699 std::vector<CompensateThrowEvent*> compensateThrowEvents;
700 std::vector<Activity*> compensatedActivities;
704 compensateThrowEvents.push_back(compensateThrowEvent);
709 auto context = scope;
716 context = eventSubProcess->parent;
717 if (
auto subProcess = context->represents<
SubProcess>() ) {
718 subProcess->compensatedBy = eventSubProcess;
722 for (
auto& childNode: context->childNodes ) {
725 auto activity = compensateBoundaryEvent->attachedTo->
as<
Activity>();
726 compensatedActivities.push_back(activity);
733 compensatedActivities.push_back(scope->
as<
SubProcess>());
739 for (
auto compensateThrowEvent : compensateThrowEvents ) {
742 std::string activityRef;
745 if ( eventDefinition.activityRef.has_value() ) {
746 activityRef = eventDefinition.activityRef.value().get().value.value;
749 if ( !activityRef.empty() ) {
750 auto it = std::find_if(
751 compensatedActivities.begin(),
752 compensatedActivities.end(),
753 [&activityRef](
const Activity* activity) {
754 return activity && activity->id == activityRef;
756 if ( it == compensatedActivities.end() ) {
757 throw std::runtime_error(
"Model: Cannot find activity '" + activityRef +
"' to be compensated");
759 compensateThrowEvent->activity = *it;
761 else if ( compensateThrowEvent->name.has_value() && !compensateThrowEvent->name.value().empty() ) {
763 auto activityName = compensateThrowEvent->name.value();
764 auto it = std::find_if(
765 compensatedActivities.begin(),
766 compensatedActivities.end(),
767 [&activityName](
const Activity* activity) {
768 return activity && activity->name.has_value() && activity->name.value() == activityName;
770 if ( it == compensatedActivities.end() ) {
771 throw std::runtime_error(
"Model: Cannot find activity with name '" + activityName +
"' to be compensated");
773 compensateThrowEvent->activity = *it;
781 std::vector<LinkSourceEvent*> linkSources;
782 std::vector<LinkTargetEvent*> linkTargets;
786 linkSources.push_back(linkSource);
789 linkTargets.push_back(linkTarget);
793 if (
auto childScope = childNode->represents<
Scope>() ) {
798 for (
auto linkSource: linkSources ) {
799 for (
auto linkTarget: linkTargets ) {
800 if ( linkSource->name == linkTarget->name ) {
801 if ( linkSource->target ) {
802 throw std::runtime_error(
"Model: Link event '" + linkSource->id +
"' has multiple targets");
804 linkSource->target = linkTarget;
805 linkTarget->sources.push_back(linkSource);
808 if ( !linkSource->target ) {
809 throw std::runtime_error(
"Model: Link event '" + linkSource->id +
"' has no target");
817 std::unordered_map<std::string,std::string> participantMap;
820 collaboration && collaboration.has_value()
825 if ( participant.processRef.has_value() ) {
826 participantMap[participant.id->get().value] = participant.processRef->get().value;
838 messageFlow->initialize(
processes,participantMap);
840 auto& [sourceProcess,sourceFlowNode] = messageFlow->source;
841 if ( sourceFlowNode ) {
842 sourceFlowNode->sending.push_back(messageFlow.get());
844 else if ( sourceProcess ) {
845 sourceProcess->sending.push_back(messageFlow.get());
850 auto& [targetProcess,targetFlowNode] = messageFlow->target;
851 if ( targetFlowNode ) {
852 targetFlowNode->receiving.push_back(messageFlow.get());
854 else if ( targetProcess ) {
855 targetProcess->receiving.push_back(messageFlow.get());
XML::bpmn::tActivity * element
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 createChildNodes(Scope *scope)
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)
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 void readBPMNFile(const std::string &filename)
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 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)
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)
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.
static XMLObject * createFromFile(const std::string &filename)
Create an XMLObject from an XML file.
std::optional< std::reference_wrapper< Attribute > > getOptionalAttributeByName(const AttributeName &name)
Get an optional attribute with the specified attribute name.
T * is()
Returns a pointer of type T of the object.
std::vector< std::reference_wrapper< T > > getChildren()
Get all children of type T.
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.