1 /**
2 Copyright: Copyright (c) 2015-2018 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 voxelman.log;
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 		tracef("registerResourceManager %s", rmInstance.id);
38 		resourceManagers[typeid(rmInstance)] = rmInstance;
39 	}
40 
41 	// IPluginManager
42 	IPlugin findPlugin(TypeInfo pluginType)
43 	{
44 		return plugins.get(pluginType, null);
45 	}
46 
47 	IPlugin findPluginById(string pluginId)
48 	{
49 		return pluginsById.get(pluginId, null);
50 	}
51 
52 
53 	// IResourceManagerRegistry
54 	IResourceManager findResourceManager(TypeInfo rmType)
55 	{
56 		tracef("findResourceManager %s", rmType);
57 		return resourceManagers.get(rmType, null);
58 	}
59 
60 	void initPlugins()
61 	{
62 		// Register resources
63 		foreach(IPlugin p; plugins)
64 		{
65 			tracef("registerResourceManagers %s", p.id);
66 			p.registerResourceManagers(&registerResourceManager);
67 		}
68 
69 		foreach(IResourceManager rm; resourceManagers)
70 		{
71 			tracef("preInit %s", rm.id);
72 			rm.preInit();
73 		}
74 		foreach(IResourceManager rm; resourceManagers)
75 		{
76 			tracef("init %s", rm.id);
77 			rm.init(this);
78 		}
79 
80 		foreach(IPlugin p; plugins)
81 		{
82 			tracef("registerResources %s", p.id);
83 			p.registerResources(this);
84 		}
85 
86 		// Load resources
87 		foreach(IResourceManager rm; resourceManagers)
88 		{
89 			tracef("loadResources %s", rm.id);
90 			rm.loadResources();
91 		}
92 		foreach(IResourceManager rm; resourceManagers)
93 		{
94 			tracef("postInit %s", rm.id);
95 			rm.postInit();
96 		}
97 
98 		// Load plugins
99 		foreach(IPlugin p; plugins)
100 		{
101 			tracef("preInit %s", p.id);
102 			p.preInit();
103 		}
104 		foreach(IPlugin p; plugins)
105 		{
106 			tracef("init %s", p.id);
107 			p.init(this);
108 		}
109 
110 		foreach(IPlugin p; plugins)
111 		{
112 			tracef("postInit %s", p.id);
113 			p.postInit();
114 		}
115 
116 		size_t i = 1;
117 		infof("Loaded %s plugins", plugins.length);
118 		foreach(IPlugin p; plugins)
119 		{
120 			infof("Loaded #%s %s %s", i, p.id, p.semver);
121 			++i;
122 		}
123 	}
124 }