highlighter application  1.1
HCE project utils : highlighter
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
JsonObjExtractor.hpp
Go to the documentation of this file.
1 
18 #ifndef JSON_JBJ_EXTRACTOR_HPP
19 #define JSON_JBJ_EXTRACTOR_HPP
20 
21 #include <Poco/Checksum.h>
22 #include <Poco/Dynamic/Var.h>
23 #include <Poco/Dynamic/Struct.h>
24 #include <Poco/Environment.h>
25 #include <Poco/JSON/Object.h>
26 #include <Poco/JSON/Array.h>
27 #include <map>
28 #include <vector>
29 
30 #include "JsonObjectExeption.hpp"
31 
32 namespace HCE
33 {
34  namespace utils
35  {
36  using namespace HCE::exception;
38  {
39  protected:
40  Poco::JSON::Object::Ptr localObj;
41  Poco::JSON::Array::Ptr localArray;
42  Poco::Dynamic::Var localVar;
43  std::string errString;
44  std::map<unsigned int, Poco::Dynamic::Var> globalMap;
45  protected:
46  inline void commonParsePrepareObj(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
47  void commonParseObj(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath) throw (JsonObjectExeption);
48  inline void mapExtract(std::vector<Poco::Dynamic::Var> &varPath);
49  inline void commonParseSelectType(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
50  void generateMapByObj(Poco::JSON::Object::Ptr obj, std::string &name);
51  void generateMapByArray(Poco::JSON::Array::Ptr array, std::string &name);
52  void clearLocalFields();
53  public:
55  inline Poco::Dynamic::Var getAsVar(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
56  inline Poco::JSON::Object::Ptr getAsObject(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
57  inline Poco::JSON::Array::Ptr getAsArray(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
58 
59  inline bool isVar(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
60  inline bool isObject(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
61  inline bool isArray(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
62  bool isKeyPresent(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath);
63 
64  void generateMap(Poco::JSON::Object::Ptr obj, std::string &name);
65 
66  static char objSeparator;
67  static char arraySeparatorBegin;
68  static char arraySeparatorEnd;
69  static std::string toJsonPath(std::vector<Poco::Dynamic::Var> &varPath) throw (JsonObjectExeption);
70 
72  };
73 
74  void JsonObjExtractor::commonParsePrepareObj(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
75  {
76  errString.clear();
77  localObj = obj;
78  localArray = nullptr;
79 // cppcheck-suppress uselessCallsEmpty
80  localVar.empty();
81  try
82  {
83  commonParseObj(obj, varPath);
84  }
86  {
87  clearLocalFields();
88  errString = excp.what();
89  }
90  }
91 
92  void JsonObjExtractor::mapExtract(std::vector<Poco::Dynamic::Var> &varPath)
93  {
94  Poco::Checksum crcCalc(Poco::Checksum::TYPE_CRC32);
95  crcCalc.update(toJsonPath(varPath));
96  std::map<unsigned int, Poco::Dynamic::Var>::iterator it;
97  if((it = globalMap.find(crcCalc.checksum())) != globalMap.end())
98  {
99  if(!((*it).second.isEmpty()))
100  {
101  if((*it).second.type() == typeid(Poco::JSON::Object::Ptr))
102  {
103  localObj = (*it).second.extract<Poco::JSON::Object::Ptr>();
104  }
105  else if((*it).second.type() == typeid(Poco::JSON::Array::Ptr))
106  {
107  localArray = (*it).second.extract<Poco::JSON::Array::Ptr>();
108  }
109  else
110  {
111  localVar = (*it).second;
112  }
113  }
114  }
115  }
116 
117  void JsonObjExtractor::commonParseSelectType(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
118  {
119  if(obj.isNull())
120  {
121  mapExtract(varPath);
122  }
123  else
124  {
125  commonParsePrepareObj(obj, varPath);
126  }
127  }
128 
129  Poco::Dynamic::Var JsonObjExtractor::getAsVar(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
130  {
131  commonParseSelectType(obj, varPath);
132  return localVar;
133  }
134 
135  Poco::JSON::Object::Ptr JsonObjExtractor::getAsObject(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
136  {
137  commonParseSelectType(obj, varPath);
138  return localObj;
139  }
140 
141  Poco::JSON::Array::Ptr JsonObjExtractor::getAsArray(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
142  {
143  commonParseSelectType(obj, varPath);
144  return localArray;
145  }
146 
147  bool JsonObjExtractor::isVar(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
148  {
149  commonParseSelectType(obj, varPath);
150  return (localVar.isEmpty() ? false : true);
151  }
152 
153  bool JsonObjExtractor::isObject(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
154  {
155  commonParseSelectType(obj, varPath);
156  return (localObj.isNull() ? false : true);
157  }
158 
159  bool JsonObjExtractor::isArray(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
160  {
161  commonParseSelectType(obj, varPath);
162  return (localArray.isNull() ? false : true);
163  }
164 
165  }
166 }
167 
168 #endif