2 // System.Web.Hosting.ApplicationManager
5 // Gonzalo Paniagua Javier (gonzalo@novell.com)
8 // Copyright (C) 2006-2010 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;
46 id_to_host = new Dictionary<string, BareApplicationHost> ();
51 if (Interlocked.Decrement (ref users) == 0)
55 [MonoTODO ("Need to take advantage of the configuration mapping capabilities of IApplicationHost")]
56 [SecurityPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
57 public IRegisteredObject CreateObject (IApplicationHost appHost, Type type)
60 throw new ArgumentNullException ("appHost");
62 throw new ArgumentNullException ("type");
64 return CreateObject (appHost.GetSiteID (),
66 appHost.GetVirtualPath (),
67 appHost.GetPhysicalPath (),
72 public IRegisteredObject CreateObject (string appId, Type type, string virtualPath,
73 string physicalPath, bool failIfExists)
75 return CreateObject (appId, type, virtualPath, physicalPath, failIfExists, true);
78 public IRegisteredObject CreateObject (string appId, Type type, string virtualPath,
79 string physicalPath, bool failIfExists, bool throwOnError)
82 throw new ArgumentNullException ("appId");
84 if (!VirtualPathUtility.IsAbsolute (virtualPath))
85 throw new ArgumentException ("Relative path no allowed.", "virtualPath");
87 if (String.IsNullOrEmpty (physicalPath))
88 throw new ArgumentException ("Cannot be null or empty", "physicalPath");
90 // 'type' is not checked. If it's null, we'll throw a NullReferenceException
91 if (!typeof (IRegisteredObject).IsAssignableFrom (type))
92 throw new ArgumentException (String.Concat ("Type '", type.Name, "' does not implement IRegisteredObject."), "type");
95 // ArgumentException is thrown for the physical path from the internal object created
96 // in the new application domain.
97 BareApplicationHost host = null;
98 if (id_to_host.ContainsKey (appId))
99 host = id_to_host [appId];
101 IRegisteredObject ireg = null;
103 ireg = CheckIfExists (host, type, failIfExists);
110 host = CreateHost (appId, virtualPath, physicalPath);
111 ireg = host.CreateInstance (type);
112 } catch (Exception) {
117 if (ireg != null && host.GetObject (type) == null) // If not registered from ctor...
118 host.RegisterObject (ireg, true);
123 // Used from ClientBuildManager
124 internal BareApplicationHost CreateHostWithCheck (string appId, string vpath, string ppath)
126 if (id_to_host.ContainsKey (appId))
127 throw new InvalidOperationException ("Already have a host with the same appId");
129 return CreateHost (appId, vpath, ppath);
132 BareApplicationHost CreateHost (string appId, string vpath, string ppath)
134 BareApplicationHost host;
135 host = (BareApplicationHost) ApplicationHost.CreateApplicationHost (typeof (BareApplicationHost), vpath, ppath);
138 id_to_host [appId] = host;
142 internal void RemoveHost (string appId)
144 id_to_host.Remove (appId);
147 IRegisteredObject CheckIfExists (BareApplicationHost host, Type type, bool failIfExists)
149 IRegisteredObject ireg = host.GetObject (type);
154 throw new InvalidOperationException (String.Concat ("Well known object of type '", type.Name, "' already exists in this domain."));
159 public static ApplicationManager GetApplicationManager ()
164 public IRegisteredObject GetObject (string appId, Type type)
167 throw new ArgumentNullException ("appId");
170 throw new ArgumentNullException ("type");
172 BareApplicationHost host = null;
173 if (!id_to_host.ContainsKey (appId))
176 host = id_to_host [appId];
177 return host.GetObject (type);
180 public ApplicationInfo [] GetRunningApplications ()
182 ICollection<string> coll = id_to_host.Keys;
183 string [] keys = new string [coll.Count];
184 coll.CopyTo (keys, 0);
185 ApplicationInfo [] result = new ApplicationInfo [coll.Count];
187 foreach (string str in keys) {
188 BareApplicationHost host = id_to_host [str];
189 result [i++] = new ApplicationInfo (str, host.PhysicalPath, host.VirtualPath);
195 public override object InitializeLifetimeService ()
200 public bool IsIdle ()
202 throw new NotImplementedException ();
207 Interlocked.Increment (ref users);
210 public void ShutdownAll ()
212 ICollection<string> coll = id_to_host.Keys;
213 string [] keys = new string [coll.Count];
214 coll.CopyTo (keys, 0);
215 foreach (string str in keys) {
216 BareApplicationHost host = id_to_host [str];
223 public void ShutdownApplication (string appId)
226 throw new ArgumentNullException ("appId");
228 BareApplicationHost host = id_to_host [appId];
235 public void StopObject (string appId, Type type)
238 throw new ArgumentNullException ("appId");
241 throw new ArgumentNullException ("type");
243 if (!id_to_host.ContainsKey (appId))
246 BareApplicationHost host = id_to_host [appId];
250 host.StopObject (type);