1#include "IExecutorFunctionality.h"
3#include "Exceptions/CantFindFunctionException.h"
4#include "Exceptions/MissingLoadTypeException.h"
5#include "Utility/Sources.h"
14 unordered_map<string, utility::JSONSettingsParser::ExecutorSettings> IExecutorFunctionality::createExecutorSettings(
const vector<utility::JSONSettingsParser>& parsers)
16 unordered_map<string, utility::JSONSettingsParser::ExecutorSettings> result;
18 for (
const utility::JSONSettingsParser& parser : parsers)
20 for (
const auto& [key, value] : parser.getSettings())
22 utility::JSONSettingsParser::ExecutorSettings executorSettings;
24 executorSettings.name = value.name;
25 executorSettings.executorLoadType = value.executorLoadType;
27 if (value.initParameters.data.size())
29 executorSettings.initParameters = json::utility::jsonObject(value.initParameters);
32 result.try_emplace(key, move(executorSettings));
39 IExecutorFunctionality::IExecutorFunctionality
41 const json::JSONParser& configuration,
42 const filesystem::path& assets,
43 const filesystem::path& pathToTemplates,
45 const vector<utility::JSONSettingsParser>& parsers,
46 const vector<string>& pathToSources
49 unordered_map<string, unique_ptr<BaseExecutor>> routes;
50 unordered_map<string, createExecutorFunction> creators;
51 vector<utility::RouteParameters> routeParameters;
52 unordered_map<string, utility::JSONSettingsParser::ExecutorSettings> settings = IExecutorFunctionality::createExecutorSettings(parsers);
53 vector<HMODULE> sources = utility::loadSources(pathToSources);
55 routes.reserve(settings.size());
56 creators.reserve(settings.size());
58 vector<pair<string, string>> nodes;
60 for (
const auto& [i, j] : settings)
62 createExecutorFunction creator =
nullptr;
64 for (
const auto& source : sources)
66 if (creator =
reinterpret_cast<createExecutorFunction
>(utility::load(source, format(
"create{}Instance", j.name))))
76 Log::error(
"Can't find creator for executor {}",
"LogWebFrameworkInitialization", j.name);
79 throw exceptions::CantFindFunctionException(format(
"create{}Instance", j.name));
82 switch (j.executorLoadType)
84 case utility::JSONSettingsParser::ExecutorSettings::loadType::initialization:
85 if (i.find(
'{') == string::npos)
87 auto [it, success] = routes.try_emplace
90 unique_ptr<BaseExecutor>(
static_cast<BaseExecutor*
>(creator()))
95 if (it->second->getType() == BaseExecutor::executorType::stateful || it->second->getType() == BaseExecutor::executorType::heavyOperationStateful)
107 routeParameters.push_back(i);
109 auto [it, success] = routes.try_emplace
111 routeParameters.back().baseRoute,
112 unique_ptr<BaseExecutor>(
static_cast<BaseExecutor*
>(creator()))
115 nodes.emplace_back(i, routeParameters.back().baseRoute);
125 case utility::JSONSettingsParser::ExecutorSettings::loadType::dynamic:
126 if (i.find(
'{') != string::npos)
128 routeParameters.push_back(i);
130 nodes.emplace_back(i, routeParameters.back().baseRoute);
135 case utility::JSONSettingsParser::ExecutorSettings::loadType::none:
136 throw exceptions::MissingLoadTypeException(j.name);
141 creators.try_emplace(j.name, creator);
144 for (
auto&& [i, j] : nodes)
146 auto node = settings.extract(i);
148 node.key() = move(j);
150 settings.insert(move(node));
153 executorsManager.init(configuration, assets, cachingSize, pathToTemplates, move(routes), move(creators), move(settings), move(routeParameters));
155 resources = executorsManager.getResourceExecutor();