Merge pull request #980 from StephenMcConnel/bug-18638
[mono.git] / mcs / nunit24 / ClientUtilities / util / Services / ServiceManager.cs
1 // ****************************************************************\r
2 // Copyright 2007, Charlie Poole\r
3 // This is free software licensed under the NUnit license. You may\r
4 // obtain a copy of the license at http://nunit.org/?p=license&r=2.4\r
5 // ****************************************************************\r
6 \r
7 using System;\r
8 using System.Collections;\r
9 using NUnit.Core;\r
10 \r
11 namespace NUnit.Util\r
12 {\r
13         /// <summary>\r
14         /// Summary description for ServiceManger.\r
15         /// </summary>\r
16         public class ServiceManager\r
17         {\r
18                 private ArrayList services = new ArrayList();\r
19                 private Hashtable serviceIndex = new Hashtable();\r
20 \r
21                 private static ServiceManager defaultServiceManager = new ServiceManager();\r
22 \r
23                 public static ServiceManager Services\r
24                 {\r
25                         get { return defaultServiceManager; }\r
26                 }\r
27 \r
28                 public void AddService( IService service )\r
29                 {\r
30                         services.Add( service );\r
31                         NTrace.Debug( "Added " + service.GetType().Name );\r
32                 }\r
33 \r
34                 public IService GetService( Type serviceType )\r
35                 {\r
36                         IService theService = (IService)serviceIndex[serviceType];\r
37                         if ( theService == null )\r
38                                 foreach( IService service in services )\r
39                                 {\r
40                                         // TODO: Does this work on Mono?\r
41                                         if( serviceType.IsInstanceOfType( service ) )\r
42                                         {\r
43                                                 serviceIndex[serviceType] = service;\r
44                                                 theService = service;\r
45                                                 break;\r
46                                         }\r
47                                 }\r
48 \r
49                         if ( theService == null )\r
50                                 NTrace.Error( string.Format( "Requested service {0} was not found", serviceType.FullName ) );\r
51                         else\r
52                                 NTrace.Info( string.Format( "Request for service {0} satisfied by {1}", serviceType.Name, theService.GetType().Name ) );\r
53                         \r
54                         return theService;\r
55                 }\r
56 \r
57                 public void InitializeServices()\r
58                 {\r
59                         foreach( IService service in services )\r
60                         {\r
61                                 NTrace.Info( "Initializing " + service.GetType().Name );\r
62                                 service.InitializeService();\r
63                         }\r
64                 }\r
65 \r
66                 public void StopAllServices()\r
67                 {\r
68                         // Stop services in reverse of initialization order\r
69                         // TODO: Deal with dependencies explicitly\r
70                         int index = services.Count;\r
71                         while( --index >= 0 )\r
72                                 ((IService)services[index]).UnloadService();\r
73                 }\r
74 \r
75                 public void ClearServices()\r
76                 {\r
77                         services.Clear();\r
78                 }\r
79 \r
80                 private ServiceManager() { }\r
81         }\r
82 }\r