Salome HOME
c983e3a49f3304279acf0acb97b4b33ddb3870b1
[modules/shaper.git] / src / Config / Config_XMLReader.h
1 // Copyright (C) 2014-20xx CEA/DEN, EDF R&D
2
3 /*
4  * Config_XMLReader.h
5  *
6  *  Created on: Mar 14, 2014
7  *      Author: sbh
8  */
9
10 #ifndef CONFIG_XMLREADER_H_
11 #define CONFIG_XMLREADER_H_
12
13 #include <Config_def.h>
14
15 #include <cstdarg>
16 #include <string>
17 #include <map>
18
19 //>> Forward declaration of xmlNodePtr.
20 typedef struct _xmlNode xmlNode;
21 typedef xmlNode *xmlNodePtr;
22 struct _xmlNode;
23 //<<
24
25 //>> Forward declaration of xmlDocPtr.
26 typedef struct _xmlDoc xmlDoc;
27 typedef xmlDoc *xmlDocPtr;
28 struct _xmlDoc;
29 //<<
30
31 /*!
32  * \class Config_XMLReader
33  * \ingroup Config
34  * \brief Base class for all libxml readers. Provides high-level API
35  * for all xml operations.
36 */
37 class Config_XMLReader
38 {
39  public:
40   /*!
41    * Constructor
42    * \param theXmlFile - full path to the xml file which will be processed by the reader
43    */
44   CONFIG_EXPORT Config_XMLReader(const std::string& theXmlFile);
45   CONFIG_EXPORT virtual ~Config_XMLReader();
46   /*!
47    * Returns value of PLUGINS_CONFIG_FILE env variable, a path to the plugins.xml file
48    * \return string value
49    */
50   CONFIG_EXPORT static std::string pluginConfigFile();
51   /*!
52    * Read all nodes in associated xml file,
53    * recursively if processChildren(xmlNode) is true for the xmlNode.
54    * For each read node the processNode will be called.
55    */
56   CONFIG_EXPORT void readAll();
57   /*!
58    * Returns xmlNodePtr to the root of reader's document
59    * or NULL if not found
60    */
61   CONFIG_EXPORT xmlNodePtr findRoot();
62
63  protected:
64   /*!
65    * \brief Allows to customize reader's behavior for a node. Virtual.
66    * The default implementation process "source", "validator" and
67    * "selection_filter" nodes.
68    */
69   virtual void processNode(xmlNodePtr aNode);
70
71   /*!
72    * This method gives an ability to finalize processing of a node,
73    * when reader is about to leave the node (node and all it's children are processed)
74    */
75   virtual void cleanup(xmlNodePtr aNode);
76   /*!
77    * \brief Defines which nodes should be processed recursively. Virtual.
78    * The default impl is to read all nodes.
79    */
80   virtual bool processChildren(xmlNodePtr aNode);
81   /*!
82    * Calls processNode() for each child (for some - recursively)
83    * of the given node.
84    * \sa ReadAll()
85    */
86   void readRecursively(xmlNodePtr theParent);
87   /*!
88    * \brief void* -> xmlNodePtr
89    */
90   xmlNodePtr node(void* theNode);
91   /// Gets xml node name
92   std::string getNodeName(xmlNodePtr theNode);
93   /// Stores an attribute in internal map for later use.
94   /// Key is "Node_Name:Node_Attribute" and value is getProperty(theNodeAttribute)
95   void storeAttribute(xmlNodePtr theNode, const char* theNodeAttribute, bool doClean = false);
96   /// Restores an attribute from internal map.
97   std::string restoreAttribute(xmlNodePtr theNode, const char* theNodeAttribute);
98   /// Restores an attribute from internal map.
99   std::string restoreAttribute(const char* theNodeName, const char* theNodeAttribute);
100   /// Cleanups attribute from cache
101   bool cleanupAttribute(xmlNodePtr theNode, const char* theNodeAttribute);
102   /// Cleanups attribute from cache
103   bool cleanupAttribute(const char* theNodeName, const char* theNodeAttribute);
104
105  protected:
106   std::string myDocumentPath; ///< Path to the xml document
107   xmlDocPtr myXmlDoc; ///< Root of the xml document
108   /// A map to store all parent's attributes.
109   /// The key has from "Node_Name:Node_Attribute"
110   std::map<std::string, std::string> myCachedAttributes;
111 };
112
113 #endif /* CONFIG_XMLREADER_H_ */