From 6f51230a791bc2be3920ae59cbab044b6d292f55 Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Mon, 11 Mar 2013 12:04:10 +0100 Subject: [PATCH] Don't instantiate abstract objects. Fixes #3669 --- lib/base/dynamicobject.cpp | 9 --------- lib/base/dynamicobject.h | 2 -- lib/config/configitem.cpp | 30 +++++++++++++++++++++-------- lib/config/configitem.h | 4 +++- lib/config/configitembuilder.cpp | 5 +---- lib/icinga/host.cpp | 5 ++--- lib/icinga/service-notification.cpp | 5 ++--- lib/icinga/service.cpp | 2 +- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/lib/base/dynamicobject.cpp b/lib/base/dynamicobject.cpp index d0693d64f..d45edf775 100644 --- a/lib/base/dynamicobject.cpp +++ b/lib/base/dynamicobject.cpp @@ -38,7 +38,6 @@ DynamicObject::DynamicObject(const Dictionary::Ptr& serializedObject) RegisterAttribute("__name", Attribute_Config, &m_Name); RegisterAttribute("__type", Attribute_Config, &m_Type); RegisterAttribute("__local", Attribute_Config, &m_Local); - RegisterAttribute("__abstract", Attribute_Config, &m_Abstract); RegisterAttribute("__source", Attribute_Local, &m_Source); RegisterAttribute("methods", Attribute_Config, &m_Methods); @@ -339,14 +338,6 @@ bool DynamicObject::IsLocal(void) const return m_Local; } -/** - * @threadsafety Always. - */ -bool DynamicObject::IsAbstract(void) const -{ - return m_Abstract; -} - /** * @threadsafety Always. */ diff --git a/lib/base/dynamicobject.h b/lib/base/dynamicobject.h index b002eaac8..fd467237c 100644 --- a/lib/base/dynamicobject.h +++ b/lib/base/dynamicobject.h @@ -71,7 +71,6 @@ public: String GetName(void) const; bool IsLocal(void) const; - bool IsAbstract(void) const; bool IsRegistered(void) const; void SetSource(const String& value); @@ -113,7 +112,6 @@ private: Attribute m_Name; Attribute m_Type; Attribute m_Local; - Attribute m_Abstract; Attribute m_Source; Attribute m_Methods; diff --git a/lib/config/configitem.cpp b/lib/config/configitem.cpp index 90e67a9cd..b73778da8 100644 --- a/lib/config/configitem.cpp +++ b/lib/config/configitem.cpp @@ -31,15 +31,17 @@ signals2::signal ConfigItem::OnRemoved; * * @param type The object type. * @param name The name of the item. + * @param unit The unit of the item. + * @param abstract Whether the item is a template. * @param exprl Expression list for the item. * @param parents Parent objects for the item. * @param debuginfo Debug information. */ ConfigItem::ConfigItem(const String& type, const String& name, - const String& unit, const ExpressionList::Ptr& exprl, + const String& unit, bool abstract, const ExpressionList::Ptr& exprl, const vector& parents, const DebugInfo& debuginfo) - : m_Type(type), m_Name(name), m_Unit(unit), m_ExpressionList(exprl), - m_Parents(parents), m_DebugInfo(debuginfo) + : m_Type(type), m_Name(name), m_Unit(unit), m_Abstract(abstract), + m_ExpressionList(exprl), m_Parents(parents), m_DebugInfo(debuginfo) { } @@ -73,6 +75,16 @@ String ConfigItem::GetUnit(void) const return m_Unit; } +/** + * Checks whether the item is abstract. + * + * @returns true if the item is abstract, false otherwise. + */ +bool ConfigItem::IsAbstract(void) const +{ + return m_Abstract; +} + /** * Retrieves the debug information for the configuration item. * @@ -251,7 +263,7 @@ DynamicObject::Ptr ConfigItem::Commit(void) /* Update or create the object and apply the configuration settings. */ bool was_null = false; - if (!dobj) { + if (!dobj && !IsAbstract()) { dobj = dtype->CreateObject(update); was_null = true; } @@ -265,10 +277,12 @@ DynamicObject::Ptr ConfigItem::Commit(void) m_DynamicObject = dobj; } - if (dobj->IsAbstract()) - dobj->Unregister(); - else - dobj->Register(); + if (dobj) { + if (IsAbstract()) + dobj->Unregister(); + else + dobj->Register(); + } /* notify our children of the update */ BOOST_FOREACH(const ConfigItem::WeakPtr wchild, children) { diff --git a/lib/config/configitem.h b/lib/config/configitem.h index 69f765f40..42c300af4 100644 --- a/lib/config/configitem.h +++ b/lib/config/configitem.h @@ -35,12 +35,13 @@ public: typedef weak_ptr WeakPtr; ConfigItem(const String& type, const String& name, const String& unit, - const ExpressionList::Ptr& exprl, const vector& parents, + bool abstract, const ExpressionList::Ptr& exprl, const vector& parents, const DebugInfo& debuginfo); String GetType(void) const; String GetName(void) const; String GetUnit(void) const; + bool IsAbstract(void) const; vector GetParents(void) const; @@ -75,6 +76,7 @@ private: String m_Type; /**< The object type. */ String m_Name; /**< The name. */ String m_Unit; /**< The compilation unit. */ + bool m_Abstract; /**< Whether this is a template. */ ExpressionList::Ptr m_ExpressionList; vector m_Parents; /**< The names of parent configuration diff --git a/lib/config/configitembuilder.cpp b/lib/config/configitembuilder.cpp index 81c6789f5..6c6b12f65 100644 --- a/lib/config/configitembuilder.cpp +++ b/lib/config/configitembuilder.cpp @@ -139,9 +139,6 @@ ConfigItem::Ptr ConfigItemBuilder::Compile(void) Expression localExpr("__local", OperatorSet, m_Local, m_DebugInfo); exprl->AddExpression(localExpr); - Expression abstractExpr("__abstract", OperatorSet, m_Abstract, m_DebugInfo); - exprl->AddExpression(abstractExpr); - - return boost::make_shared(m_Type, m_Name, m_Unit, exprl, m_Parents, + return boost::make_shared(m_Type, m_Name, m_Unit, m_Abstract, exprl, m_Parents, m_DebugInfo); } diff --git a/lib/icinga/host.cpp b/lib/icinga/host.cpp index bb8dffd09..408d69f61 100644 --- a/lib/icinga/host.cpp +++ b/lib/icinga/host.cpp @@ -208,9 +208,8 @@ void Host::UpdateSlaveServices(void) ConfigItem::Ptr item = ConfigItem::GetObject("Host", GetName()); - /* Don't create slave services unless we own this object - * and it's not a template. */ - if (!item || IsAbstract()) + /* Don't create slave services unless we own this object */ + if (!item) return; Dictionary::Ptr oldServices = m_SlaveServices; diff --git a/lib/icinga/service-notification.cpp b/lib/icinga/service-notification.cpp index 76bd6b384..8a107092e 100644 --- a/lib/icinga/service-notification.cpp +++ b/lib/icinga/service-notification.cpp @@ -191,9 +191,8 @@ void Service::UpdateSlaveNotifications(void) item = ConfigItem::GetObject("Service", GetName()); - /* Don't create slave notifications unless we own this object - * and it's not a template. */ - if (!item || IsAbstract()) + /* Don't create slave notifications unless we own this object */ + if (!item) return; { diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index bb49c00ee..3be6ac0ca 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -362,7 +362,7 @@ void Service::OnAttributeChanged(const String& name) ConfigItem::Ptr item = ConfigItem::GetObject("Service", GetName()); /* update the next check timestamp if we're the owner of this service */ - if (item && !IsAbstract()) + if (item) UpdateNextCheck(); } }