#include #include #include #include #include namespace wfr { namespace wfs { WorkflowTemplate::WorkflowTemplate( const std::string& name, wfr_id_t topLevelActivityID, std::initializer_list 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 WorkflowTemplate::execute(lwd::_wfr_lwd* input, lwd::_wfr_lwd* output) { std::shared_ptr wf = std::shared_ptr(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 */