rad  5.1.0
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 
22 namespace rad {
23 namespace cii {
24 
29 class 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() {
103  RAD_TRACE(GetLogger());
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() {
110  RAD_TRACE(GetLogger());
111  RAD_ASSERTPTR(m_mal_server);
112  m_mal_server->run();
113  }
114 
115  void Stop() {
116  RAD_TRACE(GetLogger());
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
137 template<typename SERVICE_TYPE, typename INTERFACE_TYPE>
138 class Replier {
139 public:
140  Replier(const std::string& serverUri,
141  const std::string& malType,
142  const std::string& serviceName,
143  rad::SMAdapter& sm) : m_mal_server(nullptr) {
144  RAD_TRACE(GetLogger());
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() {
165  RAD_TRACE(GetLogger());
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() {
174  RAD_TRACE(GetLogger());
175 
176  if (m_mal_server != nullptr) {
177  m_mal_server->run();
178  }
179  }
180 
181  void Stop() {
182  RAD_TRACE(GetLogger());
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 
198 private:
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 & operator=(const Replier &)=delete
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
Logger class.
#define RAD_TRACE(logger)
Definition: logger.hpp:24
Definition: actionsApp.cpp:20
log4cplus::Logger & GetLogger()
Definition: logger.cpp:70
name
Definition: wscript:8