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