/****************************************************************************** * Icinga 2 * * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2 * * of the License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software Foundation * * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ******************************************************************************/ #ifndef DYNAMICTYPE_H #define DYNAMICTYPE_H namespace icinga { struct AttributeDescription { String Name; AttributeType Type; }; class I2_BASE_API DynamicType : public Object { public: typedef shared_ptr Ptr; typedef weak_ptr WeakPtr; typedef function ObjectFactory; DynamicType(const String& name, const ObjectFactory& factory); String GetName(void) const; static DynamicType::Ptr GetByName(const String& name); static void RegisterType(const DynamicType::Ptr& type); static bool TypeExists(const String& name); DynamicObject::Ptr CreateObject(const Dictionary::Ptr& serializedUpdate) const; DynamicObject::Ptr GetObject(const String& name) const; void RegisterObject(const DynamicObject::Ptr& object); void UnregisterObject(const DynamicObject::Ptr& object); static set GetTypes(void); set GetObjects(void) const; static set GetObjects(const String& type); void AddAttribute(const String& name, AttributeType type); void RemoveAttribute(const String& name); bool HasAttribute(const String& name); void AddAttributes(const AttributeDescription *attributes, int attributeCount); private: String m_Name; ObjectFactory m_ObjectFactory; map m_Attributes; typedef map ObjectMap; typedef set ObjectSet; ObjectMap m_ObjectMap; ObjectSet m_ObjectSet; typedef map TypeMap; typedef set TypeSet; static TypeMap& InternalGetTypeMap(void); static TypeSet& InternalGetTypeSet(void); static boost::mutex& GetStaticMutex(void); }; /** * Helper class for registering DynamicObject implementation classes. * * @ingroup base */ class RegisterTypeHelper { public: RegisterTypeHelper(const String& name, const DynamicType::ObjectFactory& factory, const AttributeDescription* attributes, int attributeCount) { if (!DynamicType::TypeExists(name)) { DynamicType::Ptr type = boost::make_shared(name, factory); type->AddAttributes(attributes, attributeCount); DynamicType::RegisterType(type); } } }; /** * Factory function for DynamicObject-based classes. * * @ingroup base */ template shared_ptr DynamicObjectFactory(const Dictionary::Ptr& serializedUpdate) { return boost::make_shared(serializedUpdate); } #define REGISTER_TYPE_ALIAS(type, alias, attributeDesc) \ static RegisterTypeHelper g_RegisterDT_ ## type(alias, DynamicObjectFactory, attributeDesc, (attributeDesc == NULL) ? 0 : sizeof(attributeDesc) / sizeof((static_cast(attributeDesc))[0])) #define REGISTER_TYPE(type, attributeDesc) \ REGISTER_TYPE_ALIAS(type, #type, attributeDesc) } #endif /* DYNAMICTYPE_H */