otsdaq  v2_00_00
ConfigurationManagerRW.h
1 #ifndef _ots_ConfigurationManagerRW_h_
2 #define _ots_ConfigurationManagerRW_h_
3 
4 //#include <string>
5 //#include <map>
6 //#include <set>
7 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
8 
9 //Configuration Types
10 
11 //#include <memory>
12 
13 namespace ots {
14 
15 
17  ConfigurationInfo() : //constructor
18  configurationPtr_(0)
19  {}
20 
21  std::set<ConfigurationVersion> versions_;
22  ConfigurationBase* configurationPtr_;
23 };
24 
25 struct GroupInfo {
26  std::set<ConfigurationGroupKey> keys_;
27  std::string latestKeyGroupAuthor_, latestKeyGroupComment_,
28  latestKeyGroupCreationTime_, latestKeyGroupTypeString_;
29  std::map<std::string /*name*/, ConfigurationVersion /*version*/> latestKeyMemberMap_;
30 
31  ConfigurationGroupKey getLatestKey() { return *(keys_.rbegin()); }
32 };
33 
34 
35 #define Q(X) #X
36 #define QUOTE(X) Q(X)
37 #define __GETCFG_RW__(X) getConfigurationRW<X>(QUOTE(X))
38 
39 //==============================================================================
40 //ConfigurationManagerRW
41 // This is the ConfigurationManger with write access
42 // This class inherits all public function from ConfigurationManager
43 // and is a "Friend" class of ConfigurationManager so has access to private members.
45 {
46 public:
47 
48  ConfigurationManagerRW (std::string username);
49 
50  //==============================================================================
51  //Getters
52  const std::string& getUsername (void) const { return username_; }
53  ConfigurationInterface* getConfigurationInterface (void) const { return theInterface_; }
54 
55  const std::map<std::string, ConfigurationInfo>& getAllConfigurationInfo (bool refresh=false, std::string *accumulatedErrors=0, const std::string &errorFilterName="");
56  /* map < configName, map < aliasName, version > > */
57  std::map<std::string,std::map<std::string,ConfigurationVersion> > getActiveVersionAliases (void) const;
58 
59  template<class T>
60  T* getConfigurationRW(std::string name)
61  {
62  return (T*)getConfigurationByName(name);
63  }
64  ConfigurationBase* getVersionedConfigurationByName (const std::string &configurationName, ConfigurationVersion version, bool looseColumnMatching=false);
65  ConfigurationBase* getConfigurationByName (const std::string &configurationName);
66  ConfigurationGroupKey findConfigurationGroup (const std::string &groupName, const std::map<std::string, ConfigurationVersion> &groupMembers);
67 
68  //==============================================================================
69  //modifiers of generic ConfigurationBase
70 
71  ConfigurationVersion saveNewConfiguration (const std::string &configurationName, ConfigurationVersion temporaryVersion = ConfigurationVersion(), bool makeTemporary = false);//, bool saveToScratchVersion = false);
72  ConfigurationVersion copyViewToCurrentColumns (const std::string &configurationName, ConfigurationVersion sourceVersion);
73  void eraseTemporaryVersion (const std::string &configurationName, ConfigurationVersion targetVersion = ConfigurationVersion());
74  void clearCachedVersions (const std::string &configurationName);
75  void clearAllCachedVersions ();
76 
77  //==============================================================================
78  //modifiers of configuration groups
79 
80  void activateConfigurationGroup (const std::string &configGroupName, ConfigurationGroupKey configGroupKey, std::string *accumulatedTreeErrors=0);
81 
82  ConfigurationVersion createTemporaryBackboneView (ConfigurationVersion sourceViewVersion = ConfigurationVersion()); //-1, from MockUp, else from valid backbone view version
83  ConfigurationVersion saveNewBackbone (ConfigurationVersion temporaryVersion = ConfigurationVersion());
84 
85 
86 
87  //==============================================================================
88  //modifiers of a configuration group based on alias, e.g. "Physics"
89  ConfigurationGroupKey saveNewConfigurationGroup (const std::string &groupName, std::map<std::string, ConfigurationVersion> &groupMembers, const std::string &groupComment = ViewColumnInfo::DATATYPE_COMMENT_DEFAULT);
90 
91 
92 
93  //==============================================================================
94  //public group cache handling
95  const GroupInfo& getGroupInfo (const std::string &groupName);
96  const std::map<std::string, GroupInfo>& getAllGroupInfo () {return allGroupInfo_;}
97 
98  void testXDAQContext(); //for debugging
99 
100 private:
101 
102  //==============================================================================
103  //group cache handling
104  void cacheGroupKey (const std::string &groupName, ConfigurationGroupKey key);
105 
106 
107  //==============================================================================
108  //private members
109  std::map<std::string, ConfigurationInfo> allConfigurationInfo_;
110  std::map<std::string, GroupInfo> allGroupInfo_;
111 
112 };
113 
114 
117  //everything needed for editing a table
118  ConfigurationBase* config_;
119  ConfigurationView* cfgView_;
120  ConfigurationVersion temporaryVersion_, originalVersion_;
121  bool createdTemporaryVersion_; //indicates if temp version was created here
122  bool modified_; //indicates if temp version was modified
123  std::string configName_;
125  TableEditStruct(){ __SS__ << "impossible!" << std::endl; throw std::runtime_error(ss.str());}
126  TableEditStruct(const std::string& configName, ConfigurationManagerRW* cfgMgr)
127  :createdTemporaryVersion_(false)
128  ,modified_(false)
129  ,configName_(configName)
130  {
131  __COUT__ << "Creating Table-Edit Struct for " << configName_ << std::endl;
132  config_ = cfgMgr->getConfigurationByName(configName_);
133 
134  if(!(originalVersion_ =
135  config_->getView().getVersion()).isTemporaryVersion())
136  {
137  __COUT__ << "Start version " << originalVersion_ << std::endl;
138  //create temporary version for editing
139  temporaryVersion_ = config_->createTemporaryView(originalVersion_);
140  cfgMgr->saveNewConfiguration(
141  configName_,
142  temporaryVersion_, true); //proper bookkeeping for temporary version with the new version
143 
144  __COUT__ << "Created temporary version " << temporaryVersion_ << std::endl;
145  createdTemporaryVersion_ = true;
146  }
147  else //else table is already temporary version
148  __COUT__ << "Using temporary version " << temporaryVersion_ << std::endl;
149 
150  cfgView_ = config_->getViewP();
151  }
152 }; //end TableEditStruct declaration
153 
154 } //end namespace
155 
156 #endif