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& getParentRecordName (void) const;
205  const std::string& getParentLinkColumnName (void) const;
206  std::string getParentLinkID (void) const;
207  std::string getParentLinkIndex (void) const;
208  const std::string& getFieldTableName (void) const;
209  const TableVersion& getTableVersion (void) const;
210  const time_t& getTableCreationTime (void) const;
211  std::vector<std::vector<std::string>> getChildrenNamesByPriority (bool onlyStatusTrue = false) const;
212  std::vector<std::string> getChildrenNames (bool byPriority = false, bool onlyStatusTrue = false) const;
213  std::vector<std::vector<std::pair<
214  std::string, ConfigurationTree>>> getChildrenByPriority (std::map<std::string /*relative-path*/,
215  std::string /*value*/> filterMap = std::map<std::string /*relative-path*/, std::string /*value*/>(),
216  bool onlyStatusTrue = false) const;
217  std::vector<std::pair<std::string,
218  ConfigurationTree>> getChildren (std::map<std::string /*relative-path*/,
219  std::string /*value*/> filterMap = std::map<std::string /*relative-path*/, std::string /*value*/>(),
220  bool byPriority = false,
221  bool onlyStatusTrue = false) const;
222  std::map<std::string, ConfigurationTree> getChildrenMap (std::map<std::string /*relative-path*/,
223  std::string /*value*/> filterMap = std::map<std::string /*relative-path*/, std::string /*value*/>(),
224  bool onlyStatusTrue = false) const;
225  bool passFilterMap (const std::string& childName, std::map<std::string /*relative-path*/, std::string /*value*/> filterMap) const;
226  std::string getEscapedValue (void) const;
227  const std::string& getValueAsString (bool returnLinkTableValue = false) const;
228  const std::string& getUIDAsString (void) const;
229  const std::string& getComment (void) const;
230  bool hasComment (void) const;
231  const std::string& getAuthor (void) const;
232  const std::string& getValueDataType (void) const;
233  const std::string& getValueType (void) const;
234  const std::string& getValueName (void) const;
235  const std::string& getDefaultValue (void) const;
236  inline const std::string& getFieldName (void) const { return getValueName(); }
237  std::string getNodeType (void) const;
238  const unsigned int& getNodeRow (void) const;
239  const std::string& getDisconnectedTableName (void) const;
240  const std::string& getDisconnectedLinkID (void) const;
241  const std::string& getChildLinkIndex (void) const;
242  std::vector<std::string> getFixedChoices (void) const;
243  std::set<std::string> getSetOfGroupIDs (void) const;
244 
245  public:
247  bool isDefaultValue (void) const;
248  inline bool isRootNode (void) const { return (!isLinkNode() && !table_); }
249  inline bool isTableNode (void) const { return (table_ && row_ == TableView::INVALID && col_ == TableView::INVALID); }
250  bool isValueNode (void) const;
251  bool isValueBoolType (void) const;
252  bool isValueNumberDataType (void) const;
253  bool isDisconnected (void) const;
254  bool isLinkNode (void) const;
255  bool isGroupLinkNode (void) const;
256  bool isUIDLinkNode (void) const;
257  bool isGroupIDNode (void) const;
258  bool isUIDNode (void) const;
259  bool isStatusNode (void) const;
260  bool isEnabled (void) const;
261  inline bool status (void) const { return isEnabled(); }
262 
263  void print (const unsigned int& depth = -1, std::ostream& out = std::cout) const;
264  std::string nodeDump (bool forcePrintout = false) const;
265 
267  friend std::ostream& operator<< (
268  std::ostream& out, const ConfigurationTree& t)
269  {
270  out << t.getValueAsString();
271  return out;
272  }
273 
274  const TableViewColumnInfo& getColumnInfo (void) const;
275 
276  protected:
277  const unsigned int& getRow (void) const;
278  const unsigned int& getColumn (void) const;
279  const unsigned int& getFieldRow (void) const;
280  const unsigned int& getFieldColumn (void) const;
281 
282 
284  struct RecordField
285  {
286  RecordField(const std::string& table,
287  const std::string& /*uid*/,
288  const std::string& columnName,
289  const std::string& relativePath,
290  const TableViewColumnInfo* columnInfo)
291  : tableName_(table)
292  , columnName_(columnName)
293  , relativePath_(relativePath)
294  , columnInfo_(columnInfo)
295  {
296  }
297 
298  std::string tableName_, columnName_, relativePath_;
299  // relativePath_ is relative to record uid node, not including columnName_
300 
301  const TableViewColumnInfo* columnInfo_;
302  };
303  std::vector<ConfigurationTree::RecordField> getCommonFields (
304  const std::vector<std::string /*relative-path*/>& recordList,
305  const std::vector<std::string /*relative-path*/>& fieldAcceptList,
306  const std::vector<std::string /*relative-path*/>& fieldRejectList,
307  unsigned int depth = -1,
308  bool autoSelectFilterFields = false) const;
309  std::set<std::string /*unique-value*/> getUniqueValuesForField (
310  const std::vector<std::string /*relative-path*/>& recordList,
311  const std::string& fieldName,
312  std::string* fieldGroupIDChildLinkIndex = 0) const;
313 
314  private:
316  ConfigurationTree(const ConfigurationManager* const& configMgr,
317  const TableBase* const& config,
318  const std::string& groupId,
319  const TableBase* const& linkParentConfig,
320  const std::string& linkColName,
321  const std::string& linkColValue,
322  const unsigned int linkBackRow,
323  const unsigned int linkBackCol,
324  const std::string& disconnectedTargetName,
325  const std::string& disconnectedLinkID,
326  const std::string& childLinkIndex,
327  const unsigned int row = TableView::INVALID,
328  const unsigned int col = TableView::INVALID);
329 
330  static ConfigurationTree recurse (const ConfigurationTree& t, const std::string& childPath, bool doNotThrowOnBrokenUIDLinks, const std::string& originalNodeString);
331  ConfigurationTree recursiveGetNode (const std::string& nodeName, bool doNotThrowOnBrokenUIDLinks, const std::string& originalNodeString) const;
332  static void recursivePrint (const ConfigurationTree& t, unsigned int depth, std::ostream& out, std::string space);
333 
334  void recursiveGetCommonFields (
335  std::vector<ConfigurationTree::RecordField>& fieldCandidateList,
336  std::vector<int>& fieldCount,
337  const std::vector<std::string /*relative-path*/>& fieldAcceptList,
338  const std::vector<std::string /*relative-path*/>& fieldRejectList,
339  unsigned int depth,
340  const std::string& relativePathBase,
341  bool inFirstRecord) const;
342  ConfigurationTree getValueAsTreeNode (void) const;
343 
350  const ConfigurationManager* configMgr_;
351  const TableBase* table_;
352  const std::string groupId_;
353  const TableBase* linkParentTable_;
355  const std::string linkColName_;
356  const std::string linkColValue_;
357  const unsigned int linkBackRow_;
358  const unsigned int linkBackCol_;
359  const std::string disconnectedTargetName_;
361  const std::string disconnectedLinkID_;
362  const std::string childLinkIndex_;
363  const unsigned int row_;
364  const unsigned int col_;
365  const TableView* tableView_;
366 
367  static time_t LAST_NODE_DUMP_TIME;
368 };
369 
370 #include "otsdaq/ConfigurationInterface/ConfigurationTree.icc" //define template functions
371 
372 //==============================================================================
376 template<typename T>
377 inline void ConfigurationTree::BitMap<T>::print(std::ostream& out) const
378 {
379  if(!bitmap_.size())
380  {
381  out << "Bitmap print of empty bitmap.";
382  return;
383  }
384 
385  out << "Bitmap print of size " << bitmap_.size() << " x " << bitmap_[0].size() << __E__;
386  out << " r x c : ";
387  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
388  out << std::right << std::setw(15) << c << ' ';
389  out << "\n-------+-";
390  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
391  out << "---------------+";
392  for(unsigned int r = 0; r < bitmap_.size(); ++r)
393  {
394  out << "\n" << std::right << std::setw(6) << r << " : ";
395  if(sizeof(T) == 1) //force 8-bit to number display
396  for(unsigned int c = 0; c < bitmap_[r].size(); ++c)
397  out << std::right << std::setw(15) << std::fixed << std::setprecision(3) << (uint16_t)get(r,c) << ' ';
398  else
399  for(unsigned int c = 0; c < bitmap_[r].size(); ++c)
400  out << std::right << std::setw(15) << std::fixed << std::setprecision(3) << get(r,c) << ' ';
401  }
402  out << "\n=======+=";
403  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
404  out << "===============+";
405 
406  out << "\n";
407 } //end print()
408 
409 //==============================================================================
413 template<>
414 inline void ConfigurationTree::BitMap<std::string>::print(std::ostream& out) const
415 {
416  if(!bitmap_.size())
417  {
418  out << "Bitmap print of empty bitmap.";
419  return;
420  }
421 
422  out << "Bitmap print of size " << bitmap_.size() << " x " << bitmap_[0].size() << __E__;
423  out << " r x c : ";
424  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
425  out << std::right << std::setw(15) << c << ' ';
426  out << "\n-------+-";
427  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
428  out << "---------------+";
429  for(unsigned int r = 0; r < bitmap_.size(); ++r)
430  {
431  out << "\n" << std::right << std::setw(6) << r << " : ";
432  for(unsigned int c = 0; c < bitmap_[r].size(); ++c)
433  out << std::right << std::setw(15) << get(r,c) << ' ';
434  }
435  out << "\n=======+=";
436  for(unsigned int c = 0; c < bitmap_[0].size(); ++c)
437  out << "===============+";
438 
439  out << "\n";
440 } //end print() T=std:string
441 
442 // clang-format on
443 } // namespace ots
444 
445 #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
std::string nodeDump(bool forcePrintout=false) const
used for debugging (when throwing exception)
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
bool hasComment(void) const
hasComment
const std::string & getDefaultValue(void) const
const time_t & getTableCreationTime(void) const
getTableCreationTime
std::string getParentLinkIndex(void) const
getParentLinkIndex
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
~ConfigurationTree(void)
destructor
bool isGroupLinkNode(void) const
std::string getParentLinkID(void) const
getParentLinkID
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
const std::string & getParentRecordName(void) const
getParentRecordName
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
const std::string & getParentLinkColumnName(void) const
getParentLinkColumnName
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)