hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Response.hpp
Go to the documentation of this file.
1 
15 #ifndef RESPONSE_HPP
16 #define RESPONSE_HPP
17 
18 
22 #include <string>
23 #include <map>
24 
28 #include <Poco/Any.h>
29 #include <Poco/DynamicFactory.h>
30 #include <Poco/JSON/Parser.h>
31 #include <Poco/JSON/PrintHandler.h>
32 #include <Poco/JSON/JSONException.h>
33 #include <Poco/Environment.h>
34 
35 #include "Errors.hpp"
36 #include "EncodeDecodeBase64.hpp"
37 
38 
39 namespace HCE
40 {
41 
45 enum class CommandId {
46  DB_ENGINE_NAME=0
47 };
48 
49 
53 enum {
54  PUT=0
55  , GET
56  , DEL
57  , CHECK
58  , MANAGE
59  , LIST
60 // , COMMAND_COUNT //!< Keep it at the end of enum
61 };
62 
69 class Request {
70 public:
71  Request(const std::string& json) : initialized(false) {
72  #ifdef _DEBUG_
73  std::cout << "request constructor" << std::endl;
74  std::cout << json << std::endl;
75  #endif
76  try {
77  Poco::JSON::Array::Ptr obj;
78  Poco::JSON::Parser parser;
79  Poco::Dynamic::Var result = parser.parse(json);
80  if ( result.type() == typeid(Poco::JSON::Object::Ptr) ) {
81  type = result.extract<Poco::JSON::Object::Ptr>()->getValue<unsigned int>("type");
82  data = result.extract<Poco::JSON::Object::Ptr>()->getValue<std::string>("data");
83  }
84  initialized = true;
85  }
86  catch(const Poco::Exception& exc) {
87  std::cout << exc.displayText() << std::endl;
88  }
89  }
90 public:
91  unsigned int type;
92  std::string data;
94 };
95 
96 
101 //typedef bool STATUS;
102 struct DataSet
103 {
105  {
109  }
110  DataSet(const std::map<std::string, std::string>& docs)
111  {
112  Poco::JSON::Object items;
113  Poco::JSON::Object item;
114  for(auto doc : docs)
115  {
119  std::string base64_decoded = doc.second;
120  std::string base64_encoded = HCE::encodeBase64(base64_decoded);
121  Poco::Dynamic::Var value(base64_encoded);
122  item.set(doc.first,value);
123  }
124  items.set("documents",item);
125  std::ostringstream oss;
126  items.stringify(oss);
127  data = oss.str();
128 #ifdef _DEBUG_
129  std::cout << "data:\n"
130  << data << std::endl;
131 #endif
132  }
133  std::string jsonToString() const
134  {
138  return data;
139  }
140  bool operator==(const HCE::DataSet& rhs) const
141  {
145  return (data.compare(rhs.data)) ? false : true;
146  }
147  std::string data;
148  Poco::JSON::Object item;
149  };
153  struct Documents {
154  std::vector<std::pair<const std::string, const std::string> > docs;
155  };
161  struct Response
162  {
163  Response(unsigned err_code=ACTION_NOT_SUPPORT)
164  : error_code( Poco::NumberFormatter::format(err_code))
165  , error_message(error_messages[err_code])
166  , data()
167  , time() {
168  init();
169  }
170  Response(const std::map<std::string,std::string>& outData, const STATUS& status)
171  : error_code(Poco::NumberFormatter::format(status)), error_message(error_messages[status]), data(outData) {
175  init();
176  }
177  void init() {
178  item.set("error_code", Poco::Dynamic::Var(error_code));
179  item.set("error_message", Poco::Dynamic::Var(error_message));
180  item.set("data", Poco::Dynamic::Var(data.jsonToString()));
181  item.set("time", Poco::Dynamic::Var(time));
182  }
183  /*
184  Response(const std::string& json)
185  {
186  try
187  {
188  Poco::JSON::Array::Ptr obj;
189  Poco::JSON::Parser parser;
190  Poco::JSON::DefaultHandler defaultHandler;
191  parser.setHandler( &defaultHandler );
192  parser.parse(json);
193  Poco::DynamicAny result = defaultHandler.result();
194  if ( result.type() == typeid(Poco::JSON::Object::Ptr) )
195  {
196  if(result.extract<Poco::JSON::Object::Ptr>()->getObject("error_code"))
197  {
198  error_code = result.extract<Poco::JSON::Object::Ptr>()->getValue<std::string>("error_code");
199  }
200  if(result.extract<Poco::JSON::Object::Ptr>()->getObject("error_message"))
201  {
202  error_message = result.extract<Poco::JSON::Object::Ptr>()->getValue<std::string>("error_message");
203  }
204  }
205  }
206  catch(Poco::JSON::JSONException& jsone)
207  {
208  std::cout << jsone.message() << std::endl;
209  }
210  }
211  */
212  /*
213  Response(const std::string& errCode, const std::string& errMsg, const DataSet& outData, const std::string& elapsedTime)
214  : error_code(errCode), error_message(errMsg), data(outData), time(elapsedTime), item()
215  {
216  item.set("error_code", Poco::Dynamic::Var(error_code));
217  item.set("error_message", Poco::Dynamic::Var(error_message));
218  item.set("data", Poco::Dynamic::Var(data.jsonToString()));
219  item.set("time", Poco::Dynamic::Var(time));
220  }
221  */
222  static Documents docs() {
223  Documents doc;
224  return doc;
225  }
226  inline void setTime(const std::string& _time) {
227  item.set("time", Poco::Dynamic::Var(_time));
228  }
229  std::string json()
230  {
231  std::ostringstream oss;
232  item.stringify(oss);
233  return oss.str();
234  }
235  bool operator==(const HCE::Response& rhs) const
236  {
237  return (
238  this->error_code==rhs.error_code
239  && this->error_message==rhs.error_message
240  && this->data==rhs.data
241  );
242  }
243  std::string error_code;
244  std::string error_message;
246  std::string time;
247  Poco::JSON::Object item;
248  };
249 
250 }
251 
252 
253 #endif