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