73 lines
1.9 KiB
C++
Executable File
73 lines
1.9 KiB
C++
Executable File
|
|
#include <wfr/common/wfs/WorkflowTemplate.h>
|
|
#include <wfr/common/wfs/Workflow.h>
|
|
#include <wfr/common/wfs/ActivityTemplate.h>
|
|
#include <wfr/WorkflowRuntime.h>
|
|
#include <boost/format.hpp>
|
|
|
|
namespace wfr {
|
|
namespace wfs {
|
|
|
|
|
|
WorkflowTemplate::WorkflowTemplate( const std::string& name,
|
|
wfr_id_t topLevelActivityID,
|
|
std::initializer_list<ActivityTemplate*> activities)
|
|
: activities(activities), workflowName(name), topLevelActivityID(topLevelActivityID) {
|
|
if (activities.size() == 0) {
|
|
throw exception::wfr_fatal_error((boost::format("Workflow \"%1%\" has no activities.") % workflowName).str());
|
|
}
|
|
for (auto i : activities) {
|
|
i->initActivityTemplate(*this);
|
|
}
|
|
toplevelActivity = getActivityByID(topLevelActivityID);
|
|
if (!toplevelActivity) {
|
|
throw exception::wfr_fatal_error((boost::format("Workflow \"%1%\" has invalid top-level activity id %2%.") % workflowName % topLevelActivityID).str());
|
|
}
|
|
checkStructure();
|
|
}
|
|
|
|
|
|
WorkflowTemplate::~WorkflowTemplate() noexcept {
|
|
for (auto i : activities) {
|
|
if (i) delete i;
|
|
}
|
|
activities.clear();
|
|
}
|
|
|
|
|
|
ActivityTemplate* WorkflowTemplate::getActivityByID(wfr_id_t id) const noexcept {
|
|
ActivityTemplate* retval = nullptr;
|
|
for (auto i : activities) {
|
|
if (i->templateID == id) {
|
|
retval = i;
|
|
break;
|
|
}
|
|
}
|
|
return retval;
|
|
}
|
|
|
|
|
|
void WorkflowTemplate::checkStructure() {
|
|
for (auto i : activities) {
|
|
i->checkStructure();
|
|
}
|
|
}
|
|
|
|
|
|
std::shared_ptr<Workflow> WorkflowTemplate::execute(lwd::_wfr_lwd* input, lwd::_wfr_lwd* output) {
|
|
std::shared_ptr<Workflow> wf = std::shared_ptr<Workflow>(new Workflow(*this));
|
|
WorkflowRuntime::addWorkflowInstance(wf);
|
|
try {
|
|
wf->executeSync(input, output);
|
|
} catch (std::exception& e) {
|
|
std::cerr << "Error while executing workflow: Caught exception: " << e.what() << std::endl;
|
|
} catch (...) {
|
|
std::cerr << "Error while executing workflow: Caught unknown exception." << std::endl;
|
|
}
|
|
return wf;
|
|
}
|
|
|
|
|
|
} /* namespace wfs */
|
|
} /* namespace wfr */
|