00001 #ifndef MediaTable_ModuleStore_h 00002 #define MediaTable_ModuleStore_h 00003 00004 #include "Module.h" 00005 00006 namespace Impala { 00007 namespace Application { 00008 namespace MediaTable { 00009 00010 class ModuleStore { 00011 public: 00012 typedef std::map<std::string, Module*> ModuleMapType; 00013 typedef std::multimap<std::string, ModuleListener*> ModuleListenersMapType; 00014 00015 static void Initialize() 00016 { 00017 if (sInstance) 00018 { 00019 ILOG_WARN("ModuleStore already initialized. Skipping."); 00020 return; 00021 } 00022 sInstance = new ModuleStore(); 00023 } 00024 00025 static ModuleStore* GetInstance() 00026 { 00027 if (!sInstance) 00028 { 00029 sInstance = new ModuleStore(); 00030 } 00031 return sInstance; 00032 } 00033 00034 void Register(Module* module) { 00035 mModules[module->GetType()][module->GetName()] = module; 00036 // AddExistingListeners 00037 std::pair<ModuleListenersMapType::iterator,ModuleListenersMapType::iterator> listeners 00038 = mListeners.equal_range(module->GetType()); 00039 for (ModuleListenersMapType::iterator it=listeners.first ; it != listeners.second; it++ ) 00040 module->AddModuleListener((*it).second); 00041 } 00042 00043 void Unregister(Module* module) { 00044 mModules[module->GetType()].erase(module->GetName()); 00045 } 00046 00047 void RegisterListener(ModuleListener* listener) { 00048 mListeners.insert(std::pair<std::string, ModuleListener*>(listener->GetType(), listener)); 00049 ModuleMapType modules = GetModulesOfType(listener->GetType()); 00050 for (ModuleMapType::iterator it=modules.begin() ; it != modules.end(); it++ ) 00051 (*it).second->AddModuleListener(listener); 00052 } 00053 00054 int CountModulesOfType(std::string type) 00055 { 00056 return mModules[type].size(); 00057 } 00058 00059 void Clear() { 00060 delete sInstance; 00061 sInstance = new ModuleStore(); 00062 } 00063 00064 ModuleMapType GetModulesOfType(std::string type) { 00065 return mModules[type]; 00066 } 00067 00068 private: 00069 ModuleStore() // constructor: private 00070 { 00071 Init(); 00072 } 00073 00074 ModuleStore(ModuleStore const&){}; // copy constructor: private 00075 ModuleStore& operator=(ModuleStore const&){}; // assignment operator: private 00076 00077 void Init() 00078 { 00079 ILOG_DEBUG("Initializing ModuleStore"); 00080 } 00081 00082 typedef std::map<std::string, ModuleMapType> ModuleMapMapType; 00083 00084 ModuleMapMapType mModules; 00085 ModuleListenersMapType mListeners; 00086 00087 static ModuleStore* sInstance; 00088 00089 ILOG_VAR_DEC; 00090 }; 00091 00092 ModuleStore* ModuleStore::sInstance = 0; 00093 00094 ILOG_VAR_INIT(ModuleStore, Application.MediaTable); 00095 00096 } // namespace MediaTable 00097 } // namespace Application 00098 } // namespace Impala 00099 #endif // ModuleStore_h