2006-11-22 Miguel de Icaza <miguel@novell.com>
[mono.git] / mcs / class / System.Web / System.Web.Configuration_2.0 / WebConfigurationManager.cs
index cd65506e6f14963fb966936e5ee47a455c51f7e7..55b36a133419e0977939da0e6fdd7ed468a7d810 100644 (file)
@@ -43,8 +43,65 @@ namespace System.Web.Configuration {
 
        public static class WebConfigurationManager
        {
+#if !TARGET_J2EE
                static IInternalConfigConfigurationFactory configFactory;
                static Hashtable configurations = new Hashtable ();
+#else
+               static internal IInternalConfigConfigurationFactory configFactory
+               {
+                       get{
+                               IInternalConfigConfigurationFactory factory = (IInternalConfigConfigurationFactory)AppDomain.CurrentDomain.GetData("WebConfigurationManager.configFactory");
+                               if (factory == null){
+                                       lock (AppDomain.CurrentDomain){
+                                               object initialized = AppDomain.CurrentDomain.GetData("WebConfigurationManager.configFactory.initialized");
+                                               if (initialized == null){
+                                                       PropertyInfo prop = typeof(ConfigurationManager).GetProperty("ConfigurationFactory", BindingFlags.Static | BindingFlags.NonPublic);
+                                                       if (prop != null){
+                                                               factory = prop.GetValue(null, null) as IInternalConfigConfigurationFactory;
+                                                               configFactory = factory;
+                                                       }
+                                               }
+                                       }
+                               }
+                               return factory != null ? factory : configFactory;
+                       }
+                       set{
+                               AppDomain.CurrentDomain.SetData("WebConfigurationManager.configFactory", value);
+                               AppDomain.CurrentDomain.SetData("WebConfigurationManager.configFactory.initialized", true);
+                       }
+               }
+
+               static internal Hashtable configurations
+               {
+                       get{
+                               Hashtable table = (Hashtable)AppDomain.CurrentDomain.GetData("WebConfigurationManager.configurations");
+                               if (table == null){
+                                       lock (AppDomain.CurrentDomain){
+                                               object initialized = AppDomain.CurrentDomain.GetData("WebConfigurationManager.configurations.initialized");
+                                               if (initialized == null){
+                                                       table = new Hashtable();
+                                                       configurations = table;
+                                               }
+                                       }
+                               }
+                               return table != null ? table : configurations;
+
+                       }
+                       set{
+                               AppDomain.CurrentDomain.SetData("WebConfigurationManager.configurations", value);
+                               AppDomain.CurrentDomain.SetData("WebConfigurationManager.configurations.initialized", true);
+                       }
+               }
+#endif
+
+               static internal ArrayList extra_assemblies = null;
+               static internal ArrayList ExtraAssemblies {
+                       get {
+                               if (extra_assemblies == null)
+                                       extra_assemblies = new ArrayList();
+                               return extra_assemblies;
+                       }
+               }
                
                static WebConfigurationManager ()
                {
@@ -233,14 +290,20 @@ namespace System.Web.Configuration {
                        return config;
                }
 
+               static MethodInfo get_runtime_object = typeof (ConfigurationSection).GetMethod ("GetRuntimeObject", BindingFlags.NonPublic | BindingFlags.Instance);
+
                [MonoTODO]
                public static object GetWebApplicationSection (string sectionName)
                {
                        _Configuration config = GetWebApplicationConfiguration ();
+                       if (config == null)
+                               return null;
 
                        ConfigurationSection section = config.GetSection (sectionName);
-
-                       return section;
+                       if (section == null)
+                               return null;
+                       
+                       return get_runtime_object.Invoke (section, new object [0]);
                }
 
                public static NameValueCollection AppSettings {
@@ -297,10 +360,19 @@ namespace System.Web.Configuration {
 
                static private Web20DefaultConfig config {
                        get {
-                               return (Web20DefaultConfig)AppDomain.CurrentDomain.GetData("WebConfigurationManager.config");
+                               return (Web20DefaultConfig) AppDomain.CurrentDomain.GetData ("Web20DefaultConfig.config");
+                       }
+                       set {
+                               AppDomain.CurrentDomain.SetData ("Web20DefaultConfig.config", value);
+                       }
+               }
+
+               static private IInternalConfigSystem configSystem {
+                       get {
+                               return (IInternalConfigSystem) AppDomain.CurrentDomain.GetData ("IInternalConfigSystem.configSystem");
                        }
                        set {
-                               AppDomain.CurrentDomain.SetData("WebConfigurationManager.config", value);
+                               AppDomain.CurrentDomain.SetData ("IInternalConfigSystem.configSystem", value);
                        }
                }
 #else