BPMN-OS
BPMN for optimization and simulation
Loading...
Searching...
No Matches
FirstMatchingMessageDelivery.cpp
Go to the documentation of this file.
5#include <cassert>
6
7using namespace BPMNOS::Execution;
8
12
20
23 auto request = static_cast<const DecisionRequest*>(observable);
24 assert(request->token->node);
25 auto messageDefinition = request->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>()->getMessageDefinition(request->token->status);
26 auto recipientHeader = messageDefinition->getRecipientHeader(request->token->getAttributeRegistry(),request->token->status,*request->token->data,request->token->globals);
27 auto senderCandidates = request->token->node->extensionElements->as<BPMNOS::Model::ExtensionElements>()->messageCandidates;
29 // determine candidate messages
30 for ( auto& [ message_ptr ] : messages ) {
31 if( auto message = message_ptr.lock();
32 message &&
33 std::ranges::contains(senderCandidates, message->origin) &&
34 message->matches(recipientHeader)
35 ) {
36 candidates.emplace_back( message->weak_from_this() );
37 }
38 }
39 messageDeliveryRequests.emplace_back(request->token->weak_from_this(), request->weak_from_this(), candidates, recipientHeader);
40 }
41 else if ( observable->getObservableType() == Observable::Type::Message ) {
42 auto message = static_cast<const Message*>(observable);
43 if ( message->state == Message::State::CREATED ) {
44 messages.emplace_back( message->weak_from_this() );
45 // add new message to relevant candidate lists
46 auto recipientCandidates = message->origin->extensionElements->as<BPMNOS::Model::ExtensionElements>()->messageCandidates;
47 for ( auto& [token_ptr, request_ptr, candidates, recipientHeader ] : messageDeliveryRequests ) {
48 if ( auto token = token_ptr.lock();
49 token &&
50 std::ranges::contains(recipientCandidates, token->node) &&
51 message->matches(recipientHeader)
52 ) {
53 candidates.emplace_back( message->weak_from_this() );
54 }
55 }
56 }
57 }
58 else {
59 assert(!"Unexpected observable type");
60 }
61}
62
63std::shared_ptr<Event> FirstMatchingMessageDelivery::dispatchEvent( [[maybe_unused]] const SystemState* systemState ) {
64 for ( auto& [token_ptr, request_ptr, candidates, recipientHeader ] : messageDeliveryRequests ) {
65 if( auto token = token_ptr.lock() ) {
66 if ( request_ptr.lock() ) {
67 for ( auto& [message_ptr] : candidates ) {
68 if ( auto message = message_ptr.lock() ) {
69 return std::make_shared<MessageDeliveryEvent>(token.get(), message.get());
70 }
71 }
72 }
73 }
74 }
75 return nullptr;
76}
77
virtual void connect(Mediator *mediator)
std::shared_ptr< Event > dispatchEvent(const SystemState *systemState) override
void notice(const Observable *observable) override
void addSubscriber(Observer *subscriber, ObservableTypes... observableTypes)
Definition Notifier.h:16
A class representing the state that the execution or simulation of a given scenario is in.
Definition SystemState.h:21
List of tuples with automatic removal of tuples containing an expired weak_ptr.
Definition auto_list.h:15
Class holding extension elements representing execution data for nodes.
Represents a pending decision.
Represents an abstract base class for a class that is an event listener and notifier.
Definition Mediator.h:13
virtual constexpr Type getObservableType() const =0