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
JsonObjExtractor.cpp
Go to the documentation of this file.
1 
18 #include <sstream>
19 
20 #include "JsonObjExtractor.hpp"
21 
22 using namespace HCE::exception;
23 
24 namespace HCE
25 {
26  namespace utils
27  {
28  char JsonObjExtractor::objSeparator = '.';
29  char JsonObjExtractor::arraySeparatorBegin = '[';
30  char JsonObjExtractor::arraySeparatorEnd = ']';
31 
32  JsonObjExtractor::JsonObjExtractor():localObj(nullptr), localArray(nullptr) {}
33 
34  void JsonObjExtractor::commonParseObj(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath) throw (JsonObjectExeption)
35  {
36  int arrayIndex = 0;
37  try
38  {
39  if(!obj.isNull())
40  {
41  for(unsigned int i = 0; i < varPath.size(); i++)
42  {
43  if(varPath[i].isInteger())
44  {
45  if(localArray.isNull())
46  {
47  throw JsonObjectExeption("JSON::Object> Node Not an Array");
48  }
49  arrayIndex = varPath[i].extract<int>();
50  if(static_cast<unsigned int>(arrayIndex) >= localArray->size())
51  {
52  throw JsonObjectExeption("JSON::Object> Array Index out Of range");
53  }
54  if(localArray->isObject(arrayIndex))
55  {
56  localObj = localArray->getObject(arrayIndex);
57  localArray = nullptr;
58  }
59  else if(localArray->isArray(arrayIndex))
60  {
61  localArray = localArray->getArray(arrayIndex);
62  localObj = nullptr;
63  }
64  else if(!localArray->get(varPath[i].extract<int>()).isEmpty())
65  {
66  localVar = localArray->get(varPath[i].extract<int>());
67  localArray = nullptr;
68  localObj = nullptr;
69  }
70  else
71  {
72  clearLocalFields();
73  }
74  }
75  else if(varPath[i].isString())
76  {
77  if(localObj.isNull())
78  {
79  throw JsonObjectExeption("JSON::Object> Node not an object");
80  }
81  if(localObj->isObject(varPath[i].extract<std::string>()))
82  {
83  localObj = localObj->getObject(varPath[i].extract<std::string>());
84  localArray = nullptr;
85  }
86  else if(localObj->isArray(varPath[i].extract<std::string>()))
87  {
88  localArray = localObj->getArray(varPath[i].extract<std::string>());
89  localObj = nullptr;
90  }
91  else if(!localObj->get(varPath[i].extract<std::string>()).isEmpty())
92  {
93  localVar = localObj->get(varPath[i].extract<std::string>());
94  localArray = nullptr;
95  localObj = nullptr;
96  }
97  else
98  {
99  clearLocalFields();
100  }
101  }
102  else
103  {
104  throw JsonObjectExeption("JSON::Object> Wrong vector type");
105  }
106  }
107  }
108  }
109  catch(JsonObjectExeption &exp)
110  {
111  throw;
112  }
113  catch(std::exception &exp)
114  {
115  }
116  }
117 
118  std::string JsonObjExtractor::toJsonPath(std::vector<Poco::Dynamic::Var> &varPath) throw (JsonObjectExeption)
119  {
120  std::string ret;
121  std::stringstream intString;
122  try
123  {
124  for(unsigned int i = 0; i < varPath.size(); i++)
125  {
126  if(varPath[i].isInteger())
127  {
128  if(i == 0)
129  {
130  throw JsonObjectExeption("JSON::Object> First element of varPath must be an string");
131  }
132  ret += arraySeparatorBegin;
133  intString.str(std::string());
134  intString.clear();
135  intString << varPath[i].extract<int>();
136  ret += intString.str();
137  ret += arraySeparatorEnd;
138  }
139  else if(varPath[i].isString())
140  {
141  if(i > 0)
142  {
143  ret += objSeparator;
144  }
145  ret += (varPath[i].extract<std::string>());
146  }
147  }
148  }
149  catch(JsonObjectExeption &exp)
150  {
151  throw;
152  }
153  catch(std::exception &exp)
154  {
155  }
156  return ret;
157  }
158 
159  void JsonObjExtractor::generateMap(Poco::JSON::Object::Ptr obj, std::string &name)
160  {
161  globalMap.clear();
162  generateMapByObj(obj, name);
163  }
164 
165  void JsonObjExtractor::generateMapByObj(Poco::JSON::Object::Ptr obj, std::string &name)
166  {
167  if(!obj.isNull())
168  {
169  std::string localName;
170  std::vector<std::string> localNames;
171  obj->getNames(localNames);
172  for(unsigned int i = 0; i < localNames.size(); i++)
173  {
174  localName = name;
175  if(!localName.empty())
176  {
177  localName += objSeparator;
178  }
179  localName += localNames[i];
180  if(obj->isObject(localNames[i]))
181  {
182  generateMapByObj(obj->getObject(localNames[i]), localName);
183  }
184  else if(obj->isArray(localNames[i]))
185  {
186  generateMapByArray(obj->getArray(localNames[i]), localName);
187  }
188  else if(!obj->isNull(localNames[i]))
189  {
190  Poco::Checksum crcCalc(Poco::Checksum::TYPE_CRC32);
191  crcCalc.update(localName);
192  globalMap.insert(std::pair<unsigned int, Poco::Dynamic::Var>(crcCalc.checksum(), obj->get(localNames[i])));
193  }
194  }
195  if(!name.empty())
196  {
197  Poco::Dynamic::Var localVar(obj);
198  Poco::Checksum crcCalc(Poco::Checksum::TYPE_CRC32);
199  crcCalc.update(name);
200  globalMap.insert(std::pair<unsigned int, Poco::Dynamic::Var>(crcCalc.checksum(), localVar));
201  }
202  }
203  }
204 
205  void JsonObjExtractor::generateMapByArray(Poco::JSON::Array::Ptr array, std::string &name)
206  {
207  if(!array.isNull())
208  {
209  std::string localName;
210  std::stringstream intString;
211  for(unsigned int i = 0; i < array->size(); i++)
212  {
213  localName = name;
214  localName += arraySeparatorBegin;
215  intString.str(std::string());
216  intString.clear();
217  intString << i;
218  localName += intString.str();
219  localName += arraySeparatorEnd;
220  if(array->isObject(i))
221  {
222  generateMapByObj(array->getObject(i), localName);
223  }
224  else if(array->isArray(i))
225  {
226  generateMapByArray(array->getArray(i), localName);
227  }
228  else if(!array->isNull(i))
229  {
230  Poco::Checksum crcCalc(Poco::Checksum::TYPE_CRC32);
231  crcCalc.update(localName);
232  globalMap.insert(std::pair<unsigned int, Poco::Dynamic::Var>(crcCalc.checksum(), array->get(i)));
233  }
234  }
235  if(!name.empty())
236  {
237  Poco::Dynamic::Var localVar(array);
238  Poco::Checksum crcCalc(Poco::Checksum::TYPE_CRC32);
239  crcCalc.update(name);
240  globalMap.insert(std::pair<unsigned int, Poco::Dynamic::Var>(crcCalc.checksum(), localVar));
241  }
242  }
243  }
244 
246  {
247  localArray = nullptr;
248  localObj = nullptr;
249  localVar.empty();
250  }
251 
252  bool JsonObjExtractor::isKeyPresent(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
253  {
254  bool ret = false;
255  if(obj.isNull())
256  {
257  Poco::Checksum crcCalc(Poco::Checksum::TYPE_CRC32);
258  crcCalc.update(toJsonPath(varPath));
259  if(globalMap.find(crcCalc.checksum()) != globalMap.end())
260  {
261  ret = true;
262  }
263  }
264  else
265  {
266  commonParsePrepareObj(obj, varPath);
267  if(!localVar.isEmpty() || !localObj.isNull() || !localArray.isNull())
268  {
269  ret = true;
270  }
271  }
272  return ret;
273  }
274 
276  }
277 }