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 string msg
= String
.Format ("Type '{0}' does not implement IRegisteredObject.", type
.Name
);
76 throw new ArgumentException (msg
, "type");
80 // ArgumentException is thrown for the physical path from the internal object created
81 // in the new application domain.
82 BareApplicationHost host
= null;
83 if (id_to_host
.ContainsKey (appId
))
84 host
= id_to_host
[appId
];
86 IRegisteredObject ireg
= null;
88 ireg
= CheckIfExists (host
, type
, failIfExists
);
95 host
= CreateHost (appId
, virtualPath
, physicalPath
);
96 ireg
= host
.CreateInstance (type
);
102 if (ireg
!= null && host
.GetObject (type
) == null) // If not registered from ctor...
103 host
.RegisterObject (ireg
, true);
108 // Used from ClientBuildManager
109 internal BareApplicationHost
CreateHostWithCheck (string appId
, string vpath
, string ppath
)
111 if (id_to_host
.ContainsKey (appId
))
112 throw new InvalidOperationException ("Already have a host with the same appId");
114 return CreateHost (appId
, vpath
, ppath
);
117 BareApplicationHost
CreateHost (string appId
, string vpath
, string ppath
)
119 BareApplicationHost host
;
120 host
= (BareApplicationHost
) ApplicationHost
.CreateApplicationHost (typeof (BareApplicationHost
), vpath
, ppath
);
123 id_to_host
[appId
] = host
;
127 internal void RemoveHost (string appId
)
129 id_to_host
.Remove (appId
);
132 IRegisteredObject
CheckIfExists (BareApplicationHost host
, Type type
, bool failIfExists
)
134 IRegisteredObject ireg
= host
.GetObject (type
);
139 string msg
= String
.Format ("Well known object of type '{0}' already " +
140 "exists in this domain.", type
.Name
);
141 throw new InvalidOperationException (msg
);
147 public static ApplicationManager
GetApplicationManager ()
152 public IRegisteredObject
GetObject (string appId
, Type type
)
155 throw new ArgumentNullException ("appId");
158 throw new ArgumentNullException ("type");
160 BareApplicationHost host
= null;
161 if (!id_to_host
.ContainsKey (appId
))
164 host
= id_to_host
[appId
];
165 return host
.GetObject (type
);
168 public ApplicationInfo
[] GetRunningApplications ()
170 ICollection
<string> coll
= id_to_host
.Keys
;
171 string [] keys
= new string [coll
.Count
];
172 coll
.CopyTo (keys
, 0);
173 ApplicationInfo
[] result
= new ApplicationInfo
[coll
.Count
];
175 foreach (string str
in keys
) {
176 BareApplicationHost host
= id_to_host
[str
];
177 result
[i
++] = new ApplicationInfo (str
, host
.PhysicalPath
, host
.VirtualPath
);
183 public override object InitializeLifetimeService ()
188 public bool IsIdle ()
190 throw new NotImplementedException ();
195 Interlocked
.Increment (ref users
);
198 public void ShutdownAll ()
200 ICollection
<string> coll
= id_to_host
.Keys
;
201 string [] keys
= new string [coll
.Count
];
202 coll
.CopyTo (keys
, 0);
203 foreach (string str
in keys
) {
204 BareApplicationHost host
= id_to_host
[str
];
211 public void ShutdownApplication (string appId
)
214 throw new ArgumentNullException ("appId");
216 BareApplicationHost host
= id_to_host
[appId
];
223 public void StopObject (string appId
, Type type
)
226 throw new ArgumentNullException ("appId");
229 throw new ArgumentNullException ("type");
231 if (!id_to_host
.ContainsKey (appId
))
234 BareApplicationHost host
= id_to_host
[appId
];
238 host
.StopObject (type
);