1 /** 2 Copyright: Copyright (c) 2015-2016 Andrey Penechko. 3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 7 module pluginlib.pluginmanager; 8 9 import std.experimental.logger; 10 import std.string : format; 11 import pluginlib; 12 13 class PluginManager : IPluginManager, IResourceManagerRegistry 14 { 15 IPlugin[TypeInfo] plugins; 16 IPlugin[string] pluginsById; 17 IResourceManager[TypeInfo] resourceManagers; 18 19 void registerPlugin(IPlugin pluginInstance) 20 { 21 assert(pluginInstance); 22 assert( 23 typeid(pluginInstance) !in plugins && 24 pluginInstance.id !in pluginsById, 25 format("Duplicate plugin registered: id=\"%s\" type=\"%s\"", 26 pluginInstance.id, pluginInstance)); 27 plugins[typeid(pluginInstance)] = pluginInstance; 28 pluginsById[pluginInstance.id] = pluginInstance; 29 } 30 31 void registerResourceManager(IResourceManager rmInstance) 32 { 33 assert(rmInstance); 34 assert(typeid(rmInstance) !in resourceManagers, 35 format("Duplicate resource manager registered: id=\"%s\" type=\"%s\"", 36 rmInstance.id, rmInstance)); 37 resourceManagers[typeid(rmInstance)] = rmInstance; 38 } 39 40 // IPluginManager 41 IPlugin findPlugin(TypeInfo pluginType) 42 { 43 return plugins.get(pluginType, null); 44 } 45 46 IPlugin findPluginById(string pluginId) 47 { 48 return pluginsById.get(pluginId, null); 49 } 50 51 52 // IResourceManagerRegistry 53 IResourceManager findResourceManager(TypeInfo rmType) 54 { 55 return resourceManagers.get(rmType, null); 56 } 57 58 void initPlugins() 59 { 60 // Register resources 61 foreach(IPlugin p; plugins) 62 { 63 tracef("registerResourceManagers %s", p.id); 64 p.registerResourceManagers(®isterResourceManager); 65 } 66 67 foreach(IResourceManager rm; resourceManagers) 68 { 69 tracef("preInit %s", rm.id); 70 rm.preInit(); 71 } 72 foreach(IResourceManager rm; resourceManagers) 73 { 74 tracef("init %s", rm.id); 75 rm.init(this); 76 } 77 78 foreach(IPlugin p; plugins) 79 { 80 tracef("registerResources %s", p.id); 81 p.registerResources(this); 82 } 83 84 // Load resources 85 foreach(IResourceManager rm; resourceManagers) 86 { 87 tracef("loadResources %s", rm.id); 88 rm.loadResources(); 89 } 90 foreach(IResourceManager rm; resourceManagers) 91 { 92 tracef("postInit %s", rm.id); 93 rm.postInit(); 94 } 95 96 // Load plugins 97 foreach(IPlugin p; plugins) 98 { 99 tracef("preInit %s", p.id); 100 p.preInit(); 101 } 102 foreach(IPlugin p; plugins) 103 { 104 tracef("init %s", p.id); 105 p.init(this); 106 } 107 108 foreach(IPlugin p; plugins) 109 { 110 tracef("postInit %s", p.id); 111 p.postInit(); 112 } 113 114 size_t i = 1; 115 infof("Loaded %s plugins", plugins.length); 116 foreach(IPlugin p; plugins) 117 { 118 infof("Loaded #%s %s %s", i, p.id, p.semver); 119 ++i; 120 } 121 } 122 }