BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
ConditionalEventObserver.cpp
Go to the documentation of this file.
2#include "Engine.h"
3#include "SystemState.h"
4#include "Token.h"
6#include <iostream>
7
8using namespace BPMNOS::Execution;
9
10ConditionalEventObserver::ConditionalEventObserver(SystemState* systemState) : systemState(systemState) {
11}
12
14 assert( dynamic_cast<const DataUpdate*>(observable) );
15 auto dataUpdate = static_cast<const DataUpdate*>(observable);
16
17 if ( dataUpdate->global() ) {
18 // check tokens at all conditional events
19 for ( auto& [_,waitingTokens] : systemState->tokensAwaitingCondition ) {
20 triggerConditionalEvent( dataUpdate, waitingTokens );
21 }
22 }
23 else {
24 // check tokens at conditional events for instance with updated data
25 auto it = systemState->tokensAwaitingCondition.find(dataUpdate->instanceId);
26 if ( it != systemState->tokensAwaitingCondition.end() ) {
27 triggerConditionalEvent( dataUpdate, it->second );
28 }
29 }
30}
31
32void ConditionalEventObserver::triggerConditionalEvent(const DataUpdate* dataUpdate, auto_list< std::weak_ptr<Token> >& waitingTokens) {
33 for ( auto it = waitingTokens.begin(); it != waitingTokens.end(); ) {
34 auto& [token_ptr] = *it;
35 auto token = token_ptr.lock();
36 assert( token->node->extensionElements->represents<BPMNOS::Model::Conditions>() );
37 auto extensionElements = token->node->extensionElements->as<BPMNOS::Model::Conditions>();
38
39 // determine whether data update intersects with data dependencies of conditional event
40 auto intersect = [](const std::vector<const BPMNOS::Model::Attribute*>& first, const std::set<const BPMNOS::Model::Attribute*>& second) -> bool {
41 for ( auto lhs : first ) {
42 if ( second.contains(lhs) ) {
43 return true;
44 }
45 }
46 return false;
47 };
48
49 if ( intersect(dataUpdate->attributes,extensionElements->dataDependencies) ) {
50 // advance token if conditions are satisfied
51 if ( extensionElements->conditionsSatisfied(token->status,*token->data,token->globals) ) {
52 auto engine = const_cast<Engine*>(systemState->engine);
53 engine->commands.emplace_back(std::bind(&Token::advanceToCompleted,token.get()), token.get());
54 it = waitingTokens.erase(it);
55 }
56 else {
57 ++it;
58 }
59 }
60 }
61}
62
void notice(const Observable *observable) override
void triggerConditionalEvent(const DataUpdate *dataUpdate, auto_list< std::weak_ptr< Token > > &waitingTokens)
std::list< Command > commands
List of commands to be executed.
Definition Engine.h:91
A class representing the state that the execution or simulation of a given scenario is in.
Definition SystemState.h:21
std::unordered_map< BPMNOS::number, auto_list< std::weak_ptr< Token > > > tokensAwaitingCondition
Map holding a container of all tokens at a conditional event belonginge to a process instance.
List of tuples with automatic removal of tuples containing an expired weak_ptr.
Definition auto_list.h:15
Class holding extension elements representing conditions for sequence flows and conditional events.
Definition Conditions.h:18
const std::vector< const BPMNOS::Model::Attribute * > & attributes
Definition DataUpdate.h:17