From 5e2870ac5f249da597b9f312bce5b9648103e50c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 29 Sep 2014 09:30:08 -0700 Subject: [PATCH] require a distinction between master config and user config --- domain-server/src/DomainServer.cpp | 4 +- .../src/DomainServerSettingsManager.cpp | 23 +++------- .../src/DomainServerSettingsManager.h | 10 ++-- libraries/shared/src/HifiConfigVariantMap.cpp | 46 +++++++++---------- libraries/shared/src/HifiConfigVariantMap.h | 22 +++++++-- 5 files changed, 52 insertions(+), 53 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index b1ed765be6..d347cb088f 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -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())); diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index d9b1d4d8d6..ae5a815e92 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -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."); } diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index 29b773a354..4b884dfd5b 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -15,19 +15,17 @@ #include #include +#include #include 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; }; diff --git a/libraries/shared/src/HifiConfigVariantMap.cpp b/libraries/shared/src/HifiConfigVariantMap.cpp index d3626e0249..fabb185a35 100644 --- a/libraries/shared/src/HifiConfigVariantMap.cpp +++ b/libraries/shared/src/HifiConfigVariantMap.cpp @@ -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; diff --git a/libraries/shared/src/HifiConfigVariantMap.h b/libraries/shared/src/HifiConfigVariantMap.h index b1b6b55aa2..12cc05d2e9 100644 --- a/libraries/shared/src/HifiConfigVariantMap.h +++ b/libraries/shared/src/HifiConfigVariantMap.h @@ -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);