#pragma once #include #include #include #include #include #include #include // Forward declarations namespace wfr { namespace wfs { class Workflow; class ActivityInstance; class CompositeActivityInstance; class Activity; } namespace wep { class WorkflowExecutionPlan; class AbstractWepNode; class AtomicWepNode; class AssignWepNode; class CompositeStartWepNode; class CompositeEndWepNode; class IterationStartWepNode; class IterationEndWepNode; } // Main namespace namespace enactment { class WepBuilder { // Mutable properties that need to be accessed via getter-/setter-functions. private: std::shared_ptr wep; typedef std::map activityInstanceMap_t; typedef std::map> wepNodeMap_t; std::stack parentStack; std::stack> parentWepStack; std::stack iterationIdStack; wepNodeMap_t wepNodeMap; std::vector readyToExecuteAtomicNodes; std::vector readyToExecuteAssignNodes; wfr_size_t wepNodeCount = 0; wfr_size_t wepVisitationCount = 0; bool earlyEvaluationMode; // Non-public functions private: wepNodeMap_t::mapped_type createWEPnode(wfs::Activity& a, wfs::ActivityInstance& ai, wepNodeMap_t& wepNodeMap); void createActivityInstance(wfs::Activity& element, activityInstanceMap_t& instanceMap, wepNodeMap_t& wepNodeMap); wepNodeMap_t::mapped_type createIterationWepNodes(wfr::wfs::ActivityInstance& ai, wepNodeMap_t::mapped_type& parent, wfr_id_t iterationID); void createChildInstances(wfs::CompositeActivityInstance& composite, wepNodeMap_t::mapped_type& parent, wepNodeMap_t::mapped_type* prevIter = nullptr); // Public functions public: WepBuilder(bool earlyEvaluation) : earlyEvaluationMode(earlyEvaluation) {} virtual ~WepBuilder(); std::shared_ptr createWEP(wfs::Workflow& wf, lwd::_wfr_lwd* input, lwd::_wfr_lwd* output); bool updateExecutionPlan(std::queue& updateInstances); const std::vector& getReadyToExecuteAtomicNodes() { return readyToExecuteAtomicNodes; } const std::vector& getReadyToExecuteAssignNodes() { return readyToExecuteAssignNodes; } }; } /* namespace enactment */ } /* namespace wfr */