MIRA
XMLDomPreprocessor.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012 by
3  * MetraLabs GmbH (MLAB), GERMANY
4  * and
5  * Neuroinformatics and Cognitive Robotics Labs (NICR) at TU Ilmenau, GERMANY
6  * All rights reserved.
7  *
8  * Contact: info@mira-project.org
9  *
10  * Commercial Usage:
11  * Licensees holding valid commercial licenses may use this file in
12  * accordance with the commercial license agreement provided with the
13  * software or, alternatively, in accordance with the terms contained in
14  * a written agreement between you and MLAB or NICR.
15  *
16  * GNU General Public License Usage:
17  * Alternatively, this file may be used under the terms of the GNU
18  * General Public License version 3.0 as published by the Free Software
19  * Foundation and appearing in the file LICENSE.GPL3 included in the
20  * packaging of this file. Please review the following information to
21  * ensure the GNU General Public License version 3.0 requirements will be
22  * met: http://www.gnu.org/copyleft/gpl.html.
23  * Alternatively you may (at your option) use any later version of the GNU
24  * General Public License if such license has been publicly approved by
25  * MLAB and NICR (or its successors, if any).
26  *
27  * IN NO EVENT SHALL "MLAB" OR "NICR" BE LIABLE TO ANY PARTY FOR DIRECT,
28  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
29  * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF "MLAB" OR
30  * "NICR" HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * "MLAB" AND "NICR" SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
33  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
34  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
35  * ON AN "AS IS" BASIS, AND "MLAB" AND "NICR" HAVE NO OBLIGATION TO
36  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR MODIFICATIONS.
37  */
38 
47 #ifndef _MIRA_XMLDOMPREPROCESSOR_H_
48 #define _MIRA_XMLDOMPREPROCESSOR_H_
49 
50 #include <list>
51 #include <map>
52 #ifndef Q_MOC_RUN
53 #include <boost/function.hpp>
54 #endif
55 #include <xml/XMLDom.h>
56 
57 namespace mira {
58 
60 
62 
64 {
65  XMLVariableValue(const std::string& v = "",
66  const std::string& a = "") : value(v), annotation(a) {}
67 
68  template<typename Reflector>
69  void reflect(Reflector& r) {
70  r.property("value", value, "Variable value");
71  r.property("annotation", annotation, "Source annotation");
72  }
73 
74  XMLVariableValue& operator=(const char* s) { value = s; annotation = ""; return *this;}
75 
76  bool operator==(const std::string& s) const { return value == s; }
77  bool operator!=(const std::string& s) const { return value != s; }
78  bool operator==(const char* s) const { return value == s; }
79  bool operator!=(const char* s) const { return value != s; }
80 
81  operator std::string() const { return value; }
82 
83  friend std::ostream& operator<<(std::ostream& s, const XMLVariableValue& x);
84 
85  std::string value;
86  std::string annotation;
87 };
88 
89 std::ostream& operator<<(std::ostream& s, const XMLVariableValue& x);
90 
91 typedef std::map<std::string, XMLVariableValue> XMLVariablesMap;
92 
94 
107 {
108 public:
109  typedef boost::function<std::string (const std::string&)> Callback;
110  typedef std::list<Path> IncludePathStack;
111 
113  XMLDomPreprocessor(const XMLVariablesMap& iVariables) :
114  variables(iVariables) {}
115 
116  void preprocessXML(XMLDom& ioXml);
117  void registerXMLVariableCallback(const std::string& pattern, Callback&& callback);
118 
120 
121 protected:
122 
123  std::string resolveXMLVariables(const std::string& pattern, const std::string& var);
124  std::string resolveContent(std::string content);
125 
126  void preprocessAllLowLevel(XMLDom::iterator& iNode,
127  IncludePathStack& ioPathStack);
128 
129  void preprocessAll(XMLDom::iterator& iNode,
130  IncludePathStack& ioPathStack);
131  void processSpecialVariables(XMLDom::iterator& node);
132 
133  bool parseCondition(XMLDom::iterator& node);
134  bool parseConditionsRequireAll(XMLDom::iterator& node);
135  bool parseConditionsRequireAny(XMLDom::iterator& node);
136  bool parseExists(XMLDom::iterator& node);
137  bool parseExistsRequireAll(XMLDom::iterator& node);
138  bool parseExistsRequireAny(XMLDom::iterator& node);
139  XMLDom::iterator parseInclude(XMLDom::iterator& ioNode, IncludePathStack& ioPathStack);
140 
141  std::map<std::string, Callback> mCallbacks;
142 
144 };
145 
146 
151 void MIRA_BASE_EXPORT preprocessXML(XMLDom& ioXml, XMLVariablesMap& ioVariables);
152 
154 
155 } // namespace
156 
157 #endif
A STL conform DOM reader/writer for XML.
boost::function< std::string(const std::string &)> Callback
Definition: XMLDomPreprocessor.h:109
A STL conform wrapper for libxml2 to read XML files as DOM.
Definition: XMLDom.h:73
std::string annotation
Definition: XMLDomPreprocessor.h:86
bool operator!=(const std::string &s) const
Definition: XMLDomPreprocessor.h:77
std::string value
Definition: XMLDomPreprocessor.h:85
specialize cv::DataType for our ImgPixel and inherit from cv::DataType<Vec>
Definition: IOService.h:67
std::ostream & operator<<(std::ostream &s, const LibraryVersion &version)
bool operator==(const char *s) const
Definition: XMLDomPreprocessor.h:78
std::list< Path > IncludePathStack
Definition: XMLDomPreprocessor.h:110
std::map< std::string, XMLVariableValue > XMLVariablesMap
Definition: XMLDomPreprocessor.h:91
XMLDomPreprocessor(const XMLVariablesMap &iVariables)
Definition: XMLDomPreprocessor.h:113
friend std::ostream & operator<<(std::ostream &s, const XMLVariableValue &x)
XMLVariablesMap variables
Definition: XMLDomPreprocessor.h:119
Iterator for iterating over xml nodes that have the same parent (sibligs)
Definition: XMLDom.h:758
bool operator==(const std::string &s) const
Definition: XMLDomPreprocessor.h:76
void reflect(Reflector &r)
Definition: XMLDomPreprocessor.h:69
bool operator!=(const char *s) const
Definition: XMLDomPreprocessor.h:79
Preprocesses XML documents and resolves all special tags like , <if>, <warning> and so on...
Definition: XMLDomPreprocessor.h:106
Variables defined in xml documents.
Definition: XMLDomPreprocessor.h:63
#define MIRA_BASE_EXPORT
This is required because on windows there is a macro defined called ERROR.
Definition: Platform.h:153
XMLDomPreprocessor()
Definition: XMLDomPreprocessor.h:112
std::map< std::string, Callback > mCallbacks
Definition: XMLDomPreprocessor.h:141
void MIRA_BASE_EXPORT preprocessXML(XMLDom &ioXml, XMLVariablesMap &ioVariables)
Shortcut for processing a XML document without creating a XMLDomPreprocessor yourself.
bool mAddedInfoToException
Definition: XMLDomPreprocessor.h:143
XMLVariableValue(const std::string &v="", const std::string &a="")
Definition: XMLDomPreprocessor.h:65
XMLVariableValue & operator=(const char *s)
Definition: XMLDomPreprocessor.h:74