rad  2.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
request.hpp
Go to the documentation of this file.
1 
14 #ifndef RAD_MAL_REQUEST_HPP
15 #define RAD_MAL_REQUEST_HPP
16 
17 #include <rad/assert.hpp>
18 #include <rad/logger.hpp>
19 
20 #include <mal/rr/ServerContextProvider.hpp>
21 #include <mal/utility/future.hpp>
22 
23 #include <string>
24 
25 namespace rad {
26 namespace cii {
27 
35 template <typename REP_TYPE, typename REQ_TYPE = void>
36 class Request {
37  public:
45  explicit Request(const REQ_TYPE& req_payload)
46  : m_req_payload(req_payload),
47  m_rep_promise(std::make_shared<elt::mal::promise<REP_TYPE>>()) {
49  }
50 
54  Request(const Request& r) = default;
55 
59  Request& operator=(const Request& r) = default;
60 
67  const REQ_TYPE& GetRequestPayload() const {
69  return m_req_payload;
70  }
71 
78  elt::mal::future<REP_TYPE> GetReplyFuture() const {
80  RAD_ASSERTPTR(m_rep_promise);
81  return m_rep_promise->get_future();
82  }
83 
90  void SetReplyValue(const REP_TYPE& reply) const {
92  RAD_ASSERTPTR(m_rep_promise);
93  m_rep_promise->set_value(reply);
94  }
95 
102  template <class T>
103  void SetException(const T& e) const {
104  RAD_TRACE(GetLogger());
105  RAD_ASSERTPTR(m_rep_promise);
106  m_rep_promise->set_exception(boost::copy_exception(e));
107  }
108 
109  private:
110  REQ_TYPE m_req_payload; // Payload associated to the request.
111  /*
112  * We need a shared pointer to make Request copyable so
113  * it can be used as payload for the rad::Event class.
114  */
115  std::shared_ptr<elt::mal::promise<REP_TYPE>>
116  m_rep_promise; // Pointer to the promise associated to the reply.
117 };
118 
125 template <class REP_TYPE>
126 class Request<REP_TYPE, void> {
127  public:
132  Request() : m_rep_promise(std::make_shared<elt::mal::promise<REP_TYPE>>()) {
133  RAD_TRACE(GetLogger());
134  }
135 
139  Request(const Request& r) = default;
140 
144  Request& operator=(const Request& r) = default;
145 
152  elt::mal::future<REP_TYPE> GetReplyFuture() const {
153  RAD_TRACE(GetLogger());
154  RAD_ASSERTPTR(m_rep_promise);
155  return m_rep_promise->get_future();
156  }
157 
164  void SetReplyValue(const REP_TYPE& reply) const {
165  RAD_TRACE(GetLogger());
166  RAD_ASSERTPTR(m_rep_promise);
167  m_rep_promise->set_value(reply);
168  }
169 
177  template <class T>
178  void SetException(const T& e) const {
179  RAD_TRACE(GetLogger());
180  RAD_ASSERTPTR(m_rep_promise);
181  m_rep_promise->set_exception(boost::copy_exception(e));
182  }
183 
184  private:
185  /*
186  * We need a shared pointer to make Request copyable so
187  * it can be used as payload for the rad::Event class.
188  */
189  std::shared_ptr<elt::mal::promise<REP_TYPE>>
190  m_rep_promise; // Pointer to the promise associated to the reply.
191 };
192 
200 template <typename REP_TYPE, typename REQ_TYPE = void>
201 class RequestAmi {
202  public:
210  explicit RequestAmi(const REQ_TYPE& req_payload) {
211  RAD_TRACE(GetLogger());
212  m_server_ami = elt::mal::rr::ServerContextProvider::getInstance<
213  elt::mal::rr::ServerContext<REP_TYPE>>()
214  .createAmi();
215  }
216 
220  RequestAmi(const RequestAmi& r) = default;
221 
225  RequestAmi& operator=(const RequestAmi& r) = default;
226 
227  const REQ_TYPE& GetRequestPayload() const {
228  RAD_TRACE(GetLogger());
229  return m_req_payload;
230  }
231 
239  bool SetPartialReplyValue(const REP_TYPE& reply) const {
240  RAD_TRACE(GetLogger());
241  return m_server_ami->complete(reply);
242  }
243 
251  bool SetFinalReplyValue(const REP_TYPE& reply) const {
252  RAD_TRACE(GetLogger());
253  return m_server_ami->completed(reply);
254  }
255 
261  std::shared_ptr<::elt::mal::rr::Ami<REP_TYPE>> GetAmiServer() {
262  RAD_TRACE(GetLogger());
263  return m_server_ami;
264  }
265 
266  private:
267  REQ_TYPE m_req_payload; // Payload associated to the request.
268  std::shared_ptr<::elt::mal::rr::Ami<REP_TYPE>>
269  m_server_ami; // Pointer to the AMI object dealing with multiple replies.
270 };
271 
278 template <class REP_TYPE>
279 class RequestAmi<REP_TYPE, void> {
280  public:
286  RAD_TRACE(GetLogger());
287  m_server_ami = elt::mal::rr::ServerContextProvider::getInstance<
288  elt::mal::rr::ServerContext<REP_TYPE>>()
289  .createAmi();
290  }
291 
295  RequestAmi(const RequestAmi& r) = default;
296 
300  RequestAmi& operator=(const RequestAmi& r) = default;
301 
309  bool SetPartialReplyValue(const REP_TYPE& reply) const {
310  RAD_TRACE(GetLogger());
311  return m_server_ami->complete(reply);
312  }
313 
321  bool SetFinalReplyValue(const REP_TYPE& reply) const {
322  RAD_TRACE(GetLogger());
323  return m_server_ami->completed(reply);
324  }
325 
331  std::shared_ptr<::elt::mal::rr::Ami<REP_TYPE>> GetAmiServer() {
332  RAD_TRACE(GetLogger());
333  return m_server_ami;
334  }
335 
336  private:
337  std::shared_ptr<::elt::mal::rr::ServerAmi<REP_TYPE>>
338  m_server_ami; // Pointer to the AMI object dealing with multiple replies.
339 };
340 
341 } // namespace cii
342 } // namespace rad
343 
344 #endif // RAD_MAL_REQUEST_HPP
log4cplus::Logger & GetLogger()
Definition: logger.cpp:43
bool SetPartialReplyValue(const REP_TYPE &reply) const
Definition: request.hpp:239
bool SetFinalReplyValue(const REP_TYPE &reply) const
Definition: request.hpp:321
Definition: request.hpp:201
void SetException(const T &e) const
Definition: request.hpp:178
Request(const REQ_TYPE &req_payload)
Definition: request.hpp:45
RequestAmi()
Definition: request.hpp:285
#define RAD_ASSERTPTR(a)
Definition: assert.hpp:19
Request & operator=(const Request &r)=default
RequestAmi(const REQ_TYPE &req_payload)
Definition: request.hpp:210
bool SetPartialReplyValue(const REP_TYPE &reply) const
Definition: request.hpp:309
elt::mal::future< REP_TYPE > GetReplyFuture() const
Definition: request.hpp:152
const REQ_TYPE & GetRequestPayload() const
Definition: request.hpp:227
RequestAmi & operator=(const RequestAmi &r)=default
void SetReplyValue(const REP_TYPE &reply) const
Definition: request.hpp:164
bool SetFinalReplyValue(const REP_TYPE &reply) const
Definition: request.hpp:251
#define RAD_TRACE(logger)
Definition: logger.hpp:19
std::shared_ptr<::elt::mal::rr::Ami< REP_TYPE > > GetAmiServer()
Definition: request.hpp:261
void SetException(const T &e) const
Definition: request.hpp:103
elt::mal::future< REP_TYPE > GetReplyFuture() const
Definition: request.hpp:78
Request()
Definition: request.hpp:132
const REQ_TYPE & GetRequestPayload() const
Definition: request.hpp:67
void SetReplyValue(const REP_TYPE &reply) const
Definition: request.hpp:90
std::shared_ptr<::elt::mal::rr::Ami< REP_TYPE > > GetAmiServer()
Definition: request.hpp:331
Definition: request.hpp:36