otsdaq  v2_04_00
ConfigurationManager.h
1 #ifndef _ots_ConfigurationManager_h_
2 #define _ots_ConfigurationManager_h_
3 
4 #include <map>
5 #include <set>
6 #include <string>
7 
8 #include "otsdaq-core/ConfigurationInterface/ConfigurationInterface.h"
9 #include "otsdaq-core/ConfigurationInterface/ConfigurationTree.h"
10 #include "otsdaq-core/TableCore/TableVersion.h"
11 
12 namespace ots
13 {
14 class ProgressBar;
15 
16 #define __GET_CONFIG__(X) getTable<X>(QUOTE(X))
17 
19 {
20  // ConfigurationManagerRW is a "Friend" class of ConfigurationManager so has access to
21  // private members.
22  friend class ConfigurationManagerRW;
23 
24  public:
25  //==============================================================================
26  // Static members
27  static const std::string READONLY_USER;
28  static const std::string ACTIVE_GROUPS_FILENAME;
29  static const std::string ALIAS_VERSION_PREAMBLE;
30  static const std::string SCRATCH_VERSION_ALIAS;
31 
32  static const std::string XDAQ_CONTEXT_TABLE_NAME;
33  static const std::string XDAQ_APPLICATION_TABLE_NAME;
34  static const std::string GROUP_ALIASES_TABLE_NAME;
35  static const std::string VERSION_ALIASES_TABLE_NAME;
36 
37  static const std::string ACTIVE_GROUP_NAME_CONTEXT;
38  static const std::string ACTIVE_GROUP_NAME_BACKBONE;
39  static const std::string ACTIVE_GROUP_NAME_ITERATE;
40  static const std::string ACTIVE_GROUP_NAME_CONFIGURATION;
41  static const std::string ACTIVE_GROUP_NAME_UNKNOWN;
42 
43  static const uint8_t METADATA_COL_ALIASES;
44  static const uint8_t METADATA_COL_COMMENT;
45  static const uint8_t METADATA_COL_AUTHOR;
46  static const uint8_t METADATA_COL_TIMESTAMP;
47 
48  static const std::set<std::string> contextMemberNames_; // list of context members
49  static const std::set<std::string> backboneMemberNames_; // list of backbone members
50  static const std::set<std::string> iterateMemberNames_; // list of iterate members
51 
52  static const std::set<std::string>& getContextMemberNames(void);
53  static const std::set<std::string>& getBackboneMemberNames(void);
54  static const std::set<std::string>& getIterateMemberNames(void);
55 
56  static std::string encodeURIComponent(const std::string& sourceStr);
57  static const std::string& convertGroupTypeIdToName(int groupTypeId);
58  static int getTypeOfGroup(
59  const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
60  static const std::string& getTypeNameOfGroup(
61  const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
62 
63  //==============================================================================
64  // Construct/Destruct
65 
66  enum
67  {
68  CONTEXT_TYPE,
69  BACKBONE_TYPE,
70  ITERATE_TYPE,
71  CONFIGURATION_TYPE
72  };
73 
74  ConfigurationManager(bool initForWriteAccess = false,
75  bool initializeFromFhicl = false);
76  virtual ~ConfigurationManager(void);
77 
78  void init(std::string* accumulatedErrors = 0, bool initForWriteAccess = false);
79  void destroy(void);
80  void destroyTableGroup(const std::string& theGroup = "", bool onlyDeactivate = false);
81 
82  //==============================================================================
83  // Getters
84 
85  void loadTableGroup(
86  const std::string& configGroupName,
87  TableGroupKey configGroupKey,
88  bool doActivate = false,
89  std::map<std::string, TableVersion>* groupMembers = 0,
90  ProgressBar* progressBar = 0,
91  std::string* accumulateWarnings = 0,
92  std::string* groupComment = 0,
93  std::string* groupAuthor = 0,
94  std::string* groupCreateTime = 0,
95  bool doNotLoadMember = false,
96  std::string* groupTypeString = 0,
97  std::map<std::string /*name*/, std::string /*alias*/>* groupAliases = 0,
98  bool onlyLoadIfBackboneOrContext = false);
99  void loadMemberMap(
100  const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
101  TableGroupKey loadConfigurationBackbone(void);
102 
103  //================
104  // getTable
105  // get configuration * with specific configuration type
106  template<class T>
107  const T* getTable(std::string name) const
108  {
109  return (T*)(getTableByName(name));
110  }
111 
112  const TableBase* getTableByName(const std::string& configurationName) const;
113 
114  void dumpActiveConfiguration(const std::string& filePath,
115  const std::string& dumpType);
116 
117  std::map<std::string /*groupAlias*/,
118  std::pair<std::string /*groupName*/, TableGroupKey>>
119  getActiveGroupAliases(void);
120  // Note: this ConfigurationManager::getVersionAliases is called internally and by
121  // ConfigurationManagerRW::getVersionAliases
122  std::map<std::string /*tableName*/, std::map<std::string /*aliasName*/, TableVersion>>
123  getVersionAliases(void) const;
124 
125  std::pair<std::string /*groupName*/, TableGroupKey> getTableGroupFromAlias(
126  std::string systemAlias, ProgressBar* progressBar = 0);
127  std::map<std::string /*groupType*/,
128  std::pair<std::string /*groupName*/, TableGroupKey>>
129  getActiveTableGroups(void) const;
130  const std::map<std::string /*groupType*/,
131  std::pair<std::string /*groupName*/, TableGroupKey>>&
132  getFailedTableGroups(void) const
133  {
134  return lastFailedGroupLoad_;
135  }
136  const std::string& getActiveGroupName(const std::string& type = "") const;
137  TableGroupKey getActiveGroupKey(const std::string& type = "") const;
138 
139  ConfigurationTree getNode(
140  const std::string& nodeString,
141  bool doNotThrowOnBrokenUIDLinks = false) const; //"root/parent/parent/"
142  ConfigurationTree getContextNode(const std::string& contextUID,
143  const std::string& applicationUID) const;
144  ConfigurationTree getSupervisorNode(const std::string& contextUID,
145  const std::string& applicationUID) const;
146  ConfigurationTree getSupervisorTableNode(const std::string& contextUID,
147  const std::string& applicationUID) const;
148 
149  std::vector<std::pair<std::string /*childName*/, ConfigurationTree>> getChildren(
150  std::map<std::string, TableVersion>* memberMap = 0,
151  std::string* accumulatedTreeErrors = 0) const;
152  std::string getFirstPathToNode(const ConfigurationTree& node,
153  const std::string& startPath = "/") const;
154 
155  std::map<std::string, TableVersion> getActiveVersions(void) const;
156 
157  const std::string& getOwnerContext(void) { return ownerContextUID_; }
158  const std::string& getOwnerApp(void) { return ownerAppUID_; }
159  bool isOwnerFirstAppInContext(void);
160 
161  //==============================================================================
162  // Setters/Modifiers
163  std::shared_ptr<TableGroupKey> makeTheTableGroupKey(TableGroupKey key);
164  void restoreActiveTableGroups(bool throwErrors = false,
165  const std::string& pathToActiveGroupsFile = "",
166  bool onlyLoadIfBackboneOrContext = false);
167 
168  void setOwnerContext(const std::string& contextUID) { ownerContextUID_ = contextUID; }
169  void setOwnerApp(const std::string& appUID) { ownerAppUID_ = appUID; }
170 
171  private:
172  ConfigurationManager(const std::string& userName); // private constructor called by
173  // ConfigurationManagerRW
174  void initializeFromFhicl(const std::string& fhiclPath);
175  void recursiveInitFromFhiclPSet(const std::string& tableName,
176  const fhicl::ParameterSet& pset,
177  const std::string& recordName = "",
178  const std::string& groupName = "",
179  const std::string& groupLinkIndex = "");
180 
181  std::string username_; // user of the configuration is READONLY_USER unless using
182  // ConfigurationManagerRW
183  ConfigurationInterface* theInterface_;
184  std::shared_ptr<TableGroupKey> theConfigurationTableGroupKey_,
185  theContextTableGroupKey_, theBackboneTableGroupKey_, theIterateTableGroupKey_;
186  std::string theConfigurationTableGroup_, theContextTableGroup_,
187  theBackboneTableGroup_, theIterateTableGroup_;
188 
189  std::map<std::string, std::pair<std::string, TableGroupKey>> lastFailedGroupLoad_;
190 
191  std::map<std::string, TableBase*> nameToTableMap_;
192 
193  TableBase groupMetadataTable_; // special table - version saved each time a group is
194  // created
195 
196  std::string ownerContextUID_; // optional, often there is a context that owns this
197  // configuration manager
198  std::string ownerAppUID_; // optional, often there is a supervisor that owns this
199  // configuration manager
200 };
201 } // namespace ots
202 
203 #endif