New test.
[mono.git] / mcs / class / System.Web / System.Web.Configuration_2.0 / WebConfigurationManager.cs
index 88a4e2797a4aec9256539cf6865d31da79d74bd2..fd87f12d0854ce5c5c70fb91d6e32237c9e1e52b 100644 (file)
@@ -43,8 +43,56 @@ 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 WebConfigurationManager ()
                {
@@ -233,14 +281,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 {
@@ -273,6 +327,9 @@ namespace System.Web.Configuration {
                                } 
                        }
                        
+                       if (path.Length == 0)
+                               return path;
+
                        /* remove excess /'s from the end of the virtual path */
                        while (path [path.Length - 1] == '/')
                                path = path.Substring (0, path.Length - 1);
@@ -294,10 +351,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