otsdaq  v2_04_01
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  enum
53  {
54  CONTEXT_TYPE,
55  BACKBONE_TYPE,
56  ITERATE_TYPE,
57  CONFIGURATION_TYPE
58  };
59 
60  // clang-format off
61 
62  static const std::set<std::string>& getContextMemberNames (void);
63  static const std::set<std::string>& getBackboneMemberNames (void);
64  static const std::set<std::string>& getIterateMemberNames (void);
65 
66  static std::string encodeURIComponent (const std::string& sourceStr);
67  static const std::string& convertGroupTypeIdToName (int groupTypeId);
68  static int getTypeOfGroup (const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
69  static const std::string& getTypeNameOfGroup (const std::map<std::string /*name*/, TableVersion /*version*/>& memberMap);
70 
71  //==============================================================================
72  // Construct/Destruct
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 tableGroupKey,
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  std::string* accumulateWarnings = 0);
102  TableGroupKey loadConfigurationBackbone (void);
103 
104  //================
105  // getTable
106  // get configuration * with specific configuration type
107  template<class T>
108  const T* getTable(std::string name) const
109  {
110  return (T*)(getTableByName(name));
111  }
112 
113  const TableBase* getTableByName (const std::string& configurationName) const;
114 
115  void dumpActiveConfiguration (const std::string& filePath, const std::string& dumpType);
116 
117  std::map<std::string /*groupAlias*/,
118  std::pair<std::string /*groupName*/,
119  TableGroupKey>> getActiveGroupAliases (void);
120  // Note: this ConfigurationManager::getVersionAliases is called internally and by
121  // ConfigurationManagerRW::getVersionAliases
122  std::map<std::string /*tableName*/,
123  std::map<std::string /*aliasName*/,
124  TableVersion>> getVersionAliases (void) const;
125  std::pair<std::string /*groupName*/,
126  TableGroupKey> getTableGroupFromAlias (std::string systemAlias, ProgressBar* progressBar = 0);
127  std::map<std::string /*groupType*/,
128  std::pair<std::string /*groupName*/,
129  TableGroupKey>> getActiveTableGroups (void) const;
130  const std::map<std::string /*groupType*/,
131  std::pair<std::string /*groupName*/,
132  TableGroupKey>>& getFailedTableGroups (void) const {return lastFailedGroupLoad_;}
133  const std::string& getActiveGroupName (const std::string& type = "") const;
134  TableGroupKey getActiveGroupKey (const std::string& type = "") const;
135 
136  ConfigurationTree getNode (const std::string& nodeString, bool doNotThrowOnBrokenUIDLinks = false) const; //"root/parent/parent/"
137  ConfigurationTree getContextNode (const std::string& contextUID, const std::string& applicationUID) const;
138  ConfigurationTree getSupervisorNode (const std::string& contextUID, const std::string& applicationUID) const;
139  ConfigurationTree getSupervisorTableNode (const std::string& contextUID, const std::string& applicationUID) const;
140 
141  std::vector<std::pair<std::string /*childName*/,
142  ConfigurationTree>> getChildren (
143  std::map<std::string, TableVersion>* memberMap = 0,
144  std::string* accumulatedTreeErrors = 0) const;
145  std::string getFirstPathToNode (const ConfigurationTree& node, const std::string& startPath = "/") const;
146 
147  std::map<std::string, TableVersion> getActiveVersions (void) const;
148 
149  const std::string& getOwnerContext (void) { return ownerContextUID_; }
150  const std::string& getOwnerApp (void) { return ownerAppUID_; }
151  bool isOwnerFirstAppInContext (void);
152 
153  //==============================================================================
154  // Setters/Modifiers
155  std::shared_ptr<TableGroupKey> makeTheTableGroupKey (TableGroupKey key);
156  void restoreActiveTableGroups (
157  bool throwErrors = false,
158  const std::string& pathToActiveGroupsFile = "",
159  bool onlyLoadIfBackboneOrContext = false);
160 
161  void setOwnerContext (const std::string& contextUID) { ownerContextUID_ = contextUID; }
162  void setOwnerApp (const std::string& appUID) { ownerAppUID_ = appUID; }
163 
164  private:
165  ConfigurationManager (const std::string& userName); // private constructor called by ConfigurationManagerRW
166 
167  void initializeFromFhicl (const std::string& fhiclPath);
168  void recursiveInitFromFhiclPSet(
169  const std::string& tableName,
170  const fhicl::ParameterSet& pset,
171  const std::string& recordName = "",
172  const std::string& groupName = "",
173  const std::string& groupLinkIndex = "");
174 
175  std::string username_; // user of the configuration is READONLY_USER unless using ConfigurationManagerRW
176  ConfigurationInterface* theInterface_;
177  std::shared_ptr<TableGroupKey> theConfigurationTableGroupKey_, theContextTableGroupKey_, theBackboneTableGroupKey_, theIterateTableGroupKey_;
178  std::string theConfigurationTableGroup_, theContextTableGroup_, theBackboneTableGroup_, theIterateTableGroup_;
179 
180  std::map<std::string, std::pair<std::string, TableGroupKey>> lastFailedGroupLoad_;
181 
182  std::map<std::string, TableBase*> nameToTableMap_;
183 
184  TableBase groupMetadataTable_; // special table - version saved each time a group is created
185 
186  std::string ownerContextUID_; // optional, often there is a context that owns this configuration manager
187  std::string ownerAppUID_; // optional, often there is a supervisor that owns this configuration manager
188 
189  // clang-format on
190 };
191 } // namespace ots
192 
193 #endif