00001 #ifndef _ots_ConfigurationManagerRW_h_
00002 #define _ots_ConfigurationManagerRW_h_
00003
00004
00005
00006
00007 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
00008
00009
00010
00011
00012
00013 namespace ots {
00014
00015
00016 struct ConfigurationInfo {
00017 ConfigurationInfo() :
00018 configurationPtr_(0)
00019 {}
00020
00021 std::set<ConfigurationVersion> versions_;
00022 ConfigurationBase* configurationPtr_;
00023 };
00024
00025 struct GroupInfo {
00026 std::set<ConfigurationGroupKey> keys_;
00027 std::string latestKeyGroupAuthor_, latestKeyGroupComment_,
00028 latestKeyGroupCreationTime_, latestKeyGroupTypeString_;
00029 std::map<std::string , ConfigurationVersion > latestKeyMemberMap_;
00030
00031 ConfigurationGroupKey getLatestKey() { return *(keys_.rbegin()); }
00032 };
00033
00034
00035 #define Q(X) #X
00036 #define QUOTE(X) Q(X)
00037 #define __GETCFG_RW__(X) getConfigurationRW<X>(QUOTE(X))
00038
00039
00040
00041
00042
00043
00044 class ConfigurationManagerRW : public ConfigurationManager
00045 {
00046 public:
00047
00048 ConfigurationManagerRW (std::string username);
00049
00050
00051
00052 const std::string& getUsername (void) const { return username_; }
00053 ConfigurationInterface* getConfigurationInterface (void) const { return theInterface_; }
00054
00055 const std::map<std::string, ConfigurationInfo>& getAllConfigurationInfo (bool refresh=false, std::string *accumulatedErrors=0, const std::string &errorFilterName="");
00056
00057 std::map<std::string,std::map<std::string,ConfigurationVersion> > getActiveVersionAliases (void) const;
00058
00059 template<class T>
00060 T* getConfigurationRW(std::string name)
00061 {
00062 return (T*)getConfigurationByName(name);
00063 }
00064 ConfigurationBase* getVersionedConfigurationByName (const std::string &configurationName, ConfigurationVersion version, bool looseColumnMatching=false);
00065 ConfigurationBase* getConfigurationByName (const std::string &configurationName);
00066 ConfigurationGroupKey findConfigurationGroup (const std::string &groupName, const std::map<std::string, ConfigurationVersion> &groupMembers);
00067
00068
00069
00070
00071 ConfigurationVersion saveNewConfiguration (const std::string &configurationName, ConfigurationVersion temporaryVersion = ConfigurationVersion(), bool makeTemporary = false);
00072 ConfigurationVersion copyViewToCurrentColumns (const std::string &configurationName, ConfigurationVersion sourceVersion);
00073 void eraseTemporaryVersion (const std::string &configurationName, ConfigurationVersion targetVersion = ConfigurationVersion());
00074 void clearCachedVersions (const std::string &configurationName);
00075 void clearAllCachedVersions ();
00076
00077
00078
00079
00080 void activateConfigurationGroup (const std::string &configGroupName, ConfigurationGroupKey configGroupKey, std::string *accumulatedTreeErrors=0);
00081
00082 ConfigurationVersion createTemporaryBackboneView (ConfigurationVersion sourceViewVersion = ConfigurationVersion());
00083 ConfigurationVersion saveNewBackbone (ConfigurationVersion temporaryVersion = ConfigurationVersion());
00084
00085
00086
00087
00088
00089 ConfigurationGroupKey saveNewConfigurationGroup (const std::string &groupName, std::map<std::string, ConfigurationVersion> &groupMembers, const std::string &groupComment = ViewColumnInfo::DATATYPE_COMMENT_DEFAULT);
00090
00091
00092
00093
00094
00095 const GroupInfo& getGroupInfo (const std::string &groupName);
00096 const std::map<std::string, GroupInfo>& getAllGroupInfo () {return allGroupInfo_;}
00097
00098 void testXDAQContext();
00099
00100 private:
00101
00102
00103
00104 void cacheGroupKey (const std::string &groupName, ConfigurationGroupKey key);
00105
00106
00107
00108
00109 std::map<std::string, ConfigurationInfo> allConfigurationInfo_;
00110 std::map<std::string, GroupInfo> allGroupInfo_;
00111
00112 };
00113
00114
00116 struct TableEditStruct {
00117
00118 ConfigurationBase* config_;
00119 ConfigurationView* cfgView_;
00120 ConfigurationVersion temporaryVersion_, originalVersion_;
00121 bool createdTemporaryVersion_;
00122 bool modified_;
00123 std::string configName_;
00125 TableEditStruct(){ __SS__ << "impossible!" << std::endl; throw std::runtime_error(ss.str());}
00126 TableEditStruct(const std::string& configName, ConfigurationManagerRW* cfgMgr)
00127 :createdTemporaryVersion_(false)
00128 ,modified_(false)
00129 ,configName_(configName)
00130 {
00131 __COUT__ << "Creating Table-Edit Struct for " << configName_ << std::endl;
00132 config_ = cfgMgr->getConfigurationByName(configName_);
00133
00134 if(!(originalVersion_ =
00135 config_->getView().getVersion()).isTemporaryVersion())
00136 {
00137 __COUT__ << "Start version " << originalVersion_ << std::endl;
00138
00139 temporaryVersion_ = config_->createTemporaryView(originalVersion_);
00140 cfgMgr->saveNewConfiguration(
00141 configName_,
00142 temporaryVersion_, true);
00143
00144 __COUT__ << "Created temporary version " << temporaryVersion_ << std::endl;
00145 createdTemporaryVersion_ = true;
00146 }
00147 else
00148 __COUT__ << "Using temporary version " << temporaryVersion_ << std::endl;
00149
00150 cfgView_ = config_->getViewP();
00151 }
00152 };
00153
00154 }
00155
00156 #endif