hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
SphinxInputJsonMessageIndex.cpp
Go to the documentation of this file.
1 #include <Poco/JSON/Object.h>
2 #include <Poco/JSON/Array.h>
3 #include <Poco/JSON/JSON.h>
4 #include <Poco/JSON/Stringifier.h>
5 #include <Poco/JSON/Parser.h>
6 #include <Poco/JSON/JSONException.h>
7 
8 #include "SphinxError.hpp"
11 
12 namespace HCE
13 {
14 namespace sphinx
15 {
16 //-----------------------------------------------------------------------------
18 :inherited(), indexName(""), documentFile(""), params()
19 {
20  if (!json.empty())
21  unserialize(json);
22 }
23 //-----------------------------------------------------------------------------
24 // cppcheck-suppress unusedFunction
25 void SphinxInputJsonMessageIndex::addParameters(const std::string& paramName, const std::string& paramValue)
26 {
27  params.push_back(std::make_pair(paramName, paramValue));
28 }
29 //-----------------------------------------------------------------------------
31 {
32  _isError = false;
33  errorMsg.clear();
34  try
35  {
36  Poco::JSON::Object::Ptr obj = new Poco::JSON::Object();
37  obj->set(input_json_message_const::indexName, indexName);
38  obj->set(input_json_message_const::documentFile, documentFile);
39 
40  Poco::JSON::Array::Ptr vec = new Poco::JSON::Array();
42 
43  for (size_t i=0;i<params.size();++i)
44  {
45  Poco::JSON::Object::Ptr elem = new Poco::JSON::Object();
46  vec->add(elem);
47  elem->set(params[i].first, params[i].second);
48  }
49 
50  std::stringstream ostr;
51  Poco::JSON::Stringifier::stringify(obj, ostr);
52  json = ostr.str();
53 
54  }
55  catch(std::exception& e)
56  {
57  errorMsg = e.what();
59  _isError = true;
60  }
61  return !_isError;
62 }
63 //-----------------------------------------------------------------------------
64 bool SphinxInputJsonMessageIndex::unserialize(const std::string& json)
65 {
66  indexName.clear();
67  documentFile.clear();
68  params.clear();
69  errorMsg.clear();
70  _isError = false;
71  try
72  {
73  Poco::JSON::Parser parser;
74  Poco::Dynamic::Var res = parser.parse(json);
75  Poco::JSON::Object::Ptr obj = res.extract<Poco::JSON::Object::Ptr>();
76 
77  Poco::Dynamic::Var tmp = obj->get(input_json_message_const::indexName);
78  if (tmp.isString())
79  indexName = tmp.convert<std::string>();
80 
82  if (tmp.isString())
83  documentFile = tmp.convert<std::string>();
84 
85  Poco::JSON::Array::Ptr queryParameters = obj->getArray(input_json_message_const::queryParameters);
86  if (!queryParameters.isNull())
87  {
88  for (size_t j = 0;j <queryParameters->size();++j)
89  {
90  tmp = queryParameters->get(j);
91  if (tmp.isEmpty())
92  continue;
93 
94  if (tmp.type() == typeid(Poco::JSON::Object::Ptr))
95  {
96  Poco::JSON::Object::Ptr elem = tmp.extract<Poco::JSON::Object::Ptr>();
97  std::vector<std::string> vecNames;
98  elem->getNames(vecNames);
99  for (size_t i=0;i<vecNames.size();++i)
100  {
101  tmp = elem->get(vecNames[i]);
102  if (tmp.isString())
103  params.push_back(std::make_pair(vecNames[i], tmp.convert<std::string>()));
104  }
105  }
106  }
107  }
108  else
109  throw Poco::JSON::JSONException (std::string("array '").append(input_json_message_const::queryParameters).append("' not found"));
110 
111  }
112  catch(Poco::JSON::JSONException& e)
113  {
114  errorMsg = e.displayText();
116  _isError = true;
117  }
118  return !_isError;
119 }
120 //-----------------------------------------------------------------------------
121 std::istream& operator>>(std::istream& is, SphinxInputJsonMessageIndex& messageIndex)
122 {
123  std::string json;
124  is.seekg(0, std::ios::end);
125  json.resize(is.tellg());
126  is.seekg(0, std::ios::beg);
127  is.read(const_cast<char*>(json.c_str()), json.size());
128  messageIndex.unserialize(json);
129  return is;
130 }
131 //-----------------------------------------------------------------------------
132 std::ostream& operator<<(std::ostream& os, const SphinxInputJsonMessageIndex& messageIndex)
133 {
134  std::string json;
135  const_cast<SphinxInputJsonMessageIndex&>(messageIndex).serialize(json);
136  return os << json;
137 }
138 //-----------------------------------------------------------------------------
139 //-----------------------------------------------------------------------------
140 } // end namespace sphinx
141 } // end namespace HCE