hce-node application  1.4.3
HCE Hierarchical Cluster Engine node application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends 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  localVar.empty();
80  try
81  {
82  commonParseObj(obj, varPath);
83  }
85  {
86  clearLocalFields();
87  errString = excp.what();
88  }
89  }
90 
91  void JsonObjExtractor::mapExtract(std::vector<Poco::Dynamic::Var> &varPath)
92  {
93  Poco::Checksum crcCalc(Poco::Checksum::TYPE_CRC32);
94  crcCalc.update(toJsonPath(varPath));
95  std::map<unsigned int, Poco::Dynamic::Var>::iterator it;
96  if((it = globalMap.find(crcCalc.checksum())) != globalMap.end())
97  {
98  if(!((*it).second.isEmpty()))
99  {
100  if((*it).second.type() == typeid(Poco::JSON::Object::Ptr))
101  {
102  localObj = (*it).second.extract<Poco::JSON::Object::Ptr>();
103  }
104  else if((*it).second.type() == typeid(Poco::JSON::Array::Ptr))
105  {
106  localArray = (*it).second.extract<Poco::JSON::Array::Ptr>();
107  }
108  else
109  {
110  localVar = (*it).second;
111  }
112  }
113  }
114  }
115 
116  void JsonObjExtractor::commonParseSelectType(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
117  {
118  if(obj.isNull())
119  {
120  mapExtract(varPath);
121  }
122  else
123  {
124  commonParsePrepareObj(obj, varPath);
125  }
126  }
127 
128  Poco::Dynamic::Var JsonObjExtractor::getAsVar(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
129  {
130  commonParseSelectType(obj, varPath);
131  return localVar;
132  }
133 
134  Poco::JSON::Object::Ptr JsonObjExtractor::getAsObject(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
135  {
136  commonParseSelectType(obj, varPath);
137  return localObj;
138  }
139 
140  Poco::JSON::Array::Ptr JsonObjExtractor::getAsArray(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
141  {
142  commonParseSelectType(obj, varPath);
143  return localArray;
144  }
145 
146  bool JsonObjExtractor::isVar(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
147  {
148  commonParseSelectType(obj, varPath);
149  return (localVar.isEmpty() ? false : true);
150  }
151 
152  bool JsonObjExtractor::isObject(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
153  {
154  commonParseSelectType(obj, varPath);
155  return (localObj.isNull() ? false : true);
156  }
157 
158  bool JsonObjExtractor::isArray(Poco::JSON::Object::Ptr obj, std::vector<Poco::Dynamic::Var> &varPath)
159  {
160  commonParseSelectType(obj, varPath);
161  return (localArray.isNull() ? false : true);
162  }
163 
164  }
165 }
166 
167 #endif