otsdaq  v1_01_04
 All Classes Namespaces Functions
FileConfigurationInterface.cc
1 #include "otsdaq-core/ConfigurationInterface/FileConfigurationInterface.h"
2 #include "otsdaq-core/ConfigurationInterface/ConfigurationHandler.h"
3 #include "otsdaq-core/ConfigurationDataFormats/ConfigurationBase.h"
4 #include "otsdaq-core/MessageFacility/MessageFacility.h"
5 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
6 #include <iostream>
7 #include <set>
8 #include <dirent.h>
9 #include <errno.h>
10 #include "JSONConfigurationHandler.h.unused"
11 
12 using namespace ots;
13 
14 
15 //==============================================================================
16 void FileConfigurationInterface::fill(ConfigurationBase* configuration, ConfigurationVersion version) const
17 {
18  ConfigurationHandler::readXML (configuration, version);
19 }
20 
21 //==============================================================================
22 //findLatestVersion
23 // return INVALID if no existing versions
24 ConfigurationVersion FileConfigurationInterface::findLatestVersion(const ConfigurationBase* configuration) const
25 {
26  auto versions = getVersions(configuration);
27  if(!versions.size())
28  return ConfigurationVersion(); //return INVALID
29  return *(versions.rbegin());
30 }
31 
32 //==============================================================================
33 // save active configuration view to file
34 void FileConfigurationInterface::saveActiveVersion(const ConfigurationBase* configuration, bool overwrite) const
35 {
36  ConfigurationHandler::writeXML(configuration);
37 }
38 
39 
40 //==============================================================================
41 std::set<ConfigurationVersion> FileConfigurationInterface::getVersions(const ConfigurationBase* configuration) const
42 {
43  std::string configDir = ConfigurationHandler::getXMLDir(configuration);
44  std::cout << __COUT_HDR_FL__ << "ConfigurationDir: " << configDir << std::endl;
45  DIR *dp;
46 
47  struct dirent *dirp;
48 
49  if((dp = opendir(configDir.c_str())) == 0)
50  {
51  __SS__ << "ERROR:(" << errno << "). Can't open directory: " << configDir << std::endl;
52  __COUT_ERR__ << ss.str();
53  throw std::runtime_error(ss.str());
54 
55  }
56 
57  const unsigned char isDir = 0x4;
58  //const std::string pDir = ".";
59  //const std::string ppDir = "..";
60  //int dirVersion;
61  std::string::const_iterator it;
62  std::string dirName;
63  std::set<ConfigurationVersion> dirNumbers;
64 
65  while ((dirp = readdir(dp)) != 0)
66  {
67  if(dirp->d_type == isDir && dirp->d_name[0] != '.' )
68  {
69  dirName = dirp->d_name;
70  //Check if there are non numeric directories
71  it = dirName.begin();
72 
73  while (it != dirName.end() && std::isdigit(*it))
74  ++it;
75 
76  if(dirName.empty() || it != dirName.end())
77  {
78  std::cout << __COUT_HDR_FL__ << "WARNING: there is a non numeric directory in " << configDir << " called " << dirName
79  << " please remove it from there since only numeric directories are considered." << std::endl;
80  continue;
81  }
82 
83  dirNumbers.insert(ConfigurationVersion(strtol(dirp->d_name, 0 , 10)));
84  }
85  }
86  closedir(dp);
87  return dirNumbers;
88 }
89