2 // System.Web.Configuration.WebConfigurationManager.cs
5 // Lluis Sanchez Gual (lluis@novell.com)
6 // Chris Toshok (toshok@ximian.com)
8 // Permission is hereby granted, free of charge, to any person obtaining
9 // a copy of this software and associated documentation files (the
10 // "Software"), to deal in the Software without restriction, including
11 // without limitation the rights to use, copy, modify, merge, publish,
12 // distribute, sublicense, and/or sell copies of the Software, and to
13 // permit persons to whom the Software is furnished to do so, subject to
14 // the following conditions:
16 // The above copyright notice and this permission notice shall be
17 // included in all copies or substantial portions of the Software.
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
34 using System.Collections;
35 using System.Collections.Specialized;
36 using System.Reflection;
37 using System.Web.Util;
39 using System.Configuration;
40 using System.Configuration.Internal;
41 using _Configuration = System.Configuration.Configuration;
43 namespace System.Web.Configuration {
45 public static class WebConfigurationManager
48 static IInternalConfigConfigurationFactory configFactory;
49 static Hashtable configurations = Hashtable.Synchronized (new Hashtable ());
51 static readonly object AppSettingsKey = new object ();
52 static internal IInternalConfigConfigurationFactory configFactory
55 IInternalConfigConfigurationFactory factory = (IInternalConfigConfigurationFactory)AppDomain.CurrentDomain.GetData("WebConfigurationManager.configFactory");
57 lock (AppDomain.CurrentDomain){
58 object initialized = AppDomain.CurrentDomain.GetData("WebConfigurationManager.configFactory.initialized");
59 if (initialized == null){
60 PropertyInfo prop = typeof(ConfigurationManager).GetProperty("ConfigurationFactory", BindingFlags.Static | BindingFlags.NonPublic);
62 factory = prop.GetValue(null, null) as IInternalConfigConfigurationFactory;
63 configFactory = factory;
68 return factory != null ? factory : configFactory;
71 AppDomain.CurrentDomain.SetData("WebConfigurationManager.configFactory", value);
72 AppDomain.CurrentDomain.SetData("WebConfigurationManager.configFactory.initialized", true);
76 static internal Hashtable configurations
79 Hashtable table = (Hashtable)AppDomain.CurrentDomain.GetData("WebConfigurationManager.configurations");
81 lock (AppDomain.CurrentDomain){
82 object initialized = AppDomain.CurrentDomain.GetData("WebConfigurationManager.configurations.initialized");
83 if (initialized == null){
84 table = Hashtable.Synchronized (new Hashtable (StringComparer.OrdinalIgnoreCase));
85 configurations = table;
89 return table != null ? table : configurations;
93 AppDomain.CurrentDomain.SetData("WebConfigurationManager.configurations", value);
94 AppDomain.CurrentDomain.SetData("WebConfigurationManager.configurations.initialized", true);
99 static ArrayList extra_assemblies = null;
100 static internal ArrayList ExtraAssemblies {
102 if (extra_assemblies == null)
103 extra_assemblies = new ArrayList();
104 return extra_assemblies;
108 static bool hasConfigErrors = false;
109 static object hasConfigErrorsLock = new object ();
110 static internal bool HasConfigErrors {
112 lock (hasConfigErrorsLock) {
113 return hasConfigErrors;
118 static WebConfigurationManager ()
120 PropertyInfo prop = typeof(ConfigurationManager).GetProperty ("ConfigurationFactory", BindingFlags.Static | BindingFlags.NonPublic);
122 configFactory = prop.GetValue (null, null) as IInternalConfigConfigurationFactory;
125 public static _Configuration OpenMachineConfiguration ()
127 return ConfigurationManager.OpenMachineConfiguration ();
130 [MonoLimitation ("locationSubPath is not handled")]
131 public static _Configuration OpenMachineConfiguration (string locationSubPath)
133 return OpenMachineConfiguration ();
136 [MonoLimitation("Mono does not support remote configuration")]
137 public static _Configuration OpenMachineConfiguration (string locationSubPath,
141 return OpenMachineConfiguration (locationSubPath);
143 throw new NotSupportedException ("Mono doesn't support remote configuration");
146 [MonoLimitation("Mono does not support remote configuration")]
147 public static _Configuration OpenMachineConfiguration (string locationSubPath,
152 return OpenMachineConfiguration (locationSubPath);
153 throw new NotSupportedException ("Mono doesn't support remote configuration");
156 [MonoLimitation("Mono does not support remote configuration")]
157 public static _Configuration OpenMachineConfiguration (string locationSubPath,
163 return OpenMachineConfiguration (locationSubPath);
164 throw new NotSupportedException ("Mono doesn't support remote configuration");
167 public static _Configuration OpenWebConfiguration (string path)
169 return OpenWebConfiguration (path, null, null, null, null, null);
172 public static _Configuration OpenWebConfiguration (string path, string site)
174 return OpenWebConfiguration (path, site, null, null, null, null);
177 public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath)
179 return OpenWebConfiguration (path, site, locationSubPath, null, null, null);
182 public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath, string server)
184 return OpenWebConfiguration (path, site, locationSubPath, server, null, null);
187 public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath, string server, IntPtr userToken)
189 return OpenWebConfiguration (path, site, locationSubPath, server, null, null);
192 public static _Configuration OpenWebConfiguration (string path, string site, string locationSubPath, string server, string userName, string password)
194 if (path == null || path.Length == 0)
199 conf = (_Configuration) configurations [path];
202 conf = ConfigurationFactory.Create (typeof (WebConfigurationHost), null, path, site, locationSubPath, server, userName, password);
203 configurations [path] = conf;
204 } catch (Exception ex) {
205 lock (hasConfigErrorsLock) {
206 hasConfigErrors = true;
214 public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path)
216 return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path);
219 public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path, string site)
221 return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path, site);
224 public static _Configuration OpenMappedWebConfiguration (WebConfigurationFileMap fileMap, string path, string site, string locationSubPath)
226 return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap, path, site, locationSubPath);
229 public static _Configuration OpenMappedMachineConfiguration (ConfigurationFileMap fileMap)
231 return ConfigurationFactory.Create (typeof(WebConfigurationHost), fileMap);
234 public static _Configuration OpenMappedMachineConfiguration (ConfigurationFileMap fileMap,
235 string locationSubPath)
237 return OpenMappedMachineConfiguration (fileMap);
240 internal static object SafeGetSection (string sectionName, Type configSectionType)
243 return GetSection (sectionName);
244 } catch (Exception) {
245 if (configSectionType != null)
246 return Activator.CreateInstance (configSectionType);
251 internal static object SafeGetSection (string sectionName, string path, Type configSectionType)
254 return GetSection (sectionName, path);
255 } catch (Exception) {
256 if (configSectionType != null)
257 return Activator.CreateInstance (configSectionType);
262 public static object GetSection (string sectionName)
264 return GetSection (sectionName, GetCurrentPath (HttpContext.Current));
267 public static object GetSection (string sectionName, string path)
269 _Configuration c = OpenWebConfiguration (path);
270 ConfigurationSection section = c.GetSection (sectionName);
276 object value = get_runtime_object.Invoke (section, new object [0]);
277 if (String.CompareOrdinal ("appSettings", sectionName) == 0) {
278 HttpContext hc = HttpContext.Current;
279 NameValueCollection collection = (NameValueCollection) hc.Items [AppSettingsKey];
281 if (collection == null) {
282 IServiceProvider provider = (IServiceProvider) ((IServiceProvider) hc).GetService (typeof (HttpWorkerRequest));
283 javax.servlet.ServletConfig config = (javax.servlet.ServletConfig) provider.GetService (typeof (javax.servlet.ServletConfig));
284 javax.servlet.ServletContext context = config.getServletContext ();
286 collection = new NameValueCollection ((NameValueCollection)value);
288 for (java.util.Enumeration e = context.getInitParameterNames (); e.hasMoreElements (); ) {
289 string key = (string) e.nextElement ();
290 collection.Add (key, context.getInitParameter (key));
293 for (java.util.Enumeration e = config.getInitParameterNames (); e.hasMoreElements (); ) {
294 string key = (string) e.nextElement ();
295 collection.Add (key, config.getInitParameter (key));
298 hc.Items [AppSettingsKey] = collection;
306 return SettingsMappingManager.MapSection (get_runtime_object.Invoke (section, new object [0]));
310 static string GetCurrentPath (HttpContext ctx)
312 return (ctx != null && ctx.Request != null) ? ctx.Request.Path : HttpRuntime.AppDomainAppVirtualPath;
315 internal static void RemoveConfigurationFromCache (HttpContext ctx)
317 configurations.Remove (GetCurrentPath (ctx));
320 readonly static MethodInfo get_runtime_object = typeof (ConfigurationSection).GetMethod ("GetRuntimeObject", BindingFlags.NonPublic | BindingFlags.Instance);
322 public static object GetWebApplicationSection (string sectionName)
324 string path = (HttpContext.Current == null
325 || HttpContext.Current.Request == null
326 || HttpContext.Current.Request.ApplicationPath == null
327 || HttpContext.Current.Request.ApplicationPath == "") ?
328 String.Empty : HttpContext.Current.Request.ApplicationPath;
330 return GetSection (sectionName, path);
333 public static NameValueCollection AppSettings {
334 get { return ConfigurationManager.AppSettings; }
337 public static ConnectionStringSettingsCollection ConnectionStrings {
338 get { return ConfigurationManager.ConnectionStrings; }
341 internal static IInternalConfigConfigurationFactory ConfigurationFactory {
342 get { return configFactory; }
345 #region stuff copied from WebConfigurationSettings
347 static internal IConfigurationSystem oldConfig {
349 return (IConfigurationSystem)AppDomain.CurrentDomain.GetData("WebConfigurationManager.oldConfig");
352 AppDomain.CurrentDomain.SetData("WebConfigurationManager.oldConfig", value);
356 static private Web20DefaultConfig config {
358 return (Web20DefaultConfig) AppDomain.CurrentDomain.GetData ("Web20DefaultConfig.config");
361 AppDomain.CurrentDomain.SetData ("Web20DefaultConfig.config", value);
365 static private IInternalConfigSystem configSystem {
367 return (IInternalConfigSystem) AppDomain.CurrentDomain.GetData ("IInternalConfigSystem.configSystem");
370 AppDomain.CurrentDomain.SetData ("IInternalConfigSystem.configSystem", value);
374 static internal IConfigurationSystem oldConfig;
375 static Web20DefaultConfig config;
376 //static IInternalConfigSystem configSystem;
378 const BindingFlags privStatic = BindingFlags.NonPublic | BindingFlags.Static;
379 static readonly object lockobj = new object ();
381 internal static void Init ()
387 /* deal with the ConfigurationSettings stuff */
389 Web20DefaultConfig settings = Web20DefaultConfig.GetInstance ();
390 Type t = typeof (ConfigurationSettings);
391 MethodInfo changeConfig = t.GetMethod ("ChangeConfigurationSystem",
394 if (changeConfig == null)
395 throw new ConfigurationException ("Cannot find method CCS");
397 object [] args = new object [] {settings};
398 oldConfig = (IConfigurationSystem)changeConfig.Invoke (null, args);
404 /* deal with the ConfigurationManager stuff */
406 HttpConfigurationSystem system = new HttpConfigurationSystem ();
407 Type t = typeof (ConfigurationManager);
408 MethodInfo changeConfig = t.GetMethod ("ChangeConfigurationSystem",
411 if (changeConfig == null)
412 throw new ConfigurationException ("Cannot find method CCS");
414 object [] args = new object [] {system};
415 changeConfig.Invoke (null, args);
416 //configSystem = system;
422 class Web20DefaultConfig : IConfigurationSystem
425 static private Web20DefaultConfig instance {
427 Web20DefaultConfig val = (Web20DefaultConfig)AppDomain.CurrentDomain.GetData("Web20DefaultConfig.instance");
429 val = new Web20DefaultConfig();
430 AppDomain.CurrentDomain.SetData("Web20DefaultConfig.instance", val);
435 AppDomain.CurrentDomain.SetData("Web20DefaultConfig.instance", value);
439 static Web20DefaultConfig instance;
442 static Web20DefaultConfig ()
444 instance = new Web20DefaultConfig ();
447 public static Web20DefaultConfig GetInstance ()
452 public object GetConfig (string sectionName)
454 object o = WebConfigurationManager.GetWebApplicationSection (sectionName);
456 if (o == null || o is IgnoreSection) {
457 /* this can happen when the section
458 * handler doesn't subclass from
459 * ConfigurationSection. let's be
460 * nice and try to load it using the
461 * 1.x style routines in case there's
462 * a 1.x section handler registered
465 object o1 = WebConfigurationManager.oldConfig.GetConfig (sectionName);
475 // nothing. We need a context.