1 | using System.Collections.Concurrent;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using System.IO;
|
---|
4 | using System.Web;
|
---|
5 | using System.Web.Http;
|
---|
6 |
|
---|
7 | namespace HeuristicLab.Services.WebApp {
|
---|
8 | public class PluginManager {
|
---|
9 |
|
---|
10 | private static PluginManager instance;
|
---|
11 | public static PluginManager Instance {
|
---|
12 | get { return instance ?? (instance = new PluginManager()); }
|
---|
13 | }
|
---|
14 |
|
---|
15 | private readonly IDictionary<string, Plugin> plugins;
|
---|
16 |
|
---|
17 | public HttpConfiguration Configuration { get; set; }
|
---|
18 |
|
---|
19 | private string PluginsDirectory {
|
---|
20 | get { return string.Format(@"{0}WebApp\plugins", HttpRuntime.AppDomainAppPath); }
|
---|
21 | }
|
---|
22 |
|
---|
23 | public PluginManager() {
|
---|
24 | plugins = new ConcurrentDictionary<string, Plugin>();
|
---|
25 | }
|
---|
26 |
|
---|
27 | public Plugin GetPlugin(string name) {
|
---|
28 | Plugin plugin;
|
---|
29 | plugins.TryGetValue(name, out plugin);
|
---|
30 | if (plugin == null) {
|
---|
31 | string directory = string.Format(@"{0}\{1}", PluginsDirectory, name);
|
---|
32 | if (Directory.Exists(directory)) {
|
---|
33 | plugin = new Plugin {
|
---|
34 | Name = name,
|
---|
35 | Directory = directory
|
---|
36 | };
|
---|
37 | plugin.Configure(Configuration);
|
---|
38 | plugins.Add(name, plugin);
|
---|
39 | }
|
---|
40 | }
|
---|
41 | return plugin;
|
---|
42 | }
|
---|
43 |
|
---|
44 | public IEnumerable<Plugin> GetPlugins() {
|
---|
45 | DiscoverPlugins();
|
---|
46 | return plugins.Values;
|
---|
47 | }
|
---|
48 |
|
---|
49 | private void DiscoverPlugins() {
|
---|
50 | var pluginDirectories = Directory.GetDirectories(PluginsDirectory);
|
---|
51 | foreach (var directory in pluginDirectories) {
|
---|
52 | string pluginName = Path.GetFileName(directory);
|
---|
53 | Plugin plugin;
|
---|
54 | plugins.TryGetValue(pluginName, out plugin);
|
---|
55 | if (plugin == null) {
|
---|
56 | plugin = new Plugin {
|
---|
57 | Name = pluginName,
|
---|
58 | Directory = directory
|
---|
59 | };
|
---|
60 | plugin.Configure(Configuration);
|
---|
61 | plugins.Add(pluginName, plugin);
|
---|
62 | }
|
---|
63 | }
|
---|
64 | }
|
---|
65 | }
|
---|
66 | } |
---|