Files
WFR-lib/include/wfr/enactment/WepBuilder.h
T
2017-04-11 15:49:21 +02:00

86 lines
2.4 KiB
C++
Executable File

#pragma once
#include <wfr/common/types/LwdTypes.h>
#include <stack>
#include <map>
#include <utility>
#include <queue>
#include <set>
#include <memory>
// 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::WorkflowExecutionPlan> wep;
typedef std::map<wfs::Activity*, wfr::wfs::ActivityInstance*> activityInstanceMap_t;
typedef std::map<wfs::ActivityInstance*, std::pair<wep::AbstractWepNode*, wep::AbstractWepNode*>> wepNodeMap_t;
std::stack<wfs::ActivityInstance*> parentStack;
std::stack<std::pair<wep::AbstractWepNode*, wep::AbstractWepNode*>> parentWepStack;
std::stack<wfr_id_t> iterationIdStack;
wepNodeMap_t wepNodeMap;
std::vector<wep::AtomicWepNode*> readyToExecuteAtomicNodes;
std::vector<wep::AssignWepNode*> 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 visitActivity(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 handleChildren(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<wep::WorkflowExecutionPlan> createWEP(wfs::Workflow& wf, lwd::_wfr_lwd* input, lwd::_wfr_lwd* output);
bool updateExecutionPlan(std::queue<wfs::ActivityInstance*>& updateInstances);
const std::vector<wep::AtomicWepNode*>& getReadyToExecuteAtomicNodes() { return readyToExecuteAtomicNodes; }
const std::vector<wep::AssignWepNode*>& getReadyToExecuteAssignNodes() { return readyToExecuteAssignNodes; }
};
} /* namespace enactment */
} /* namespace wfr */