Example #1
0
        private Settings ParseConfiguration(string fileName)
        {
            // Bundle configuration (AjaxControlToolkit.config) specified
            // Try read config content from cache
            var configContent = _cacheProvider.Get <string>(CacheConfigName);

            if (string.IsNullOrEmpty(configContent))
            {
                using (StreamReader sr = File.OpenText(fileName)) {
                    // Retrieve config content from file and caching it
                    configContent = sr.ReadToEnd();
                    _cacheProvider.Set(CacheConfigName, configContent, fileName);
                }
            }

            // Deserialize bundle configuration
            var bundleConfig = (Config.Settings)(new XmlSerializer(typeof(Config.Settings)))
                               .Deserialize(new StringReader(configContent));

            return(bundleConfig);
        }
        /// <summary>
        /// Get all types of controls referenced by control bundle names.
        /// If control bundle names is empty then default control bundle defined in AjaxControlToolkit.config will be use to retrieved control types.
        /// If AjaxControlToolkit.config file is not found then all standard control types of AjaxControlToolkit will be retrieved and if control bundle names is defined exception will thrown.
        /// </summary>
        /// <param name="context">Current HttpContext.</param>
        /// <param name="bundles">Control bundle names. Will be ignored if AjaxControlToolkit.config file is not found.</param>
        /// <returns></returns>
        public virtual List <Type> GetControlTypesInBundles(HttpContextBase context, string[] bundles)
        {
            var registeredControls = new List <Type>();
            var registeredBundles  = new List <string>();
            var fileName           = context.Server.MapPath(ConfigFileName);

            if (!File.Exists(fileName))
            {
                // No configuration config (AjaxControlToolkit.config) is specified

                // Bundle names specified, but AjaxControlToolkit.config is not provided then exception should be thrown
                if (bundles != null && bundles.Length > 0)
                {
                    throw new Exception("Can not resolve requested control bundle since " + ConfigFileName +
                                        " file is not defined.");
                }

                // Parse all controls type name in ControlDependencyTypeMaps
                var allControlTypesName = new List <string>();
                foreach (var map in ControlDependencyTypeMaps)
                {
                    allControlTypesName.AddRange(map.Value);
                }

                // Load all AjaxControlToolkit controls if there is no bundle specified neither the config file
                registeredControls.AddRange(allControlTypesName.Select(c => Type.GetType(c))
                                            .ToList());
            }
            else
            {
                // Bundle configuration (AjaxControlToolkit.config) specified
                // Try read config content from cache
                var configContent = _cacheProvider.Get <string>(CacheConfigName);
                if (string.IsNullOrEmpty(configContent))
                {
                    using (StreamReader sr = File.OpenText(fileName)) {
                        // Retrieve config content from file and caching it
                        configContent = sr.ReadToEnd();
                        _cacheProvider.Set(CacheConfigName, configContent, fileName);
                    }
                }

                // Deserialize bundle configuration
                var bundleConfig = (Config.Settings)(new XmlSerializer(typeof(Config.Settings)))
                                   .Deserialize(new StringReader(configContent));

                // Iterate all control bundle sections. Normaly, there will be only 1 section.
                foreach (var bundle in bundleConfig.ControlBundleSections)
                {
                    // Iterate all control bundles in a section.
                    foreach (var controlBundle in bundle.ControlBundles)
                    {
                        // Only add control types if ...
                        if (
                            // ... this is default control bundle and requested bundle not specified.
                            (string.IsNullOrEmpty(controlBundle.Name) && (bundles == null || bundles.Length == 0)) ||

                            // .. or this is not default bundle and its specified in requested bundle
                            (bundles != null && bundles.Contains(controlBundle.Name)))
                        {
                            // Iterate all controls registered in control bundle. Determining control types is works here.
                            foreach (var control in controlBundle.Controls)
                            {
                                if (string.IsNullOrEmpty(control.Assembly) || control.Assembly == "AjaxControlToolkit")
                                {
                                    // Processing AjaxControlToolkit controls
                                    var controlName = "AjaxControlToolkit." + control.Name;

                                    // Verify that control is a standard AjaxControlToolkit control
                                    if (!ControlDependencyTypeMaps.ContainsKey(controlName))
                                    {
                                        throw new Exception(
                                                  string.Format(
                                                      "Could not find control '{0}'. Please make sure you entered the correct control name in AjaxControlToolkit.config file.",
                                                      control.Name));
                                    }

                                    registeredControls.AddRange(ControlDependencyTypeMaps[controlName]
                                                                .Select(c => Type.GetType(c)));
                                }
                                else
                                {
                                    // Processing custom controls
                                    registeredControls.Add(
                                        ToolkitScriptManagerHelper.GetAssembly(control.Assembly)
                                        .GetType(control.Assembly + "." + control.Name));
                                }
                            }

                            // Mark that bundle is registered for future verification
                            registeredBundles.Add(controlBundle.Name);
                        }
                    }
                }

                // Verify, is there any control in bundle that not registered yet
                if (bundles != null)
                {
                    foreach (var bundle in bundles)
                    {
                        if (!registeredBundles.Contains(bundle))
                        {
                            throw new Exception(string.Format("Could not resolve bundle {0}.", bundle));
                        }
                    }
                }
            }

            // Return unique types
            return(registeredControls.Distinct().ToList());
        }