HCE project C++ developers source code library  1.1.1
HCE project developer library
 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 void SphinxInputJsonMessageIndex::addParameters(const std::string& paramName, const std::string& paramValue)
25 {
26  params.push_back(std::make_pair(paramName, paramValue));
27 }
28 //-----------------------------------------------------------------------------
30 {
31  _isError = false;
32  errorMsg.clear();
33  try
34  {
35  Poco::JSON::Object::Ptr obj = new Poco::JSON::Object();
36  obj->set(input_json_message_const::indexName, indexName);
37  obj->set(input_json_message_const::documentFile, documentFile);
38 
39  Poco::JSON::Array::Ptr vec = new Poco::JSON::Array();
41 
42  for (size_t i=0;i<params.size();++i)
43  {
44  Poco::JSON::Object::Ptr elem = new Poco::JSON::Object();
45  vec->add(elem);
46  elem->set(params[i].first, params[i].second);
47  }
48 
49  std::stringstream ostr;
50  Poco::JSON::Stringifier::stringify(obj, ostr);
51  json = ostr.str();
52 
53  }
54  catch(std::exception& e)
55  {
56  errorMsg = e.what();
58  _isError = true;
59  }
60  return !_isError;
61 }
62 //-----------------------------------------------------------------------------
63 bool SphinxInputJsonMessageIndex::unserialize(const std::string& json)
64 {
65  indexName.clear();
66  documentFile.clear();
67  params.clear();
68  errorMsg.clear();
69  _isError = false;
70  try
71  {
72  Poco::JSON::Parser parser;
73  Poco::Dynamic::Var res = parser.parse(json);
74  Poco::JSON::Object::Ptr obj = res.extract<Poco::JSON::Object::Ptr>();
75 
76  Poco::Dynamic::Var tmp = obj->get(input_json_message_const::indexName);
77  if (tmp.isString())
78  indexName = tmp.convert<std::string>();
79 
81  if (tmp.isString())
82  documentFile = tmp.convert<std::string>();
83 
84  Poco::JSON::Array::Ptr queryParameters = obj->getArray(input_json_message_const::queryParameters);
85  if (!queryParameters.isNull())
86  {
87  for (size_t j = 0;j <queryParameters->size();++j)
88  {
89  tmp = queryParameters->get(j);
90  if (tmp.isEmpty())
91  continue;
92 
93  if (tmp.type() == typeid(Poco::JSON::Object::Ptr))
94  {
95  Poco::JSON::Object::Ptr elem = tmp.extract<Poco::JSON::Object::Ptr>();
96  std::vector<std::string> vecNames;
97  elem->getNames(vecNames);
98  for (size_t i=0;i<vecNames.size();++i)
99  {
100  tmp = elem->get(vecNames[i]);
101  if (tmp.isString())
102  params.push_back(std::make_pair(vecNames[i], tmp.convert<std::string>()));
103  }
104  }
105  }
106  }
107  else
108  throw Poco::JSON::JSONException (std::string("array '").append(input_json_message_const::queryParameters).append("' not found"));
109 
110  }
111  catch(Poco::JSON::JSONException& e)
112  {
113  errorMsg = e.displayText();
115  _isError = true;
116  }
117  return !_isError;
118 }
119 //-----------------------------------------------------------------------------
120 std::istream& operator>>(std::istream& is, SphinxInputJsonMessageIndex& messageIndex)
121 {
122  std::string json;
123  is.seekg(0, std::ios::end);
124  json.resize(is.tellg());
125  is.seekg(0, std::ios::beg);
126  is.read(const_cast<char*>(json.c_str()), json.size());
127  messageIndex.unserialize(json);
128  return is;
129 }
130 //-----------------------------------------------------------------------------
131 std::ostream& operator<<(std::ostream& os, const SphinxInputJsonMessageIndex& messageIndex)
132 {
133  std::string json;
134  const_cast<SphinxInputJsonMessageIndex&>(messageIndex).serialize(json);
135  return os << json;
136 }
137 //-----------------------------------------------------------------------------
138 //-----------------------------------------------------------------------------
139 } // end namespace sphinx
140 } // end namespace HCE