Don't instantiate abstract objects.

Fixes #3669
This commit is contained in:
Gunnar Beutner 2013-03-11 12:04:10 +01:00
parent f34778eb86
commit 6f51230a79
8 changed files with 31 additions and 31 deletions

View File

@ -38,7 +38,6 @@ DynamicObject::DynamicObject(const Dictionary::Ptr& serializedObject)
RegisterAttribute("__name", Attribute_Config, &m_Name); RegisterAttribute("__name", Attribute_Config, &m_Name);
RegisterAttribute("__type", Attribute_Config, &m_Type); RegisterAttribute("__type", Attribute_Config, &m_Type);
RegisterAttribute("__local", Attribute_Config, &m_Local); RegisterAttribute("__local", Attribute_Config, &m_Local);
RegisterAttribute("__abstract", Attribute_Config, &m_Abstract);
RegisterAttribute("__source", Attribute_Local, &m_Source); RegisterAttribute("__source", Attribute_Local, &m_Source);
RegisterAttribute("methods", Attribute_Config, &m_Methods); RegisterAttribute("methods", Attribute_Config, &m_Methods);
@ -339,14 +338,6 @@ bool DynamicObject::IsLocal(void) const
return m_Local; return m_Local;
} }
/**
* @threadsafety Always.
*/
bool DynamicObject::IsAbstract(void) const
{
return m_Abstract;
}
/** /**
* @threadsafety Always. * @threadsafety Always.
*/ */

View File

@ -71,7 +71,6 @@ public:
String GetName(void) const; String GetName(void) const;
bool IsLocal(void) const; bool IsLocal(void) const;
bool IsAbstract(void) const;
bool IsRegistered(void) const; bool IsRegistered(void) const;
void SetSource(const String& value); void SetSource(const String& value);
@ -113,7 +112,6 @@ private:
Attribute<String> m_Name; Attribute<String> m_Name;
Attribute<String> m_Type; Attribute<String> m_Type;
Attribute<bool> m_Local; Attribute<bool> m_Local;
Attribute<bool> m_Abstract;
Attribute<String> m_Source; Attribute<String> m_Source;
Attribute<Dictionary::Ptr> m_Methods; Attribute<Dictionary::Ptr> m_Methods;

View File

@ -31,15 +31,17 @@ signals2::signal<void (const ConfigItem::Ptr&)> ConfigItem::OnRemoved;
* *
* @param type The object type. * @param type The object type.
* @param name The name of the item. * @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 exprl Expression list for the item.
* @param parents Parent objects for the item. * @param parents Parent objects for the item.
* @param debuginfo Debug information. * @param debuginfo Debug information.
*/ */
ConfigItem::ConfigItem(const String& type, const String& name, 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<String>& parents, const DebugInfo& debuginfo) const vector<String>& parents, const DebugInfo& debuginfo)
: m_Type(type), m_Name(name), m_Unit(unit), m_ExpressionList(exprl), : m_Type(type), m_Name(name), m_Unit(unit), m_Abstract(abstract),
m_Parents(parents), m_DebugInfo(debuginfo) m_ExpressionList(exprl), m_Parents(parents), m_DebugInfo(debuginfo)
{ {
} }
@ -73,6 +75,16 @@ String ConfigItem::GetUnit(void) const
return m_Unit; 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. * 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. */ /* Update or create the object and apply the configuration settings. */
bool was_null = false; bool was_null = false;
if (!dobj) { if (!dobj && !IsAbstract()) {
dobj = dtype->CreateObject(update); dobj = dtype->CreateObject(update);
was_null = true; was_null = true;
} }
@ -265,10 +277,12 @@ DynamicObject::Ptr ConfigItem::Commit(void)
m_DynamicObject = dobj; m_DynamicObject = dobj;
} }
if (dobj->IsAbstract()) if (dobj) {
if (IsAbstract())
dobj->Unregister(); dobj->Unregister();
else else
dobj->Register(); dobj->Register();
}
/* notify our children of the update */ /* notify our children of the update */
BOOST_FOREACH(const ConfigItem::WeakPtr wchild, children) { BOOST_FOREACH(const ConfigItem::WeakPtr wchild, children) {

View File

@ -35,12 +35,13 @@ public:
typedef weak_ptr<ConfigItem> WeakPtr; typedef weak_ptr<ConfigItem> WeakPtr;
ConfigItem(const String& type, const String& name, const String& unit, ConfigItem(const String& type, const String& name, const String& unit,
const ExpressionList::Ptr& exprl, const vector<String>& parents, bool abstract, const ExpressionList::Ptr& exprl, const vector<String>& parents,
const DebugInfo& debuginfo); const DebugInfo& debuginfo);
String GetType(void) const; String GetType(void) const;
String GetName(void) const; String GetName(void) const;
String GetUnit(void) const; String GetUnit(void) const;
bool IsAbstract(void) const;
vector<String> GetParents(void) const; vector<String> GetParents(void) const;
@ -75,6 +76,7 @@ private:
String m_Type; /**< The object type. */ String m_Type; /**< The object type. */
String m_Name; /**< The name. */ String m_Name; /**< The name. */
String m_Unit; /**< The compilation unit. */ String m_Unit; /**< The compilation unit. */
bool m_Abstract; /**< Whether this is a template. */
ExpressionList::Ptr m_ExpressionList; ExpressionList::Ptr m_ExpressionList;
vector<String> m_Parents; /**< The names of parent configuration vector<String> m_Parents; /**< The names of parent configuration

View File

@ -139,9 +139,6 @@ ConfigItem::Ptr ConfigItemBuilder::Compile(void)
Expression localExpr("__local", OperatorSet, m_Local, m_DebugInfo); Expression localExpr("__local", OperatorSet, m_Local, m_DebugInfo);
exprl->AddExpression(localExpr); exprl->AddExpression(localExpr);
Expression abstractExpr("__abstract", OperatorSet, m_Abstract, m_DebugInfo); return boost::make_shared<ConfigItem>(m_Type, m_Name, m_Unit, m_Abstract, exprl, m_Parents,
exprl->AddExpression(abstractExpr);
return boost::make_shared<ConfigItem>(m_Type, m_Name, m_Unit, exprl, m_Parents,
m_DebugInfo); m_DebugInfo);
} }

View File

@ -208,9 +208,8 @@ void Host::UpdateSlaveServices(void)
ConfigItem::Ptr item = ConfigItem::GetObject("Host", GetName()); ConfigItem::Ptr item = ConfigItem::GetObject("Host", GetName());
/* Don't create slave services unless we own this object /* Don't create slave services unless we own this object */
* and it's not a template. */ if (!item)
if (!item || IsAbstract())
return; return;
Dictionary::Ptr oldServices = m_SlaveServices; Dictionary::Ptr oldServices = m_SlaveServices;

View File

@ -191,9 +191,8 @@ void Service::UpdateSlaveNotifications(void)
item = ConfigItem::GetObject("Service", GetName()); item = ConfigItem::GetObject("Service", GetName());
/* Don't create slave notifications unless we own this object /* Don't create slave notifications unless we own this object */
* and it's not a template. */ if (!item)
if (!item || IsAbstract())
return; return;
{ {

View File

@ -362,7 +362,7 @@ void Service::OnAttributeChanged(const String& name)
ConfigItem::Ptr item = ConfigItem::GetObject("Service", GetName()); ConfigItem::Ptr item = ConfigItem::GetObject("Service", GetName());
/* update the next check timestamp if we're the owner of this service */ /* update the next check timestamp if we're the owner of this service */
if (item && !IsAbstract()) if (item)
UpdateNextCheck(); UpdateNextCheck();
} }
} }