From: Gunnar Beutner Date: Mon, 26 Oct 2015 10:05:24 +0000 (+0100) Subject: Implement Array::ToString and Dictionary::ToString X-Git-Tag: v2.4.0~137 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd7786391042046addfff236437319137358d4c7;p=icinga2 Implement Array::ToString and Dictionary::ToString fixes #10329 --- diff --git a/lib/base/CMakeLists.txt b/lib/base/CMakeLists.txt index 0adaa2fbd..ce2e3c928 100644 --- a/lib/base/CMakeLists.txt +++ b/lib/base/CMakeLists.txt @@ -26,7 +26,7 @@ set(base_SOURCES application.cpp application.thpp application-version.cpp array.cpp array-script.cpp boolean.cpp boolean-script.cpp console.cpp context.cpp convert.cpp debuginfo.cpp dictionary.cpp dictionary-script.cpp - configobject.cpp configobject.thpp configobject-script.cpp configtype.cpp dependencygraph.cpp + configobject.cpp configobject.thpp configobject-script.cpp configtype.cpp configwriter.cpp dependencygraph.cpp exception.cpp fifo.cpp filelogger.cpp filelogger.thpp initialize.cpp json.cpp json-script.cpp loader.cpp logger.cpp logger.thpp math-script.cpp netstring.cpp networkstream.cpp number.cpp number-script.cpp object.cpp diff --git a/lib/base/array.cpp b/lib/base/array.cpp index b069dc78b..d93e6ae25 100644 --- a/lib/base/array.cpp +++ b/lib/base/array.cpp @@ -22,6 +22,7 @@ #include "base/debug.hpp" #include "base/primitivetype.hpp" #include "base/dictionary.hpp" +#include "base/configwriter.hpp" #include using namespace icinga; @@ -211,3 +212,10 @@ Array::Ptr Array::Reverse(void) const return result; } + +String Array::ToString(void) const +{ + std::ostringstream msgbuf; + ConfigWriter::EmitArray(msgbuf, const_cast(this)); + return msgbuf.str(); +} diff --git a/lib/base/array.hpp b/lib/base/array.hpp index f5fc8018b..bb9a00ce5 100644 --- a/lib/base/array.hpp +++ b/lib/base/array.hpp @@ -122,6 +122,8 @@ public: Array::Ptr Reverse(void) const; + virtual String ToString(void) const override; + private: std::vector m_Data; /**< The data for the array. */ }; diff --git a/lib/config/configwriter.cpp b/lib/base/configwriter.cpp similarity index 82% rename from lib/config/configwriter.cpp rename to lib/base/configwriter.cpp index 91af9a6c1..ec5514636 100644 --- a/lib/config/configwriter.cpp +++ b/lib/base/configwriter.cpp @@ -17,7 +17,7 @@ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ -#include "config/configwriter.hpp" +#include "base/configwriter.hpp" #include "config/configcompiler.hpp" #include "base/exception.hpp" #include @@ -145,7 +145,7 @@ void ConfigWriter::EmitIdentifier(std::ostream& fp, const String& identifier, bo { static std::set keywords; if (keywords.empty()) { - const std::vector& vkeywords = ConfigCompiler::GetKeywords(); + const std::vector& vkeywords = GetKeywords(); std::copy(vkeywords.begin(), vkeywords.end(), std::inserter(keywords, keywords.begin())); } @@ -204,3 +204,44 @@ String ConfigWriter::EscapeIcingaString(const String& str) boost::algorithm::replace_all(result, "\"", "\\\""); return result; } + +const std::vector& ConfigWriter::GetKeywords(void) +{ + static std::vector keywords; + + if (keywords.empty()) { + keywords.push_back("object"); + keywords.push_back("template"); + keywords.push_back("include"); + keywords.push_back("include_recursive"); + keywords.push_back("include_zones"); + keywords.push_back("library"); + keywords.push_back("null"); + keywords.push_back("true"); + keywords.push_back("false"); + keywords.push_back("const"); + keywords.push_back("var"); + keywords.push_back("this"); + keywords.push_back("globals"); + keywords.push_back("locals"); + keywords.push_back("use"); + keywords.push_back("ignore_on_error"); + keywords.push_back("apply"); + keywords.push_back("to"); + keywords.push_back("where"); + keywords.push_back("import"); + keywords.push_back("assign"); + keywords.push_back("ignore"); + keywords.push_back("function"); + keywords.push_back("return"); + keywords.push_back("break"); + keywords.push_back("continue"); + keywords.push_back("for"); + keywords.push_back("if"); + keywords.push_back("else"); + keywords.push_back("while"); + keywords.push_back("throw"); + } + + return keywords; +} diff --git a/lib/config/configwriter.hpp b/lib/base/configwriter.hpp similarity index 96% rename from lib/config/configwriter.hpp rename to lib/base/configwriter.hpp index c7fa1bb8e..fcee04ab9 100644 --- a/lib/config/configwriter.hpp +++ b/lib/base/configwriter.hpp @@ -20,7 +20,6 @@ #ifndef CONFIGWRITER_H #define CONFIGWRITER_H -#include "config/i2-config.hpp" #include "base/object.hpp" #include "base/array.hpp" #include "base/dictionary.hpp" @@ -32,9 +31,9 @@ namespace icinga /** * A configuration writer. * - * @ingroup config + * @ingroup base */ -class I2_CONFIG_API ConfigWriter +class I2_BASE_API ConfigWriter { public: static void EmitBoolean(std::ostream& fp, bool val); @@ -56,6 +55,7 @@ public: static void EmitComment(std::ostream& fp, const String& text); static void EmitFunctionCall(std::ostream& fp, const String& name, const Array::Ptr& arguments); + static const std::vector& GetKeywords(void); private: ConfigWriter(void); diff --git a/lib/base/dictionary.cpp b/lib/base/dictionary.cpp index 9afb25681..ee652039f 100644 --- a/lib/base/dictionary.cpp +++ b/lib/base/dictionary.cpp @@ -21,6 +21,7 @@ #include "base/objectlock.hpp" #include "base/debug.hpp" #include "base/primitivetype.hpp" +#include "base/configwriter.hpp" #include using namespace icinga; @@ -198,3 +199,10 @@ std::vector Dictionary::GetKeys(void) const return keys; } + +String Dictionary::ToString(void) const +{ + std::ostringstream msgbuf; + ConfigWriter::EmitScope(msgbuf, 0, const_cast(this)); + return msgbuf.str(); +} diff --git a/lib/base/dictionary.hpp b/lib/base/dictionary.hpp index 0556aa31f..fd625a048 100644 --- a/lib/base/dictionary.hpp +++ b/lib/base/dictionary.hpp @@ -115,6 +115,8 @@ public: virtual Object::Ptr Clone(void) const override; + virtual String ToString(void) const override; + private: std::map m_Data; /**< The data for the dictionary. */ }; diff --git a/lib/cli/consolecommand.cpp b/lib/cli/consolecommand.cpp index cea3f884d..801c5f8ee 100644 --- a/lib/cli/consolecommand.cpp +++ b/lib/cli/consolecommand.cpp @@ -19,6 +19,7 @@ #include "cli/consolecommand.hpp" #include "config/configcompiler.hpp" +#include "base/configwriter.hpp" #include "base/json.hpp" #include "base/console.hpp" #include "base/application.hpp" @@ -80,7 +81,7 @@ static char *ConsoleCompleteHelper(const char *word, int state) if (state == 0) { matches.clear(); - BOOST_FOREACH(const String& keyword, ConfigCompiler::GetKeywords()) { + BOOST_FOREACH(const String& keyword, ConfigWriter::GetKeywords()) { AddSuggestion(matches, word, keyword); } diff --git a/lib/config/CMakeLists.txt b/lib/config/CMakeLists.txt index 048250cf4..72038ff1a 100644 --- a/lib/config/CMakeLists.txt +++ b/lib/config/CMakeLists.txt @@ -37,7 +37,6 @@ set(config_SOURCES applyrule.cpp configcompilercontext.cpp configcompiler.cpp configitembuilder.cpp configitem.cpp ${FLEX_config_lexer_OUTPUTS} ${BISON_config_parser_OUTPUTS} - configwriter.cpp expression.cpp objectrule.cpp ) diff --git a/lib/config/configcompiler.cpp b/lib/config/configcompiler.cpp index 12ce40918..688f50681 100644 --- a/lib/config/configcompiler.cpp +++ b/lib/config/configcompiler.cpp @@ -320,43 +320,3 @@ void ConfigCompiler::RegisterZoneDir(const String& tag, const String& ppath, con m_ZoneDirs[zoneName].push_back(zf); } -const std::vector& ConfigCompiler::GetKeywords(void) -{ - static std::vector keywords; - - if (keywords.empty()) { - keywords.push_back("object"); - keywords.push_back("template"); - keywords.push_back("include"); - keywords.push_back("include_recursive"); - keywords.push_back("include_zones"); - keywords.push_back("library"); - keywords.push_back("null"); - keywords.push_back("true"); - keywords.push_back("false"); - keywords.push_back("const"); - keywords.push_back("var"); - keywords.push_back("this"); - keywords.push_back("globals"); - keywords.push_back("locals"); - keywords.push_back("use"); - keywords.push_back("ignore_on_error"); - keywords.push_back("apply"); - keywords.push_back("to"); - keywords.push_back("where"); - keywords.push_back("import"); - keywords.push_back("assign"); - keywords.push_back("ignore"); - keywords.push_back("function"); - keywords.push_back("return"); - keywords.push_back("break"); - keywords.push_back("continue"); - keywords.push_back("for"); - keywords.push_back("if"); - keywords.push_back("else"); - keywords.push_back("while"); - keywords.push_back("throw"); - } - - return keywords; -} diff --git a/lib/config/configcompiler.hpp b/lib/config/configcompiler.hpp index 66e8df177..154717766 100644 --- a/lib/config/configcompiler.hpp +++ b/lib/config/configcompiler.hpp @@ -118,8 +118,6 @@ public: static std::vector GetZoneDirs(const String& zone); static void RegisterZoneDir(const String& tag, const String& ppath, const String& zoneName); - static const std::vector& GetKeywords(void); - private: boost::promise > m_Promise; diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index a240b6944..0320460c3 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -21,8 +21,8 @@ #include "icinga/icingaapplication.tcpp" #include "icinga/cib.hpp" #include "icinga/macroprocessor.hpp" -#include "config/configwriter.hpp" #include "config/configcompiler.hpp" +#include "base/configwriter.hpp" #include "base/configtype.hpp" #include "base/logger.hpp" #include "base/objectlock.hpp" diff --git a/lib/remote/configobjectutility.cpp b/lib/remote/configobjectutility.cpp index cd83d87bd..325451403 100644 --- a/lib/remote/configobjectutility.cpp +++ b/lib/remote/configobjectutility.cpp @@ -21,7 +21,7 @@ #include "remote/configpackageutility.hpp" #include "config/configcompiler.hpp" #include "config/configitem.hpp" -#include "config/configwriter.hpp" +#include "base/configwriter.hpp" #include "base/exception.hpp" #include "base/serializer.hpp" #include "base/dependencygraph.hpp"