00001 #include "otsdaq-core/ConfigurationInterface/FileConfigurationInterface.h"
00002 #include "otsdaq-core/ConfigurationInterface/ConfigurationHandler.h"
00003 #include "otsdaq-core/ConfigurationDataFormats/ConfigurationBase.h"
00004 #include "otsdaq-core/MessageFacility/MessageFacility.h"
00005 #include "otsdaq-core/Macros/CoutMacros.h"
00006 #include <iostream>
00007 #include <set>
00008 #include <dirent.h>
00009 #include <errno.h>
00010 #include "JSONConfigurationHandler.h.unused"
00011
00012 using namespace ots;
00013
00014
00015
00016 void FileConfigurationInterface::fill(ConfigurationBase* configuration, ConfigurationVersion version) const
00017 {
00018 ConfigurationHandler::readXML (configuration, version);
00019 }
00020
00021
00022
00023
00024 ConfigurationVersion FileConfigurationInterface::findLatestVersion(const ConfigurationBase* configuration) const
00025 {
00026 auto versions = getVersions(configuration);
00027 if(!versions.size())
00028 return ConfigurationVersion();
00029 return *(versions.rbegin());
00030 }
00031
00032
00033
00034 void FileConfigurationInterface::saveActiveVersion(const ConfigurationBase* configuration, bool overwrite) const
00035 {
00036 ConfigurationHandler::writeXML(configuration);
00037 }
00038
00039
00040
00041 std::set<ConfigurationVersion> FileConfigurationInterface::getVersions(const ConfigurationBase* configuration) const
00042 {
00043 std::string configDir = ConfigurationHandler::getXMLDir(configuration);
00044 std::cout << __COUT_HDR_FL__ << "ConfigurationDir: " << configDir << std::endl;
00045 DIR *dp;
00046
00047 struct dirent *dirp;
00048
00049 if((dp = opendir(configDir.c_str())) == 0)
00050 {
00051 __SS__ << "ERROR:(" << errno << "). Can't open directory: " << configDir << std::endl;
00052 __COUT_ERR__ << ss.str();
00053 throw std::runtime_error(ss.str());
00054
00055 }
00056
00057 const unsigned char isDir = 0x4;
00058
00059
00060
00061 std::string::const_iterator it;
00062 std::string dirName;
00063 std::set<ConfigurationVersion> dirNumbers;
00064
00065 while ((dirp = readdir(dp)) != 0)
00066 {
00067 if(dirp->d_type == isDir && dirp->d_name[0] != '.' )
00068 {
00069 dirName = dirp->d_name;
00070
00071 it = dirName.begin();
00072
00073 while (it != dirName.end() && std::isdigit(*it))
00074 ++it;
00075
00076 if(dirName.empty() || it != dirName.end())
00077 {
00078 std::cout << __COUT_HDR_FL__ << "WARNING: there is a non numeric directory in " << configDir << " called " << dirName
00079 << " please remove it from there since only numeric directories are considered." << std::endl;
00080 continue;
00081 }
00082
00083 dirNumbers.insert(ConfigurationVersion(strtol(dirp->d_name, 0 , 10)));
00084 }
00085 }
00086 closedir(dp);
00087 return dirNumbers;
00088 }
00089