WebFramework v3.0.12
Web framework for C++.
Loading...
Searching...
No Matches
IExecutorFunctionality.cpp
1#include "IExecutorFunctionality.h"
2
3#include "Exceptions/CantFindFunctionException.h"
4#include "Exceptions/MissingLoadTypeException.h"
5#include "Utility/Sources.h"
6#include "Log.h"
7
8using namespace std;
9
10namespace framework
11{
12 namespace interfaces
13 {
14 unordered_map<string, utility::JSONSettingsParser::ExecutorSettings> IExecutorFunctionality::createExecutorSettings(const vector<utility::JSONSettingsParser>& parsers)
15 {
16 unordered_map<string, utility::JSONSettingsParser::ExecutorSettings> result;
17
18 for (const utility::JSONSettingsParser& parser : parsers)
19 {
20 for (const auto& [key, value] : parser.getSettings())
21 {
22 utility::JSONSettingsParser::ExecutorSettings executorSettings;
23
24 executorSettings.name = value.name;
25 executorSettings.executorLoadType = value.executorLoadType;
26
27 if (value.initParameters.data.size())
28 {
29 executorSettings.initParameters = json::utility::jsonObject(value.initParameters);
30 }
31
32 result.try_emplace(key, move(executorSettings));
33 }
34 }
35
36 return result;
37 }
38
39 IExecutorFunctionality::IExecutorFunctionality
40 (
41 const json::JSONParser& configuration,
42 const filesystem::path& assets,
43 const filesystem::path& pathToTemplates,
44 uint64_t cachingSize,
45 const vector<utility::JSONSettingsParser>& parsers,
46 const vector<string>& pathToSources
47 )
48 {
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);
54
55 routes.reserve(settings.size());
56 creators.reserve(settings.size());
57
58 vector<pair<string, string>> nodes;
59
60 for (const auto& [i, j] : settings)
61 {
62 createExecutorFunction creator = nullptr;
63
64 for (const auto& source : sources)
65 {
66 if (creator = reinterpret_cast<createExecutorFunction>(utility::load(source, format("create{}Instance", j.name))))
67 {
68 break;
69 }
70 }
71
72 if (!creator)
73 {
74 if (Log::isValid())
75 {
76 Log::error("Can't find creator for executor {}", "LogWebFrameworkInitialization", j.name);
77 }
78
79 throw exceptions::CantFindFunctionException(format("create{}Instance", j.name));
80 }
81
82 switch (j.executorLoadType)
83 {
84 case utility::JSONSettingsParser::ExecutorSettings::loadType::initialization:
85 if (i.find('{') == string::npos)
86 {
87 auto [it, success] = routes.try_emplace
88 (
89 i,
90 unique_ptr<BaseExecutor>(static_cast<BaseExecutor*>(creator()))
91 );
92
93 if (success)
94 {
95 if (it->second->getType() == BaseExecutor::executorType::stateful || it->second->getType() == BaseExecutor::executorType::heavyOperationStateful)
96 {
97 routes.erase(i);
98 }
99 else
100 {
101 it->second->init(j);
102 }
103 }
104 }
105 else
106 {
107 routeParameters.push_back(i);
108
109 auto [it, success] = routes.try_emplace
110 (
111 routeParameters.back().baseRoute,
112 unique_ptr<BaseExecutor>(static_cast<BaseExecutor*>(creator()))
113 );
114
115 nodes.emplace_back(i, routeParameters.back().baseRoute);
116
117 if (success)
118 {
119 it->second->init(j);
120 }
121 }
122
123 break;
124
125 case utility::JSONSettingsParser::ExecutorSettings::loadType::dynamic:
126 if (i.find('{') != string::npos)
127 {
128 routeParameters.push_back(i);
129
130 nodes.emplace_back(i, routeParameters.back().baseRoute);
131 }
132
133 break;
134
135 case utility::JSONSettingsParser::ExecutorSettings::loadType::none:
136 throw exceptions::MissingLoadTypeException(j.name);
137
138 break;
139 }
140
141 creators.try_emplace(j.name, creator);
142 }
143
144 for (auto&& [i, j] : nodes)
145 {
146 auto node = settings.extract(i);
147
148 node.key() = move(j);
149
150 settings.insert(move(node)); //-V837
151 }
152
153 executorsManager.init(configuration, assets, cachingSize, pathToTemplates, move(routes), move(creators), move(settings), move(routeParameters));
154
155 resources = executorsManager.getResourceExecutor();
156 }
157 }
158}