hlcc 2.0.0-beta2+pre1
Loading...
Searching...
No Matches
replier.hpp
Go to the documentation of this file.
1
9#ifndef RAD_MAL_REPLIER_HPP
10#define RAD_MAL_REPLIER_HPP
11
12#include <rad/assert.hpp>
13#include <rad/logger.hpp>
14
15#include <mal/Cii.hpp>
16#include <mal/Mal.hpp>
17#include <mal/utility/LoadMal.hpp>
18
19#include <thread>
20
21namespace rad {
22namespace cii {
23
28class Replier final {
29 public:
36 explicit Replier(const elt::mal::Uri& uri,
37 const std::optional<elt::mal::Mal::Properties> mal_properties = {})
38 : m_server(nullptr) {
39 RAD_TRACE(GetLogger());
40
41 m_server = elt::mal::CiiFactory::getInstance().createServer(
42 uri, elt::mal::rr::qos::QoS::DEFAULT,
43 mal_properties ? *mal_properties : elt::mal::Mal::Properties());
44 RAD_ASSERTPTR(m_server);
45
46 LOG4CPLUS_DEBUG(GetLogger(), "Created MAL server for <" << uri << ">");
47
48 m_thread = std::thread([this]() { m_server->run(); });
49 }
50
56 RAD_TRACE(GetLogger());
57
58 RAD_ASSERTPTR(m_server);
59 try {
60 m_server->close();
61 if (m_thread.joinable() == false) {
62 LOG4CPLUS_ERROR(GetLogger(), "Thread not joinable!");
63 return;
64 }
65 m_thread.join();
66 } catch (...) {
67 LOG4CPLUS_ERROR(GetLogger(), "Unknown exception when closing MAL server!");
68 }
69 LOG4CPLUS_DEBUG(GetLogger(), "Terminated MAL server thread.");
70 }
71
79 template <class SERVICE_TYPE>
80 void RegisterService(const std::string& name, std::shared_ptr<SERVICE_TYPE> service) {
81 RAD_TRACE(GetLogger());
82 RAD_ASSERTPTR(m_server);
83 std::shared_ptr<elt::mal::rr::RrEntity> rrservice = service;
84 m_server->registerService<SERVICE_TYPE, false>(name, rrservice);
85 LOG4CPLUS_DEBUG(GetLogger(), "Registered service <" << name << ">");
86 }
87
93 void UnregisterService(const std::string& name) {
94 RAD_TRACE(GetLogger());
95 RAD_ASSERTPTR(m_server);
96 m_server->unregisterService(name);
97 LOG4CPLUS_DEBUG(GetLogger(), "Unregistered service <" << name << ">");
98 }
99
100#if 0
101 void Start() {
102 RAD_TRACE(GetLogger());
103 RAD_ASSERTPTR(m_mal_server);
104 m_thread = std::thread(&Replier::Run, this);
105 LOG4CPLUS_DEBUG(GetLogger(), "Started MAL server thread.");
106 }
107
108 void Run() {
109 RAD_TRACE(GetLogger());
110 RAD_ASSERTPTR(m_mal_server);
111 m_mal_server->run();
112 }
113
114 void Stop() {
115 RAD_TRACE(GetLogger());
116 RAD_ASSERTPTR(m_mal_server);
117 m_mal_server->close();
118 if (m_thread.joinable() == false) {
119 LOG4CPLUS_ERROR(GetLogger(), "Thread not joinable!");
120 return;
121 }
122 m_thread.join();
123 LOG4CPLUS_DEBUG(GetLogger(), "Terminated MAL server thread.");
124 }
125#endif
126
127 Replier(const Replier&) = delete;
128 Replier& operator=(const Replier&) = delete;
129
130 private:
131 std::unique_ptr<elt::mal::rr::Server> m_server; // MAL Server.
132 std::thread m_thread; // Thread used to run the MAL Server.
133};
134
135#if 0
136template<typename SERVICE_TYPE, typename INTERFACE_TYPE>
137class Replier {
138public:
139 Replier(const std::string& serverUri,
140 const std::string& malType,
141 const std::string& serviceName,
142 rad::SMAdapter& sm) : m_mal_server(nullptr) {
143 RAD_TRACE(GetLogger());
144
145 elt::mal::CiiFactory& factory = elt::mal::CiiFactory::getInstance();
146
147 elt::mal::Mal::Properties mal_properties;
148 auto malInstance = elt::mal::loadMal(malType, mal_properties);
149
150 elt::mal::Uri sUri = elt::mal::Uri(serverUri);
151 std::string scheme = sUri.scheme().to_string();
152 factory.registerMal(scheme, malInstance);
153 LOG4CPLUS_DEBUG(GetLogger(), "Registered MAL.");
154
155 m_mal_server = factory.createServer(sUri, elt::mal::rr::qos::QoS::DEFAULT, mal_properties);
156
157 std::shared_ptr<elt::mal::rr::RrEntity> serviceImpl = std::make_shared<INTERFACE_TYPE>(sm);
158 m_mal_server->registerService<SERVICE_TYPE, false>(serviceName, serviceImpl);
159
160 LOG4CPLUS_DEBUG(GetLogger(), "Registered MAL <" << malType << "> service <" << serviceName << "> on <" << sUri << ">");
161 }
162
163 void Start() {
164 RAD_TRACE(GetLogger());
165
166 if (m_mal_server != nullptr) {
167 m_thread = std::thread(&Replier::Run, this);
168 LOG4CPLUS_DEBUG(GetLogger(), "Started MAL server thread.");
169 }
170 }
171
172 void Run() {
173 RAD_TRACE(GetLogger());
174
175 if (m_mal_server != nullptr) {
176 m_mal_server->run();
177 }
178 }
179
180 void Stop() {
181 RAD_TRACE(GetLogger());
182
183 if (m_mal_server != nullptr) {
184 m_mal_server->close();
185 if (m_thread.joinable() == false) {
186 std::cout << "Thread not joinable!\n";
187 return;
188 }
189 m_thread.join();
190 LOG4CPLUS_DEBUG(GetLogger(), "Terminated MAL server thread.");
191 }
192 }
193
194 Replier(const Replier&) = delete;
195 Replier& operator= (const Replier&) = delete;
196
197private:
198 std::unique_ptr<elt::mal::rr::Server> m_server;
199 std::thread m_thread;
200};
201#endif
202
203} // namespace cii
204} // namespace rad
205
206#endif // RAD_MAL_REPLIER_HPP
Definition: replier.hpp:28
void UnregisterService(const std::string &name)
Definition: replier.hpp:93
Replier(const elt::mal::Uri &uri, const std::optional< elt::mal::Mal::Properties > mal_properties={})
Definition: replier.hpp:36
Replier(const Replier &)=delete
void RegisterService(const std::string &name, std::shared_ptr< SERVICE_TYPE > service)
Definition: replier.hpp:80
~Replier()
Definition: replier.hpp:55
Replier & operator=(const Replier &)=delete
log4cplus::Logger & GetLogger()
Definition: logger.cpp:17
Definition: replier.hpp:21