You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
7.9 KiB
117 lines
7.9 KiB
//
|
|
// Created by zhaohe on 19-5-30.
|
|
//
|
|
|
|
#pragma once
|
|
#include <exception>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <list>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <set>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <vector>
|
|
// #include "zwtimecpp/core/core.hpp"
|
|
// #include "zwtimecpp/core/exception/base_exception.hpp"
|
|
// #include "zwtimecpp/core/exception/base_exception.hpp"
|
|
// #include "zwtimecpp/core/exception/null_expection.hpp"
|
|
// #include "zwtimecpp/core/logger/logger_factory.hpp"
|
|
// #include "zwtimecpp/core/utils/data.hpp"
|
|
#include "components/fileutils.hpp"
|
|
#include "components/marco/data.hpp"
|
|
#include "nlohmann/json.hpp"
|
|
#include "spdlogfactory/logger_factory.hpp"
|
|
#include "components/zexception/zexception.hpp"
|
|
|
|
// #include "zwtimecpp/core/utils/zmath.hpp"
|
|
|
|
// ConfigurationService的实现
|
|
/*----------------------------------------------------------------*/
|
|
#define ConfigServiceENABLE_GET_AND_SET2(type, propertyName, defaultValue) \
|
|
private: \
|
|
type propertyName = defaultValue; \
|
|
\
|
|
public: \
|
|
virtual const type &get_##propertyName() const { \
|
|
lock_guard<recursive_mutex> lock(lock_); \
|
|
return propertyName; \
|
|
} \
|
|
virtual void set_##propertyName(const type &propertyName) { \
|
|
lock_guard<recursive_mutex> lock(lock_); \
|
|
this->propertyName = propertyName; \
|
|
flushConfigToFile(); \
|
|
}
|
|
|
|
#define configTemplateGET_CONFIG2(type, propertyName, defaultValue) \
|
|
try { \
|
|
j3.at(#propertyName).get_to(propertyName); \
|
|
} catch (const std::exception &e) { \
|
|
onParseConfigFail(#propertyName, e); \
|
|
}
|
|
|
|
#define configTemplateSAVE_CONFIG2(type, propertyName, defaultValue) j[#propertyName] = propertyName;
|
|
|
|
#define configTemplateDEFILE_CONFIG_SERVICE2(name, configList, configfilePath, onParseFiale) \
|
|
namespace iflytop { \
|
|
using namespace std; \
|
|
using namespace core; \
|
|
using namespace nlohmann; \
|
|
class name { \
|
|
ENABLE_LOGGER(name) \
|
|
string configFile; \
|
|
\
|
|
mutable recursive_mutex lock_; \
|
|
bool forTest = false; \
|
|
\
|
|
public: \
|
|
name() {} \
|
|
\
|
|
public: \
|
|
void initialize(string configFile = configfilePath) { \
|
|
logger->debug("initialize"); \
|
|
\
|
|
this->configFile = configFile; \
|
|
json j3; \
|
|
\
|
|
string config; \
|
|
if (!FileUtils().exist(configFile)) { \
|
|
logger->error("can't find configfile ,create default config:{}", configFile); \
|
|
auto defaultConfigFile = FileUtils().openTrunc(configFile); \
|
|
defaultConfigFile->write("{}", 2); \
|
|
} \
|
|
config = FileUtils().readFileAsString(configFile); \
|
|
if (config.empty()) { \
|
|
flushConfigToFile(); \
|
|
config = FileUtils().readFileAsString(configFile); \
|
|
} \
|
|
\
|
|
try { \
|
|
j3 = json::parse(config); \
|
|
} catch (const std::exception &e) { \
|
|
throw zexception("Parse config fail......" + string(e.what())); \
|
|
} \
|
|
configList(configTemplateGET_CONFIG2); \
|
|
flushConfigToFile(); \
|
|
} \
|
|
configList(ConfigServiceENABLE_GET_AND_SET2); \
|
|
\
|
|
public: \
|
|
private: \
|
|
void flushConfigToFile() { \
|
|
json j; \
|
|
configList(configTemplateSAVE_CONFIG2); \
|
|
bool flushSuccess = FileUtils().writeToFile(configFile, j.dump(2)); \
|
|
if (!flushSuccess) { \
|
|
logger->error("flush config to logfile fail"); \
|
|
} \
|
|
}; \
|
|
static shared_ptr<name> &instance() { \
|
|
static shared_ptr<name> value; \
|
|
return value; \
|
|
} \
|
|
void onParseConfigFail(string file_name, const std::exception &e) { onParseFiale; }; \
|
|
}; \
|
|
}
|