rad 6.2.0
Loading...
Searching...
No Matches
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#include <rad/exceptions.hpp>
20
21#include <mal/rr/ServerContextProvider.hpp>
22#include <mal/utility/future.hpp>
23#include <mal/MalException.hpp>
24
25#include <type_traits>
26#include <string>
27
28namespace rad {
29namespace cii {
30
38template <typename REP_TYPE, typename REQ_TYPE = void>
39class Request {
40 public:
48 explicit Request(const REQ_TYPE& req_payload)
49 : m_req_payload(req_payload),
50 m_rep_promise(std::make_shared<elt::mal::promise<REP_TYPE>>()) {
52 }
53
58 Request(const Request&) = default;
59 Request(Request&&) noexcept(std::is_nothrow_move_constructible<REQ_TYPE>()) = default;
61
66 Request& operator=(const Request&) = default;
67 Request& operator=(Request&&) noexcept(std::is_nothrow_move_assignable_v<REQ_TYPE>) = default;
69
76 const REQ_TYPE& GetRequestPayload() const {
78 return m_req_payload;
79 }
80
87 elt::mal::future<REP_TYPE> GetReplyFuture() const {
89 RAD_ASSERTPTR(m_rep_promise);
90 return m_rep_promise->get_future();
91 }
92
102 std::shared_ptr<elt::mal::promise<REP_TYPE>> GetReplyPromise() const {
104 RAD_ASSERTPTR(m_rep_promise);
105 return m_rep_promise;
106 }
107
114 void SetReplyValue(const REP_TYPE& reply) const {
116 RAD_ASSERTPTR(m_rep_promise);
117 try {
118 m_rep_promise->set_value(reply);
119 } catch(boost::wrapexcept<boost::promise_already_satisfied>& e) {
120 RAD_LOG_THROW(rad::Exception, GetLogger(), "Reply or Exception was already sent.");
121 }
122 }
123
132 template <class T>
133 void SetException(const T& e) const {
134 // EICSSW-1303 Exception type T must derive from elt::mal::MalException
135 static_assert(std::is_base_of_v<elt::mal::MalException, T>,
136 "T must derive from MalException");
138 RAD_ASSERTPTR(m_rep_promise);
139 try {
140 m_rep_promise->set_exception(boost::copy_exception(e));
141 } catch(boost::wrapexcept<boost::promise_already_satisfied>& e1) {
142 RAD_LOG_THROW(rad::Exception, GetLogger(), "Reply or Exception was already sent.");
143 }
144 }
145
146 private:
147 REQ_TYPE m_req_payload; // Payload associated to the request.
148 /*
149 * We need a shared pointer to make Request copyable so
150 * it can be used as payload for the rad::Event class.
151 */
152 std::shared_ptr<elt::mal::promise<REP_TYPE>>
153 m_rep_promise; // Pointer to the promise associated to the reply.
154};
155
162template <class REP_TYPE>
163class Request<REP_TYPE, void> {
164 public:
169 Request() : m_rep_promise(std::make_shared<elt::mal::promise<REP_TYPE>>()) {
171 }
172
177 Request(const Request&) = default;
178 Request(Request&&) noexcept = default;
180
185 Request& operator=(const Request&) = default;
186 Request& operator=(Request&&) noexcept = default;
188
195 elt::mal::future<REP_TYPE> GetReplyFuture() const {
197 RAD_ASSERTPTR(m_rep_promise);
198 return m_rep_promise->get_future();
199 }
200
210 std::shared_ptr<elt::mal::promise<REP_TYPE>> GetReplyPromise() const {
212 RAD_ASSERTPTR(m_rep_promise);
213 return m_rep_promise;
214 }
215
222 void SetReplyValue(const REP_TYPE& reply) const {
224 RAD_ASSERTPTR(m_rep_promise);
225 try {
226 m_rep_promise->set_value(reply);
227 } catch(boost::wrapexcept<boost::promise_already_satisfied>& e) {
228 RAD_LOG_THROW(rad::Exception, GetLogger(), "Reply or Exception was already sent.");
229 }
230 }
231
239 template <class T>
240 void SetException(const T& e) const {
241 // EICSSW-1303 Exception type T must derive from elt::mal::MalException
242 static_assert(std::is_base_of_v<elt::mal::MalException, T>,
243 "T must derive from MalException");
245 RAD_ASSERTPTR(m_rep_promise);
246 try {
247 m_rep_promise->set_exception(boost::copy_exception(e));
248 } catch(boost::wrapexcept<boost::promise_already_satisfied>& e1) {
249 RAD_LOG_THROW(rad::Exception, GetLogger(), "Reply or Exception was already sent.");
250 }
251 }
252
253 private:
254 /*
255 * We need a shared pointer to make Request copyable so
256 * it can be used as payload for the rad::Event class.
257 */
258 std::shared_ptr<elt::mal::promise<REP_TYPE>>
259 m_rep_promise; // Pointer to the promise associated to the reply.
260};
261
269template <typename REP_TYPE, typename REQ_TYPE = void>
271 public:
279 explicit RequestAmi(const REQ_TYPE& req_payload) {
281 m_server_ami = elt::mal::rr::ServerContextProvider::getInstance<
282 elt::mal::rr::ServerContext<REP_TYPE>>()
283 .createAmi();
284 }
288 // @{
289 RequestAmi(const RequestAmi&) = default;
290 RequestAmi(RequestAmi&&) noexcept(std::is_nothrow_move_constructible<REQ_TYPE>()) = default;
291 // @}
292
296 // @{
297 RequestAmi& operator=(const RequestAmi&) = default;
299 operator=(RequestAmi&&) noexcept(std::is_nothrow_move_assignable_v<REQ_TYPE>) = default;
300 // @}
301
302 const REQ_TYPE& GetRequestPayload() const {
304 return m_req_payload;
305 }
306
314 bool SetPartialReplyValue(const REP_TYPE& reply) const {
316 return m_server_ami->complete(reply);
317 }
318
326 bool SetFinalReplyValue(const REP_TYPE& reply) const {
328 return m_server_ami->completed(reply);
329 }
330
336 std::shared_ptr<::elt::mal::rr::Ami<REP_TYPE>> GetAmiServer() {
338 return m_server_ami;
339 }
340
341 private:
342 REQ_TYPE m_req_payload; // Payload associated to the request.
343 std::shared_ptr<::elt::mal::rr::Ami<REP_TYPE>>
344 m_server_ami; // Pointer to the AMI object dealing with multiple replies.
345};
346
353template <class REP_TYPE>
354class RequestAmi<REP_TYPE, void> {
355 public:
362 m_server_ami = elt::mal::rr::ServerContextProvider::getInstance<
363 elt::mal::rr::ServerContext<REP_TYPE>>()
364 .createAmi();
365 }
366
370 // @{
371 RequestAmi(const RequestAmi&) = default;
372 RequestAmi(RequestAmi&&) noexcept = default;
373 // @}
374
378 // @{
379 RequestAmi& operator=(const RequestAmi&) = default;
380 RequestAmi& operator=(RequestAmi&&) noexcept = default;
381 // @}
382
390 bool SetPartialReplyValue(const REP_TYPE& reply) const {
392 return m_server_ami->complete(reply);
393 }
394
402 bool SetFinalReplyValue(const REP_TYPE& reply) const {
404 return m_server_ami->completed(reply);
405 }
406
412 std::shared_ptr<::elt::mal::rr::Ami<REP_TYPE>> GetAmiServer() {
414 return m_server_ami;
415 }
416
417 private:
418 std::shared_ptr<::elt::mal::rr::ServerAmi<REP_TYPE>>
419 m_server_ami; // Pointer to the AMI object dealing with multiple replies.
420};
421
422} // namespace cii
423} // namespace rad
424
425#endif // RAD_MAL_REQUEST_HPP
Assert header file.
#define RAD_ASSERTPTR(a)
Definition assert.hpp:19
Base class for the exceptions thrown by RAD and its users.
Definition exceptions.hpp:53
std::shared_ptr<::elt::mal::rr::Ami< REP_TYPE > > GetAmiServer()
Definition request.hpp:412
RequestAmi(const RequestAmi &)=default
RequestAmi()
Definition request.hpp:360
bool SetFinalReplyValue(const REP_TYPE &reply) const
Definition request.hpp:402
RequestAmi(RequestAmi &&) noexcept=default
Definition request.hpp:270
bool SetPartialReplyValue(const REP_TYPE &reply) const
Definition request.hpp:314
RequestAmi(const REQ_TYPE &req_payload)
Definition request.hpp:279
RequestAmi(RequestAmi &&) noexcept(std::is_nothrow_move_constructible< REQ_TYPE >())=default
bool SetFinalReplyValue(const REP_TYPE &reply) const
Definition request.hpp:326
const REQ_TYPE & GetRequestPayload() const
Definition request.hpp:302
RequestAmi(const RequestAmi &)=default
std::shared_ptr<::elt::mal::rr::Ami< REP_TYPE > > GetAmiServer()
Definition request.hpp:336
void SetException(const T &e) const
Definition request.hpp:240
Request(const Request &)=default
std::shared_ptr< elt::mal::promise< REP_TYPE > > GetReplyPromise() const
Definition request.hpp:210
Request(Request &&) noexcept=default
Request()
Definition request.hpp:169
void SetReplyValue(const REP_TYPE &reply) const
Definition request.hpp:222
Definition request.hpp:39
void SetException(const T &e) const
Definition request.hpp:133
Request(const Request &)=default
elt::mal::future< REP_TYPE > GetReplyFuture() const
Definition request.hpp:87
Request(Request &&) noexcept(std::is_nothrow_move_constructible< REQ_TYPE >())=default
void SetReplyValue(const REP_TYPE &reply) const
Definition request.hpp:114
std::shared_ptr< elt::mal::promise< REP_TYPE > > GetReplyPromise() const
Definition request.hpp:102
Request(const REQ_TYPE &req_payload)
Definition request.hpp:48
const REQ_TYPE & GetRequestPayload() const
Definition request.hpp:76
Logger class.
#define RAD_TRACE(logger)
Definition logger.hpp:21
Exception classes header file.
#define RAD_LOG_THROW(exceptionType_t, logger, msg)
Throw exception with information about the throw location.
Definition exceptions.hpp:356
Definition actionsApp.cpp:23
log4cplus::Logger & GetLogger()
Definition logger.cpp:72
Definition errors.hpp:58