BeeeOn Gateway  v2020.3.1-2-g6f737dc
Platform to interconnect the IoT world
SAXHelper.h
1 #pragma once
2 
3 #include <stack>
4 
5 #include <Poco/SAX/ContentHandler.h>
6 #include <Poco/SAX/DTDHandler.h>
7 
8 #include "util/Loggable.h"
9 
10 namespace Poco {
11 
12 class Path;
13 
14 namespace XML {
15 
16 class Locator;
17 
18 }
19 }
20 
21 namespace BeeeOn {
22 
23 struct SAXElement {
24  SAXElement();
25  SAXElement(
26  const Poco::XML::XMLString &localName,
27  const Poco::XML::XMLString &qName,
28  const Poco::XML::XMLString &uri
29  );
30 
31  bool isRoot() const;
32  bool is(const Poco::XML::XMLString &localName,
33  const Poco::XML::XMLString &qName,
34  const Poco::XML::XMLString &uri) const;
35 
36  const Poco::XML::XMLString localName;
37  const Poco::XML::XMLString qName;
38  const Poco::XML::XMLString uri;
39  Poco::XML::XMLString content;
40 };
41 
42 class SAXHelper :
43  public Poco::XML::ContentHandler,
44  public Poco::XML::DTDHandler,
45  public Loggable {
46 public:
47  SAXHelper();
48  virtual ~SAXHelper();
49 
50  virtual void processingInstruction(
51  const Poco::XML::XMLString &target,
52  const Poco::XML::XMLString &data);
53 
54  virtual void skippedEntity(const Poco::XML::XMLString &name);
55 
59  virtual void ignorableWhitespace(
60  const Poco::XML::XMLChar c[],
61  int start,
62  int length) override;
63 
69  virtual void characters(const Poco::XML::XMLChar c[],
70  int start, int length) override;
71 
75  void startDocument() override;
76 
80  void endDocument() override;
81 
87  void startElement(const Poco::XML::XMLString &uri,
88  const Poco::XML::XMLString &localName,
89  const Poco::XML::XMLString &qName,
90  const Poco::XML::Attributes &attrList) override;
91 
97  void endElement(const Poco::XML::XMLString &uri,
98  const Poco::XML::XMLString &localName,
99  const Poco::XML::XMLString &qName) override;
100 
101  virtual void startPrefixMapping(
102  const Poco::XML::XMLString &prefix,
103  const Poco::XML::XMLString &uri) override;
104 
105  virtual void endPrefixMapping(const Poco::XML::XMLString &prefix) override;
106 
107  void setDocumentLocator(const Poco::XML::Locator *loc) override;
108 
109  virtual void notationDecl(const Poco::XML::XMLString &name,
110  const Poco::XML::XMLString *publicId,
111  const Poco::XML::XMLString *systemId) override;
112 
113  virtual void unparsedEntityDecl(const Poco::XML::XMLString &name,
114  const Poco::XML::XMLString *publicId,
115  const Poco::XML::XMLString &systemId,
116  const Poco::XML::XMLString &notationName) override;
117 
118  static void parse(const Poco::Path &path, SAXHelper &helper);
119 
120 protected:
125  virtual bool expectElement(const SAXElement &element) const;
126 
131  virtual void startElement(const SAXElement &element,
132  const Poco::XML::Attributes &attrList);
133 
138  virtual void endElement(const SAXElement &element);
139 
144  virtual bool expectContent(int length) const;
145 
150  virtual void preprocessContent(
151  const Poco::XML::XMLChar c[],
152  int &start,
153  int &length);
154 
158  void trimContent(const Poco::XML::XMLChar c[],
159  int &start,
160  int &length);
161 
166  void appendContent(const Poco::XML::XMLChar c[],
167  int start, int length);
168 
173  void appendContent(const Poco::XML::XMLString &s);
174 
179  bool getAndTrimAttribute(const Poco::XML::Attributes &attrList,
180  const Poco::XML::XMLString &name,
181  Poco::XML::XMLString &value) const;
182 
187  bool getAttributeAsDouble(const Poco::XML::Attributes &attrList,
188  const Poco::XML::XMLString &name,
189  double &value) const;
190 
195  bool getAttributeAsInt(const Poco::XML::Attributes &attrList,
196  const Poco::XML::XMLString &name,
197  int &value) const;
198 
202  void error(const std::string &message) const;
203 
207  void fatal(const std::string &message) const;
208 
212  const std::string beginMessage() const;
213 
217  const Poco::XML::Locator &locator() const;
218 
222  const std::deque<SAXElement> &path() const;
223 
227  const SAXElement &current() const;
228 
232  const SAXElement &parent() const;
233 
237  template <typename T>
238  bool isPathFromRoot(const T &name) const
239  {
240  return m_path.size() > 1
241  && m_path[0].isRoot()
242  && checkPath(1, name);
243  }
244 
248  template <typename T, typename ...Ts>
249  bool isPathFromRoot(const T &name, const Ts &... ts) const
250  {
251  return m_path.size() > 1
252  && m_path[0].isRoot()
253  && checkPath(1, name, ts...);
254  }
255 
256 private:
257  bool checkPath(unsigned int i) const
258  {
259  return i == m_path.size();
260  }
261 
262  template <typename T>
263  bool checkPath(unsigned int i, const T &name) const
264  {
265  return i < m_path.size()
266  && matchPathElement(m_path[i], name)
267  && checkPath(i + 1);
268  }
269 
270  template <typename T, typename ...Ts>
271  bool checkPath(unsigned int i, const T &name, const Ts &... ts) const
272  {
273  return i < m_path.size()
274  && matchPathElement(m_path[i], name)
275  && checkPath(i + 1, ts...);
276  }
277 
278  template <typename T>
279  bool matchPathElement(const SAXElement &element, const T &name) const
280  {
281  return element.localName == name || name == std::string("*");
282  }
283 
284 private:
285  const Poco::XML::Locator *m_locator;
286  std::deque<SAXElement> m_path;
287 };
288 
289 }
virtual void characters(const Poco::XML::XMLChar c[], int start, int length) override
Definition: SAXHelper.cpp:261
Definition: SAXHelper.h:23
void endDocument() override
Definition: SAXHelper.cpp:183
bool getAttributeAsDouble(const Poco::XML::Attributes &attrList, const Poco::XML::XMLString &name, double &value) const
Definition: SAXHelper.cpp:351
Definition: SAXHelper.h:42
void trimContent(const Poco::XML::XMLChar c[], int &start, int &length)
Definition: SAXHelper.cpp:297
void endElement(const Poco::XML::XMLString &uri, const Poco::XML::XMLString &localName, const Poco::XML::XMLString &qName) override
void startElement(const Poco::XML::XMLString &uri, const Poco::XML::XMLString &localName, const Poco::XML::XMLString &qName, const Poco::XML::Attributes &attrList) override
const Poco::XML::Locator & locator() const
Definition: SAXHelper.cpp:152
const SAXElement & current() const
Definition: SAXHelper.cpp:162
virtual bool expectElement(const SAXElement &element) const
Definition: SAXHelper.cpp:218
const SAXElement & parent() const
Definition: SAXHelper.cpp:170
void appendContent(const Poco::XML::XMLChar c[], int start, int length)
const std::deque< SAXElement > & path() const
Definition: SAXHelper.cpp:157
void error(const std::string &message) const
Definition: SAXHelper.cpp:142
virtual void preprocessContent(const Poco::XML::XMLChar c[], int &start, int &length)
Definition: SAXHelper.cpp:284
const std::string beginMessage() const
Definition: SAXHelper.cpp:125
virtual void ignorableWhitespace(const Poco::XML::XMLChar c[], int start, int length) override
Definition: SAXHelper.cpp:256
Definition: Loggable.h:19
bool isPathFromRoot(const T &name, const Ts &...ts) const
Definition: SAXHelper.h:249
bool getAttributeAsInt(const Poco::XML::Attributes &attrList, const Poco::XML::XMLString &name, int &value) const
Definition: SAXHelper.cpp:364
bool isPathFromRoot(const T &name) const
Definition: SAXHelper.h:238
void startDocument() override
Definition: SAXHelper.cpp:178
virtual bool expectContent(int length) const
Definition: SAXHelper.cpp:279
void fatal(const std::string &message) const
Definition: SAXHelper.cpp:147
bool getAndTrimAttribute(const Poco::XML::Attributes &attrList, const Poco::XML::XMLString &name, Poco::XML::XMLString &value) const
Definition: SAXHelper.cpp:337