From c99666e75a0a7df6dc176f2d610d10cc4931cec3 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Mon, 14 Dec 2015 16:44:13 -0800 Subject: [PATCH] Cleaning ConfigurationManager and OpenSpaceEngine Updated Ghoul version --- ext/ghoul | 2 +- .../openspace/engine/configurationmanager.h | 64 ++++++++++++++++++- src/engine/configurationmanager.cpp | 20 +++--- src/engine/openspaceengine.cpp | 1 + 4 files changed, 72 insertions(+), 15 deletions(-) diff --git a/ext/ghoul b/ext/ghoul index ff01cac350..aef83ca794 160000 --- a/ext/ghoul +++ b/ext/ghoul @@ -1 +1 @@ -Subproject commit ff01cac35077a6fe298f8b691466ee9cb704200b +Subproject commit aef83ca794d1153c8537d19d16222a3a1075d4ab diff --git a/include/openspace/engine/configurationmanager.h b/include/openspace/engine/configurationmanager.h index 46ce99a67f..c20bf4eedd 100644 --- a/include/openspace/engine/configurationmanager.h +++ b/include/openspace/engine/configurationmanager.h @@ -41,32 +41,92 @@ class ConfigurationManager : public ghoul::Dictionary { public: /// The key that stores the subdirectory containing all predefined path tokens static const std::string KeyPaths; - /// + /// The key that stores the location to the cache directory used to store all the + /// permanent and non-permanent cached files static const std::string KeyCache; + /// The key that stores the main directory for fonts static const std::string KeyFonts; + /// The key that stores the location of the SGCT configuration file that is used on + /// application launch static const std::string KeyConfigSgct; + /// The key that stores the type of Lua documentation that should be stored static const std::string KeyLuaDocumentationType; + /// The key that stores the save location of the Lua documentation static const std::string KeyLuaDocumentationFile; + /// The key that stores the type of Property documentation that should be stored static const std::string KeyPropertyDocumentationType; + /// The key that stores the save location of the Property documentation static const std::string KeyPropertyDocumentationFile; + /// The key that stores the location of the scene file that is initially loaded static const std::string KeyConfigScene; - static const std::string KeyEnableGui; + /// The key that stores the subdirectory containing a list of all startup scripts to + /// be executed on application start before the scene file is loaded static const std::string KeyStartupScript; + /// The key that stores the subdirectory containing a list of all settings scripts to + /// be executed on application start and after the scene file is loaded static const std::string KeySettingsScript; + /// The key that stores the location of the SPICE time kernel to be loaded on + /// application start static const std::string KeySpiceTimeKernel; + /// The key that stores the location of the SPICE leapsecond kernel to be loaded on + /// application start static const std::string KeySpiceLeapsecondKernel; + /// The key that stores the desired LogLevel for the whole application + /// \sa ghoul::logging::LogManager static const std::string KeyLogLevel; + /// The key that stores whether the log should be immediately flushed after a n + /// \sa ghoul::logging::LogManager static const std::string KeyLogImmediateFlush; + /// The key that stores a subdirectory with a description for additional + /// ghoul::logging::Log%s to be created + /// \sa LogFactory static const std::string KeyLogs; + /// The key that stores the verbosity (None, Minimal, Default, Full) of the system + /// capabilities components static const std::string KeyCapabilitiesVerbosity; + /// The key that stores whether the master node should perform rendering just function + /// as a pure manager static const std::string KeyDisableMasterRendering; + /// The key that sets the request URL that is used to request additional data to be + /// downloaded static const std::string KeyDownloadRequestURL; + /** + * Iteratively walks the directory structure starting with \p filename to find the + * base name compoenent of \p filename. The directory structure is searched by first + * searching the current directory and then moving iteratively to the the parent + * directory. + * \param filename The fully qualified filename to be searched for + * \return The path to the file that was found with the same base name as \p filename + * but higher up in the file structure. + * \throw ghoul::RuntimeError If the configuration could not be found + * \pre \p filename must not be empty + */ static std::string findConfiguration(const std::string& filename); + /** + * Load the provided configuration file (\p filename) into this Dictionary. All paths + * that are specified in the configuration file will automatically be registered in + * the ghoul::filesystem::FileSystem. + * \param filename The filename to be loaded + * \throw ghoul::FileNotFoundException If the \p filename did not exist + * \throw ghoul::RuntimeError If the configuration file was not complete (i.e., did + * not specify the necessary keys KeyPaths, KeyPaths.KeyCache, KeyFonts, and + * KeyConfigSgct) + * \throw ghoul::lua::LuaRuntimeException If there was Lua-based error loading the + * configuration file + * \pre \p filename must not be empty + */ void loadFromFile(const std::string& filename); private: + /** + * Checks whether the loaded configuration file is complete, that is specifying the + * necessary keys KeyPaths, KeyPaths.KeyCache, KeyFonts, and KeyConfigSgct. The method + * will log fatal errors if a key is missing. + * \return true if the configuration file was complete; + * false otherwise + */ bool checkCompleteness() const; }; diff --git a/src/engine/configurationmanager.cpp b/src/engine/configurationmanager.cpp index fe8c24987c..d4c713f3ff 100644 --- a/src/engine/configurationmanager.cpp +++ b/src/engine/configurationmanager.cpp @@ -52,7 +52,6 @@ const string ConfigurationManager::KeyPropertyDocumentationType = const string ConfigurationManager::KeyPropertyDocumentationFile = "PropertyDocumentationFile.File"; const string ConfigurationManager::KeyConfigScene = "Scene"; -const string ConfigurationManager::KeyEnableGui = "EnableGUI"; const string ConfigurationManager::KeyStartupScript = "StartupScripts"; const string ConfigurationManager::KeySettingsScript = "SettingsScripts"; const string ConfigurationManager::KeySpiceTimeKernel = "SpiceKernel.Time"; @@ -66,6 +65,8 @@ const string ConfigurationManager::KeyDisableMasterRendering = "DisableRendering const string ConfigurationManager::KeyDownloadRequestURL = "DownloadRequestURL"; string ConfigurationManager::findConfiguration(const string& filename) { + ghoul_assert(!filename.empty(), "Filename must not be empty"); + using ghoul::filesystem::Directory; Directory directory = FileSys.currentDirectory(); @@ -110,13 +111,6 @@ void ConfigurationManager::loadFromFile(const string& filename) { ghoul::lua::loadDictionaryFromFile(filename, *this); // Register all the paths -// const bool hasPath = hasKeyAndValue(KeyPaths); -// if (!hasPath) { -// throw ghoul::RuntimeError( -// "Configuration does not contain the key '" + KeyPaths + "'", -// "ConfifgurationManager" -// ); -// } ghoul::Dictionary dictionary = value(KeyPaths); std::vector pathKeys = dictionary.keys(); @@ -135,14 +129,16 @@ void ConfigurationManager::loadFromFile(const string& filename) { } bool complete = checkCompleteness(); - if (!complete) - return false; + if (!complete) { + throw ghoul::RuntimeError( + "Configuration file '" + filename + "' was not complete", + "ConfigurationManager" + ); + } // Remove the Paths dictionary from the configuration manager as those paths might // change later and we don't want to be forced to keep our local copy up to date removeKey(KeyPaths); - - return true; } bool ConfigurationManager::checkCompleteness() const { diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index ac2ef92e54..a0bc517450 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -306,6 +306,7 @@ bool OpenSpaceEngine::initialize() { Verbosity verbosity = Verbosity::Default; if (configurationManager().hasKeyAndValue(ConfigurationManager::KeyCapabilitiesVerbosity)) { std::map verbosityMap = { + { "None", Verbosity::None }, { "Minimal", Verbosity::Minimal }, { "Default", Verbosity::Default }, { "Full", Verbosity::Full }