2 // System.Web.Hosting.ApplicationManager
5 // Gonzalo Paniagua Javier (gonzalo@novell.com)
8 // Copyright (C) 2006 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Collections.Generic;
33 using System.Security.Permissions;
34 using System.Security.Policy;
35 using System.Threading;
37 namespace System.Web.Hosting {
38 [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
39 public sealed class ApplicationManager : MarshalByRefObject {
40 static ApplicationManager instance = new ApplicationManager ();
42 Dictionary <string, BareApplicationHost> id_to_host;
44 private ApplicationManager ()
46 id_to_host = new Dictionary<string, BareApplicationHost> ();
51 if (Interlocked.Decrement (ref users) == 0)
55 public IRegisteredObject CreateObject (string appId, Type type, string virtualPath,
56 string physicalPath, bool failIfExists)
58 return CreateObject (appId, type, virtualPath, physicalPath, failIfExists, true);
61 public IRegisteredObject CreateObject (string appId, Type type, string virtualPath,
62 string physicalPath, bool failIfExists, bool throwOnError)
65 throw new ArgumentNullException ("appId");
67 if (!VirtualPathUtility.IsAbsolute (virtualPath))
68 throw new ArgumentException ("Relative path no allowed.", "virtualPath");
70 if (physicalPath == null || physicalPath == "")
71 throw new ArgumentException ("Cannot be null or empty", "physicalPath");
73 // 'type' is not checked. If it's null, we'll throw a NullReferenceException
74 if (!typeof (IRegisteredObject).IsAssignableFrom (type))
75 throw new ArgumentException (String.Concat ("Type '", type.Name, "' does not implement IRegisteredObject."), "type");
78 // ArgumentException is thrown for the physical path from the internal object created
79 // in the new application domain.
80 BareApplicationHost host = null;
81 if (id_to_host.ContainsKey (appId))
82 host = id_to_host [appId];
84 IRegisteredObject ireg = null;
86 ireg = CheckIfExists (host, type, failIfExists);
93 host = CreateHost (appId, virtualPath, physicalPath);
94 ireg = host.CreateInstance (type);
100 if (ireg != null && host.GetObject (type) == null) // If not registered from ctor...
101 host.RegisterObject (ireg, true);
106 // Used from ClientBuildManager
107 internal BareApplicationHost CreateHostWithCheck (string appId, string vpath, string ppath)
109 if (id_to_host.ContainsKey (appId))
110 throw new InvalidOperationException ("Already have a host with the same appId");
112 return CreateHost (appId, vpath, ppath);
115 BareApplicationHost CreateHost (string appId, string vpath, string ppath)
117 BareApplicationHost host;
118 host = (BareApplicationHost) ApplicationHost.CreateApplicationHost (typeof (BareApplicationHost), vpath, ppath);
121 id_to_host [appId] = host;
125 internal void RemoveHost (string appId)
127 id_to_host.Remove (appId);
130 IRegisteredObject CheckIfExists (BareApplicationHost host, Type type, bool failIfExists)
132 IRegisteredObject ireg = host.GetObject (type);
137 throw new InvalidOperationException (String.Concat ("Well known object of type '", type.Name, "' already exists in this domain."));
142 public static ApplicationManager GetApplicationManager ()
147 public IRegisteredObject GetObject (string appId, Type type)
150 throw new ArgumentNullException ("appId");
153 throw new ArgumentNullException ("type");
155 BareApplicationHost host = null;
156 if (!id_to_host.ContainsKey (appId))
159 host = id_to_host [appId];
160 return host.GetObject (type);
163 public ApplicationInfo [] GetRunningApplications ()
165 ICollection<string> coll = id_to_host.Keys;
166 string [] keys = new string [coll.Count];
167 coll.CopyTo (keys, 0);
168 ApplicationInfo [] result = new ApplicationInfo [coll.Count];
170 foreach (string str in keys) {
171 BareApplicationHost host = id_to_host [str];
172 result [i++] = new ApplicationInfo (str, host.PhysicalPath, host.VirtualPath);
178 public override object InitializeLifetimeService ()
183 public bool IsIdle ()
185 throw new NotImplementedException ();
190 Interlocked.Increment (ref users);
193 public void ShutdownAll ()
195 ICollection<string> coll = id_to_host.Keys;
196 string [] keys = new string [coll.Count];
197 coll.CopyTo (keys, 0);
198 foreach (string str in keys) {
199 BareApplicationHost host = id_to_host [str];
206 public void ShutdownApplication (string appId)
209 throw new ArgumentNullException ("appId");
211 BareApplicationHost host = id_to_host [appId];
218 public void StopObject (string appId, Type type)
221 throw new ArgumentNullException ("appId");
224 throw new ArgumentNullException ("type");
226 if (!id_to_host.ContainsKey (appId))
229 BareApplicationHost host = id_to_host [appId];
233 host.StopObject (type);