otsdaq  v1_01_02
 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  std::cout << __COUT_HDR_FL__<< "ERROR:(" << errno << "). Can't open directory: " << configDir << std::endl;
52  throw std::runtime_error("Error in File Interface getVersion!");
53  }
54 
55  const unsigned char isDir = 0x4;
56  //const std::string pDir = ".";
57  //const std::string ppDir = "..";
58  //int dirVersion;
59  std::string::const_iterator it;
60  std::string dirName;
61  std::set<ConfigurationVersion> dirNumbers;
62 
63  while ((dirp = readdir(dp)) != 0)
64  {
65  if(dirp->d_type == isDir && dirp->d_name[0] != '.' )
66  {
67  dirName = dirp->d_name;
68  //Check if there are non numeric directories
69  it = dirName.begin();
70 
71  while (it != dirName.end() && std::isdigit(*it))
72  ++it;
73 
74  if(dirName.empty() || it != dirName.end())
75  {
76  std::cout << __COUT_HDR_FL__ << "WARNING: there is a non numeric directory in " << configDir << " called " << dirName
77  << " please remove it from there since only numeric directories are considered." << std::endl;
78  continue;
79  }
80 
81  dirNumbers.insert(ConfigurationVersion(strtol(dirp->d_name, 0 , 10)));
82  }
83  }
84  closedir(dp);
85  return dirNumbers;
86 }
87