rad  2.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
21 namespace rad {
22 namespace cii {
23 
28 class Replier final {
29  public:
36  Replier(const elt::mal::Uri& uri,
37  const std::optional<elt::mal::Mal::Properties> mal_properties = {})
38  : m_server(nullptr) {
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 
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) {
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) {
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
136 template<typename SERVICE_TYPE, typename INTERFACE_TYPE>
137 class Replier {
138 public:
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 
197 private:
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
log4cplus::Logger & GetLogger()
Definition: logger.cpp:43
void UnregisterService(const std::string &name)
Definition: replier.hpp:93
Replier & operator=(const Replier &)=delete
#define RAD_ASSERTPTR(a)
Definition: assert.hpp:19
Definition: smAdapter.hpp:42
~Replier()
Definition: replier.hpp:55
Definition: replier.hpp:28
#define RAD_TRACE(logger)
Definition: logger.hpp:19
Replier(const elt::mal::Uri &uri, const std::optional< elt::mal::Mal::Properties > mal_properties={})
Definition: replier.hpp:36
void RegisterService(const std::string &name, std::shared_ptr< SERVICE_TYPE > service)
Definition: replier.hpp:80