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/CoutHeaderMacros.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 std::cout << __COUT_HDR_FL__<< "ERROR:(" << errno << "). Can't open directory: " << configDir << std::endl;
00052 throw std::runtime_error("Error in File Interface getVersion!");
00053 }
00054
00055 const unsigned char isDir = 0x4;
00056
00057
00058
00059 std::string::const_iterator it;
00060 std::string dirName;
00061 std::set<ConfigurationVersion> dirNumbers;
00062
00063 while ((dirp = readdir(dp)) != 0)
00064 {
00065 if(dirp->d_type == isDir && dirp->d_name[0] != '.' )
00066 {
00067 dirName = dirp->d_name;
00068
00069 it = dirName.begin();
00070
00071 while (it != dirName.end() && std::isdigit(*it))
00072 ++it;
00073
00074 if(dirName.empty() || it != dirName.end())
00075 {
00076 std::cout << __COUT_HDR_FL__ << "WARNING: there is a non numeric directory in " << configDir << " called " << dirName
00077 << " please remove it from there since only numeric directories are considered." << std::endl;
00078 continue;
00079 }
00080
00081 dirNumbers.insert(ConfigurationVersion(strtol(dirp->d_name, 0 , 10)));
00082 }
00083 }
00084 closedir(dp);
00085 return dirNumbers;
00086 }
00087