00001 #include "utilmm/configsearch/configuration_finder.hh"
00002
00003 #define WIN32_LEAN_AND_MEAN
00004 #include <boost/program_options.hpp>
00005 #include <boost/filesystem/fstream.hpp>
00006 #include <boost/algorithm/string.hpp>
00007
00008 namespace utilmm {
00009
00010 const char* configEnv = "ROCK_CONFIG_PATH";
00011
00012
00013 std::string ConfigurationFinder::find( const std::string& configFile)
00014 {
00015 return find(configFile, "");
00016 }
00017
00018 std::string ConfigurationFinder::find( const std::string& configFile, const std::string& packagename)
00019 {
00020 const char* configurationDir = getenv(configEnv);
00021
00022 std::vector<std::string> searchDirectories;
00023 if(configurationDir == NULL || configurationDir == "")
00024 {
00025 fprintf(stderr, "WARNING: ConfigurationFinder: environment variable %s is not set\n", configEnv);
00026 } else {
00027
00028 boost::split(searchDirectories, configurationDir, boost::is_any_of(":"));
00029 }
00030
00031 if(packagename != "")
00032 {
00033
00034
00035 std::vector<std::string>::iterator it = searchDirectories.begin();
00036 for(;it != searchDirectories.end(); it++)
00037 {
00038 boost::filesystem::path directory(*it);
00039 boost::filesystem::path searchPath = operator/(directory, packagename);
00040 *it = searchPath.string();
00041 }
00042 }
00043
00044 return search(configFile, searchDirectories);
00045 }
00046
00047 std::string ConfigurationFinder::search(const std::string& file, const std::vector<std::string>& searchDirectories)
00048 {
00049 std::string searchFile(file);
00050 std::string result;
00051
00052 if( searchFile != "")
00053 {
00054
00055
00056 if(boost::filesystem::exists(searchFile))
00057 {
00058 result = boost::filesystem::system_complete( searchFile ).string();
00059
00060 } else {
00061
00062 std::vector<std::string>::const_iterator it = searchDirectories.begin();
00063
00064 for(; it != searchDirectories.end(); it++)
00065 {
00066 boost::filesystem::path dir(*it);
00067 boost::filesystem::path testPath = operator/(dir,searchFile);
00068
00069 if( boost::filesystem::exists(testPath) )
00070 {
00071 result = boost::filesystem::system_complete( testPath ).string();
00072 break;
00073 }
00074 }
00075 }
00076 }
00077
00078 return result;
00079 }
00080
00081 std::string ConfigurationFinder::findSystemConfig(const std::string& file, const std::string& systemId)
00082 {
00083 std::vector<std::string> result;
00084 boost::algorithm::split(result, systemId, boost::algorithm::is_any_of("_"));
00085
00086 if(result.size() != 2)
00087 {
00088 fprintf(stderr, "WARNING: ConfigurationFinder: Invalid systemConfig provided\n");
00089 fprintf(stderr, "ConfigurationFinder: searching in basedir %s\n", systemId.c_str());
00090
00091 }
00092
00093 boost::filesystem::path baseDir(result[0]);
00094 boost::filesystem::path systemIdDir = operator/(baseDir, result[1]);
00095 std::string systemIdConfig = find(file,systemIdDir.string() );
00096 std::string baseConfig = find(file, baseDir.string());
00097
00098 if(systemIdConfig != "")
00099 return systemIdConfig;
00100
00101 return baseConfig;
00102 }
00103
00104 }
00105