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(&registerResourceManager);
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 }