DDS  ver. 3.4
ToolsProtocolCore.h
Go to the documentation of this file.
1 // Copyright 2019 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 
6 #ifndef DDS_TOOLSPROTOCOLCORE_H
7 #define DDS_TOOLSPROTOCOLCORE_H
8 
9 // STD
10 #include <string>
11 // BOOST
12 #include <boost/crc.hpp>
13 #include <boost/property_tree/json_parser.hpp>
14 #include <boost/uuid/uuid.hpp>
15 #include <boost/uuid/uuid_generators.hpp>
16 #include <boost/uuid/uuid_io.hpp>
17 
18 /*
19 {
20  "dds": {
21  "tools-api": {
22  "message": {
23  "msg": "string",
24  "severity": 123,
25  "requestID": 123
26  },
27  "done": {
28  "requestID": 123
29  },
30  "progress":{
31  "completed": 123,
32  "total": 123,
33  "errors": 123,
34  "time": 123,
35  "srcCommand": 123
36  },
37  "submit": {
38  "rms": "string",
39  "instances": 123,
40  "config": "string",
41  "pluginPath": "string",
42  "requestID": 123
43  },
44  "topology": {
45  "updateType": 123,
46  "topologyFile": "string",
47  "disableValidation": false,
48  "requestID": 123
49  },
50  "getlog": {
51  "requestID": 123
52  },
53  "commanderInfo":
54  {
55  "pid":123,
56  "idleAgentsCount": 123,
57  "activeTopologyName": "string",
58  "requestID": 123
59  },
60  "agentInfo":
61  {
62  "index": 0,
63  "lobbyLeader" : true,
64  "agentID": 3456,
65  "taskID": 5678,
66  "startUpTime": 12345,
67  "agentState": "executing",
68  "username": "user1"
69  "host": "host1",
70  "DDSPath": "/path/to/dds",
71  "agentPid": 34
72  "requestID": 123
73  },
74  "agentCount":
75  {
76  "activeSlotsCount": 123,
77  "idleSlotsCount" : 234,
78  "executingSlotsCount": 345,
79  "requestID": 123
80  },
81  }
82  }
83 }
84 */
85 
86 #define DDS_TOOLS_DECLARE_DATA_CLASS(theBaseClass, theClass, theTag) \
87  struct theClass : theBaseClass<theClass> \
88  { \
89  private: \
90  friend SBaseData<theClass>; \
91  friend theBaseClass<theClass>; \
92  void _fromPT(const boost::property_tree::ptree& _pt) \
93  { \
94  } \
95  void _toPT(boost::property_tree::ptree& _pt) const \
96  { \
97  } \
98  static constexpr const char* _protocolTag = theTag; \
99  \
100  public: \
101  bool operator==(const theClass& _val) const \
102  { \
103  return SBaseData::operator==(_val); \
104  } \
105  };
106 
107 namespace dds
108 {
109  namespace tools_api
110  {
111  typedef uint64_t requestID_t;
112 
113  template <class T>
114  struct SBaseData
115  {
117 
120  std::string toJSON() const
121  {
122  boost::property_tree::ptree pt;
123 
124  toPT(pt);
125 
126  boost::property_tree::ptree ptParent;
127 
128  auto parentPtr = static_cast<const T*>(this);
129  ptParent.put_child("dds.tools-api." + std::string(parentPtr->_protocolTag), pt);
130 
131  std::stringstream json;
132  boost::property_tree::write_json(json, ptParent);
133 
134  return json.str();
135  }
136 
139  void toPT(boost::property_tree::ptree& _pt) const
140  {
141  auto parentPtr = static_cast<const T*>(this);
142 
143  _pt.put<requestID_t>("requestID", m_requestID);
144 
145  return parentPtr->_toPT(_pt);
146  }
147 
150  void fromPT(const boost::property_tree::ptree& _pt)
151  {
152  auto parentPtr = static_cast<T*>(this);
153 
154  m_requestID = _pt.get<uint64_t>("requestID", 0);
155 
156  return parentPtr->_fromPT(_pt);
157  }
158 
160  bool operator==(const T& _val) const
161  {
162  return (m_requestID == _val.m_requestID);
163  }
164 
166  friend std::ostream& operator<<(std::ostream& _os, const SBaseData& _data)
167  {
168  auto parentPtr = static_cast<const T*>(_data);
169  return _os << "requestID: " << _data.m_requestID << "; protocolTag: " << parentPtr->_protocolTag;
170  }
171 
173  std::string defaultToString() const
174  {
175  std::stringstream ss;
176  auto parentPtr = static_cast<const T*>(this);
177  ss << "requestID: " << m_requestID << "; protocolTag: " << parentPtr->_protocolTag;
178  return ss.str();
179  }
180  };
181 
182  template <class T>
183  struct SBaseRequestData : public SBaseData<T>
184  {
185  };
186 
187  template <class T>
188  struct SBaseResponseData : public SBaseData<T>
189  {
190  };
191 
192  struct SEmptyResponseData : SBaseResponseData<SEmptyResponseData>
193  {
194  private:
196  void _fromPT(const boost::property_tree::ptree& _pt)
197  {
198  throw std::runtime_error("DDS Tools API: bad usage of SEmptyResponseData");
199  }
200 
201  void _toPT(boost::property_tree::ptree& _pt) const
202  {
203  throw std::runtime_error("DDS Tools API: bad usage of SEmptyResponseData");
204  }
205  static std::string _protocolTag()
206  {
207  throw std::runtime_error("DDS Tools API: bad usage of SEmptyResponseData");
208  }
209 
210  public:
212  bool operator==(const SEmptyResponseData& _val) const
213  {
214  throw std::runtime_error("DDS Tools API: bad usage of SEmptyRequestData");
215  }
216  };
217 
218  // forward declaration
219  struct SDoneResponseData;
220  struct SMessageResponseData;
221  struct SProgressResponseData;
222 
223  template <class TRequest, class TResponse>
225  {
226  using response_t = TResponse;
227  using request_t = TRequest;
228  using responseVector_t = std::vector<response_t>;
229 
230  typedef std::shared_ptr<SBaseRequestImpl> ptr_t;
231 
233  typedef std::function<void(const response_t&)> callbackResponse_t;
235  typedef std::function<void(const SProgressResponseData&)> callbackProgress_t;
237  typedef std::function<void(const SMessageResponseData&)> callbackMessage_t;
239  typedef std::function<void()> callbackDone_t;
240 
241  public:
242  static ptr_t makeRequest(const request_t& _request)
243  {
244  // we don't use make_shared here, becasue the constructor is private
245  auto ptr = std::shared_ptr<SBaseRequestImpl>(new SBaseRequestImpl());
246  requestID_t requestID = ptr->m_request.m_requestID;
247  ptr->m_request = _request;
248  ptr->m_request.m_requestID = requestID;
249  return ptr;
250  }
251 
252  void setResponseCallback(callbackResponse_t _callbackResponse)
253  {
254  m_callbackResponse = _callbackResponse;
255  }
256 
257  void setProgressCallback(callbackProgress_t _callbackProgress)
258  {
259  m_callbackProgress = _callbackProgress;
260  }
261 
262  void setMessageCallback(callbackMessage_t _callbackMessage)
263  {
264  m_callbackMessage = _callbackMessage;
265  }
266 
267  void setDoneCallback(callbackDone_t _callbackDone)
268  {
269  m_callbackDone = _callbackDone;
270  }
271 
274  {
275  try
276  {
277  if (m_callbackResponse)
278  m_callbackResponse(_arg);
279  }
280  catch (const std::exception& e)
281  {
282  throw std::runtime_error(std::string("ResponseCallback: ") + e.what());
283  }
284  }
285 
287  {
288  try
289  {
290  if (m_callbackProgress)
291  m_callbackProgress(_arg);
292  }
293  catch (const std::exception& e)
294  {
295  throw std::runtime_error(std::string("ProgressCallback: ") + e.what());
296  }
297  }
298 
299  void execMessageCallback(const SMessageResponseData& _arg)
300  {
301  try
302  {
303  if (m_callbackMessage)
304  m_callbackMessage(_arg);
305  }
306  catch (const std::exception& e)
307  {
308  throw std::runtime_error(std::string("MessageCallback: ") + e.what());
309  }
310  }
311 
313  {
314  try
315  {
316  if (m_callbackDone)
317  m_callbackDone();
318  }
319  catch (const std::exception& e)
320  {
321  throw std::runtime_error(std::string("DoneCallback: ") + e.what());
322  }
323  }
324 
325  const request_t& getRequest() const
326  {
327  return m_request;
328  }
329 
330  protected:
332  {
333  const boost::uuids::uuid id = boost::uuids::random_generator()();
334  std::stringstream strid;
335  strid << id;
336 
337  m_request.m_requestID = crc64(strid.str());
338  }
340 
341  uint64_t crc64(const std::string& _str)
342  {
343  boost::crc_optimal<64, 0x04C11DB7, 0, 0, false, false> crc;
344  crc.process_bytes(_str.data(), _str.size());
345  return crc.checksum();
346  }
347 
348  private:
349  callbackResponse_t m_callbackResponse;
350  callbackProgress_t m_callbackProgress;
351  callbackMessage_t m_callbackMessage;
352  callbackDone_t m_callbackDone;
353 
354  request_t m_request;
355  };
356  } // namespace tools_api
357 } // namespace dds
358 
359 #endif /* DDS_TOOLSPROTOCOLCORE_H */
TRequest request_t
Definition: ToolsProtocolCore.h:227
bool operator==(const T &_val) const
Equality operator.
Definition: ToolsProtocolCore.h:160
requestID_t m_requestID
Definition: ToolsProtocolCore.h:116
void setDoneCallback(callbackDone_t _callbackDone)
Definition: ToolsProtocolCore.h:267
friend std::ostream & operator<<(std::ostream &_os, const SBaseData &_data)
Stream operator.
Definition: ToolsProtocolCore.h:166
std::shared_ptr< SBaseRequestImpl > ptr_t
Definition: ToolsProtocolCore.h:230
std::function< void(const SMessageResponseData &)> callbackMessage_t
Callback function for message notifications.
Definition: ToolsProtocolCore.h:237
uint64_t crc64(const std::string &_str)
Definition: ToolsProtocolCore.h:341
void setResponseCallback(callbackResponse_t _callbackResponse)
Definition: ToolsProtocolCore.h:252
std::string defaultToString() const
Default string representation.
Definition: ToolsProtocolCore.h:173
Definition: ToolsProtocolCore.h:192
static ptr_t makeRequest(const request_t &_request)
Definition: ToolsProtocolCore.h:242
std::function< void()> callbackDone_t
Callback function for a done notification.
Definition: ToolsProtocolCore.h:239
void fromPT(const boost::property_tree::ptree &_pt)
Init structure from boost's property tree.
Definition: ToolsProtocolCore.h:150
std::function< void(const response_t &)> callbackResponse_t
Callback function for a Response notification.
Definition: ToolsProtocolCore.h:233
Definition: ToolsProtocolCore.h:188
uint64_t requestID_t
Definition: ToolsProtocolCore.h:111
std::string toJSON() const
Fill structure into JSON.
Definition: ToolsProtocolCore.h:120
Definition: AgentConnectionManager.h:13
void execDoneCallback()
Definition: ToolsProtocolCore.h:312
Definition: ToolsProtocolCore.h:224
SBaseRequestImpl()
Definition: ToolsProtocolCore.h:331
void setMessageCallback(callbackMessage_t _callbackMessage)
Definition: ToolsProtocolCore.h:262
bool operator==(const SEmptyResponseData &_val) const
Equality operator.
Definition: ToolsProtocolCore.h:212
Structure holds information of a done response.
Definition: ToolsProtocol.h:47
const request_t & getRequest() const
Definition: ToolsProtocolCore.h:325
std::vector< response_t > responseVector_t
Definition: ToolsProtocolCore.h:228
ret_t crc(const std::string &_str)
Definition: CRC.h:19
std::function< void(const SProgressResponseData &)> callbackProgress_t
Callback function for progress notifications.
Definition: ToolsProtocolCore.h:235
void toPT(boost::property_tree::ptree &_pt) const
Fill structure into boost's property tree.
Definition: ToolsProtocolCore.h:139
TResponse response_t
Definition: ToolsProtocolCore.h:226
void execProgressCallback(const SProgressResponseData &_arg)
Definition: ToolsProtocolCore.h:286
Definition: ToolsProtocolCore.h:114
Definition: ToolsProtocolCore.h:183
void execMessageCallback(const SMessageResponseData &_arg)
Definition: ToolsProtocolCore.h:299
void setProgressCallback(callbackProgress_t _callbackProgress)
Definition: ToolsProtocolCore.h:257
void execResponseCallback(const response_t &_arg)
For tests or internal use.
Definition: ToolsProtocolCore.h:273