mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 04:44:11 +02:00
require a distinction between master config and user config
This commit is contained in:
parent
a701bcea7b
commit
5e2870ac5f
5 changed files with 52 additions and 53 deletions
|
@ -48,7 +48,7 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
|||
_sessionAuthenticationHash(),
|
||||
_webAuthenticationStateSet(),
|
||||
_cookieSessionHash(),
|
||||
_settingsManager()
|
||||
_settingsManager(arguments())
|
||||
{
|
||||
LogUtils::init();
|
||||
|
||||
|
@ -57,8 +57,6 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
|||
setApplicationName("domain-server");
|
||||
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||
|
||||
_settingsManager.loadSettingsMap(arguments());
|
||||
|
||||
installNativeEventFilter(&_shutdownEventListener);
|
||||
connect(&_shutdownEventListener, SIGNAL(receivedCloseEvent()), SLOT(quit()));
|
||||
|
||||
|
|
|
@ -26,9 +26,9 @@
|
|||
|
||||
const QString SETTINGS_DESCRIPTION_RELATIVE_PATH = "/resources/describe-settings.json";
|
||||
|
||||
DomainServerSettingsManager::DomainServerSettingsManager() :
|
||||
DomainServerSettingsManager::DomainServerSettingsManager(const QStringList& argumentList) :
|
||||
_descriptionArray(),
|
||||
_settingsMap()
|
||||
_configMap(argumentList)
|
||||
{
|
||||
// load the description object from the settings description
|
||||
QFile descriptionFile(QCoreApplication::applicationDirPath() + SETTINGS_DESCRIPTION_RELATIVE_PATH);
|
||||
|
@ -37,13 +37,6 @@ DomainServerSettingsManager::DomainServerSettingsManager() :
|
|||
_descriptionArray = QJsonDocument::fromJson(descriptionFile.readAll()).array();
|
||||
}
|
||||
|
||||
void DomainServerSettingsManager::loadSettingsMap(const QStringList& argumentList) {
|
||||
_settingsMap = HifiConfigVariantMap::mergeMasterConfigWithUserConfig(argumentList);
|
||||
|
||||
// figure out where we are supposed to persist our settings to
|
||||
_settingsFilepath = HifiConfigVariantMap::userConfigFilepath(argumentList);
|
||||
}
|
||||
|
||||
const QString SETTINGS_PATH = "/settings.json";
|
||||
|
||||
bool DomainServerSettingsManager::handlePublicHTTPRequest(HTTPConnection* connection, const QUrl &url) {
|
||||
|
@ -76,7 +69,7 @@ bool DomainServerSettingsManager::handleAuthenticatedHTTPRequest(HTTPConnection
|
|||
QJsonObject postedObject = postedDocument.object();
|
||||
|
||||
// we recurse one level deep below each group for the appropriate setting
|
||||
recurseJSONObjectAndOverwriteSettings(postedObject, _settingsMap, _descriptionArray);
|
||||
recurseJSONObjectAndOverwriteSettings(postedObject, _configMap.getUserConfig(), _descriptionArray);
|
||||
|
||||
// store whatever the current _settingsMap is to file
|
||||
persistToFile();
|
||||
|
@ -99,6 +92,7 @@ bool DomainServerSettingsManager::handleAuthenticatedHTTPRequest(HTTPConnection
|
|||
rootObject[SETTINGS_RESPONSE_DESCRIPTION_KEY] = _descriptionArray;
|
||||
rootObject[SETTINGS_RESPONSE_VALUE_KEY] = responseObjectForType("", true);
|
||||
|
||||
|
||||
connection->respond(HTTPConnection::StatusCode200, QJsonDocument(rootObject).toJson(), "application/json");
|
||||
}
|
||||
|
||||
|
@ -145,7 +139,8 @@ QJsonObject DomainServerSettingsManager::responseObjectForType(const QString& ty
|
|||
|
||||
// we need to check if the settings map has a value for this setting
|
||||
QVariant variantValue;
|
||||
QVariant settingsMapGroupValue = _settingsMap.value(groupObject[DESCRIPTION_NAME_KEY].toString());
|
||||
QVariant settingsMapGroupValue = _configMap.getMergedConfig()
|
||||
.value(groupObject[DESCRIPTION_NAME_KEY].toString());
|
||||
|
||||
if (!settingsMapGroupValue.isNull()) {
|
||||
variantValue = settingsMapGroupValue.toMap().value(settingName);
|
||||
|
@ -239,10 +234,6 @@ void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJ
|
|||
}
|
||||
}
|
||||
|
||||
QByteArray DomainServerSettingsManager::getJSONSettingsMap() const {
|
||||
return QJsonDocument::fromVariant(_settingsMap).toJson();
|
||||
}
|
||||
|
||||
void DomainServerSettingsManager::persistToFile() {
|
||||
|
||||
// make sure we have the dir the settings file is supposed to live in
|
||||
|
@ -255,7 +246,7 @@ void DomainServerSettingsManager::persistToFile() {
|
|||
QFile settingsFile(_settingsFilepath);
|
||||
|
||||
if (settingsFile.open(QIODevice::WriteOnly)) {
|
||||
settingsFile.write(getJSONSettingsMap());
|
||||
settingsFile.write(QJsonDocument::fromVariant(_configMap.getUserConfig()).toJson());
|
||||
} else {
|
||||
qCritical("Could not write to JSON settings file. Unable to persist settings.");
|
||||
}
|
||||
|
|
|
@ -15,19 +15,17 @@
|
|||
#include <QtCore/QJsonArray>
|
||||
#include <QtCore/QJsonDocument>
|
||||
|
||||
#include <HifiConfigVariantMap.h>
|
||||
#include <HTTPManager.h>
|
||||
|
||||
class DomainServerSettingsManager : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
DomainServerSettingsManager();
|
||||
DomainServerSettingsManager(const QStringList& argumentList);
|
||||
bool handlePublicHTTPRequest(HTTPConnection* connection, const QUrl& url);
|
||||
bool handleAuthenticatedHTTPRequest(HTTPConnection* connection, const QUrl& url);
|
||||
|
||||
void loadSettingsMap(const QStringList& argumentList);
|
||||
|
||||
QByteArray getJSONSettingsMap() const;
|
||||
QVariantMap& getSettingsMap() { return _settingsMap; }
|
||||
QVariantMap& getSettingsMap() { return _configMap.getMergedConfig(); }
|
||||
private:
|
||||
QJsonObject responseObjectForType(const QString& typeValue, bool isAuthenticated = false);
|
||||
void recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, QVariantMap& settingsVariant,
|
||||
|
@ -35,7 +33,7 @@ private:
|
|||
void persistToFile();
|
||||
|
||||
QJsonArray _descriptionArray;
|
||||
QVariantMap _settingsMap;
|
||||
HifiConfigVariantMap _configMap;
|
||||
QString _settingsFilepath;
|
||||
};
|
||||
|
||||
|
|
|
@ -87,43 +87,46 @@ QVariantMap HifiConfigVariantMap::mergeCLParametersWithJSONConfig(const QStringL
|
|||
return mergedMap;
|
||||
}
|
||||
|
||||
QVariantMap HifiConfigVariantMap::mergeMasterConfigWithUserConfig(const QStringList& argumentList) {
|
||||
HifiConfigVariantMap::HifiConfigVariantMap(const QStringList& argumentList) :
|
||||
_masterConfigPath(),
|
||||
_userConfigPath(),
|
||||
_masterConfig(),
|
||||
_userConfig(),
|
||||
_mergedConfig()
|
||||
{
|
||||
// check if there is a master config file
|
||||
const QString MASTER_CONFIG_FILE_OPTION = "--master-config";
|
||||
|
||||
QVariantMap configVariantMap;
|
||||
|
||||
int masterConfigIndex = argumentList.indexOf(MASTER_CONFIG_FILE_OPTION);
|
||||
if (masterConfigIndex != -1) {
|
||||
QString masterConfigFilepath = argumentList[masterConfigIndex + 1];
|
||||
|
||||
mergeMapWithJSONFile(configVariantMap, masterConfigFilepath);
|
||||
loadMapFromJSONFile(_masterConfig, masterConfigFilepath);
|
||||
}
|
||||
|
||||
// merge the existing configVariantMap with the user config file
|
||||
mergeMapWithJSONFile(configVariantMap, userConfigFilepath(argumentList));
|
||||
|
||||
return configVariantMap;
|
||||
}
|
||||
|
||||
QString HifiConfigVariantMap::userConfigFilepath(const QStringList& argumentList) {
|
||||
// we've loaded up the master config file, now fill in anything it didn't have with the user config file
|
||||
// load the user config
|
||||
const QString USER_CONFIG_FILE_OPTION = "--user-config";
|
||||
|
||||
int userConfigIndex = argumentList.indexOf(USER_CONFIG_FILE_OPTION);
|
||||
QString userConfigFilepath;
|
||||
if (userConfigIndex != -1) {
|
||||
userConfigFilepath = argumentList[userConfigIndex + 1];
|
||||
_userConfigPath = argumentList[userConfigIndex + 1];
|
||||
} else {
|
||||
userConfigFilepath = QString("%1/%2/%3/config.json").arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation),
|
||||
QCoreApplication::organizationName(),
|
||||
QCoreApplication::applicationName());
|
||||
_userConfigPath = QString("%1%2/%3/config.json").arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation),
|
||||
QCoreApplication::organizationName(),
|
||||
QCoreApplication::applicationName());
|
||||
}
|
||||
|
||||
return userConfigFilepath;
|
||||
loadMapFromJSONFile(_userConfig, _userConfigPath);
|
||||
|
||||
// the merged config is initially matched to the master config
|
||||
_mergedConfig = _masterConfig;
|
||||
|
||||
// then we merge in anything missing from the user config
|
||||
addMissingValuesToExistingMap(_mergedConfig, _userConfig);
|
||||
}
|
||||
|
||||
void HifiConfigVariantMap::mergeMapWithJSONFile(QVariantMap& existingMap, const QString& filename) {
|
||||
void HifiConfigVariantMap::loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename) {
|
||||
QFile configFile(filename);
|
||||
|
||||
if (configFile.exists()) {
|
||||
|
@ -131,12 +134,7 @@ void HifiConfigVariantMap::mergeMapWithJSONFile(QVariantMap& existingMap, const
|
|||
configFile.open(QIODevice::ReadOnly);
|
||||
|
||||
QJsonDocument configDocument = QJsonDocument::fromJson(configFile.readAll());
|
||||
|
||||
if (existingMap.isEmpty()) {
|
||||
existingMap = configDocument.toVariant().toMap();
|
||||
} else {
|
||||
addMissingValuesToExistingMap(existingMap, configDocument.toVariant().toMap());
|
||||
}
|
||||
existingMap = configDocument.toVariant().toMap();
|
||||
|
||||
} else {
|
||||
qDebug() << "Could not find JSON config file at" << filename;
|
||||
|
|
|
@ -17,11 +17,25 @@
|
|||
class HifiConfigVariantMap {
|
||||
public:
|
||||
static QVariantMap mergeCLParametersWithJSONConfig(const QStringList& argumentList);
|
||||
static QVariantMap mergeMasterConfigWithUserConfig(const QStringList& argumentList);
|
||||
static QString userConfigFilepath(const QStringList& argumentList);
|
||||
|
||||
HifiConfigVariantMap(const QStringList& argumentList);
|
||||
|
||||
const QVariantMap& getMasterConfig() const { return _masterConfig; }
|
||||
QVariantMap& getUserConfig() { return _userConfig; }
|
||||
QVariantMap& getMergedConfig() { return _mergedConfig; }
|
||||
|
||||
const QString& userConfigFilepath() const { return _userConfigPath; }
|
||||
private:
|
||||
static void mergeMapWithJSONFile(QVariantMap& existingMap, const QString& filename);
|
||||
static void addMissingValuesToExistingMap(QVariantMap& existingMap, const QVariantMap& newMap);
|
||||
QString _masterConfigPath;
|
||||
QString _userConfigPath;
|
||||
|
||||
QVariantMap _masterConfig;
|
||||
QVariantMap _userConfig;
|
||||
QVariantMap _mergedConfig;
|
||||
|
||||
QVariantMap mergeMasterConfigWithUserConfig(const QStringList& argumentList);
|
||||
void loadMapFromJSONFile(QVariantMap& existingMap, const QString& filename);
|
||||
void addMissingValuesToExistingMap(QVariantMap& existingMap, const QVariantMap& newMap);
|
||||
};
|
||||
|
||||
const QVariant* valueForKeyPath(QVariantMap& variantMap, const QString& keyPath);
|
||||
|
|
Loading…
Reference in a new issue