otsdaq  3.03.00
ConfigurationTree.h
1 #ifndef _ots_ConfigurationTree_h_
2 #define _ots_ConfigurationTree_h_
3 
4 #include "otsdaq/TableCore/TableView.h"
5 
6 namespace ots
7 {
8 class ConfigurationManager;
9 class TableBase;
10 
11 template<typename T>
12 struct identity
13 {
14  typedef T type;
15 };
16 
18 {
19  friend class ConfigurationGUISupervisor;
20  friend class Iterator;
21  friend class ARTDAQTableBase;
22 
23  // clang-format off
24  public:
47  ConfigurationTree(const ConfigurationManager* const& configMgr,
48  const TableBase* const& table);
49  ~ConfigurationTree(void);
50 
51  ConfigurationTree(ConfigurationTree const& a) = default;
52 
53  ConfigurationTree& operator=(const ConfigurationTree& a)
54  {
55  __COUT__ << "OPERATOR= COPY CONSTRUCTOR ConfigManager: " << configMgr_
56  << " configuration: " << table_ << std::endl;
57  // Note: Members of the ConfigurationTree are declared constant.
58  // (Refer to comments at top of class declaration for solutions)
59  // So this operator cannot work.. SO I am going to crash just in case it is
60  // called by mistake
61  __COUT__ << "OPERATOR= COPY CONSTRUCTOR CANNOT BE USED - ConfigurationTree is a "
62  "const class. SO YOUR CODE IS WRONG! You should probably instantiate "
63  "and initialize another ConfigurationTree, rather than assigning to "
64  "an existing ConfigurationTree. Crashing now."
65  << std::endl;
66  __COUT__ << "OPERATOR= COPY CONSTRUCTOR CANNOT BE USED - ConfigurationTree is a "
67  "const class. SO YOUR CODE IS WRONG! You should probably instantiate "
68  "and initialize another ConfigurationTree, rather than assigning to "
69  "an existing ConfigurationTree. Crashing now."
70  << std::endl;
71  __COUT__ << "OPERATOR= COPY CONSTRUCTOR CANNOT BE USED - ConfigurationTree is a "
72  "const class. SO YOUR CODE IS WRONG! You should probably instantiate "
73  "and initialize another ConfigurationTree, rather than assigning to "
74  "an existing ConfigurationTree. Crashing now."
75  << std::endl;
76  __COUT__ << "OPERATOR= COPY CONSTRUCTOR CANNOT BE USED - ConfigurationTree is a "
77  "const class. SO YOUR CODE IS WRONG! You should probably instantiate "
78  "and initialize another ConfigurationTree, rather than assigning to "
79  "an existing ConfigurationTree. Crashing now."
80  << std::endl;
81  __COUT__ << "OPERATOR= COPY CONSTRUCTOR CANNOT BE USED - ConfigurationTree is a "
82  "const class. SO YOUR CODE IS WRONG! You should probably instantiate "
83  "and initialize another ConfigurationTree, rather than assigning to "
84  "an existing ConfigurationTree. Crashing now."
85  << std::endl;
86  __COUT__ << "OPERATOR= COPY CONSTRUCTOR CANNOT BE USED - ConfigurationTree is a "
87  "const class. SO YOUR CODE IS WRONG! You should probably instantiate "
88  "and initialize another ConfigurationTree, rather than assigning to "
89  "an existing ConfigurationTree. Crashing now."
90  << std::endl;
91 
93  exit(0);
94 
95  // copy to const members is not allowed.. but would look like this:
96 
97  configMgr_ = a.configMgr_;
98  table_ = a.table_;
99  // groupId_ = a.groupId_;
100  // linkColName_ = a.linkColName_;
101  // childLinkIndex_ = a.childLinkIndex_;
102  // row_ = a.row_;
103  // col_ = a.col_;
104  tableView_ = a.tableView_;
105  __COUT__ << "OPERATOR COPY CONSTRUCTOR" << std::endl;
106  return *this;
107  }; //end operator=
108 
109  static const std::string DISCONNECTED_VALUE;
110  static const std::string VALUE_TYPE_DISCONNECTED;
111  static const std::string VALUE_TYPE_NODE;
112 
113  static const std::string NODE_TYPE_GROUP_TABLE;
114  static const std::string NODE_TYPE_TABLE;
115  static const std::string NODE_TYPE_GROUP_LINK;
116  static const std::string NODE_TYPE_UID_LINK;
117  static const std::string NODE_TYPE_VALUE;
118  static const std::string NODE_TYPE_UID;
119  static const std::string NODE_TYPE_ROOT;
120 
121  static const std::string ROOT_NAME;
122 
123  template<typename T>
124  struct BitMap
125  {
126  BitMap() : isDefault_(true), zero_(T()) {}
127 
129  const T& get(unsigned int row, unsigned int col) const
130  {
131  return isDefault_ ? zero_ : bitmap_[row][col];
132  }
133  unsigned int numberOfRows() const { return bitmap_.size(); }
134  unsigned int numberOfColumns(unsigned int row) const
135  {
136  return bitmap_[row].size();
137  }
138  void print(std::ostream& out = std::cout) const;
139 
140  private:
141  std::vector<std::vector<T>> bitmap_;
142  bool isDefault_;
143  T zero_;
144  };
145 
148  //==============================================================================
152  template<class T>
153  void getValue (T& value) const;
157  void getValue (std::string& value) const;
158  template<class T>
159  void getValueAsBitMap (ConfigurationTree::BitMap<T>& value) const;
160  void getValueAsBitMap (ConfigurationTree::BitMap<std::string>& value) const;
161 
162  //==============================================================================
167  template<class T>
168  T getValue (void) const;
169  template<class T>
170  T getValueWithDefault (const T& defaultValue) const;
174  std::string getValue (void) const;
175  std::string getValueWithDefault (const std::string& defaultValue) const;
176  template<class T>
177  ConfigurationTree::BitMap<T> getValueAsBitMap (void) const;
178  ConfigurationTree::BitMap<std::string> getValueAsBitMap (void) const;
179 
180  private:
181  template<typename T>
182  T handleValidateValueForColumn(
183  const TableView* configView,
184  std::string value,
185  unsigned int col,
186  ots::identity<T>) const;
187  std::string handleValidateValueForColumn(
188  const TableView* configView,
189  std::string value,
190  unsigned int col,
192 
193  public:
195  ConfigurationTree getNode (const std::string& nodeName, bool doNotThrowOnBrokenUIDLinks = false) const;
196  std::map<std::string, ConfigurationTree> getNodes (const std::string& nodeString) const;
197  ConfigurationTree getBackNode (std::string nodeName, unsigned int backSteps = 1) const;
198  ConfigurationTree getForwardNode (std::string nodeName, unsigned int forwardSteps = 1) const;
199 
201  const ConfigurationManager* getConfigurationManager (void) const { return configMgr_; }
202  const std::string& getTableName (void) const;
203  const std::string& getParentTableName (void) const;
204  const std::string& getFieldTableName (void) const;
205  const TableVersion& getTableVersion (void) const;
206  const time_t& getTableCreationTime (void) const;
207  std::vector<std::vector<std::string>> getChildrenNamesByPriority (bool onlyStatusTrue = false) const;
208  std::vector<std::string> getChildrenNames (bool byPriority = false, bool onlyStatusTrue = false) const;
209  std::vector<std::vector<std::pair<
210  std::string, ConfigurationTree>>> getChildrenByPriority (std::map<std::string /*relative-path*/,
211  std::string /*value*/> filterMap = std::map<std::string /*relative-path*/, std::string /*value*/>(),
212  bool onlyStatusTrue = false) const;
213  std::vector<std::pair<std::string,
214  ConfigurationTree>> getChildren (std::map<std::string /*relative-path*/,
215  std::string /*value*/> filterMap = std::map<std::string /*relative-path*/, std::string /*value*/>(),
216  bool byPriority = false,
217  bool onlyStatusTrue = false) const;
218  std::map<std::string, ConfigurationTree> getChildrenMap (std::map<std::string /*relative-path*/,
219  std::string /*value*/> filterMap = std::map<std::string /*relative-path*/, std::string /*value*/>(),
220  bool onlyStatusTrue = false) const;
221  bool passFilterMap (const std::string& childName, std::map<std::string /*relative-path*/, std::string /*value*/> filterMap) const;
222  std::string getEscapedValue (void) const;
223  const std::string& getValueAsString (bool returnLinkTableValue = false) const;
224  const std::string& getUIDAsString (void) const;
225  const std::string& getComment (void) const;
226  const std::string& getAuthor (void) const;
227  const std::string& getValueDataType (void) const;
228  const std::string& getValueType (void) const;
229  const std::string& getValueName (void) const;
230  const std::string& getDefaultValue (void) const;
231  inline const std::string& getFieldName (void) const { return getValueName(); }
232  std::string getNodeType (void) const;
233  const unsigned int& getNodeRow (void) const;
234  const std::string& getDisconnectedTableName (void) const;
235  const std::string& getDisconnectedLinkID (void) const;
236  const std::string& getChildLinkIndex (void) const;
237  std::vector<std::string> getFixedChoices (void) const;
238  std::set<std::string> getSetOfGroupIDs (void) const;
239 
240  public:
242  bool isDefaultValue (void) const;
243  inline bool isRootNode (void) const { return (!isLinkNode() && !table_); }
244  inline bool isTableNode (void) const { return (table_ && row_ == TableView::INVALID && col_ == TableView::INVALID); }
245  bool isValueNode (void) const;
246  bool isValueBoolType (void) const;
247  bool isValueNumberDataType (void) const;
248  bool isDisconnected (void) const;
249  bool isLinkNode (void) const;
250  bool isGroupLinkNode (void) const;
251  bool isUIDLinkNode (void) const;
252  bool isGroupIDNode (void) const;
253  bool isUIDNode (void) const;
254  bool isStatusNode (void) const;
255  bool isEnabled (void) const;
256  inline bool status (void) const { return isEnabled(); }
257 
258  void print (const unsigned int& depth = -1, std::ostream& out = std::cout) const;
259  std::string nodeDump (void) const;
260 
262  friend std::ostream& operator<< (
263  std::ostream& out, const ConfigurationTree& t)
264  {
265  out << t.getValueAsString();
266  return out;
267  }
268 
269  const TableViewColumnInfo& getColumnInfo (void) const;
270 
271  protected:
272  const unsigned int& getRow (void) const;
273  const unsigned int& getColumn (void) const;
274  const unsigned int& getFieldRow (void) const;
275  const unsigned int& getFieldColumn (void) const;
276 
277 
279  struct RecordField
280  {
281  RecordField(const std::string& table,
282  const std::string& /*uid*/,
283  const std::string& columnName,
284  const std::string& relativePath,
285  const TableViewColumnInfo* columnInfo)
286  : tableName_(table)
287  , columnName_(columnName)
288  , relativePath_(relativePath)
289  , columnInfo_(columnInfo)
290  {
291  }
292 
293  std::string tableName_, columnName_, relativePath_;
294  // relativePath_ is relative to record uid node, not including columnName_
295 
296  const TableViewColumnInfo* columnInfo_;
297  };
298  std::vector<ConfigurationTree::RecordField> getCommonFields (
299  const std::vector<std::string /*relative-path*/>& recordList,
300  const std::vector<std::string /*relative-path*/>& fieldAcceptList,
301  const std::vector<std::string /*relative-path*/>& fieldRejectList,
302  unsigned int depth = -1,
303  bool autoSelectFilterFields = false) const;
304  std::set<std::string /*unique-value*/> getUniqueValuesForField (
305  const std::vector<std::string /*relative-path*/>& recordList,
306  const std::string& fieldName,
307  std::string* fieldGroupIDChildLinkIndex = 0) const;
308 
309  private:
311  ConfigurationTree(const ConfigurationManager* const& configMgr,
312  const TableBase* const& config,
313  const std::string& groupId,
314  const TableBase* const& linkParentConfig,
315  const std::string& linkColName,
316  const std::string& linkColValue,
317  const unsigned int linkBackRow,
318  const unsigned int linkBackCol,
319  const std::string& disconnectedTargetName,
320  const std::string& disconnectedLinkID,
321  const std::string& childLinkIndex,
322  const unsigned int row = TableView::INVALID,
323  const unsigned int col = TableView::INVALID);
324 
325  static ConfigurationTree recurse (const ConfigurationTree& t, const std::string& childPath, bool doNotThrowOnBrokenUIDLinks, const std::string& originalNodeString);
326  ConfigurationTree recursiveGetNode (const std::string& nodeName, bool doNotThrowOnBrokenUIDLinks, const std::string& originalNodeString) const;
327  static void recursivePrint (const ConfigurationTree& t, unsigned int depth, std::ostream& out, std::string space);
328 
329  void recursiveGetCommonFields (
330  std::vector<ConfigurationTree::RecordField>& fieldCandidateList,
331  std::vector<int>& fieldCount,
332  const std::vector<std::string /*relative-path*/>& fieldAcceptList,
333  const std::vector<std::string /*relative-path*/>& fieldRejectList,
334  unsigned int depth,
335  const std::string& relativePathBase,
336  bool inFirstRecord) const;
337  ConfigurationTree getValueAsTreeNode (void) const;
338 
345  const ConfigurationManager* configMgr_;
346  const TableBase* table_;
347  const std::string groupId_;
348  const TableBase* linkParentTable_;
350  const std::string linkColName_;
351  const std::string linkColValue_;
352  const unsigned int linkBackRow_;
353  const unsigned int linkBackCol_;
354  const std::string disconnectedTargetName_;
356  const std::string disconnectedLinkID_;
357  const std::string childLinkIndex_;
358  const unsigned int row_;
359  const unsigned int col_;
360  const TableView* tableView_;
361 
362  static time_t LAST_NODE_DUMP_TIME;
363 };
364 
365 #include "otsdaq/ConfigurationInterface/ConfigurationTree.icc" //define template functions
366 
367 //==============================================================================
371 template<typename T>
372 inline void ConfigurationTree::BitMap<T>::print(std::ostream& out) const
373 {
374  if(!bitmap_.size())
375  {
376  out << "Bitmap print of empty bitmap.";
377  return;
378  }
379 
380  out << "Bitmap print of size " << bitmap_.size() << " x " << bitmap_[0].size() << __E__;
381  out << " r x c : ";
382  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
383  out << std::right << std::setw(15) << c << ' ';
384  out << "\n-------+-";
385  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
386  out << "---------------+";
387  for(unsigned int r = 0; r < bitmap_.size(); ++r)
388  {
389  out << "\n" << std::right << std::setw(6) << r << " : ";
390  if(sizeof(T) == 1) //force 8-bit to number display
391  for(unsigned int c = 0; c < bitmap_[r].size(); ++c)
392  out << std::right << std::setw(15) << std::fixed << std::setprecision(3) << (uint16_t)get(r,c) << ' ';
393  else
394  for(unsigned int c = 0; c < bitmap_[r].size(); ++c)
395  out << std::right << std::setw(15) << std::fixed << std::setprecision(3) << get(r,c) << ' ';
396  }
397  out << "\n=======+=";
398  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
399  out << "===============+";
400 
401  out << "\n";
402 } //end print()
403 
404 //==============================================================================
408 template<>
409 inline void ConfigurationTree::BitMap<std::string>::print(std::ostream& out) const
410 {
411  if(!bitmap_.size())
412  {
413  out << "Bitmap print of empty bitmap.";
414  return;
415  }
416 
417  out << "Bitmap print of size " << bitmap_.size() << " x " << bitmap_[0].size() << __E__;
418  out << " r x c : ";
419  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
420  out << std::right << std::setw(15) << c << ' ';
421  out << "\n-------+-";
422  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
423  out << "---------------+";
424  for(unsigned int r = 0; r < bitmap_.size(); ++r)
425  {
426  out << "\n" << std::right << std::setw(6) << r << " : ";
427  for(unsigned int c = 0; c < bitmap_[r].size(); ++c)
428  out << std::right << std::setw(15) << get(r,c) << ' ';
429  }
430  out << "\n=======+=";
431  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
432  out << "===============+";
433 
434  out << "\n";
435 } //end print() T=std:string
436 
437 // clang-format on
438 } // namespace ots
439 
440 #endif
<virtual so future plugins can inherit from multiple table base classes
const unsigned int & getRow(void) const
getRow
const std::string & getValueDataType(void) const
std::map< std::string, ConfigurationTree > getNodes(const std::string &nodeString) const
getNodes
const TableVersion & getTableVersion(void) const
getTableVersion
bool isDisconnected(void) const
const std::string & getAuthor(void) const
getAuthor
const std::string & getComment(void) const
getComment
std::vector< std::string > getChildrenNames(bool byPriority=false, bool onlyStatusTrue=false) const
bool isEnabled(void) const
same as status()
static const std::string NODE_TYPE_GROUP_TABLE
bool isValueNumberDataType(void) const
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
const std::string & getTableName(void) const
getTableName
T getValueWithDefault(const T &defaultValue) const
const unsigned int & getFieldRow(void) const
std::map< std::string, ConfigurationTree > getChildrenMap(std::map< std::string, std::string > filterMap=std::map< std::string, std::string >(), bool onlyStatusTrue=false) const
const std::string & getValueName(void) const
const std::string & getValueAsString(bool returnLinkTableValue=false) const
const ConfigurationManager * getConfigurationManager(void) const
extracting information from node
const std::string & getChildLinkIndex(void) const
getChildLinkIndex
void print(const unsigned int &depth=-1, std::ostream &out=std::cout) const
bool isGroupIDNode(void) const
void getValue(T &value) const
const std::string & getDisconnectedTableName(void) const
getDisconnectedTableName
bool isValueBoolType(void) const
std::vector< std::pair< std::string, ConfigurationTree > > getChildren(std::map< std::string, std::string > filterMap=std::map< std::string, std::string >(), bool byPriority=false, bool onlyStatusTrue=false) const
std::vector< std::string > getFixedChoices(void) const
const std::string & getDefaultValue(void) const
const time_t & getTableCreationTime(void) const
getTableCreationTime
const std::string & getUIDAsString(void) const
bool status(void) const
same as isEnabled()
std::vector< ConfigurationTree::RecordField > getCommonFields(const std::vector< std::string > &recordList, const std::vector< std::string > &fieldAcceptList, const std::vector< std::string > &fieldRejectList, unsigned int depth=-1, bool autoSelectFilterFields=false) const
const unsigned int & getNodeRow(void) const
getNodeRow
std::set< std::string > getSetOfGroupIDs(void) const
bool isValueNode(void) const
const std::string & getFieldName(void) const
alias for getValueName
std::vector< std::vector< std::string > > getChildrenNamesByPriority(bool onlyStatusTrue=false) const
std::set< std::string > getUniqueValuesForField(const std::vector< std::string > &recordList, const std::string &fieldName, std::string *fieldGroupIDChildLinkIndex=0) const
const std::string & getValueType(void) const
bool passFilterMap(const std::string &childName, std::map< std::string, std::string > filterMap) const
std::string nodeDump(void) const
used for debugging (when throwing exception)
~ConfigurationTree(void)
destructor
bool isGroupLinkNode(void) const
const std::string & getFieldTableName(void) const
const unsigned int & getColumn(void) const
getColumn
const std::string & getDisconnectedLinkID(void) const
getDisconnectedLinkID
const std::string & getParentTableName(void) const
getParentTableName
bool isUIDLinkNode(void) const
std::string getEscapedValue(void) const
friend std::ostream & operator<<(std::ostream &out, const ConfigurationTree &t)
make stream output easy
const TableViewColumnInfo & getColumnInfo(void) const
bool isDefaultValue(void) const
boolean info
std::vector< std::vector< std::pair< std::string, ConfigurationTree > > > getChildrenByPriority(std::map< std::string, std::string > filterMap=std::map< std::string, std::string >(), bool onlyStatusTrue=false) const
T getValue(void) const
defined in included .icc source
const unsigned int & getFieldColumn(void) const
friend ConfigurationTree
so ConfigurationTree can access private
void print(std::ostream &out=std::cout) const
extracting information from a list of records
static std::string stackTrace(void)